#! /usr/bin/env python # # $Source: /cvs/G/DRV/misc/App/scripts/bootinfo,v $ # $Revision: 1.9 $ $Date: 2004/07/30 13:28:56 $ # ''' Obtain boot information about IOCs from the ssrm_public Oracle database and make a pretty printout. Usage: ----- %s [--help] [-v] [--debug] [--nocc] [ ...] where is used to match part of the system (i.e. crate name), bootpc, ipaddr or ethaddr. Unless "--nocc" is specified, will be converted to uppercase before being used. -v displays the script's version number. Example: %s x04sa ''' #-------------------------------------------------------------------- import os, sys import signal import urllib import string import getopt import time #--------------------------------------------------------------------------- def showUsage (): # ========= base = os.path.basename (sys.argv[0]) print __doc__ % (base, base) return #-------------------------------------------------------------------- def showVersion (): # =========== ''' $Source: /cvs/G/DRV/misc/App/scripts/bootinfo,v $ $Revision: 1.9 $ $Date: 2004/07/30 13:28:56 $ Installed Location: $SLSBASE/sls/bin ''' print showVersion.__doc__ return #--------------------------------------------------------------------------- # The program starts here! if __name__ == "__main__": sys.stderr = sys.stdout caseConvert = 1 debug = 0 timeout = 15 try: # # Analyse the options # (opts, items) = getopt.getopt (sys.argv[1:], "h?v", \ ("help", "nocc", "debug")) for opt in opts: if opt[0] == "-h": raise "Help" if opt[0] == "-?": raise "Help" if opt[0] == "-v": raise "Version" if opt[0] == "--help": raise "Help" if opt[0] == "--nocc": caseConvert = 0 if opt[0] == "--debug": debug = 1 #endfor if debug: timeout = 30 except "Help": showUsage () sys.exit (0) except "Version": showVersion () sys.exit (0) except: print "Bad option. Specify \"-h\" for help." sys.exit (1) #endtry nFnd = 0 if len (items) == 0: items = "%" # ## ## The following code has been hacked around because of DUO problems. ## DM, 22-Jul-2004 ## ## query = "SELECT SYSTEM AS IOC, " + \ ## "BOOTDATE, " + \ ## "BOOTTIME, " + \ ## "BOOTPC, " + \ ## "SLSBASE, " + \ ## "EPICSVER AS EPICS, " + \ ## "VXWORKSVER AS VXWORKS, " + \ ## "IPADDR, " + \ ## "VXWORKS AS ARCH " + \ ## "FROM SSRM.IOC_LASTBOOTED " + \ ## "WHERE SYSTEM LIKE '%" + item + "%' OR " + \ ## "BOOTPC LIKE '%" + item + "%' OR " + \ ## "SLSBASE LIKE '%" + item + "%' OR " + \ ## "EPICSVER LIKE '%" + item + "%' OR " + \ ## "VXWORKSVER LIKE '%" + item + "%' OR " + \ ## "IPADDR LIKE '%" + item + "%' OR " + \ ## "ETHADDR LIKE '%" + item + "%' OR " + \ ## "IPADDR LIKE '%" + item + "%' OR " + \ ## "VXWORKS LIKE '%" + item + "%' " + \ ## "ORDER BY IOC" childPID = os.fork () if childPID == 0: query = "SELECT SYSTEM AS IOC, " + \ "BOOTDATE, " + \ "BOOTTIME, " + \ "BOOTPC, " + \ "SLSBASE, " + \ "EPICSVER AS EPICS, " + \ "VXWORKSVER AS VXWORKS, " + \ "IPADDR, " + \ "VXWORKS AS ARCH " + \ "FROM SSRM.IOC_LASTBOOTED" if debug: print "query = \"%s\"" % query url = "http://pc4860.psi.ch/testplan/IOC_INFOS/ioc_select.php?SQLQUER=" + \ urllib.quote_plus (query) if debug: print "url = \"%s\"" % url try: ufo = urllib.urlopen (url) # Query the database lines = ufo.readlines () # Get the result ufo.close () except: print "\aError getting data from database!" raise #endtry if debug: print "Response:" for line in lines: print " \"%s\"" % string.rstrip (line) #endif # Loop over the list of patterns. hdrNotDone = 1 for item in items: if caseConvert: item = string.upper (item) # if hdrNotDone: toks = string.split (lines[0]) print "\n%-16s %-11s %-8s %-8s %-6s %-8s %-8s %-15s %s" % \ (toks[0], toks[1], toks[2], toks[3], toks[4], toks[5], toks[6], toks[7], toks[8]) for i in range (9): toks[i] = "-------------------"[0:len (toks[i])] print "%-16s %-11s %-8s %-8s %-6s %-8s %-8s %-15s %s" % \ (toks[0], toks[1], toks[2], toks[3], toks[4], toks[5], toks[6], toks[7], toks[8]) hdrNotDone = 0 #endif for line in lines[1:]: toks = string.split (line) if len (toks) >= 9: toks[8] = os.path.basename(os.path.dirname (toks[8])) if toks[8][-8:] == "/vxWorks": toks[8] = toks[8][0:-8] date = time.strptime ("%s %s" % (toks[1], toks[2]), "%d-%m-%Y %H:%M:%S") dateStr = time.strftime ("%d-%b-%Y %H:%M:%S", date) recd = "%-16s %s %-8s %-7s %-8s %-8s %-15s %s" % \ (toks[0], dateStr, toks[3], toks[4], toks[5], toks[6], toks[7], toks[8]) if (item == "%") or (string.find (recd, item) >= 0): print recd nFnd = nFnd + 1 #endif #endif #endif #endfor print if nFnd == 0: print "No database entries found!" else: for i in range (int (timeout)): time.sleep (1) (pid, status) = os.waitpid (childPID, os.WNOHANG) if debug: print "waitpid return status = (%d, %d)" % (pid, status) if pid == childPID: if debug: print "Child has exited." sys.exit (0) #endif #endfor os.kill (childPID, signal.SIGKILL) print "Time-out getting data from database!" #endif sys.exit (0) #endif #--------------------------------------------------# # emacs setup - force text mode to prevent emacs # # from helping with the indentation! # # Local Variables: # # mode:text # # indent-tabs-mode:nil # # End: # #--------------------------------------------------# # #------------------------------------------------- End of $RCSfile: bootinfo,v $