#!/bin/bash # Script for updating the marvin program in the initrd. set -e set -u # Variables - Default values # Local directory name containing the representation for the initrd ROBOT_LOCAL_DIR="./robot" # Remote directory in the initrd ROBOT_REMOTE_DIR="/robot" # Name of the script to launch the robot program ROBOT_START_SCRIPT="start.sh" # Build directory ROBOT_BUILD_DIR="." # Config directory ROBOT_CONF_DIR="$ROBOT_BUILD_DIR/../runtime" # Max size of the config directory (in bytes) ROBOT_CONF_MAX_SIZE="100000" # Hostname of the robot ROBOT_HOST="nenuphar" # In autonomous mode, wait time for bringing up the ssh deamon ROBOT_WAIT_TIME="3s" check_rsync () { if [[ "x$(whereis rsync | cut -d ':' -f 2)" == "x" ]] then echo "Please install rsync" exit 1 fi } # Check the structure (directory robot and startup script) check_create_structure () { # Check the local directory exist if [[ ! -d $ROBOT_LOCAL_DIR ]] then mkdir -p $ROBOT_LOCAL_DIR/lib fi # Check we have a start script if [[ ! -x $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT ]] then # Create a default one cat < $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT # Startup script launched when the PC104 boot. # It will be sourced by other script. # Example : # ./test_ai -z EOF chmod +x $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT # Need to tune it by the user echo "Please tune your $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT." # XXX vim it ? exit 2 fi } # Check that there is a line in the startup script for launchin a program and # a binary existing check_install_binary () { if [[ $(grep -c "^\\./" $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT) -eq 0 ]] then echo "No command found in your $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT." exit 3 fi for line in "$(grep "^\\./" $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT)" do bin="$(echo "$line" | cut -d ' ' -f 1)" if [[ ! -x $ROBOT_BUILD_DIR/$bin ]] then echo "Binary not found : $bin." exit 4 else # Copy the binary to the local dir cp -p $ROBOT_BUILD_DIR/$bin $ROBOT_LOCAL_DIR/ # Remove useless symbol strip -p $ROBOT_LOCAL_DIR/$bin # Copy needed libraries for lib in "$(ldd $ROBOT_BUILD_DIR/$bin | cut -d ' ' -f 3)" do cp -p $lib $ROBOT_LOCAL_DIR/lib done fi done } # Install the configuration check_install_config () { # First we check the size if [[ $(du -bs --exclude=.svn $ROBOT_CONF_DIR | cut -f 1) -gt $ROBOT_CONF_MAX_SIZE ]] then echo "Config directory ($ROBOT_CONF_DIR) is too big." exit 5 fi # There is no way to know the files needed, so we rsync everything rsync -aq --exclude=.svn $ROBOT_CONF_DIR/ $ROBOT_LOCAL_DIR } upload_data () { # Check if host exist and is up echo "Ping" ping -c 1 -w 1 -q $ROBOT_HOST > /dev/null case $? in 0) # Robot is online ! ;; 1) # Host exist but is offline echo "$ROBOT_HOST is currently down." exit 6 ;; 2) # Host does not exist echo "$ROBOT_HOST does not exist." exit 7 ;; *) # Unknown error... echo "ping failed, unknown error." exit 8 ;; esac echo "nc" # Are we in automous mode ? if [[ $(nc -w 1 $ROBOT_HOST 1234) -eq 0 ]] then sleep $ROBOT_WAIT_TIME fi # Mount the initrd echo "Mounting" # TODO Best manage compressed initrd or not # && gunzip -c /initrd/last > /tmp/initrd_cur \ ssh -o "ConnectTimeout 1" root@$ROBOT_HOST "mount -oremount,rw / \ && cp /initrd/last /tmp/initrd_cur \ && mount -o loop /tmp/initrd_cur /mnt/initrd" # Rsyncer echo "rsync" # TODO Remove old files ! rsync -av $ROBOT_LOCAL_DIR/ root@$ROBOT_HOST:/mnt/initrd/$ROBOT_REMOTE_DIR/ echo "umount" # Démonter et recompresser l'initrd voir rotater tout # TODO Best manage compressed initrd or not # TODO Backup, rotation, et less cp ! # && gzip -f -9 -c /tmp/initrd_cur > /initrd/initrd1.gz\ ssh -o "ConnectTimeout 1" root@$ROBOT_HOST "umount /mnt/initrd \ && cp /tmp/initrd_cur /initrd/initrd1.gz \ && sync \ && mount -oremount,ro /" # TODO Change between NFS/Autonomous... # && kill -SIGTERM 1" } # TODO Parameter check_rsync check_create_structure check_install_binary check_install_config upload_data