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