#!/bin/bash
# Author: J. Eduardo Ramirez
# 
# Dec 05, 2016 Version 7: Detach function "RunningGlideins" into a new script Glidein_Who accessible from any WN.
# Jan 26, 2017 Version 8: using maps (complete rewrite)

declare -A mapjobinfo
declare -A mapnodes
declare -A MapCertByJobID
declare -A MapCertByLine

#auxiliar input function (change if needed)
GLIDEINWHO="/home/eduardo/bin/grid/Glidein_Who"

#get output from condor
OLD_IFS=$IFS;IFS=$'\n';lines=( $(condor_q -run $1) );IFS=$OLD_IFS
 
#preprocess condor output (get nodes/slots info)
for idx in $(seq 0 $((${#lines[@]} - 1)))
do
    line="${lines[$idx]}"
    linesid[$idx]="list"
    #tag empty lines
    [ "$line" == "" ] && linesid[$idx]="blank"
    #tag info lines
    [[ "$line" == *"--"* ]]&&linesid[$idx]="title" 
    [[ "$line" == *"ID"* ]]&&[[ "$line" == *"OWNER"* ]]&&linesid[$idx]="title" 

    #get node/slot info
    words=( $line )
#debug#    echo "words[0] = ${words[0]}"
    jobid="${words[0]}"
    OLD_IFS=$IFS;IFS=$'@';nodeslot=( ${words[5]} );IFS=$OLD_IFS

    #get all jobs associated to a WN
    thisnode="${nodeslot[1]}"
    mapjobinfo[$jobid]=$idx
    [[  "${linesid[$idx]}" == "list" ]]&&[ "x$thisnode" != "x" ]&&mapnodes[$thisnode]="${mapnodes[$thisnode]} $jobid"


#debug test
#    [[  "${linesid[$idx]}" == "list" ]]&&echo $thisnode "${mapnodes[$thisnode]}"
done 

#ssh to running nodes
echo "Start ssh to ${#mapnodes[@]} nodes "
for WNNODE in "${!mapnodes[@]}";
do
   OLD_IFS=$IFS;IFS=$" ";listjobids=( ${mapnodes[$WNNODE]} );IFS=$OLD_IFS

   echo "Node $WNNODE ${mapnodes[$WNNODE]} ($((${#listjobids[@]}-0)) jobs)"
   #Get Certs of running user in node (ssh)
#debug   echo "ssh -Y $WNNODE \"$GLIDEINWHO $WNNODE ${mapnodes[$WNNODE]}\""
   newcerts=`ssh -Y $WNNODE "$GLIDEINWHO $WNNODE ${mapnodes[$WNNODE]}"`
   certs=`echo $newcerts`
   OLD_IFS=$IFS;IFS=$',';listcerts=( $certs );IFS=$OLD_IFS
   for i in $(seq 0 $((${#listjobids[@]} - 1)))
   do
#debug      echo ${listjobids[$i]} ${listcerts[$i]}
#      MapCertByJobID[${listjobids[$i]}]=${listcerts[$i]}
      MapCertByLine[${mapjobinfo[${listjobids[$i]}]}]=${listcerts[$i]}
   done
   
done

#Print output condor_q like extended with certs
for idx in $(seq 0 $((${#lines[@]} - 1)))
do
#    echo "${linesid[$idx]}($idx) - ${lines[$idx]} ${MapCertByLine[$idx]}"
    echo "${lines[$idx]} ${MapCertByLine[$idx]}"
done
exit
