#/bin/bash if [ -z "$1" ]; then echo "Missing Server Configuration File" exit 1 fi if [ "$1" == "--help" ]; then echo "usage: " echo "remoteMonitors " echo " can be start, stop, or check" echo "start starts the monitors" echo "stop stops running monitors" echo "check shows status of monitors" echo "update updates secondo on remote server via CVS" echo "createHomes creates secondo database directories on remote computers" echo "copycfg copies configuration files to remote computers" echo echo "each line within the config file has to be in format" echo " [ [ [ []]]]" echo "" echo " : the host name at that the monitor should run" echo " : the bin directory of the Secondo to be started" echo " : configuration file to use, must be exist on server side" echo " : overwrite the database directory specified in the configuration file" echo " if not used, but later arguments should be set, use a dollar sign " echo " as place holder" echo " : overwrite the monitor port specified in the configuration file" echo " if not used, but later arguments should be set, use a dollar sign " echo " as place holder" echo " : user which performs the command on the remote machine" exit fi if [ -z "$2" ]; then echo "second parameter missing " exit 1; fi config=$1 action=$2 if [ $action != start ]; then if [ $action != stop ]; then if [ $action != check ]; then if [ $action != update ]; then if [ $action != createHomes ]; then if [ $action != copycfg ]; then echo "invalid action" echo allowed are start, stop, update, and check exit 1 fi fi fi fi fi fi function createHomesLine { if [ -z "$1" ]; then # empty line return fi server=$1 home=$4 if [ -z "$home" ]; then echo "no home specified for server $server" return fi if [ -n "$6" ]; then user="$6@" fi ssh "$user$server mkdir -p $home" } function copyConfigLine { if [ -z "$1" ]; then # empty line return fi server=$1 cfg=$2 bin=$3 if [ -z "$bin" ]; then echo "no bin directory specified for server $server" return fi if [ -n "$6" ]; then user="$6@" fi scp $cfg $user$server:$bin } # global variable holding server values # to avoid multiple update on a single server usedServers="" function updateLine { if [ -z "$1" ]; then # empty line return fi server=$1 if [ -n "$6" ]; then user="$6@" fi secBin=$3; # check whether server was already updatet if [[ $usedServers == *"$server"* ]]; then echo "Server $server already processed" return fi echo "update server $server" usedServers="$usedServers $server" if [ -z "$3" ]; then remotedir=$(ssh "$user$server" 'source $HOME/.bashrc; echo $SECONDO_BUILD_DIR') else remotedir=$3 fi echo "remote SECONDO_BUILD_DIR= $remotedir" if [ -z "$remotedir" ]; then echo "cannot determine SECONDO_BUILD_DIR on server $server" return fi # copy current makefile.algebras to remote server scp $SECONDO_BUILD_DIR/makefile.algebras $user$server:$remotedir/ script=UpdateMonitortemp.sh echo 'source $HOME/.bashrc' >$script echo "cd $remotedir" >>$script echo 'cvs update -PdA' >>$script echo 'make' >> $script echo >>$script ssh $user$server 'bash -s' <$script rm $script echo "Server $server processed" return } function startLine { if [ -z "$1" ]; then # empty line return fi if [ -z "$2" ]; then # empty line echo "invalid format in line" $* return fi server=$1 config=$2 if [ -n "$4" ]; then if [ "$4" != "$" ]; then home="-d $4" fi fi if [ -n "$5" ]; then if [ "$5" != "$" ]; then port="-p $5" fi fi if [ -n "$6" ]; then user="$6@" fi script=runMonitortemp.sh if [ -z "$3" ]; then echo 'cd $HOME/secondo/bin' >$script else echo cd $3 >$script fi echo 'source $HOME/.secondorc' >> $script echo export SECONDO_CONFIG=$config >>$script echo 'if [ ! -e $SECONDO_CONFIG ]; then' >>$script echo ' echo configuration file $SECONDO_CONFIG not found an server ' $server >>$script echo ' exit' >>$script echo 'fi' >>$script if [ -z "$port" ]; then echo 'port=$(grep ^SecondoPort ${SECONDO_CONFIG} | sed -e "s@SecondoPort=@@g" | sed -e "s@\s@@g")' >>$script else echo "port=$5" >>$script fi echo 'if [ -z "$TMPDIR" ]; then' >>$script echo ' export TMPDIR=/tmp' >>$script echo 'fi' >>$script echo 'tmpfile="$TMPDIR/SM_${port}.lck"' >>$script echo 'if [ -e $tmpfile ]; then' >>$script echo 'echo "SecondoMonitor already running on port ${port}"' >>$script echo 'exit 1' >>$script echo 'fi' >>$script echo "nohup ./SecondoMonitor -s $home $port -c $config >SecondoMonitor.log "'2>&1 &' >>$script echo 'pid=$!' >>$script echo 'echo $pid >$tmpfile' >>$script echo 'w=$(ps -p $pid | wc -l )' >>$script echo 'if [ "$w" == "2" ]; then' >>$script echo ' echo Monitor is running now at port $port' >>$script echo 'else' >>$script echo ' echo Could not start Monitor on port $port' >> $script echo ' rm $tmpfile' >>$script echo 'fi' >> $script echo Try to start monitor on server $server ssh $user$server 'bash -s' <$script rm $script } function stopLine { if [ -z "$1" ]; then # empty line return fi if [ -z "$2" ]; then # at least server and config are required echo "invalid format in line" $* return fi server=$1 config=$2 if [ -n "$4" ]; then if [ "$4" != "$" ]; then home="$-d $4" fi fi if [ -n "$5" ]; then if [ "$5" != "$" ]; then port="-p $5" fi fi if [ -n "$6" ]; then user="$6@" fi script=stopMonitortemp.sh if [ -z "$3" ]; then echo 'cd $HOME/secondo/bin' >$script else echo cd $3 >$script fi echo export SECONDO_CONFIG=$config >>$script echo 'if [ ! -e $SECONDO_CONFIG ]; then' >>$script echo ' echo configuration file $SECONDO_CONFIG not found an server ' $server >>$script echo ' exit' >>$script echo 'fi' >>$script if [ -z "$port" ]; then echo 'port=$(grep ^SecondoPort ${SECONDO_CONFIG} | sed -e "s@SecondoPort=@@g" | sed -e "s@\s@@g")' >>$script else echo "port=$5" >>$script fi echo 'if [ -z "$TMPDIR" ]; then' >>$script echo ' export TMPDIR=/tmp' >>$script echo 'fi' >>$script echo 'tmpfile="$TMPDIR/SM_${port}.lck"' >>$script echo 'if [ ! -e $tmpfile ]; then' >>$script echo 'echo "SecondoMonitor not running on port ${port}"' >>$script echo 'exit 1' >>$script echo 'fi' >>$script echo 'pid=$(cat $tmpfile)' >>$script echo 'gid=$(ps -p $pid -o pgid | sed -e "s@[a-zA-Z]@@g" )' >>$script echo 'gid=$(echo $gid | sed -e "s@\s@@g")' >>$script echo 'if [ -n "$gid" ]; then' >>$script echo 'kill -9 -$gid' >>$script echo 'fi' >>$script echo 'rm $tmpfile' >>$script echo Try to stop monitor on server $server ssh $user$server 'bash -s' <$script rm $script } function checkLine { if [ -z "$1" ]; then # empty line return fi if [ -z "$2" ]; then # at least server and config are required echo "invalid format in line" $* return fi server=$1 config=$2 if [ -n "$4" ]; then if [ "$4" != "$" ]; then home="-d $4" fi fi if [ -n "$5" ]; then if [ "$5" != "$" ]; then port="-p $5" fi fi if [ -n "$6" ]; then user="$6@" fi script=checkMonitortemp.sh if [ -z "$3" ]; then echo 'cd $HOME/secondo/bin' >$script else echo cd $3 >$script fi echo export SECONDO_CONFIG=$config >>$script echo 'if [ ! -e $SECONDO_CONFIG ]; then' >>$script echo ' echo configuration file $SECONDO_CONFIG not found on server ' $server >>$script echo ' exit' >>$script echo 'fi' >>$script if [ -z "$port" ]; then echo 'port=$(grep ^SecondoPort ${SECONDO_CONFIG} | sed -e "s@SecondoPort=@@g" | sed -e "s@\s@@g")' >>$script else echo "port=$5" >>$script fi echo 'if [ -z "$TMPDIR" ]; then' >>$script echo ' export TMPDIR=/tmp' >>$script echo 'fi' >>$script echo 'tmpfile="$TMPDIR/SM_${port}.lck"' >>$script echo 'if [ ! -e $tmpfile ]; then' >>$script echo 'echo "SecondoMonitor not running on port ${port} at " ' $server >>$script echo 'exit 1' >>$script echo 'fi' >>$script echo 'pid=$(cat $tmpfile)' >>$script echo 'x=$(ps -p $pid | wc -l)' >>$script echo 'if [ "$x" == "2" ]; then ' >>$script echo ' echo Monitor is running on port $port at ' $server >> $script echo "else " >>$script echo " echo Monitor should run but is not active, delete runnning marker" >> $script echo ' rm $tmpfile' >>$script echo "fi" >>$script echo Try to check monitor on server $server ssh $user$server 'bash -s' <$script rm $script } if [ $action == start ]; then while read line; do copyConfigLine $line; startLine $line ;done <$1 else if [ $action == stop ]; then while read line; do stopLine $line ;done <$1 else if [ $action == check ]; then while read line; do checkLine $line ;done <$1 else if [ $action == update ]; then while read line; do updateLine $line ;done <$1 else if [ $action == copycfg ]; then while read line; do copyConfigLine $line ;done <$1 else if [ $action == createHomes ]; then while read line; do createHomesLine $line ;done <$1 else echo "unknown command" fi fi fi fi fi fi