1#!/usr/bin/env python 2# 3# (C) 2001 by Argonne National Laboratory. 4# See COPYRIGHT in top-level directory. 5# 6 7""" 8usage: mpdlistjobs [-u | --user=username] [-a | --alias=jobalias] [-j | --jobid=jobid] 9 (only use one of jobalias or jobid)' 10lists jobs being run by an mpd ring, all by default, or filtered' 11 by user, mpd job id, or alias assigned when the job was submitted' 12""" 13from time import ctime 14__author__ = "Ralph Butler and Rusty Lusk" 15__date__ = ctime() 16__version__ = "$Revision: 1.21 $" 17__credits__ = "" 18 19 20import sys, os, signal, socket 21 22from mpdlib import mpd_set_my_id, mpd_uncaught_except_tb, mpd_print, \ 23 mpd_handle_signal, mpd_get_my_username, MPDConClientSock, MPDParmDB 24 25def mpdlistjobs(): 26 import sys # to get access to excepthook in next line 27 sys.excepthook = mpd_uncaught_except_tb 28 signal.signal(signal.SIGINT, sig_handler) 29 mpd_set_my_id(myid='mpdlistjobs') 30 uname = '' 31 jobid = '' 32 sjobid = '' 33 jobalias = '' 34 sssPrintFormat = 0 35 if len(sys.argv) > 1: 36 aidx = 1 37 while aidx < len(sys.argv): 38 if sys.argv[aidx] == '-h' or sys.argv[aidx] == '--help': 39 usage() 40 if sys.argv[aidx] == '-u': # or --user= 41 uname = sys.argv[aidx+1] 42 aidx += 2 43 elif sys.argv[aidx].startswith('--user'): 44 splitArg = sys.argv[aidx].split('=') 45 try: 46 uname = splitArg[1] 47 except: 48 print 'mpdlistjobs: invalid argument:', sys.argv[aidx] 49 usage() 50 aidx += 1 51 elif sys.argv[aidx] == '-j': # or --jobid= 52 jobid = sys.argv[aidx+1] 53 aidx += 2 54 sjobid = jobid.split('@') # jobnum and originating host 55 elif sys.argv[aidx].startswith('--jobid'): 56 splitArg = sys.argv[aidx].split('=') 57 try: 58 jobid = splitArg[1] 59 sjobid = jobid.split('@') # jobnum and originating host 60 except: 61 print 'mpdlistjobs: invalid argument:', sys.argv[aidx] 62 usage() 63 aidx += 1 64 elif sys.argv[aidx] == '-a': # or --alias= 65 jobalias = sys.argv[aidx+1] 66 aidx += 2 67 elif sys.argv[aidx].startswith('--alias'): 68 splitArg = sys.argv[aidx].split('=') 69 try: 70 jobalias = splitArg[1] 71 except: 72 print 'mpdlistjobs: invalid argument:', sys.argv[aidx] 73 usage() 74 aidx += 1 75 elif sys.argv[aidx] == '--sss': 76 sssPrintFormat = 1 77 aidx +=1 78 else: 79 print 'unrecognized arg: %s' % sys.argv[aidx] 80 sys.exit(-1) 81 82 parmdb = MPDParmDB(orderedSources=['cmdline','xml','env','rcfile','thispgm']) 83 parmsToOverride = { 84 'MPD_USE_ROOT_MPD' : 0, 85 'MPD_SECRETWORD' : '', 86 } 87 for (k,v) in parmsToOverride.items(): 88 parmdb[('thispgm',k)] = v 89 parmdb.get_parms_from_env(parmsToOverride) 90 parmdb.get_parms_from_rcfile(parmsToOverride) 91 if (hasattr(os,'getuid') and os.getuid() == 0) or parmdb['MPD_USE_ROOT_MPD']: 92 fullDirName = os.path.abspath(os.path.split(sys.argv[0])[0]) # normalize 93 mpdroot = os.path.join(fullDirName,'mpdroot') 94 conSock = MPDConClientSock(mpdroot=mpdroot,secretword=parmdb['MPD_SECRETWORD']) 95 else: 96 conSock = MPDConClientSock(secretword=parmdb['MPD_SECRETWORD']) 97 98 msgToSend = { 'cmd' : 'mpdlistjobs' } 99 conSock.send_dict_msg(msgToSend) 100 msg = conSock.recv_dict_msg(timeout=5.0) 101 if not msg: 102 mpd_print(1,'no msg recvd from mpd before timeout') 103 if msg['cmd'] != 'local_mpdid': # get full id of local mpd for filters later 104 mpd_print(1,'did not recv local_mpdid msg from local mpd; instead, recvd: %s' % msg) 105 else: 106 if len(sjobid) == 1: 107 sjobid.append(msg['id']) 108 done = 0 109 while not done: 110 msg = conSock.recv_dict_msg() 111 if not msg.has_key('cmd'): 112 mpd_print(1,'mpdlistjobs: INVALID msg=:%s:' % (msg) ) 113 sys.exit(-1) 114 if msg['cmd'] == 'mpdlistjobs_info': 115 smjobid = msg['jobid'].split(' ') # jobnum, mpdid, and alias (if present) 116 if len(smjobid) < 3: 117 smjobid.append('') 118 print_based_on_uname = 0 # default 119 print_based_on_jobid = 0 # default 120 print_based_on_jobalias = 0 # default 121 if not uname or uname == msg['username']: 122 print_based_on_uname = 1 123 if not jobid and not jobalias: 124 print_based_on_jobid = 1 125 print_based_on_jobalias = 1 126 else: 127 if sjobid and sjobid[0] == smjobid[0] and sjobid[1] == smjobid[1]: 128 print_based_on_jobid = 1 129 if jobalias and jobalias == smjobid[2]: 130 print_based_on_jobalias = 1 131 if not smjobid[2]: 132 smjobid[2] = ' ' # just for printing 133 if print_based_on_uname and (print_based_on_jobid or print_based_on_jobalias): 134 if sssPrintFormat: 135 print "%s %s %s"%(msg['host'],msg['clipid'],msg['sid']) 136 else: 137 print 'jobid = %s@%s' % (smjobid[0],smjobid[1]) 138 print 'jobalias = %s' % (smjobid[2]) 139 print 'username = %s' % (msg['username']) 140 print 'host = %s' % (msg['host']) 141 print 'pid = %s' % (msg['clipid']) 142 print 'sid = %s' % (msg['sid']) 143 print 'rank = %s' % (msg['rank']) 144 print 'pgm = %s' % (msg['pgm']) 145 print 146 else: # mpdlistjobs_trailer 147 done = 1 148 conSock.close() 149 150def sig_handler(signum,frame): 151 mpd_handle_signal(signum,frame) # not nec since I exit next 152 sys.exit(-1) 153 154def usage(): 155 print __doc__ 156 sys.exit(-1) 157 158if __name__ == '__main__': 159 mpdlistjobs() 160