#!/bin/csh -f
#
# 	%W% %E%
#
# one by one 
# 
# process status : runs susp
# current_jobs  : status host pid giganibatcharguments jobid
# current_nodes : status host jobid
#
# assume no -o option is used for giganibatch
# this assures that the last arg of giganibatcharg is framenumber
# further is assumed that all strings are of equal length

set host = `uname -n`
set curf = curf_${host}
set rendir = ${GIG_D_ROOT}/projects/renmanadm/${curf}
set rendirnodef = ${rendir}/current_nodes
set rendirjobsf = ${rendir}/running_jobs
set rendirnodef_tmp = ${rendir}/current_nodes_tmp
set rendirjobsf_tmp = ${rendir}/running_jobs_tmp

set arguments = `getopt a:b:d:e:f:k:m:p:r:s: $*`

foreach i ( $arguments )
  switch ( $i )

    case '-a'
      gigrs_rshell $arguments[2] exit
      if ( $status ) then
        echo host $arguments[2] not reachable
      else
        touch ${rendir}/nodeflag_1
        echo 2 > ${rendir}/nodeturn
        set turn = `cat ${rendir}/nodeturn`
        while ( ( -e ${rendir}/nodeflag_2 ) && ( $turn == '2' ) )
          set turn = `cat ${rendir}/nodeturn`
        end
        echo idle $arguments[2] 0 dumb >> $rendirnodef
        /bin/rm -f ${rendir}/nodeflag_1
      endif
      shift arguments
      shift arguments
      breaksw

    case '-d'
# kill running or suspended jobs and remove server entr(y)(ies)

      set n_entries = `egrep "$arguments[2]" $rendirnodef | awk 'BEGIN {} {s+=1;} END {print s}' s=0 -`
      set i = 0
      while ( $i < $n_entries )
        set get_ent = `egrep "$arguments[2]" $rendirnodef | awk 'BEGIN {} {if(s==t){print $0;exit};s+=1;} END {}' s=0 t=$i -`
        gigrs_rshell $get_ent[2] "kill -KILL $get_ent[3]"
        @ i += 1
      end
#####
#      set n_entrs = `egrep "$arguments[2]" $rendirjobsf | awk 'BEGIN {} {s+=1;} END {print s}' s=0 -`
#      set str_len = `egrep "$arguments[2]" $rendirjobsf | awk '{print NF;exit}'`
#      set get_all = `egrep "$arguments[2]" $rendirjobsf | awk '{print $0}'`
#      set i = 0
#      while ( $i < $n_entrs )
#        set get_jobid = $get_all[3]
#        gigrs_rshell $get_all[2] "kill -KILL $get_jobid"
#        set j = 0
#        while ( $j < $str_len )
#          shift get_all
#          @ j += 1
#        end
#        @ i += 1
#      end
#####
      if ( $n_entries > 0 ) then
        gigrs_delnodes_a $arguments[2]
        egrep -v "lost $arguments[2]" $rendirjobsf >! $rendirjobsf_tmp
        mv $rendirjobsf_tmp $rendirjobsf
      else
        touch ${rendir}/nodeflag_1
        echo 2 > ${rendir}/nodeturn
        set turn = `cat ${rendir}/nodeturn`
        while ( ( -e ${rendir}/nodeflag_2 ) && ( $turn == '2' ) )
          set turn = `cat ${rendir}/nodeturn`
        end
        egrep -v "$arguments[2]" $rendirnodef >! $rendirnodef_tmp
        mv $rendirnodef_tmp $rendirnodef
        /bin/rm -f ${rendir}/nodeflag_1
      endif
      shift arguments
      shift arguments
      breaksw

    case '-k'
# kill a specific frame rendering - suspended or running 
# find out whether entry exists 
# NOT used
      set n_entries = `egrep "$arguments[2]" $rendirjobsf | awk 'BEGIN {} {s+=1;} END {print s}' s=0 -`
      if ( $n_entries != 0 ) then
        set get_ent = `egrep "$arguments[2]" $rendirjobsf | awk '{print $0;exit}'`
