123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- #!/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 <http://www.gnu.org/licenses/>.
- #
- # 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 <cmd>: command to perform, one of submit, status\n']
- msg += ['-e <extend>: extend options to commands']
- msg += ['-o <objid>: identifier of object to act upon\n']
- msg += ['-u <user>: username to perform commandd as\n']
- msg += ['-f <serialized_file>: filename containing serialized data\n']
- msg += ['-s <hostname>: 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)
|