Hi all,
this patch is a first little step to the development of a method to monitor the clients installation process.
The reports follow this simple protocol:
- a monitor server is defined using the parameter MONITOR_URL;
- at the beginning of the autoinstallscript if the $MONITOR_URL variable is defined we send some infos to this url (using wget); in the monitor server there will be a dynamic web page that will parse the variables passed by wget and will store them to a DB, file, or something like that;
- before the image syncronization we evaluate the disk space (parsing df output) and the image size (using rsync);
- then a report task is spawned; this task periodically evaluates the disk space and determines the percentage of image copied in this way:
(CURRENT_DISK_SIZE - INITIAL_DISK_SIZE) / IMAGE_SIZE
- at the end of the image syncronization a special code (i.e. 0) is send to the monitor server (always using wget) to report the successfully ending of the syncronization
- if something goes wrong another special error code (i.e. -1) is reported to the monitor server (with a wget command inside the shellout routine)
For now that's all... I'll wait to test it better before continue the development..
Obviusly this protocol can be improved by reporting not only the image syncronization status, but also, for example, the pre-install status (partitioning, etc.) or post-install status (post-install scripts, systemconfigurator, etc).
Moreover we can define a set of error codes to pass to the shellout routine; in this way we could communicate to the monitor server the particular error that happened during a client installation (i.e. I/O error, out of disk space, disk not found, etc.).
Any ideas, feedbacks, suggestions, etc. are welcome...
Regards, -Andrea
-- Andrea Righi System Management Group - CINECA - http://www.cineca.it Via Magnanelli 6/3 40033 Casalecchio di Reno (BO) - Italy e-mail: [EMAIL PROTECTED]
diff -urN --exclude CVS systemimager/etc/autoinstallscript.template systemimager-monitor/etc/autoinstallscript.template --- systemimager/etc/autoinstallscript.template 2005-02-15 18:14:54.000000000 +0100 +++ systemimager-monitor/etc/autoinstallscript.template 2005-02-15 20:26:18.000000000 +0100 @@ -31,6 +31,25 @@ ##SET_IMAGENAME## ##SET_OVERRIDES## +# Get initial information to send to the monitor server. +if [ ! -z $MONITOR_URL ]; then + mac=`ifconfig $DEVICE | sed -ne "s/.*HWaddr //p" | sed "s/ //g"` + cpu=`cat /proc/cpuinfo | grep "model name" | sed "s/.*: //"`\ -\ `cat /proc/cpuinfo | grep "cpu MHz" | sed "s/.*: //"`MHz + mem=`cat /proc/meminfo | sed -ne "s/MemTotal: *//p" | sed "s/ kB//"` + + elapsed=`expr $(cat /proc/uptime | sed "s/\..*//") / 60` + wget -qq -O /dev/null ${MONITOR_URL}?\ +mac=`echo $mac | sed "s/:/%3a/g"`\&\ +action=start\&\ +ip=$IPADDRESS\&\ +netmask=$NETMASK\&\ +eth=$DEVICE\&\ +cpu=`echo $cpu | sed "s/ /%20/g"`\&\ +mem=$mem\&\ +elapsed=$elapsed + +fi + ### BEGIN Check to be sure this not run from a working machine ### # Test for mounted SCSI or IDE disks mount | grep [hs]d[a-z][1-9] > /dev/null 2>&1 @@ -138,6 +157,9 @@ echo "Quietly installing image... " start_spinner fi + if [ ! -z $MONITOR_URL ]; then + start_monitor_task + fi if [ "${TMPFS_STAGING}" = "yes" ]; then # Deposit image into tmpfs @@ -170,6 +192,9 @@ # Leave notice of which image is installed on the client echo $IMAGENAME > /a/etc/systemimager/IMAGE_LAST_SYNCED_TO || shellout +if [ ! -z $MONITOR_URL ]; then + stop_monitor_task 0 +fi ### BEGIN generate new fstab file from autoinstallscript.conf ### ##GENERATE_FSTAB## diff -urN --exclude CVS systemimager/initrd_source/skel/etc/init.d/functions systemimager-monitor/initrd_source/skel/etc/init.d/functions --- systemimager/initrd_source/skel/etc/init.d/functions 2005-02-09 18:25:09.000000000 +0100 +++ systemimager-monitor/initrd_source/skel/etc/init.d/functions 2005-02-15 20:33:57.000000000 +0100 @@ -218,6 +218,9 @@ # Usage: $COMMAND || shellout # shellout() { + if [ ! -z $REPORT_PID ]; then + stop_report_task -1 + fi COUNT="$RETRY" echo "Killing off running processes." kill -9 $TMPFS_WATCHER_PID >/dev/null 2>/dev/null @@ -1237,6 +1240,71 @@ # ################################################################################ # +# Report installation status to the monitor server +# + +start_report_task() { + # Evaluate image size. + IMAGESIZE=`rsync -av $IMAGESERVER::$IMAGENAME | grep "total size" | sed -e "s/total size is \([0-9]*\).*/\1/"` + IMAGESIZE=`expr $IMAGESIZE / 1024` + + # Evaluate disks size. + TOT=0; LIST=`df 2>/dev/null | sed -ne "/^\/dev/p" | sed "s/ */ /g" | cut -d' ' -f3` + for size in $LIST; do + TOT=`expr $TOT + $size` + done + DISKSIZE=$TOT + + # MAC address is the primary key to identify a client -AR- + mac=`ifconfig $DEVICE | sed -ne "s/.*HWaddr //p" | sed "s/ //g"` + + # Spawn the report task -AR- + { + while :; do + TOT=0; LIST=`df 2>/dev/null | sed -ne "/^\/dev/p" | sed "s/ */ /g" | cut -d' ' -f3` + for size in $LIST; do + TOT=`expr $TOT + $size` + done + status=`echo "($TOT - $DISKSIZE) * 100 / $IMAGESIZE" | bc` + if [ $status -eq 0 ]; then + status=1 + fi + + # Send status to the monitor server -AR- + elapsed=`expr $(cat /proc/uptime | sed "s/\..*//") / 60` + wget -qq -O /dev/null ${MONITOR_URL}?\ +action=refresh\&\ +mac=`echo $mac | sed "s/:/%3a/g"`\&\ +elapsed=$elapsed\&\ +status=$status + + # Wait 30 sec between each report -AR- + sleep 30 + done + }& + REPORT_PID=$! +} +# +################################################################################ +# +# Stop to report installation status to the monitor server +# + +stop_report_task() { + status=$1 + kill -9 $REPORT_PID + + # Try to report the error to the monitor server. + elapsed=`expr $(cat /proc/uptime | sed "s/\..*//") / 60` + wget -qq -O /dev/null ${MONITOR_URL}?\ +mac=`echo $mac | sed "s/:/%3a/g"`\&\ +action=stop\&\ +status=$status\&\ +elapsed=$elapsed +} +# +################################################################################ +# # Beep incessantly # beep_incessantly() {