#!/usr/bin/env python
################################################################################
#\defgroup difxjobstatus DiFXJobStatus
#
#\brief Obtain the "status" of job(s) on the DiFX server using the .input file(s)
# path.
#
#Usage: DiFXJobStatus [options] path
#
# DiFXJobStatus can be used to display the most recent "status" of a job
# or list of jobs on the DiFX server. The status information is contained in
# the .difxlog file associated with each job. If a job has been run with logging
# facilities turned on, the .difxlog file will contain information about it -
# DiFXJobStatus simply picks up the latest "STATUS" item and reports it.
# The status will be something like "completed", "failed", or "running". If
# the .difxlog file does not exit, DiFXJobStatus will report that, too.
#
# Jobs are specified by their .input file
# paths - wildcards can be used for a list of jobs.
#
# DiFXJobStatus can be set to run in a "monitor" mode where it will
# repeatedly ask for the status of a job. This provides a simple way of watching
# a job or group of jobs as they run and determining when they are finished.
#
#
Command Line Arguments
#
#
# -D, --difx VERSION | Run using a specific DiFX version. If not specified
# the value of the DIFX_VERSION environment variable will
# be used. Failing that, \"DIFX-DEVEL\" will be used.
# |
-h, --help | Print help information and quit.
# |
-H, --hostname NAME | Use NAME as the host of the difxServer program.
# Default is to use DIFX_CONTROL_HOST environment variable.
# |
-P, --port PORT | Use PORT as the TCP port to communicated with the difxServer.
# Default is to use DIFX_CONTROL_PORT environment variable.
# |
-l, --long | Provide a \"long\" job status, which includes job run history.
# Currently not implemented.
# |
-r, --repeat SEC | Repeat the job status command after a delay of SEC seconds.
# By default there is no repeat.
# |
-s, --short | Provide only the final job state as the status (much faster
# and easier to deal with if you have lots of jobs). This is the
# default.
# |
-t, --time | Turn off the time stamp in the short output. By default a
# time stamp is displayed with each status.
# |
################################################################################
program = 'DiFXJobStatus'
version = '0.1'
author = 'John Spitzak'
verdate = '20150909'
import os
import sys
import time
import DiFXControl
#===============================================================================
# MAIN
#===============================================================================
host = None
port = None
# Locate a "default" DiFX Version from environment variables. User may change this
# with command line arguments.
try:
DiFXVersion = os.environ["DIFX_VERSION"]
except:
DiFXVersion = "DIFX-DEVEL"
try:
i = 1
pathStr = None
repeat = False
repeatSeconds = 0
shortStatus = True
displayTime = True
while i < len( sys.argv ):
# Check against legal argument types. The final argument must be a path to
# .input file(s).
if sys.argv[i] in [ "-h", "--help" ]:
print('\n%s ver %s %s %s' % (program, version, author, verdate))
print("Obtain the status of jobs on the DiFX software correlator.")
print("Usage: %s [options] " % ( sys.argv[0] ))
print("")
print("Options can include:")
print("")
print(" --difx VERSION")
print(" -D VERSION Run using a specific DiFX version. If not specified")
print(" the value of the DIFX_VERSION environment variable will")
print(" be used. Failing that, \"DIFX-DEVEL\" will be used.")
print("")
print(" --help")
print(" -h Print this help information and quit.")
print("")
print(" --hostname NAME")
print(" -H NAME Use NAME as the host of the difxServer program.")
print(" Default is to use DIFX_CONTROL_HOST environment variable.")
print("")
print(" --port PORT")
print(" -P PORT Use PORT as the TCP port to communicated with the difxServer.")
print(" Default is to use DIFX_CONTROL_PORT environment variable.")
print("")
print(" --long")
print(" -l Provide a \"long\" job status, which includes job run history.")
print(" Currently not implemented.")
print("")
print(" --repeat SEC")
print(" -r SEC Repeat the job status command after a delay of SEC seconds.")
print(" By default there is no repeat.")
print("")
print(" --short")
print(" -s Provide only the final job state as the status (much faster")
print(" and easier to deal with if you have lots of jobs). This is the")
print(" default.")
print("")
print(" --time")
print(" -t Turn off the time stamp in the short output. By default a")
print(" time stamp is displayed with each status.")
print("")
print("")
exit( 0 )
elif sys.argv[i] in [ "-H", "--hostname" ]:
host = sys.argv[i+1]
i = i + 1
elif sys.argv[i] in [ "-D", "--difx" ]:
DiFXVersion = sys.argv[i+1]
i = i + 1
elif sys.argv[i] in [ "-P", "--port" ]:
port = int( sys.argv[i+1] )
i = i + 1
elif sys.argv[i] in [ "-r", "--repeat" ]:
repeatSeconds = int( sys.argv[i+1] )
repeat = True
i = i + 1
elif sys.argv[i] in [ "-s", "--short" ]:
shortStatus = True
elif sys.argv[i] in [ "-t", "--time" ]:
displayTime = False
else:
pathStr = sys.argv[i]
i = i + 1
except RuntimeError:
print("Usage: %s [options] " % ( sys.argv[0] ))
exit( 0 )
keepGoing = True
# Open a new connection to the difxServer...
difx = DiFXControl.Client()
difx.connect( host, port )
if difx.socketOK:
difx.monitor()
difx.version( DiFXVersion )
while difx.socketOK and keepGoing:
statusInfo = difx.jobStatus( pathStr, shortStatus )
# How we interpret the status information is dependent on what we asked
# for...shortStatus includes only a time stamp and one line of data for
# each .input file.
if shortStatus:
statusTime = statusInfo[0]
statusList = statusInfo[1]
if statusList == None:
print("No .input files found.")
else:
if repeat:
os.system( 'cls' if os.name == 'nt' else 'clear' )
if statusTime != None and displayTime:
print(statusTime)
maxLen1 = 0
maxLen2 = 0
for item in statusList:
if len( item[0] ) > maxLen1:
maxLen1 = len( item[0] )
if displayTime and len( item[1][1] ) > maxLen2:
maxLen2 = len( item[1][1] )
if displayTime:
maxLen2 = maxLen2 + 5
for item in statusList:
outStr = item[0]
while len( outStr ) < maxLen1 + 5:
outStr += " "
outStr += item[1][1]
if displayTime:
while len( outStr ) < maxLen1 + maxLen2 + 5:
outStr += " "
outStr += item[1][0]
print(outStr)
if repeat:
try:
time.sleep( repeatSeconds )
except KeyboardInterrupt:
keepGoing = False
else:
keepGoing = False
difx.close()