#! /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] [<pattern> ...]
  where
    <pattern> is used to match part of the system (i.e. crate name),
              bootpc, ipaddr or ethaddr.
    Unless "--nocc" is specified, <pattern> 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 $
