#!/usr/bin/env python
# coding: utf-8
# Copyright (C) 1994-2018 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# PBS Pro is free software. You can redistribute it and/or modify it under the
# terms of the GNU Affero General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option) any
# later version.
#
# PBS Pro is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.
# See the GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# For a copy of the commercial license terms and conditions,
# go to: (http://www.pbspro.com/UserArea/agreement.html)
# or contact the Altair Legal Department.
#
# Altair’s dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of PBS Pro and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair’s trademarks, including but not limited to "PBS™",
# "PBS Professional®", and "PBS Pro™" and Altair’s logos is subject to Altair's
# trademark licensing policies.
import sys
import os
import getopt
import cPickle
import pwd
from ptl.lib.pbs_testlib import PtlConfig, Server
from ptl.lib.pbs_testlib import PbsStatusError, PbsSubmitError, PbsDeleteError
from ptl.lib.pbs_testlib import PbsManagerError, PbsAlterError, PbsSignalError
from ptl.lib.pbs_testlib import PbsOrderError, PbsMessageError, PbsHoldError
from ptl.lib.pbs_testlib import PbsReleaseError, PbsRunError, PbsRerunError
from ptl.lib.pbs_testlib import PbsMoveError, PbsDeljobError, PbsDelresvError
from ptl.lib.pbs_testlib import PbsQtermError
def usage():
msg = []
msg += ['PBS Pro user impersonation tool. This tool is an internal ']
msg += ['tool and is not intended to be used by end-users\n\n']
msg += ['Usage: ' + os.path.basename(sys.argv[0]) + ' [OPTION]\n\n']
msg += ['-c : command to perform, one of submit, status\n']
msg += ['-e : extend options to commands']
msg += ['-o : identifier of object to act upon\n']
msg += ['-u : username to perform commandd as\n']
msg += ['-f : filename containing serialized data\n']
msg += ['-s : name of host on which to perform command\n']
msg += ['-h: usage help\n']
print "".join(msg)
def _load_data(objfile=None, servername=None, user=None):
if objfile:
f = open(objfile, 'r')
_data = cPickle.load(f)
f.close()
else:
_data = None
if user is not None:
uid = pwd.getpwnam(user)[2]
if os.getuid() == 0 and uid != 0:
os.setuid(uid)
s = Server(servername, stat=False)
return (s, _data)
if __name__ == '__main__':
if len(sys.argv) < 2:
usage()
sys.exit(1)
try:
opts, args = getopt.getopt(sys.argv[1:], "c:e:o:u:f:s:h")
except:
usage()
sys.exit(1)
cmd = None
objid = None
user = None
objfile = None
servername = None
extend = None
for o, val in opts:
if o == '-e':
extend = val
elif o == '-c':
cmd = val
elif o == '-o':
objid = val.split(',')
elif o == '-u':
user = val
elif o == '-f':
objfile = val
elif o == '-s':
servername = val
elif o == '-h':
usage()
sys.exit(0)
else:
sys.stderr.write('unrecognized option. Exiting')
usage()
sys.exit(1)
if cmd is None or user is None or servername is None:
print None
sys.exit(0)
PtlConfig()
if cmd == 'submit':
(s, job) = _load_data(objfile, servername, user)
job.attrl = s.utils.dict_to_attrl(job.attributes)
job.attropl = s.utils.dict_to_attropl(job.attributes)
try:
jid = s.submit(job)
sys.stdout.write(jid.strip())
except PbsSubmitError, e:
sys.stdout.write(str(e.rv))
sys.stderr.write(repr(e))
sys.exit(e.rc)
elif cmd == 'status':
(s, _data) = _load_data(objfile, servername, user)
if 'obj_type' in _data:
obj_type = int(_data['obj_type'])
else:
obj_type = None
if 'attrib' in _data:
attrib = _data['attrib']
else:
attrib = None
if 'id' in _data:
id = _data['id']
else:
id = None
try:
rv = s.status(obj_type, attrib, id, extend=extend)
sys.stdout.write(str(rv))
except PbsStatusError, e:
rv = e.rv
sys.stdout.write(str(rv))
sys.stderr.write(repr(e))
sys.stderr.flush()
sys.exit(e.rc)
elif cmd == 'delete':
if objid is None:
print '1'
else:
(s, data) = _load_data(objfile, servername, user)
try:
rc = s.delete(objid, extend=extend)
sys.stdout.write(str(rc))
except PbsDeleteError, e:
sys.stdout.write(str(rc))
sys.stderr.write(repr(e))
sys.exit(e.rc)
elif cmd == 'deljob':
if objid is None:
print '1'
else:
(s, data) = _load_data(objfile, servername, user)
try:
rc = s.deljob(objid, extend=extend)
sys.stdout.write(str(rc))
except PbsDeljobError, e:
sys.stdout.write(str(rc))
sys.stderr.write(repr(e))
sys.exit(e.rc)
elif cmd == 'delresv':
if objid is None:
print '1'
else:
(s, data) = _load_data(objfile, servername, user)
try:
rc = s.delresv(objid, extend=extend)
sys.stdout.write(str(rc))
except PbsDelresvError, e:
sys.stdout.write(str(rc))
sys.stderr.write(repr(e))
sys.exit(e.rc)
elif cmd == 'select':
(s, attrib) = _load_data(objfile, servername, user)
rv = s.select(attrib, extend=extend)
print rv
elif cmd == 'alterjob':
if objid is None:
print '1'
else:
(s, attrib) = _load_data(objfile, servername, user)
try:
rc = s.alterjob(objid, attrib, extend=extend)
sys.stdout.write(str(rc))
except PbsAlterError, e:
sys.stdout.write(str(rc))
sys.stderr.write(repr(e))
sys.exit(e.rc)
elif cmd == 'holdjob':
if objid is None:
print '1'
else:
(s, hold_list) = _load_data(objfile, servername, user)
try:
rc = s.holdjob(objid, str(hold_list), extend=extend)
sys.stdout.write(str(rc))
except PbsHoldError, e:
sys.stdout.write(str(rc))
sys.stderr.write(repr(e))
sys.exit(e.rc)
elif cmd == 'sigjob':
if objid is None:
print '1'
else:
(s, signal) = _load_data(objfile, servername, user)
try:
rc = s.sigjob(objid, str(signal), extend=extend)
sys.stdout.write(str(rc))
except PbsSignalError, e:
sys.stdout.write(str(rc))
sys.stderr.write(repr(e))
sys.exit(e.rc)
elif cmd == 'msgjob':
if objid is None:
print '1'
else:
(s, msg) = _load_data(objfile, servername, user)
try:
rc = s.holdjob(objid, str(msg), extend=extend)
sys.stdout.write(str(rc))
except PbsMessageError, e:
sys.stdout.write(str(rc))
sys.stderr.write(repr(e))
sys.exit(e.rc)
elif cmd == 'rlsjob':
if objid is None:
print '1'
else:
(s, hold_list) = _load_data(objfile, servername, user)
try:
rc = s.rlsjob(objid, str(hold_list), extend=extend)
sys.stdout.write(str(rc))
except PbsReleaseError, e:
sys.stdout.write(str(rc))
sys.stderr.write(repr(e))
sys.exit(e.rc)
elif cmd == 'rerunjob':
if objid is None:
print '1'
else:
(s, data) = _load_data(objfile, servername, user)
try:
rc = s.rerunjob(objid, extend=extend)
sys.stdout.write(str(rc))
except PbsRerunError, e:
sys.stdout.write(str(rc))
sys.stderr.write(repr(e))
sys.exit(e.rc)
elif cmd == 'orderjob':
if objid is None:
print '1'
else:
(s, jobid2) = _load_data(objfile, servername, user)
try:
rc = s.orderjob(objid, str(jobid2), extend=extend)
sys.stdout.write(str(rc))
except PbsOrderError, e:
sys.stdout.write(str(rc))
sys.stderr.write(repr(e))
sys.exit(e.rc)
elif cmd == 'runjob':
if objid is None:
print '1'
else:
(s, location) = _load_data(objfile, servername, user)
try:
rc = s.runjob(objid, str(location), extend=extend)
except PbsRunError, e:
rc = e.rc
print str(rc)
elif cmd == 'movejob':
if objid is None:
print '1'
else:
(s, destination) = _load_data(objfile, servername, user)
try:
rc = s.movejob(objid, str(destination), extend=extend)
sys.stdout.write(rc)
except PbsMoveError, e:
sys.stdout.write(str(rc))
sys.stderr.write(repr(e))
sys.exit(e.rc)
"""
elif cmd == 'alterresv':
if objid is None:
print '1'
else:
(s, attrib) = _load_data(objfile, servername, user)
try:
rc = s.alterresv(objid, attrib, extend=extend)
sys.stdout.write(str(rc))
except PbsAlterError, e:
sys.stdout.write(str(rc))
sys.stderr.write(repr(e))
sys.exit(e.rc)
"""
elif cmd == 'manager':
(s, _data) = _load_data(objfile, servername, user)
if 'cmd' in _data:
cmd = int(_data['cmd'])
else:
cmd = None
if 'obj_type' in _data:
obj_type = int(_data['obj_type'])
else:
obj_type = None
if 'attrib' in _data:
attrib = _data['attrib']
else:
attrib = None
if 'id' in _data:
id = _data['id']
else:
id = None
try:
rc = s.manager(cmd, obj_type, attrib, id, extend=extend)
sys.stdout.write(str(rc))
except PbsManagerError, e:
sys.stderr.write(repr(e))
sys.exit(e.rc)
elif cmd == 'terminate':
(s, data) = _load_data(servername, user)
rc = s.terminate(manner=data['manner'],
server_name=data['server_name'], extend=extend)
print str(rc)
sys.exit(0)