#!?SHELL_EXECUTION?

#########################################################################
# COPYRIGHT (C) 2003         EDF R&D              WWW.CODE-ASTER.ORG    #
#                                                                       #
# 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 2 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, WRITE TO : EDF R&D CODE_ASTER,       #
#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        #
#########################################################################

# $Id: as_exec 1203 2006-08-03 16:39:19Z mcourtoi $
# $HeadURL: svn://aster.cla.edfgdf.fr/astk/tags/v1.5.0/ASTK_SERV/bin/as_exec $
# as_exec : excute Aster selon le contenu du profil fourni

#########################################################################
# rpertoire qui accueille output+error (on ajoute $HOME devant)
FLASH=`egrep '^[ ]*flash_srv[ ]+:' $SCON/config | awk '{print $3}'`

# rpertoire temporaire (criture pour tous)
TMP=`egrep '^[ ]*rep_tmp[ ]+:' $SCON/config | awk '{print $3}'`

#########################################################################
# arguments
err=-1
if [ $# -eq 1 ]; then
   fich=$1
   err=0
fi

if [ $err -lt 0 ]; then
   echo "usage : as_serv as_exec user@mach:/nom_profil"
   exit 1
fi

#########################################################################
# temporaire des services (ne pas l'effacer)
jn=$$
if [ -n "$USER" ]; then
   who=$USER
else
   if [ -n "$LOGNAME" ]; then
      who=$LOGNAME
   else
      who=`whoami`
   fi
fi
TMP=$TMP/astk_$who
if [ ! -d $TMP ]; then
   mkdir -p $TMP
fi
chmod 755 $TMP

# rpertoire flash
FLASH=$HOME/$FLASH
if [ ! -d $FLASH ]; then
   mkdir -p $FLASH
fi


#########################################################################
# profil
prof=$FLASH/prof_run.$jn
pr_astk=$TMP/profil_astk.$jn
if [ `echo $fich | grep -c '@'` -ne 0 ]; then
   $RCP_CMD $fich $pr_astk > /dev/null 2>&1
else
   \cp $fich $pr_astk > /dev/null 2>&1
fi
if [ ! -f $pr_astk ]; then
   echo "Profile copy failed"
   exit 2
fi

# mode interactif ou batch
mode=`egrep '^P[ ]+mode[ ]+' $pr_astk | awk '{print $3}'`

#########################################################################
# version de ASTK serveur
serv_vers=`echo '\$HeadURL: svn://aster.cla.edfgdf.fr/astk/tags/v1.5.0/ASTK_SERV/bin/as_exec $' | sed -e 's#\$HeadURL.*/astk/tags/v##g' \
   -e 's#/.*$##g' -e 's#_#.#g' | awk -F'.' '{printf("%02d.%02d.%02d",$1,$2,$3);}'`

client_vers=`egrep '^P[ ]+origine[ ]+ASTK[ ]+' $pr_astk | awk '{print $4}' \
   | awk -F'.' '{printf("%02d.%02d.%02d",$1,$2,$3);}'`

# CARACTERES INTERDITS dans ASTK_MESSAGE : "'

ASTK_MESSAGE=""
if [ $client_vers != $serv_vers ]; then
   ASTK_MESSAGE="######################################################################\n\nWARNING : ASTK Server version ($serv_vers) differs from\n          ASTK Client version ($client_vers).\n          An update from Server or Client is necessary.\n          This execution may fail ! \n          If it works results should be correct.\n\n######################################################################\n\n"
fi

#########################################################################
# rcupre une partie des infos dans le profil
vers=`egrep '^P[ ]+version[ ]+' $pr_astk | awk '{print $3}'`

# serveur, user
serv=`egrep '^P[ ]+serveur[ ]+' $pr_astk | awk '{print $3}'`
user=`egrep '^P[ ]+username[ ]+' $pr_astk | awk '{print $3}'`
# client, user
mcli=`egrep '^P[ ]+mclient[ ]+' $pr_astk | awk '{print $3}'`
ucli=`egrep '^P[ ]+uclient[ ]+' $pr_astk | awk '{print $3}'`
# noeud (facultatif)
inode=`egrep -c '^P[ ]+noeud[ ]+' $pr_astk`
# nom du job
nomjob=`egrep '^P[ ]+nomjob[ ]+' $pr_astk | awk '{print $3}'`

if [ $inode -eq 0 ]; then
   node=$serv
else
   node=`egrep '^P[ ]+noeud[ ]+' $pr_astk | awk '{print $3}'`
fi

# plate-forme
plt=`egrep '^[ ]*plate-forme[ ]+:' $SCON/config | awk '{print $3}'`

# debug/nodebug
dbg=`egrep '^P[ ]+debug[ ]+' $pr_astk | awk '{print $3}'`

# terminal
term=`egrep '^P[ ]+xterm[ ]+' $pr_astk | sed -e  's/^P *xterm *//g'`

# display
display=`egrep '^P[ ]+display[ ]+' $pr_astk | sed -e  's/^P *display *//g'`

# paramtre du job
memjob=`egrep '^P[ ]+memjob[ ]+' $pr_astk | awk -F' ' '{print $3}'`
let 'vmem=memjob/1024'
tpsjob=`egrep '^P[ ]+tpsjob[ ]+' $pr_astk | awk -F' ' '{print $3}'`

# nbre de processeurs
nbp=`egrep '^P[ ]+ncpus[ ]+' $pr_astk | awk '{print $3}'`

# classe
classe=`egrep '^P[ ]+classe[ ]+' $pr_astk | awk -F' ' '{print $3}'`

# heure de depart
depart=`egrep '^P[ ]+depart[ ]+' $pr_astk | awk -F' ' '{print $3}'`

# infos btc
consbtc=`egrep '^P[ ]+consbtc[ ]+' $pr_astk | awk '{print $3}'`

# options de debug/verbose
srv_dbg=`egrep '^P[ ]+srv_dbg[ ]+' $pr_astk | awk '{print $3}'`
srv_verb=`egrep '^P[ ]+srv_verb[ ]+' $pr_astk | awk '{print $3}'`
opts=""
if [ -n "$srv_dbg" ] && [ "$srv_dbg" = "oui" ]; then
   opts="$opts --debug"
fi
if [ -n "$srv_verb" ] && [ "$srv_verb" = "oui" ]; then
   opts="$opts --verbose"
fi

opts="$opts --remote_shell_protocol=$RSH_PROTO --remote_copy_protocol=$RCP_PROTO"

#########################################################################
# entete d'info
ASTK_MESSAGE=$ASTK_MESSAGE"###############################################\n           Client name : ${mcli}\n              Username : ${ucli}\n-----------------------------------------------\n           Server name : ${serv}\n              Username : ${user}\n                  Node : ${node}\n              Platform : ${plt}\n-----------------------------------------------\n    Code_Aster version : ${vers}\n-----------------------------------------------\n            Time (min) : ${tpsjob}\n           Memory (MB) : ${vmem}\n  Number of processors : ${nbp}\n-----------------------------------------------\n            Debug mode : ${dbg}\n"

if [ -n "$classe" ]; then
   ASTK_MESSAGE=$ASTK_MESSAGE" specified batch queue : ${classe}\n"
fi
if [ -n "$depart" ]; then
   ASTK_MESSAGE=$ASTK_MESSAGE"            start time : ${depart}\n"
fi

if [ $consbtc = "oui" ]; then
   msg="generated"
else
   msg="provided by user"
fi
ASTK_MESSAGE=$ASTK_MESSAGE"-----------------------------------------------\n            BTC script : ${msg}\n"

ASTK_MESSAGE=$ASTK_MESSAGE"-----------------------------------------------\n   Version ASTK Server : ${serv_vers}\n   Version ASTK Client : ${client_vers}\n###############################################\n"

export ASTK_MESSAGE

#########################################################################
# si batch et machine de rfrence, on laisse la main  as_exec_ref
if [ $mode = "batch" ] && [ -x $SBIN/as_exec_ref ]; then
   MSG=`$SBIN/as_exec_ref $pr_astk $TMP/$nomjob.u$$`
   iret=$?
   echo $MSG
   JOBID=`echo $MSG | awk -F 'JOBID=' '{print $2}' | awk '{print $1}'`
   if [ -f $TMP/$nomjob.u$$ ]; then
      \mv -f $TMP/$nomjob.u$$ $FLASH/$nomjob.u$JOBID
   fi
   \cp -f $pr_astk $FLASH/$nomjob.p$JOBID
   \rm -f $pr_astk
   exit $iret
fi

#########################################################################
# rpertoire temporaire de l'excution
if [ -f $SCON/config_$node ]; then
   rep_trav=`egrep '^[ ]*rep_trav[ ]+:' $SCON/config_$node | awk '{print $3}'`
fi
if [ -z "$rep_trav" ]; then
   rep_trav=`egrep '^[ ]*rep_trav[ ]+:' $SCON/config | awk '{print $3}'`
fi

#########################################################################
# faut-il garder le rpertoire temporaire
env=`egrep -c '^P[ ]+actions[ ]+make_env' $pr_astk`

#########################################################################
# consbtc ?
fbtc=$FLASH/btc.$jn
if [ $consbtc = "non" ] && [ $env -eq 0 ]; then
# prendre le btc du profil
   fbtc0=`egrep '^F[ ]+btc[ ]+.*[ ]+D' $pr_astk | awk '{print $3}'`
   if [ `echo $fbtc0 | grep -c '@'` -ne 0 ]; then
      $RCP_CMD $fbtc0 $fbtc
   else
      \cp $fbtc0 $fbtc
   fi
   if [ ! -f $fbtc ]; then
      echo "BTC file not found"
      exit 4
   fi
else
# construire le script  lancer
   echo '#!/bin/sh'                                       >  $fbtc
   
   echo "ASTER_VERSION=$vers; export ASTER_VERSION"       >> $fbtc
   if [ -n "$display" ]; then
      echo "DISPLAY=$display; export DISPLAY"             >> $fbtc
   fi
   if [ -f $SCON/aster_profile.sh ]; then
      echo ". $SCON/aster_profile.sh"                     >> $fbtc
   fi
   if [ $mode = "interactif" ]; then
      echo "num_job=$jn"                                  >> $fbtc
      m="i"
   else
      batch_jid=`egrep '^[ ]*batch_jid[ ]+:' $SCON/config | awk '{print $3}'`
      echo "num_job=\`echo \$$batch_jid | awk '{inv=\$0; sub(\"^[0-9]+\",\"\",inv); sub(inv,\"\",\$0); print \$0;}'\`" >> $fbtc
      m="b"
   fi

   echo "# copie du .export dans le flasheur et rep_trav" >> $fbtc
   echo "cat << EOFEXPORT > $FLASH/$nomjob.p\$num_job"    >> $fbtc
   cat $pr_astk                                           >> $fbtc
   echo "EOFEXPORT"                                       >> $fbtc

   # on redfinit car dj arriv en dhcp ou quand on change de noeud...
   echo "LOGNAME=$who; export LOGNAME"                    >> $fbtc

cat << EOF >> $fbtc
# message d'info
printf "$ASTK_MESSAGE\n"

# lance l'exec
$SBIN/as_run $opts $FLASH/$nomjob.p\$num_job --num_job=\$num_job | tee $rep_trav/$nomjob.\$num_job.fort.6.$m
# diagnostic
egrep -- '--- DIAGNOSTIC JOB :' $rep_trav/$nomjob.\$num_job.fort.6.$m | awk '{print \$5}' > $FLASH/$nomjob.$m\$num_job
\rm -f $rep_trav/$nomjob.\$num_job.fort.6.$m

\rm -rf $fbtc
EOF
fi

chmod 755 $fbtc

#########################################################################
# soumbtc ?
JOBID=-1
soum=`egrep '^P[ ]+soumbtc[ ]+' $pr_astk | awk '{print $3}'`
if [ $soum = "oui" ]; then
   if [ $mode = "interactif" ]; then
      JOBID=$jn
      QUEUE=interactif
      if [ `uname -n | sed 's#\..*$##'` = `echo $node | sed 's#\..*$##'` ]; then
         if [ -n "$depart" ]; then
            echo "$fbtc 1> $FLASH/$nomjob.o$JOBID 2> $FLASH/$nomjob.e$JOBID" | at ${depart}
         else
            if [ -z "$term" ]; then
               $fbtc 1> $FLASH/$nomjob.o$JOBID 2> $FLASH/$nomjob.e$JOBID &
            else
               echo "$term -e /bin/sh -c \"$fbtc 2> $FLASH/$nomjob.e$JOBID | tee $FLASH/$nomjob.o$JOBID\" &" > $fbtc.x
               chmod 755 $fbtc.x
               $fbtc.x > /dev/null 2>&1
               \rm -f $fbtc.x
            fi
         fi
      else
         # test de connexion au noeud $node
         \rm -f $TMP/tmp_out
         $RSH_CMD -n $node echo 'hello' 1> $TMP/tmp_out 2>&1
         itest=$?
         if [ $itest -ne 0 ] || [ `grep -c hello $TMP/tmp_out` -ne 1 ]; then
            echo "Connexion failure to $node (from $serv)."
            exit 6
         fi
         if [ -n "$depart" ]; then
            cmd="echo \"$fbtc 1> $FLASH/$nomjob.o$JOBID 2> $FLASH/$nomjob.e$JOBID\" | at ${depart}"
            $RSH_CMD -n $node $cmd
         else
            if [ -z "$term" ]; then
               echo "/bin/sh -c \"$fbtc 1> $FLASH/$nomjob.o$JOBID 2> $FLASH/$nomjob.e$JOBID\" &" > $fbtc.x
               chmod 755 $fbtc.x
               echo "$RSH_CMD -n $node $fbtc.x 1> /dev/null 2> /dev/null" >  $fbtc.xr
               echo "rm -f $fbtc.x $fbtc.xr"                       >> $fbtc.xr
               chmod 755 $fbtc.xr
               $fbtc.xr 1> /dev/null 2> /dev/null &
            else
               echo "$term -e /bin/sh -c \"$fbtc 2> $FLASH/$nomjob.e$JOBID | tee $FLASH/$nomjob.o$JOBID\" &" > $fbtc.x
               chmod 755 $fbtc.x
               echo "$RSH_CMD -n $node $fbtc.x 1> /dev/null 2> /dev/null" >  $fbtc.xr
               echo "rm -f $fbtc.x $fbtc.xr"                       >> $fbtc.xr
               chmod 755 $fbtc.xr
               $fbtc.xr 1> /dev/null 2> /dev/null &
            fi
         fi
      fi
   else
      MSG=`$SLIB/sub_script $pr_astk $fbtc`
      iret=$?
      if [ $iret -ne 0 ]; then
         echo $MSG
         exit 5
      fi
      JOBID=`echo $MSG | awk -F 'JOBID=' '{print $2}' | awk '{print $1}'`
      QUEUE=`echo $MSG | awk -F 'QUEUE=' '{print $2}' | awk '{print $1}'`
   fi
   # garder le btc dans le flasheur
   \cp $fbtc $FLASH/$nomjob.u$JOBID
fi
# retourne le numro du job
echo "JOBID=$JOBID QUEUE=$QUEUE"

#########################################################################
# faut-il recopier le btc vers le client
if [ `egrep -c '^F[ ]+btc[ ]+.*[ ]+[D]*R' $pr_astk` -eq 1 ]; then
   fbtc0=`egrep '^F[ ]+btc[ ]+.*[ ]+[D]*R' $pr_astk | awk '{print $3}'`
   if [ `echo $fbtc0 | grep -c '@'` -ne 0 ]; then
      $RCP_CMD $fbtc $fbtc0
   else
      \cp $fbtc $fbtc0
   fi
fi

\rm -f $pr_astk

exit 0
