#!/bin/bash # Maintenance: # * Recfactored from original version (2016-07-04) on 2017-04-07 by Sebastian J. # Bronner . # * Modified: 2017-05-19 by Sebastian J. Bronner DEFAULT_BINDIR='$HOME/secondo/bin' function die { for arg do echo "$arg" >&2 done echo >&2 echo "Usage : $0 " >&2 echo "Details: $0 --help" >&2 exit 1 } function printUsage { cat << EOF Usage: $0 can be start, stop, check, update, or mkdbdir:" 'start' starts the monitors in . 'stop' stops any running monitors in . 'check' shows the status of the monitors in . 'update' updates Secondo via CVS on all s in . 'mkdbdir' creates the database directories specified in . Each line within has to be in the following format: [ [ [ []]]] : the hostname where the monitor should be run : configuration file to use, must exist on server side : the Secondo bin directory containing the SecondoMonitor executable : overwrite the database directory specified in the configuration file if not used, but later arguments should be set, use a dollar sign as place holder : overwrite the monitor port specified in the configuration file if not used, but later arguments should be set, use a dollar sign as place holder : user with which to run command on the remote machine, including the monitor EOF exit } function startLine { echo -n "$userhost${port:+:}$port ... " ssh "$userhost" 'bash -s' << EOF set -e . \$HOME/.secondorc cd ${bindir:-$DEFAULT_BINDIR} port=${port:-\$(sed -rn 's/^SecondoPort=([^#[:space:]]*)[[:space:]]*(#.*$)?/\1/p' $conffile)} test "\$TMPDIR" || export TMPDIR=/tmp tmpfile="\$TMPDIR/SM_\$port.lck" if [ -e "\$tmpfile" ] then echo "failed! A SecondoMonitor (pid \$(cat "\$tmpfile")) is already running on port \$port." exit fi nohup ./SecondoMonitor -s -c $conffile ${dbdir:+-d }$dbdir ${port:+-p }$port > SecondoMonitor.log 2>&1 & pid=\$! echo \$pid > "\$tmpfile" if ps --no-headers -p \$pid > /dev/null then echo "started with pid \$pid$(test "$port" || echo " on port \$port")." else echo "failed! The SecondoMonitor process (pid \$pid) disappeared unexpectedly." rm "\$tmpfile" fi EOF test $? -eq 0 || echo 'failed!' } function stopLine { echo -n "$userhost${port:+:}$port ... " ssh "$userhost" 'bash -s' << EOF set -e cd ${bindir:-$DEFAULT_BINDIR} port=${port:-\$(sed -rn 's/^SecondoPort=([^#[:space:]]*)[[:space:]]*(#.*$)?/\1/p' $conffile)} test "\$TMPDIR" || export TMPDIR=/tmp tmpfile="\$TMPDIR/SM_\$port.lck" if [ ! -e "\$tmpfile" ] then echo "done. No SecondoMonitor was found running on port \$port." exit fi pid=\$(cat "\$tmpfile") if ! pgid=\$(ps --no-headers -p \$pid -o pgid) then echo "done. No SecondoMonitor was found with pid \$pid." rm "\$tmpfile" exit fi pgid=\$(echo \$pgid) if kill -s 9 -\$pgid then echo "done." rm "\$tmpfile" else echo "failed! The SecondoMonitor on port \$port with pid \$pid could not be killed." fi EOF test $? -eq 0 || echo 'failed!' } function checkLine { echo -n "$userhost${port:+:}$port ... " ssh "$userhost" 'bash -s' << EOF set -e cd ${bindir:-$DEFAULT_BINDIR} port=${port:-\$(sed -rn 's/^SecondoPort=([^#[:space:]]*)[[:space:]]*(#.*$)?/\1/p' $conffile)} test "\$TMPDIR" || export TMPDIR=/tmp tmpfile="\$TMPDIR/SM_\$port.lck" if [ ! -e "\$tmpfile" ] then echo "NOT RUNNING!$(test "$port" || echo " (port \$port)")" exit fi pid=\$(cat "\$tmpfile") if ps --no-headers -p \$pid > /dev/null then echo "running with pid \$pid$(test "$port" || echo " on port \$port")." else echo "NOT RUNNING! (pid \$pid$(test "$port" || echo ", port \$port")), removing marker." rm "\$tmpfile" fi EOF test $? -eq 0 || echo 'ERROR!' } function updateLine { # Check whether $userhost was already updated and update the list of already # updated userhosts and their update status. for u in "${updated[@]}" do test "$u" == "$userhost" && return done n=${#updated[@]} updated[n]="$userhost" status[n]='not started' # Label the output. echo echo "> > > $userhost < < <" echo # Determine $remotedir. if [ "$bindir" ] then remotedir="${bindir%/bin}" else remotedir="$(ssh "$userhost" '. $HOME/.bashrc; echo $SECONDO_BUILD_DIR')" if [ -z "$remotedir" ] then echo "Can't determine SECONDO_BUILD_DIR for $userhost!" status[n]='aborted, no SECONDO_BUILD_DIR' return fi fi echo "Remote SECONDO_BUILD_DIR: $remotedir" # Copy current makefile.algebras to $userhost. scp "$SECONDO_BUILD_DIR/makefile.algebras" "$userhost:$remotedir/" status[n]='aborted, copied makefile.algebras' # Run the update. ssh "$userhost" 'bash -s' << EOF set -e . \$HOME/.secondorc cd $remotedir cvs update -PdA make EOF test $? == 0 && status[n]='complete' || status[n]='aborted with remote errors' } function mkdbdirLine { test -z "$dbdir" && echo "no dbdir specified in line '$*'." && return ssh "$userhost" mkdir -p "$dbdir" } # Check specified on commandline. test "$1" || die "No was specified." test "$1" == '--help' && printUsage test -r "$1" || die "Unable to read '$1'." # Check specified on commandline. test "$2" || die "No was specified." method="${2}Line" declare -f "$method" > /dev/null || die "The '$2' is not valid." # Execute for every line in . while read server conffile bindir dbdir port user rest do test "$server" || return # empty line test -z "$conffile" && echo "Invalid format in line '$*'." && return test "$bindir" == '$' && unset bindir test "$dbdir" == '$' && unset dbdir test "$port" == '$' && unset port test "$user" == '$' && unset user userhost="$user${user:+@}$server" $method done < $1 # Perform some post-action stuff. if [ "$2" == 'update' ] then echo echo 'Update Summary' echo for((i=0; i<${#updated[@]}; i++)) do echo "${updated[i]}: ${status[i]}" done fi # vim: textwidth=80:shiftwidth=2:softtabstop=-1:expandtab