[Server-devel] [PATCH] Add support for usbmount triggers in xs-rsync

Martin Langhoff martin at laptop.org
Mon Aug 11 02:12:57 EDT 2008


This is the first user of usbmount, so several things
to note...

 - The usbmount scripts don't get a tty, which means
   that we need sudo to allow nontty usage (changed
   in xs-config for root)

 - We check manifest.md5 with a custom utility called
   xs-check-signature, initially a wrapper around md5sum
   that ensures that all files in the directory are in
   the manifest. This script is not included here.

 - We use /usr/bin/logger (to syslog) for output and
   logging, we log to the 'user' facility. Moodle will
   later have a 'tail -f /var/log/user.log'.

 - Stock syslog.conf in fedora drop the user messages,
   so xs-config has been updated to log to user.log

 - It is important to show progress towards completion
   so each msg has an indication of how far along we are.

 - We'll need to localise these. Tricky -
---
 Makefile                            |    2 +
 usbmount-50-xs-rsync-installcontent |   62 +++++++++++++++++++++++++++++++++++
 xs-rsync.spec.in                    |    2 +
 3 files changed, 66 insertions(+), 0 deletions(-)
 create mode 100755 usbmount-50-xs-rsync-installcontent

diff --git a/Makefile b/Makefile
index 729b0b4..f78173f 100644
--- a/Makefile
+++ b/Makefile
@@ -82,6 +82,8 @@ install:
 	install -D -m 644 xinetd-xs-rsyncd.conf $(DESTDIR)/etc/xinetd.d/xs-rsyncd
 	install -D -m 644 crond-xs-rsync.conf   $(DESTDIR)/etc/cron.d/xs-rsync
 
+	install -D -m 755 usbmount-50-xs-rsync-installcontent $(DESTDIR)/etc/usbmount/mount.d/50-xs-rsync-installcontent
+
 	# root owned
 	install -D -d $(DESTDIR)/library/xs-rsync
 	install -D -d $(DESTDIR)/library/xs-rsync/xobuilds-packed
diff --git a/usbmount-50-xs-rsync-installcontent b/usbmount-50-xs-rsync-installcontent
new file mode 100755
index 0000000..9bfeed4
--- /dev/null
+++ b/usbmount-50-xs-rsync-installcontent
@@ -0,0 +1,62 @@
+#!/bin/bash -x
+# Part of the xs-sync package
+# Author: Martin Langhoff <martin at laptop.org>
+# Copyright: One Laptop per Child
+
+set -e
+
+VERBOSE=no
+
+# Log a string via the syslog facility.
+log()
+{
+    if test $1 != debug || expr "$VERBOSE" : "[yY]" > /dev/null; then
+	logger -p user.$1 -t "xs-rsync[$$]" -- "$2"
+    fi
+}
+STEPS=5
+
+if [ -e $UM_MOUNTPOINT/xs-xobuilds -a \
+     -e $UM_MOUNTPOINT/xs-xobuilds/manifest.md5 ];then
+    log notice 'Found xobuilds to install!';
+    log notice "[1/$STEPS] Checking signature]";
+
+    xs-check-signature $UM_MOUNTPOINT/xs-xobuilds/manifest.md5
+
+    log notice "[2/$STEPS] Checking checksum on external disk";
+    pushd $UM_MOUNTPOINT/xs-xobuilds
+    md5sum -c manifest.md5
+    popd
+
+    ## Do we have enough space?
+    # note: we could use awk {'print $4'} instead of the
+    # perl regex, but it breaks with long /dev nodes
+    # such as those from LVMs -which wrap. The regex captures the
+    # number just left of the number with the percentage sign.
+    NEED=`du -s -B1M $UM_MOUNTPOINT/xs-xobuilds | awk {'print $1'}`
+    HAVE=`df -B1M /library/xs-rsync | tail -n1 | \
+	  perl -pe 'm/(\d+)\s+\d+\%/; $_=$1;'`
+    if [ $NEED -gt $HAVE ];then
+	log err 'Not enough free space in /library for this xo image - cancelling';
+	exit 1;
+    fi
+
+    ### Copy it first - as the media is bound to be slow
+    # - make this atomic by cp'ing to a tmpdir, and mv'ing into place
+    #   to be fail-safe
+    # - remove - manifest.md5
+    # - TODO? we could avoid cp'ing files we already have using
+    #   rsync --copy-dest instead of cp
+    #
+    log notice "[3/$STEPS] Copying xo-builds to xobuilds-packed";
+    TMPDEST=`mktemp -d -p /library/xs-rsync/tmp`
+    cp $UM_MOUNTPOINT/xs-xobuilds/* $TMPDEST
+    rm $TMPDEST/manifest.md5
+    mv $TMPDEST/* /library/xs-rsync/xobuilds-packed/
+
+    log notice "[4/$STEPS] Refreshing XO builds available";
+    (/usr/bin/xs-refresh-xobuilds.py 2>&1 ) | logger -p user.debug -t "xs-rsync[$$]"
+    log notice "[5/$STEPS] Finished - XOs can now update.";
+
+
+fi # end if we have xs-xobuilds/manifest.md5
\ No newline at end of file
diff --git a/xs-rsync.spec.in b/xs-rsync.spec.in
index 0fc0c46..3b0f103 100644
--- a/xs-rsync.spec.in
+++ b/xs-rsync.spec.in
@@ -20,6 +20,7 @@ Requires:       fakeroot
 Requires:       fakechroot
 Requires:       bash
 Requires:       vixie-cron
+Requires:       usbmount
 
 %description
 XS rsync provides support for publishing resources on the XS via rsync.
@@ -79,6 +80,7 @@ make install DESTDIR=$RPM_BUILD_ROOT
 %config(noreplace) %{_sysconfdir}/xs-rsyncd.conf.in
 %config(noreplace) %{_sysconfdir}/xinetd.d/xs-rsyncd
 %config(noreplace) %{_sysconfdir}/cron.d/xs-rsync
+%config(noreplace) %{_sysconfdir}/usbmount/mount.d/50-xs-rsync-installcontent
 %dir  /library/xs-rsync/xobuilds-packed
 %attr(755, xs-rsync, xs-rsync) %dir /library/xs-rsync/pub
 %attr(755, xs-rsync, xs-rsync) %dir /library/xs-rsync/pub/builds
-- 
1.5.5.1



More information about the Server-devel mailing list