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.4 $"
00015 __release__ = "$Name: P04-06-05 $"
00016 __credits__ = "SLAC"
00017
00018 import LATTE.copyright_SLAC
00019
00020 # base classes
00021 from LATTE.monitoring.Collector import Collector
00022 from ConfigParser import *
00023
00024 from LATTE.client.gCmdCli import CmdCli
00025 from LATTE.database.gLAT import GLAT
00026 from LATTE.database.gHSK import GHSK
00027 from LATTE.monitoring.HskCli import *
00028
00029
00030 class HskConfiguration(ConfigParser):
00031 """
00032 """
00033 def __init__(self):
00034 ConfigParser.__init__(self)
00035 self.__fileName = None
00036
00037 def read(self, fileName):
00038 self.__fileName = fileName
00039 ConfigParser.read(self, fileName)
00040
00041 def verify(self):
00042 # test the config for required parameters
00043 cSect = self.sections()
00044 REQUIRED = ('core', 'database', 'inputs')
00045 for sect in REQUIRED:
00046 if sect not in cSect:
00047 msg = 'Config file %s is missing required section: %s' % ( self.__fileName, sect )
00048 raise KeyError, msg
00049
00050 # core check
00051 coItems = self.options('core')
00052 REQUIRED = ()
00053 for item in REQUIRED:
00054 if item not in dbItems:
00055 msg = 'Config file %s is missing required key %s in core section' % ( self.__fileName, item )
00056 raise KeyError, msg
00057
00058 # database check
00059 dbItems = self.options('database')
00060 REQUIRED = ('type',)
00061 for item in REQUIRED:
00062 if item not in dbItems:
00063 msg = 'Config file %s is missing required key %s in database section' % ( self.__fileName,item )
00064 raise KeyError, msg
00065
00066 # inputs check
00067 inItems = self.options('inputs')
00068 REQUIRED = ('latschema', 'hskschema', 'server', 'packet')
00069 for item in REQUIRED:
00070 if item not in inItems:
00071 msg = 'Config file %s is missing required key %s in inputs section' % ( self.__fileName, item )
00072 raise KeyError, msg
00073
00074
00075 class HskCollector(Collector):
00076 """\brief Configurable housekeeping collector
00077
00078 Takes a HskConfiguration object as input.
00079 """
00080 def __init__(self, config):
00081 Collector.__init__(self)
00082
00083 # Required inputs. Checked in setup of configuration
00084 latSchema = config.get('inputs', 'latSchema')
00085 hskSchema = config.get('inputs', 'hskSchema')
00086 cmdServer = config.get('inputs', 'server')
00087
00088
00089 # set up command client
00090 self.__cmdCli = CmdCli()
00091 self.__cmdHandler = HskHandler(self.__cmdCli, cmdServer)
00092
00093 # set up LAT database (Needed for commanding)
00094 self.__latDB = GLAT(self.__cmdCli)
00095 self.__latDB.readSchema(latSchema)
00096
00097 # set up HSK database
00098 self.__hskDB = GHSK(self.__cmdCli)
00099 self.__hskDB.readSchema(hskSchema)
00100 self.__hskDB.applyConfig(None)
00101
00102 # Delay setting is optional, default = 10 seconds
00103 try:
00104 self.setDelay(config.getint('core', 'delay'))
00105 except:
00106 pass
00107
00108 # set up retrievers
00109 if config.getboolean('inputs', 'packet'):
00110 # HskPacket reads
00111 from LATTE.monitoring.HskCli import HskCli
00112 from LATTE.monitoring.HskPacketRetriever import HskPacketRetriever
00113 self.__hskCli = HskCli()
00114 self.__hskHandler = HskHandler(self.__hskCli, cmdServer)
00115 self.addRetriever( "HSK", HskPacketRetriever(self.__hskCli) )
00116 else:
00117 # LAT single register reads
00118 from LATTE.monitoring.HskRetriever import HskLatRetriever
00119 self.addRetriever( "HSK", HskLatRetriever(self.__latDB) )
00120
00121 # set up recorders:
00122 # Alarming system
00123 from LATTE.monitoring.HskRecorder import HskAlarmRecorder
00124 self.addRecorder( HskAlarmRecorder(self.__hskDB) )
00125
00126 # Systems to write data out
00127 if config.get('database', 'type') == 'sql':
00128 # set up SQL recorder
00129 import MySQLdb
00130 from LATTE.monitoring.HskSqlInterface import HskSqlRecorder
00131 host = config.get('database', 'host')
00132 user = config.get('database', 'user')
00133 src = config.getint('database', 'machineid')
00134
00135 sqlDB = MySQLdb.connect(host=host, db='itosdb', user=user)
00136 self.addRecorder(HskSqlRecorder(self.__hskDB, sqlDB.cursor(), src))
00137 else:
00138 # text/flatfile database
00139 dataFile = config.get('database', 'datafile')
00140 from LATTE.monitoring.HskRecorder import HskFileRecorder
00141 self.addRecorder(HskFileRecorder(self.__hskDB, dataFile))
00142
00143 # optional UDP broadcast
00144 if config.has_section('udp') & config.getboolean('udp', 'broadcast'):
00145 from LATTE.monitoring.Recorder import UDPRecorder
00146 serverName = config.get('udp', 'serverName')
00147 serverAddr = config.get('udp', 'serverAddr')
00148
00149 udpR = UDPRecorder()
00150 udpR.startUDPServer(serverName,serverAddr)
00151 self.addRecorder(udpR)
00152
00153 def latDB(self): return self.__latDB
00154 def hskDB(self): return self.__hskDB
00155
00156
00157
00158
00159
00160