summaryrefslogtreecommitdiff
path: root/i/pc104/initrd/update.sh
diff options
context:
space:
mode:
Diffstat (limited to 'i/pc104/initrd/update.sh')
-rwxr-xr-xi/pc104/initrd/update.sh112
1 files changed, 84 insertions, 28 deletions
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 <<EOF > $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