From 831e13eea8edbe4fbb6693628607b14bfd4f1aa8 Mon Sep 17 00:00:00 2001 From: dufourj Date: Sat, 4 Feb 2006 21:34:07 +0000 Subject: PC104 : - suppression du pivot_root (chroot convient mieux aux besoins) ; - script de mise à jour du programme sur l'initrd PC104 en autonome quasi-fonctionnel (quelques amélioriation à faire) ; - impossibilité de démarrer un binaire créé sur lampion sans provoquer un kill du kernel (certains supports noyau manquant ? Lib ou autres programmes manquant ?). - l'initrd compressé c'est rapide à booter mais long à mettre à jour... --- i/pc104/initrd/update.sh | 112 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 84 insertions(+), 28 deletions(-) (limited to 'i/pc104/initrd/update.sh') diff --git a/i/pc104/initrd/update.sh b/i/pc104/initrd/update.sh index 9cb9059..ae7b0cf 100755 --- a/i/pc104/initrd/update.sh +++ b/i/pc104/initrd/update.sh @@ -1,6 +1,9 @@ #!/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" @@ -12,8 +15,12 @@ ROBOT_START_SCRIPT="start.sh" ROBOT_BUILD_DIR="." # Config directory ROBOT_CONF_DIR="$ROBOT_BUILD_DIR/../runtime" -# Max size of the config directory -ROBOT_CONF_MAX_SIZE="3000" +# 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 () { @@ -29,17 +36,19 @@ check_create_structure () # Check the local directory exist if [[ ! -d $ROBOT_LOCAL_DIR ]] then - mkdir $ROBOT_LOCAL_DIR + mkdir -p $ROBOT_LOCAL_DIR/lib fi # Check we have a start script - if [[ ! -f $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT ]] + if [[ ! -x $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT ]] then # Create a default one - echo -e \ - "# Startup script launched when the PC104 boot.\n\ -# It will be sourced by other script.\n\ -# Example : \n\ -# ./test_ai -z" > $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT + 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 ? @@ -51,12 +60,12 @@ check_create_structure () # a binary existing check_install_binary () { - if [[ $(grep -cv "^#" $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT) -eq 0 ]] + 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 -v "^#" $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT)" + for line in "$(grep "^\\./" $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT)" do bin="$(echo "$line" | cut -d ' ' -f 1)" if [[ ! -x $ROBOT_BUILD_DIR/$bin ]] @@ -65,9 +74,14 @@ check_install_binary () exit 4 else # Copy the binary to the local dir - install -m 777 $ROBOT_BUILD_DIR/$bin $ROBOT_LOCAL_DIR/ + cp -p $ROBOT_BUILD_DIR/$bin $ROBOT_LOCAL_DIR/ # Remove useless symbol - strip $ROBOT_LOCAL_DIR/$bin + 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 } @@ -76,28 +90,69 @@ check_install_binary () check_install_config () { # First we check the size - if [[ $(du -bs $ROBOT_CONF_DIR | cut -f 1) -gt $ROBOT_CONF_MAX_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 $ROBOT_CONF_DIR/ $ROBOT_LOCAL_DIR/rc + rsync -aq --exclude=.svn $ROBOT_CONF_DIR/ $ROBOT_LOCAL_DIR } -# TODO Send it to the initrd -# Guiding steps : -# 1. Try netcat on the robot -# 1.a If it responding, we are in autonomous mode, wait that the PC104 mount -# the real system for ssh -# 2. Try ssh -# 2.a Not responding, wrong robot/dns ? Too quick from 1 ? -# 3. Backuper/rotater l'initrd -# 4. Décompréssé l'initrd -# 5. Le monter -# 6. rsyncer -# 7. Démonter -# 8. Re-compresser +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 @@ -105,3 +160,4 @@ check_rsync check_create_structure check_install_binary check_install_config +upload_data -- cgit v1.2.3