#!/bin/bash # Author: Ferdi Franceschini (ffr@ansto.gov.au) # Author: Douglas Clowes (dcl@ansto.gov.au) # Deploys SICServer and configuration files to # an instrument control computer. # It requires a MANIFEST.TXT file for each instrument # INSTCFCOMMON.TXT file contains paths to the common configuration files # used by the instrument specific configurations, it should be placed in # the 'config' directory for each instrument. The paths are relative # to the instrument source directory. This file is optional. usage() { cat <.nbi... or ics1-test.nbi... for test TARGET_DIR is the top part of the directory tree defaults to /usr/local or /usr/local/TEST_SICS/ for test tail directories in TARGET_DIR will be created on TARGET_HOST if necessary. Examples: ./deploySICS.sh -n echidna prepares deployment of echidna (./hrpd) to directory /usr/local/sics on isc1-echidna.nbi.ansto.gov.au ./deploySICS.sh -n reflectometer/test prepares deployment of platypus (./reflectometer) to directory usr/local/TEST_SICS/platypus on isc1-test.nbi.ansto.gov.au ./deploySICS.sh -n test/echidna localhost $HOME prepares deployment of echidna (./hrpd) to directory $HOME/TEST_SICS/echidna on localhost EOF } init_file_map() { echo -n "" >$FILEMAP echo "TEMPDIR=$TEMPDIR" >>$FILEMAP echo "SRCDIR=$PWD" >>$FILEMAP echo "DESTDIR=$DESTDIR" >>$FILEMAP echo "SICS_SITE=$(bash ../extract_version.sh SITE)" >>$FILEMAP echo "SICS_VERSION=$(bash ../extract_version.sh VERSION)" >>$FILEMAP echo "SICS_REVISION=$(bash ../extract_version.sh REVISION)" >>$FILEMAP } # Copy sics server configuration files to a given destination # Usage: copy_server_config SERVER_DIRECTORY copy_server_config() { sicserver_path=$1 cp -v -a --preserve=timestamps $COMMON $INSTSPEC $TEMPDIR/$DESTDIR/$sicserver_path >>$FILEMAP if [ -e $INSTCFDIR/INSTCFCOMMON.TXT ]; then for f in $(cat $INSTCFDIR/INSTCFCOMMON.TXT); do cp -v --parents --preserve=timestamps $f $TEMPDIR/$DESTDIR/$sicserver_path >>$FILEMAP done fi } # Set shell matches to be case insensitive shopt -s nocasematch # If the first argument is "-n" then it is a dry-run only if [[ "$1" = "-n" ]] then DEPLOY="NO" shift else DEPLOY="YES" fi # If the wrong number of arguments is given, print usage info and exit if [ $# -eq 0 -o $# -gt 3 ] then usage exit 1 fi # Allow test/animal or animal/test or just animal # animal produces TESTING=".", INSTRUMENT=animal # test/animal produces TESTING=test, INSTRUMENT=animal # animal/test produces TESTING=animal, INSTRUMENT=test (we then swap them) TESTING=$(dirname "$1") INSTRUMENT=$(basename "$1") if [[ "$INSTRUMENT" = "test" ]] then TESTING=$(basename "$1") INSTRUMENT=$(dirname "$1") fi SRCDIR="." TEMPDIR=$HOME/tmp # We allow the instrument to be specified as either the animal name or the # mnemonic as we have to map between the two. This is because the source # directory is named by the mnemonic and the destination directory is named by # the animal. Any instrument-specific processing should be done within the case. # Set the destination host # instrument name and the # instrument src directory SICSDIR=sics case $INSTRUMENT in echidna|hrpd) INSTRUMENT=echidna DESTHOST=${2:-ics1-echidna.nbi.ansto.gov.au} INSTSRC=$SRCDIR/hrpd;; wombat|hipd) INSTRUMENT=wombat DESTHOST=${2:-ics1-wombat.nbi.ansto.gov.au} INSTSRC=$SRCDIR/hipd;; koala|qld) INSTRUMENT=koala DESTHOST=${2:-ics1-koala.nbi.ansto.gov.au} INSTSRC=$SRCDIR/qld;; platypus|reflectometer) INSTRUMENT=platypus DESTHOST=${2:-ics1-platypus.nbi.ansto.gov.au} INSTSRC=$SRCDIR/reflectometer;; kowari|rsd) INSTRUMENT=kowari DESTHOST=${2:-ics1-kowari.nbi.ansto.gov.au} INSTSRC=$SRCDIR/rsd;; quokka|sans) INSTRUMENT=quokka DESTHOST=${2:-ics1-quokka.nbi.ansto.gov.au} INSTSRC=$SRCDIR/sans;; pelican|pelican) INSTRUMENT=pelican DESTHOST=${2:-ics1-pelican.nbi.ansto.gov.au} INSTSRC=$SRCDIR/pelican;; lyrebird|lyrebird) INSTRUMENT=lyrebird DESTHOST=${2:-ics1-taipan.nbi.ansto.gov.au} SICSDIR=nbi/sics/lyrebird INSTSRC=$SRCDIR/lyrebird;; taipan|tas) INSTRUMENT=taipan DESTHOST=${2:-ics1-taipan.nbi.ansto.gov.au} SICSDIR=nbi/sics/taipan INSTSRC=$SRCDIR/tas;; kookaburra|kookaburra) INSTRUMENT=kookaburra DESTHOST=${2:-ics1-kookaburra.nbi.ansto.gov.au} INSTSRC=$SRCDIR/kookaburra;; dingo|dingo) INSTRUMENT=dingo DESTHOST=${2:-ics1-dingo.nbi.ansto.gov.au} INSTSRC=$SRCDIR/dingo;; bilby|bilby) INSTRUMENT=bilby DESTHOST=${2:-ics1-bilby.nbi.ansto.gov.au} INSTSRC=$SRCDIR/bilby;; emu|emu) INSTRUMENT=emu DESTHOST=${2:-ics1-emu.nbi.ansto.gov.au} INSTSRC=$SRCDIR/emu;; esac INSTCFDIR=$INSTSRC/config # Perform any instrument-specific make processing make -C ../ $INSTRUMENT || exit $? # Set up the staging directories and, if testing, the testing parts if [[ "$TESTING" = "test" ]] then DESTHOST=${2:-ics1-test.nbi.ansto.gov.au} DESTDIR=${3:-/usr/local}/TEST_SICS/$INSTRUMENT TARDIR=${DESTDIR:1} # step down to the sics directory DESTDIR=$DESTDIR/$SICSDIR else DESTDIR=${3:-/usr/local}/$SICSDIR TARDIR=${DESTDIR:1} fi # remove and recreate the temporary directory rm -fr $TEMPDIR/$DESTDIR mkdir -p $TEMPDIR/$DESTDIR/newserver FILEMAP=$TEMPDIR/$DESTDIR/newserver/FILEMAP.TXT init_file_map # Notify progress and intention echo "Deploying $INSTRUMENT to $DESTHOST:$DESTDIR" # Set up the commands that we will be using for the "deploy" phase EXTRACT_CMDS="tar vxzp -C /; touch /$DESTDIR/{DataNumber,extraconfig.tcl,newserver/config/nexus/nexus.dic,script_validator/DataNumber}" if [[ "$DESTHOST" = "localhost" ]] then EXTRACT=$EXTRACT_CMDS EXTRACT_NODEPLOY=$EXTRACT_CMDS elif [[ "$TESTING" != "test" ]] then EXTRACT="ssh $DESTHOST $EXTRACT_CMDS; chown -R root:root /$DESTDIR/newserver; chown ${INSTRUMENT}_sics. /$DESTDIR/{DataNumber,newserver/config/nexus/nexus.dic,script_validator/{DataNumber,data}}; chown ${INSTRUMENT}. /$DESTDIR/extraconfig.tcl" EXTRACT_NODEPLOY="ssh $DESTHOST $EXTRACT_CMDS; chown -R root:root /$DESTDIR/newserver; chown ${INSTRUMENT}_sics. /$DESTDIR/{DataNumber,newserver/config/nexus/nexus.dic}; chown ${INSTRUMENT}. /$DESTDIR/extraconfig.tcl" else EXTRACT="ssh $DESTHOST $EXTRACT_CMDS" EXTRACT_NODEPLOY="ssh $DESTHOST $EXTRACT_CMDS" fi # Ensure that we have the needed manifest files if [ ! -e $SRCDIR/MANIFEST.TXT ] then echo "$SRCDIR/MANIFEST.TXT not found" exit 1 fi if [ ! -e $INSTSRC/MANIFEST.TXT ] then echo "$INSTSRC/MANIFEST.TXT not found" echo "You must list the files required for $INSTRUMENT in the manifest" exit 1 fi # Get list of files to copy and prepend directory name COMMON=$(for f in $(cat $SRCDIR/MANIFEST.TXT); do echo -n "$SRCDIR/$f "; done) INSTSPEC=$(for f in $(cat $INSTSRC/MANIFEST.TXT); do echo -n "$INSTSRC/$f "; done) # Create Instrument Control Server directories and copy SICS configs to the 'server' directory mkdir -p $TEMPDIR/$DESTDIR/{batch,newserver,log,tmp} copy_server_config newserver cp -v -a --preserve=timestamps ../SICServer $TEMPDIR/$DESTDIR/newserver >>$FILEMAP # Create Script Validator directories mkdir -p $TEMPDIR/$DESTDIR/script_validator/{data,log,tmp} # Create a manifest of the files installed on the IC host echo "Date: $(date -Iminutes)" > $TEMPDIR/$DESTDIR/newserver/DEPLOYMENT.TXT echo "User: $USER" >> $TEMPDIR/$DESTDIR/newserver/DEPLOYMENT.TXT DEPLOYED_VERSION="$(bash ../extract_version.sh all)" echo "Version:" $DEPLOYED_VERSION >> $TEMPDIR/$DESTDIR/newserver/DEPLOYMENT.TXT cat $SRCDIR/MANIFEST.TXT $SRCDIR/$INSTSRC/MANIFEST.TXT > $TEMPDIR/$DESTDIR/newserver/MANIFEST.TXT cd $TEMPDIR # remove any .svn directories rm -rf $(find $TARDIR -type d -name .svn) # remove any temporary editor files find $TARDIR -type f -name .\*.sw\? -exec rm {} \; # remove any editor backup files directories find $TARDIR -type f -name \*~ -exec rm {} \; # remove any compiled python files find $TARDIR -type f -name \*.pyc -exec rm {} \; # set modes for files find $TARDIR -type f -exec chmod u-s,g-x+wr,o-wx+r {} \; find $TARDIR -type f -perm -100 -exec chmod go+x {} \; # set modes for directories find $TARDIR -type d -exec chmod u+rwx,g+rwxs,o-w+rx {} \; # Strip leading / from DESTDIR and extract to destination if [[ "$DEPLOY" = "YES" ]] then if [[ "$DESTHOST" = "localhost" ]] then eval "tar -cz ${TARDIR} | $EXTRACT" else tar -cz ${TARDIR} | $EXTRACT fi else echo "tar -cz -C $TEMPDIR $TARDIR | $EXTRACT_NODEPLOY" fi