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