Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | Related Pages

HskCollector.py

00001 #!/usr/local/bin/python
00002 #
00003 #                               Copyright 2004
00004 #                                     by
00005 #                        The Board of Trustees of the
00006 #                     Leland Stanford Junior University.
00007 #                            All rights reserved.
00008 #
00009 
00010 __facility__ = "Online"
00011 __abstract__ = "GLAST LAT Housekeeping server infrastructure"
00012 __author__   = "Jim Panetta <panetta@slac.stanford.edu> SLAC - GLAST I&T"
00013 __date__     = "10/06/04"
00014 __version__  = "$Revision: 1.8 $"
00015 __release__  = "$Name: R04-12-00 $"
00016 __credits__  = "SLAC"
00017 
00018 import LATTE.copyright_SLAC
00019 
00020 import logging as log
00021 import logging.handlers
00022 import sys
00023 
00024 # base classes
00025 from LATTE.monitoring.Collector    import Collector
00026 from ConfigParser                  import *
00027 
00028 from LATTE.client.gCmdCli          import CmdCli
00029 from LATTE.database.gLAT           import GLAT
00030 from LATTE.database.gHSK           import GHSK
00031 from LATTE.monitoring.HskCli       import *
00032 from LATTE.logger.socketLogging    import socketLogging
00033 from LATTE.tools.gAlert            import *
00034 
00035 
00036 class HskConfiguration(ConfigParser):
00037   """
00038   """
00039   def __init__(self):
00040     ConfigParser.__init__(self)
00041     self.__fileName = None
00042   
00043   def read(self, fileName):
00044     self.__fileName = fileName
00045     ConfigParser.read(self, fileName)
00046     
00047   def verify(self):
00048     # test the config for required parameters
00049     cSect    = self.sections()
00050     REQUIRED = ('core', 'database', 'inputs')
00051     for sect in REQUIRED:
00052       if sect not in cSect:
00053         msg = 'Config file %s is missing required section: %s' % ( self.__fileName, sect )
00054         raise KeyError, msg
00055     
00056     # core check
00057     coItems  = self.options('core')
00058     REQUIRED = ('loghost',)
00059     for item in REQUIRED:
00060       if item not in coItems:
00061         msg = 'Config file %s is missing required key %s in core section' % ( self.__fileName, item )
00062         raise KeyError, msg
00063     
00064     # database check
00065     dbItems  = self.options('database')
00066     REQUIRED = ('type',)
00067     for item in REQUIRED:
00068       if item not in dbItems:
00069         msg = 'Config file %s is missing required key %s in database section' % ( self.__fileName,item )
00070         raise KeyError, msg
00071     
00072     # inputs check
00073     inItems  = self.options('inputs')
00074     REQUIRED = ('latschema', 'hskschema', 'server', 'packet')
00075     for item in REQUIRED:
00076       if item not in inItems:
00077         msg = 'Config file %s is missing required key %s in inputs section' % ( self.__fileName, item )
00078         raise KeyError, msg
00079     
00080 
00081 class HskCollector(Collector):
00082   """\brief Configurable housekeeping collector
00083   
00084   Takes a HskConfiguration object as input.
00085   """
00086   def __init__(self, config):
00087     Collector.__init__(self)
00088     
00089     # connect to the message logger and configure logging.
00090     logHost = config.get('core', 'loghost')
00091     if logHost is not "None":
00092       # Needs to be done before the first call to log
00093       if config.has_option('core', 'loglevel'):
00094         # Logger has levels like DEBUG CRITICAL, etc.  must be upper
00095         logLevel = config.get('core', 'loglevel').upper()
00096       else:
00097         logLevel = "DEBUG"
00098       socketLogging(logHost, logLevel)
00099 
00100     # Required inputs.  Checked in setup of configuration
00101     latSchema = config.get('inputs', 'latSchema')
00102     hskSchema = config.get('inputs', 'hskSchema')
00103     cmdServer = config.get('inputs', 'server')
00104     
00105     
00106     # set up command client
00107     self.__cmdCli     = CmdCli()
00108     self.__cmdHandler = HskHandler(self.__cmdCli, cmdServer)
00109     
00110     # set up LAT database (Needed for commanding)
00111     self.__latDB = GLAT(self.__cmdCli)
00112     self.__latDB.readSchema(latSchema)
00113     
00114     # set up HSK database
00115     self.__hskDB      = GHSK(self.__cmdCli)
00116     self.__hskDB.readSchema(hskSchema)
00117     self.__hskDB.applyConfig(None)
00118     
00119     # Delay setting is optional, default = 10 seconds
00120     try:
00121       self.setDelay(config.getint('core', 'delay'))
00122     except:
00123       pass
00124     
00125     # set up retrievers
00126     if config.getboolean('inputs', 'packet'):
00127       # HskPacket reads
00128       log.debug("Adding HskPacketRetriever to HSK fabric")
00129       from LATTE.monitoring.HskCli             import HskCli
00130       from LATTE.monitoring.HskPacketRetriever import HskPacketRetriever
00131       self.__hskCli     = HskCli()
00132       self.__hskHandler = HskHandler(self.__hskCli, cmdServer)
00133       self.addRetriever( "HSK", HskPacketRetriever(self.__hskCli) ) 
00134       # no delay in packetized housekeeping.  Camp on the connection.
00135       self.setDelay(0)
00136     else:
00137       # LAT single register reads
00138       log.debug("Adding HskLatRetriever to HSK fabric")
00139       from LATTE.monitoring.HskRetriever       import HskLatRetriever
00140       self.addRetriever( "HSK", HskLatRetriever(self.__latDB) )
00141 
00142     # set up recorders:
00143     # Alarming system
00144     from LATTE.monitoring.HskRecorder          import HskAlarmRecorder
00145     self.addRecorder( HskAlarmRecorder(self.__hskDB) )
00146     
00147     # Systems to write data out
00148     if config.get('database', 'type') == 'sql':
00149       # set up SQL recorder
00150       log.debug("Attempting to add HskSqlRecorder to HSK fabric")
00151       import MySQLdb
00152       from LATTE.monitoring.HskSqlInterface   import HskSqlRecorder
00153       host = config.get('database', 'host')
00154       user = config.get('database', 'user')
00155       src  = config.getint('database', 'machineid')
00156       
00157       log.debug("Connecting to database on %s" % host)
00158       sqlDB = MySQLdb.connect(host=host, db='itosdb', user=user)
00159       self.addRecorder(HskSqlRecorder(self.__hskDB, sqlDB.cursor(), src))
00160     else:
00161       # text/flatfile database
00162       log.debug("Attempting to add HskFileRecorder to HSK fabric")
00163       dataFile = config.get('database', 'datafile')
00164       from LATTE.monitoring.HskRecorder       import HskFileRecorder
00165       self.addRecorder(HskFileRecorder(self.__hskDB, dataFile))
00166     
00167     # optional UDP broadcast
00168     if config.has_section('udp') & config.getboolean('udp', 'broadcast'):
00169       log.debug("Attempting to add UDPRecorder to HSK fabric")
00170       from LATTE.monitoring.Recorder          import UDPRecorder
00171       serverName = config.get('udp', 'serverName')
00172       serverAddr = config.get('udp', 'serverAddr')
00173 
00174       udpR = UDPRecorder()
00175       udpR.startUDPServer(serverName,serverAddr)
00176       self.addRecorder(udpR)
00177     
00178     # alert("test alert 1 from hsk system", "LATTE")
00179 
00180   def latDB(self): return self.__latDB
00181   def hskDB(self): return self.__hskDB
00182 
00183 
00184 
00185 
00186 
00187 

Generated on Fri Jul 21 13:26:29 2006 for LATTE R04-12-00 by doxygen 1.4.3