#!/usr/bin/env bash
# $Id$
#
# Thomas Dreibholz's PlanetLab Script Collection
# Copyright (C) 2005-2023 by Thomas Dreibholz
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Contact: thomas.dreibholz@gmail.com


. ./planetlab-config


if [ $# -lt 3 ]; then
   echo "Usage: start-process [Process Name] [Process Call] [Server 1] {Server 2} ..."
   exit 1
fi
PROCNAME=$1
PROGCALL=$2
shift
shift


SERVER=$1
if [ x$SERVER = "x" ]; then
   echo "ERROR: No server name/IP given!"
   exit 1
fi

if [ "x$PROGCHK" = "x1" ] ; then
   cd bin
   MD5_LOCAL="`md5sum $DISTPRGS`"
   cd ..
fi

while [ ! x$1 = "x" ] ; do
   SERVER=$1
   shift

   PIDFILE=$PROCNAME-$SERVER.pid

   echo -e "\x1b[34m`date`: Contacting $SERVER ...\x1b[0m"
   if [ -e $PIDFILE ]; then
      echo "ERROR: PID file $PIDFILE already exists!"
      exit 1
   fi

   # Achtung:
   # Option -t sorgt dafür, daß Pseudo-Terminal erzeugt wird.
   # Optionen -t -t erzwingen Erstellung von Pseudo-Terminal, auch wenn stdin keines ist!
   # -> Lokaler ssh-Abbruch -> Abbruch der entfernten Prozesse.
   ( ssh -t -t -C -i $PLANETLAB_KEY -oStrictHostKeyChecking=no -oPasswordAuthentication=no $PLANETLAB_USER@$SERVER " \
        cd ~/bin && \
        ulimit -c unlimited && \
        if [ \"x$PROGCHK\" = \"x1\" ] ; then \
           MD5_REMOTE=\"\`md5sum $DISTPRGS\`\" && \
           if [ \"x$MD5_LOCAL\" != \"x\$MD5_REMOTE\" ] ; then \
              echo \"ERROR on $SERVER: Different program versions!\" ; \
              echo \"local:  $MD5_LOCAL\" ; \
              echo \"remote: \$MD5_REMOTE\" ; \
              exit 1 ; \
           fi \
        fi && \
        echo \"`date`: $SERVER> $PROGCALL\" | head -c125 | xargs -i§ echo §... && \
        $PROGCALL" 2>&1 &
     echo $! >$PIDFILE )  | grep -v "tcgetattr: Inappropriate ioctl for device" &
   # This is necessary to get rid of the stupid tcgetattr error prints, but
   # store ssh's PID instead of grep's PID!

   # echo `date`: START `cat $PIDFILE` -- $PROCNAME >$RANDOM-$RANDOM.td0
done
