#!/usr/bin/env python # -*- python -*- # Bockjoo Kim, Univ. Of Florida # Modified by Jerry Gieraltowski, ANL for http_proxy __rcsid__ = "$Id: $" import getopt import sys import os import xmlrpclib #xmlrpcservice='http://gdsuf.phys.ufl.edu/gridcat3/services.php' #xmlrpcservice='@gridcat_services_url@' #xmlrpcservice='http://www.ivdgl.org/gridcat/gridcat/services.php' #xmlrpcservice='http://www.ivdgl.org/grid3/catalog/services.php' #xmlrpcservice='http://osg-itb.ivdgl.org/gridcat/services.php' xmlrpcservice='http://osg-cat.grid.iu.edu/services.php' xmlrpcservice='http://gdsuf.phys.ufl.edu:8080/OSG/services.php' #xmlrpcservice='http://butternut.ucs.indiana.edu/gridcat/services.php' class ProxyTransport(xmlrpclib.Transport): def __init__(self,proxy): self.proxy = proxy def make_connection(self,host): self.realhost = host import httplib return httplib.HTTP(self.proxy) def send_request(self, connection, handler, request_body): connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler)) def send_host(self, connection, host): connection.putheader('Host', self.realhost) def gridcat_client_main(): usage = """gridcat-client.py [--useservice=] [options [args]] OPTIONS Top level options: -h | --help | --usage Print help --useservice= Invoke useservice method to switch to the requested service This option should be followed by one of the Method options Introspect options: --listmethods List available methods --methodhelp= Provides help for a specific method --methodsig= Provides what should be the argument for a specific method Method options: --sitenames Invoke sitenames method and list all site names --hostnames Invoke hostnames method and list all gatekeeper host names --jobmanagers Invoke jobmanagers method and list jobmanagers in a site --sitestatus Invoke sitestatus method and show site status in a site --authstatus Show authorization possibility status in a site --batchstatus Show batch job accessibility status in a site --gsiftpstatus Show gsiftp accessibiltiy status in a site --directories List grid accessible directories in a site --cpuslots Show available CPU slots in a site --diskspace Show available data directory disk space in GB in a site --showtables Invoke showtables method and list all gridcat MySQL tables --showfields= Invoke showfields method and list names of all fields in a table --getsiteresult Invoke getsiteresult method and show query result --getresult Invoke getresult method and show query result (This is the last resort if none of above methods get you what you want if you dare to use this option.) --services Lists available services """ ## process source and dest args try: opts, args = getopt.getopt(sys.argv[1:], "h:", ["help", "usage","listmethods","methodhelp=","methodsig=","useservice=","sitenames","hostnames","jobmanagers","sitestatus","authstatus","batchstatus","gsiftpstatus","directories","cpuslots","diskspace","showtables","showfields=","getsiteresult","getresult","services"]) except getopt.GetoptError, what: print "GetOpt error:", what print usage sys.exit(1) #try: proxies = os.environ['http_proxy'] #except KeyError: proxies = 'None' #if proxies=='None': # server = xmlrpclib.ServerProxy(xmlrpcservice) #else: # server = xmlrpclib.ServerProxy(xmlrpcservice, transport=ProxyTransport(proxies)) #server=None ## process options service=0 for opt, arg in opts: if opt == "--useservice": try: proxies = os.environ['http_proxy'] except KeyError: proxies = 'None' if proxies=='None': server = xmlrpclib.Server(arg) else: server = xmlrpclib.ServerProxy(arg, transport=ProxyTransport(proxies)) service=1 #print "sys.argv len ",len(sys.argv) if service==0 : if len(sys.argv) < 2 : print usage sys.exit(0) elif service==1 : if len(sys.argv) < 3 : print usage sys.exit(0) if service == 0 : if xmlrpcservice == '@gridcat_services_url@' : print "congure service or use option --useservice" sys.exit(0) try: proxies = os.environ['http_proxy'] except KeyError: proxies = 'None' if proxies=='None': server = xmlrpclib.Server(xmlrpcservice) else: server = xmlrpclib.ServerProxy(xmlrpcservice, transport=ProxyTransport(proxies)) #if server == '' : # if xmlrpcservice == '@gridcat_services_url@' : # print "congure service or use option --useservice" # sys.exit(0) # else : # try: proxies = os.environ['http_proxy'] # except KeyError: proxies = 'None' # if proxies=='None': # server = xmlrpclib.ServerProxy(xmlrpcservice) # else: # server = xmlrpclib.ServerProxy(xmlrpcservice, transport=ProxyTransport(proxies)) for opt, arg in opts: if opt in ("-h", "--help", "--usage"): print usage sys.exit(0) if opt == "--listmethods": lmethods=server.system.listMethods() for method in lmethods : print method elif opt == "--methodhelp": methodhelp=server.system.methodHelp(arg) print methodhelp elif opt == "--methodsig": methodsig=server.system.methodSignature(arg) print methodsig elif opt == "--sitenames": print server.sitenames() elif opt == "--hostnames": print server.hostnames() elif opt == "--jobmanagers": if len(args) <> 1 : print "ERROR: --jobmanagers requires a site name" sys.exit(0) site=args[0] print server.jobmanagers(site) elif opt == "--sitestatus": if len(args) <> 1 : print "ERROR: --sitestatus requires a site name" sys.exit(0) site=args[0] print server.sitestatus(site) elif opt == "--authstatus": test_name="auth" if len(args) <> 1 : print "ERROR: --authstatus requires a site name" sys.exit(0) site=args[0] print server.teststatus(test_name,site) elif opt == "--batchstatus": test_name="batchsub" if len(args) <> 1 : print "ERROR: --batchstatus requires a site name" sys.exit(0) site=args[0] print server.teststatus(test_name,site) elif opt == "--gsiftpstatus": if len(args) <> 1 : print "ERROR: --gsiftpstatus requires a site name" sys.exit(0) site=args[0] test_name="gsiftp_in" print test_name,server.teststatus(test_name,site) test_name="gsiftp_out" print test_name,server.teststatus(test_name,site) elif opt == "--directories": if len(args) <> 1 : print "ERROR: --directories requires a site name" sys.exit(0) site=args[0] field='griddir' real_field='grid3dir' print field,server.getsiteresult('site_info',real_field,site) field='appdir' print field,server.getsiteresult('site_info',field,site) field='datadir' print field,server.getsiteresult('site_info',field,site) field='tmpdir' print field,server.getsiteresult('site_info',field,site) field='wntmpdir' print field,server.getsiteresult('site_info',field,site) elif opt == "--cpuslots": if len(args) <> 1 : print "ERROR: --cpuslots requires a site name" sys.exit(0) site=args[0] field='ncpurunning' ncpurunning=server.getsiteresult('site_info',field,site) print field,ncpurunning field='ncpus' ncpus=server.getsiteresult('site_info',field,site) print field,ncpus elif opt == "--diskspace": if len(args) <> 1 : print "ERROR: --diskspace requires a site name" sys.exit(0) site=args[0] field='dataavail' dataavail=server.getsiteresult('site_se',field,site) #print field,dataavail try: davail=float(dataavail) except: davail=0.0 if davail > 0 : davail = float(davail) * 0.001 davail='%*.*f' % (11,2,davail) print field+"(GB) ",davail field='dataused' dataused=server.getsiteresult('site_se',field,site) try: dused=float(dataused) except: dused=0.0 if dused > 0 and dused < 1 : if davail > 0.0 : totalspace= float(davail) / ( 1.0 - float(dused)) dused=totalspace-float(davail) dused='%*.*f' % (11,2,dused) print field+"(GB) ", dused elif opt == "--showtables": print server.showtables() elif opt == "--showfields": print server.showfields(arg) elif opt == "--getsiteresult": if len(args) <> 3 : print "ERROR: --getsiteresult requires a table name, a field name, and a site name" sys.exit(0) if len(args) <> 3 : print "ERROR: --getsiteresult requires a table name, a field name, and a site name" sys.exit(0) if len(args) <> 3 : print "ERROR: --getsiteresult requires a table name, a field name, and a site name" sys.exit(0) table=args[0] field=args[1] site=args[2] print server.getsiteresult(table,field,site) elif opt == "--getresult": if len(args) <> 3 : print "ERROR: --getsiteresult requires a table name, a field name, and an MySQL constraint caluse" sys.exit(0) if len(args) <> 3 : print "ERROR: --getsiteresult requires a table name, a field name, and an MySQL constraint caluse" sys.exit(0) if len(args) <> 3 : print "ERROR: --getsiteresult requires a table name, a field name, and an MySQL constraint caluse" sys.exit(0) table=args[0] field=args[1] constraint=args[2] print server.getresult(table,field,constraint) elif opt == "--services": #print "--useservice=http://www.ivdgl.org/grid3/catalog/services.php" ##print "--useservice=http://butternut.ucs.indiana.edu/services.php" #print "--useservice=http://gdsuf.phys.ufl.edu/gridcat/services.php" #print "--useservice=http://gdsuf.phys.ufl.edu/tier2-gridcat/services.php" #print "--useservice=http://gdsuf.phys.ufl.edu/grid3dev/services.php" ##print "--useservice=http://osg-itb.ivdgl.org/gridcat/services.php" print "--useservice=http://osg-cat.grid.iu.edu/services.php" #print "default : --useservice=http://www.ivdgl.org/grid3/catalog/services.php" #else: # print usage # sys.exit(0) # if it reached this far, there was no option if __name__ == '__main__': gridcat_client_main()