echo get_ent = $get_ent
        gigrs_rshell $get_ent[2] "kill -KILL $get_ent[3]"
        if ( $status ) then
# machine is not reachable  : get all entries for this machine
          gigrs_delnodes_a $arguments[2]
          shift arguments
          shift arguments
          breaksw
        endif
# remove entry from rendirjobsf
        egrep -v "$arguments[2]" $rendirjobsf >! $rendirjobsf_tmp
        mv $rendirjobsf_tmp $rendirjobsf
# update entry in rendernodef
        touch ${rendir}/nodeflag_1
        echo 2 > ${rendir}/nodeturn
        set turn = `cat ${rendir}/nodeturn`
        while ( ( -e ${rendir}/nodeflag_2 ) && ( $turn == '2' ) )
          set turn = `cat ${rendir}/nodeturn`
        end
        egrep -v "$arguments[2]" $rendirnodef >! $rendirnodef_tmp
        if ( $#get_ent > 3 ) then
          echo idle $get_ent[2] 0 $get_ent[4] $get_ent[5] >> $rendirnodef_tmp
        else
          echo idle $get_ent[2] 0 >> $rendirnodef_tmp
        endif
        mv $rendirnodef_tmp $rendirnodef
        /bin/rm -f ${rendir}/nodeflag_1
      endif
      shift arguments
      shift arguments
      breaksw

    case '-r'
# resume server - on multi resume one at a time
# first check whether process still exists on specific machine
# then signal this process with kill -CONT pid
# finally update entry in running_jobs and current_nodes
# NOT used since introduction of renderhours 
      set n_entries = `egrep "susp $arguments[2]" $rendirjobsf | awk 'BEGIN {} {s+=1;} END {print s}' s=0 -`
      set str_lengt = `egrep "susp $arguments[2]" $rendirjobsf | awk '{print NF;exit}'`
      set get_first = `egrep "susp $arguments[2]" $rendirjobsf | awk '{print $0;exit}'`
      set get_all = `egrep "susp $arguments[2]" $rendirjobsf | awk '{print $0}'`

      if ( $n_entries != 0 ) then
# signal process
        gigrs_rshell $arguments[2] "kill -CONT $get_first[3]"
        if ( $status != 0 ) then
# machine is not reachable
          gigrs_delnodes_a $arguments[2]
          shift arguments
          shift arguments
          breaksw
        endif

# change corresponding entry in current_node
        touch ${rendir}/nodeflag_1
        echo 2 > ${rendir}/nodeturn
        set turn = `cat ${rendir}/nodeturn`
        while ( ( -e ${rendir}/nodeflag_2 ) && ( $turn == '2' ) )
          set turn = `cat ${rendir}/nodeturn`
        end
        egrep -v "$arguments[2] $get_first[3]" $rendirnodef >! $rendirnodef_tmp
        set get_ent = `egrep "$arguments[2] $get_first[3]" $rendirnodef | awk '{print $0;exit}'`
        set get_ent[1] = "runs"
        echo $get_ent >> $rendirnodef_tmp
#        echo runs $arguments[2] $get_first[3] >> $rendirnodef_tmp
        /bin/mv $rendirnodef_tmp $rendirnodef
        /bin/rm -f ${rendir}/nodeflag_1

# get not suspended entries in running_jobs
        egrep -v "susp $arguments[2]" $rendirjobsf >! $rendirjobsf_tmp

# change first suspended entry into a running entry 
        set get_first[1] = "runs"
        echo $get_first >> $rendirjobsf_tmp

# remove first entry
        set i = 0
        while ( $i < $str_lengt )
          shift get_all
          @ i += 1
        end

# get remaining suspended entries
        @ n_entries -= 1
        while ( $n_entries != 0)
          @ n_entries -= 1
          set i = 0
          set new_entry = ''
          while ( $i < $str_lengt )
            set new_entry = ($new_entry $get_all[1])
            shift get_all
            @ i += 1
          end
          echo $new_entry >> $rendirjobsf_tmp
        end
      endif

      mv $rendirjobsf_tmp $rendirjobsf

      shift arguments
      shift arguments
      breaksw

    case '-s'
# suspend server - on multi suspend one at a time
# signal this process with kill -STOP pid
# update entry in running_jobs and current_nodes
# NOT used since introduction of renderhours

      set n_entries = `egrep "runs $arguments[2]" $rendirjobsf | awk 'BEGIN {} {s+=1;} END {print s}' s=0 -`
      set str_lengt = `egrep "runs $arguments[2]" $rendirjobsf | awk '{print NF;exit}'`
      set get_first = `egrep "runs $arguments[2]" $rendirjobsf | awk '{print $0;exit}'`
      set get_all = `egrep "runs $arguments[2]" $rendirjobsf | awk '{print $0}'`

      if ( $n_entries != 0 ) then
# signal process
        gigrs_rshell $arguments[2] "kill -STOP $get_first[3]"
        if ( $status ) then
# machine is not reachable
          gigrs_delnodes_a $arguments[2]
          shift arguments
          shift arguments
          breaksw
        endif

# change corresponding entry in current_nodes
        touch ${rendir}/nodeflag_1
        echo 2 > ${rendir}/nodeturn
        set turn = `cat ${rendir}/nodeturn`
        while ( ( -e ${rendir}/nodeflag_2 ) && ( $turn == '2' ) )
          set turn = `cat ${rendir}/nodeturn`
        end
        egrep -v "$arguments[2] $get_first[3]" $rendirnodef >! $rendirnodef_tmp
        set get_ent = `egrep "$arguments[2] $get_first[3]" $rendirnodef | awk '{print $0;exit}'`
        set get_ent[1] = "susp"
        echo $get_ent >> $rendirnodef_tmp
        /bin/mv $rendirnodef_tmp $rendirnodef
        /bin/rm -f ${rendir}/nodeflag_1

# get not running entries
        egrep -v "runs $arguments[2]" $rendirjobsf >! $rendirjobsf_tmp

# change first running entry into a suspended entry 
        set get_first[1] = "susp"
        echo $get_first >> $rendirjobsf_tmp

# remove first entry
        set i = 0
        while ( $i < $str_lengt )
          shift get_all
          @ i += 1
        end

# get remaining running entries
        @ n_entries -= 1
        while ( $n_entries != 0)
          @ n_entries -= 1
          set i = 0
          set new_entry = ''
          while ( $i < $str_lengt )
            set new_entry = ($new_entry $get_all[1])
            shift get_all
            @ i += 1
          end
          echo $new_entry >> $rendirjobsf_tmp
        end
      endif

      mv $rendirjobsf_tmp $rendirjobsf

      shift arguments
      shift arguments
      breaksw

    case '-m'
      set gserver = $arguments[2]
      shift arguments
      shift arguments
      breaksw

    case '-b'
      set begin_at = $arguments[2]
      shift arguments
      shift arguments
      breaksw

    case '-e'
      set stop_at = $arguments[2]
      shift arguments
      shift arguments
# we must have all arguments 
      if ( $gserver != '' && $begin_at != '' && $stop_at != '' ) then
        if ( -e ${rendirnodef_tmp}_tmp ) then 
          /bin/rm ${rendirnodef_tmp}_tmp
        endif
        touch ${rendirnodef_tmp}_tmp
        touch ${rendir}/nodeflag_1
        echo 2 > ${rendir}/nodeturn
        set turn = `cat ${rendir}/nodeturn`
        while ( ( -e ${rendir}/nodeflag_2 ) && ( $turn == '2' ) )
          set turn = `cat ${rendir}/nodeturn`
        end
# multi proc all entries
        set n_entries = `egrep "$gserver" $rendirnodef | awk 'BEGIN {} {s+=1;} END {print s}' s=0 -`
        set i = 0
        while ( $i < $n_entries )
          set get_ent = `egrep "$gserver" $rendirnodef | awk 'BEGIN{}{if(s==t){print $0;exit};s+=1;}END{}' s=0 t=$i -`
          echo $get_ent >> ${rendirnodef_tmp}_tmp
          @ i += 1
        end
        fgrep -v "$gserver" $rendirnodef >! $rendirnodef_tmp
        set i = 0
        while ( $i < $n_entries )
          set get_ent = `cat ${rendirnodef_tmp}_tmp | awk 'BEGIN{}{if(s==t){print $0;exit};s+=1;}END{}' s=0 t=$i -`
          if ( $#get_ent > 4 ) then 
            set get_ent[5] = $begin_at
            set get_ent[6] = $stop_at
          else
            set get_ent = ($get_ent $begin_at $stop_at)
          endif
          echo $get_ent >> $rendirnodef_tmp
          @ i += 1
        end
        /bin/mv $rendirnodef_tmp $rendirnodef
        /bin/rm -f ${rendir}/nodeflag_1
        /bin/rm ${rendirnodef_tmp}_tmp
      endif
      breaksw

    case '-f'
      set gserver = $arguments[2]
      if ( $gserver != '' ) then
        if ( -e ${rendirnodef_tmp}_tmp ) then 
          /bin/rm ${rendirnodef_tmp}_tmp
        endif
        touch ${rendirnodef_tmp}_tmp
        touch ${rendir}/nodeflag_1
        echo 2 > ${rendir}/nodeturn
        set turn = `cat ${rendir}/nodeturn`
        while ( ( -e ${rendir}/nodeflag_2 ) && ( $turn == '2' ) )
          set turn = `cat ${rendir}/nodeturn`
        end
# multi proc all entries

        set n_entries = `egrep "$gserver" $rendirnodef | awk 'BEGIN {} {s+=1;} END {print s}' s=0 -`
        set i = 0
        while ( $i < $n_entries )
          set get_ent = `egrep "$gserver" $rendirnodef | awk 'BEGIN{}{if(s==t){print $0;exit};s+=1;}END{}' s=0 t=$i -`
          echo $get_ent >> ${rendirnodef_tmp}_tmp
          @ i += 1
        end
        fgrep -v "$gserver" $rendirnodef >! $rendirnodef_tmp
        set i = 0
        while ( $i < $n_entries )
          set get_ent = `cat ${rendirnodef_tmp}_tmp | awk 'BEGIN{}{if(s==t){print $0;exit};s+=1;}END{}' s=0 t=$i -`
          if ( $get_ent[1] == 'susp' ) then
            set get_ent[1] = runs
            gigrs_rshell $get_ent[2] "kill -CONT $get_ent[3]"
# we have to change entries in running jobs file as well
            set job_ent = `egrep $get_ent[2] $rendirjobsf | egrep $get_ent[3]`
            if ( $#job_ent > 0 ) then
              set job_ent[1] = runs
              echo $job_ent > $rendirjobsf_tmp
              egrep $get_ent[2] $rendirjobsf | egrep -v $get_ent[3] >> $rendirjobsf_tmp
              egrep -v $get_ent[2] $rendirjobsf >> $rendirjobsf_tmp
              /bin/mv $rendirjobsf_tmp $rendirjobsf
            endif
          endif
          echo $get_ent[1] $get_ent[2] $get_ent[3] $get_ent[4] >> $rendirnodef_tmp
          @ i += 1
        end
        /bin/mv $rendirnodef_tmp $rendirnodef
        /bin/rm -f ${rendir}/nodeflag_1
        /bin/rm ${rendirnodef_tmp}_tmp
      endif
      shift arguments
      shift arguments
      breaksw

    case '-p'
      if ( $gserver != '' ) then 
        gigrs_rshell $gserver exit
        if ( $status ) then
          echo host $gserver not reachable
        else
          touch ${rendir}/nodeflag_1
          echo 2 > ${rendir}/nodeturn
          set turn = `cat ${rendir}/nodeturn`
          while ( ( -e ${rendir}/nodeflag_2 ) && ( $turn == '2' ) )
            set turn = `cat ${rendir}/nodeturn`
          end
          echo idle $gserver 0 $arguments[2] >> $rendirnodef
          /bin/rm -f ${rendir}/nodeflag_1
        endif
      endif
      shift arguments
      shift arguments
      breaksw

    case '--'
      shift arguments
      break

  endsw
end

