From 93c03424db023696c59989c83fcbdd16da428735 Mon Sep 17 00:00:00 2001 From: Pieter Donker <donker@astron.nl> Date: Mon, 2 Nov 2015 08:22:10 +0000 Subject: [PATCH] Task #8683: removed tile based rf-test and added extra logging --- LCU/checkhardware/checkHardware.py | 453 ++++++++++++++------------- LCU/checkhardware/lib/general_lib.py | 13 +- LCU/checkhardware/rtsm.py | 26 +- LCU/checkhardware/showTestResult.py | 316 ++++++++++--------- 4 files changed, 425 insertions(+), 383 deletions(-) diff --git a/LCU/checkhardware/checkHardware.py b/LCU/checkhardware/checkHardware.py index abc6fcd9f51..cda79248ee1 100755 --- a/LCU/checkhardware/checkHardware.py +++ b/LCU/checkhardware/checkHardware.py @@ -1,22 +1,23 @@ #!/usr/bin/python + info = ''' ---------------------------------------------------------------------------- Usage of arguments -cf=fullfilename : full path and filename for the configurationfile to use. -l=2 : set level to 2 (default level is 0) - level 0 : manual checks, use keys listed below + level 0 : manual checks, use keys listed below level 1..n : see checkhardware.conf file for checks done - + To start a long check set number of runs or start and stop time, if start time is not given the first run is started immediately -r=1 : repeats, number of runs to do -start=[date_time]: start time of first run, format [YYYYMMDD_HH:MM:SS] -stop=[date_time] : stop time of last run, format [YYYYMMDD_HH:MM:SS] - + Set logging level, can be: debug|info|warning|error -ls=debug : print all information on screen, default=info -lf=info : print debug|warning|error information to log file, default=debug - + Select checks to do, can be combined with all levels -s(rcumode) : signal check for rcumode -sh(rcumode) : short test for rcumode 1..4 @@ -28,16 +29,16 @@ info = ''' ------------------------------------------------------------------ -e(rcumode)[=120] : do all HBA element tests, optional data time in seconds default = 10 sec. -sn(rcumode) : HBA summator noise check. -m(rcumode) : HBA modem check. - + -rcu(mode) : do all rcu(mode) tests - + -rv : RSP version check, always done -tv : TBB version check, always done - + -rbc : RSP board check, voltage and temperature -spu : SPU voltage check -tm : TBB memmory check - + example : ./checkHardware.py -s5 -n5=180 ----------------------------------------------------------------------------''' @@ -69,22 +70,22 @@ os.umask(001) logger = None -rcu_keys = ('RCU1','RCU2','RCU3','RCU4','RCU5','RCU6','RCU7') -rcu_m1_keys = ('O1','SP1','N1','S1','SH1','D1','F1') -rcu_m2_keys = ('O2','SP2','N2','S2','SH2','D2','F2') -rcu_m3_keys = ('O3','SP3','N3','S3','SH3','D3','F3') -rcu_m4_keys = ('O4','SP4','N4','S4','SH4','D4','F4') -rcu_m5_keys = ('M5','O5','SN5','SP5','N5','S5','E5') -rcu_m6_keys = ('M6','O6','SN6','SP6','N6','S6','E6') -rcu_m7_keys = ('M7','O7','SN7','SP7','N7','S7','E7') +rcu_keys = ('RCU1', 'RCU2', 'RCU3', 'RCU4', 'RCU5', 'RCU6', 'RCU7') +rcu_m1_keys = ('O1', 'SP1', 'N1', 'S1', 'SH1', 'D1', 'F1') +rcu_m2_keys = ('O2', 'SP2', 'N2', 'S2', 'SH2', 'D2', 'F2') +rcu_m3_keys = ('O3', 'SP3', 'N3', 'S3', 'SH3', 'D3', 'F3') +rcu_m4_keys = ('O4', 'SP4', 'N4', 'S4', 'SH4', 'D4', 'F4') +rcu_m5_keys = ('M5', 'O5', 'SN5', 'SP5', 'N5', 'S5', 'E5') +rcu_m6_keys = ('M6', 'O6', 'SN6', 'SP6', 'N6', 'S6', 'E6') +rcu_m7_keys = ('M7', 'O7', 'SN7', 'SP7', 'N7', 'S7', 'E7') rcu_m12_keys = rcu_m1_keys + rcu_m2_keys rcu_m34_keys = rcu_m3_keys + rcu_m4_keys rcu_m567_keys = rcu_m5_keys + rcu_m6_keys + rcu_m7_keys -rsp_keys = ('RV','SPU','RBC') + rcu_keys + rcu_m12_keys + rcu_m34_keys + rcu_m567_keys -tbb_keys = ('TV','TM') -control_keys = ('R','START','STOP') +rsp_keys = ('RV', 'SPU', 'RBC') + rcu_keys + rcu_m12_keys + rcu_m34_keys + rcu_m567_keys +tbb_keys = ('TV', 'TM') +control_keys = ('R', 'START', 'STOP') all_keys = control_keys + rsp_keys + tbb_keys rsp_check = False tbb_check = False @@ -99,18 +100,19 @@ args['TV'] = '-' def printHelp(): print info + # return readable info for test def getTestInfo(key=''): if key[-1] in '1234567': test_name = '' test = key[:-1] mode = key[-1] - + if mode in '1234': ant_type = 'LBA' else: ant_type = 'HBA' - + if test in ('O',): test_name += 'Oscillation' if test in ('SP',): @@ -124,7 +126,7 @@ def getTestInfo(key=''): if test in ('D',): test_name += 'Down' if test in ('F',): - test_name += 'Flat' + test_name += 'Flat' if test in ('S',): test_name += 'RF' if test in ('SN',): @@ -132,16 +134,18 @@ def getTestInfo(key=''): if test in ('E',): test_name += 'Element' if test in ('M',): - test_name += 'Modem' - + test_name += 'Modem' + if test in ('RCU',): + test_name += 'All tests' + return '%s mode-%c %s check' % (ant_type, mode, test_name) - + if key in 'RV': return 'RSP Version check' if key in 'SPU': return 'SPU check' if key in 'RBC': - return 'RSP board check' + return 'RSP board check' if key in 'TV': return 'TBB Version check' if key in 'TM': @@ -149,30 +153,31 @@ def getTestInfo(key=''): if key in 'START': return 'START checks' if key in 'STOP': - return 'STOP checks' + return 'STOP checks' if key in 'R': return 'Number of test repeats set to' - return('') - + return('') + + def addToArgs(key, value): if key == '': return global args, rsp_check, tbb_check - if key in rsp_keys or key in tbb_keys or key in ('H','L','LS','LF','R','START','STOP'): + if key in rsp_keys or key in tbb_keys or key in ('H', 'L', 'LS', 'LF', 'R', 'START', 'STOP'): if value != '-': args[key] = value - else: + else: args[key] = '-' - + if key in rsp_keys: rsp_check = True if key in tbb_keys: tbb_check = True else: - sys.exit('Unknown key %s' %(key)) + sys.exit('Unknown key %s' % (key)) return - - + + def getArguments(): key = '' value = '-' @@ -186,15 +191,14 @@ def getArguments(): key, value = opt, '-' addToArgs(key=key, value=value) return - + + # get checklevel and set tests to do def setLevelTests(conf): - #global args - level = args.get('L', '0') if level == '0': return - tests = conf.getStr('level-%s-tests' %(level)).split(',') + tests = conf.getStr('level-%s-tests' % (level)).split(',') for tst in tests: opt = tst.upper() valpos = opt.find('=') @@ -206,37 +210,38 @@ def setLevelTests(conf): addToArgs(key=key, value=value) return + # get and unpack configuration file class cConfiguration: def __init__(self): self.conf = dict() - if args.has_key('CF'): + if 'CF' in args: filename = args.get('CF') else: filename = '/localhome/stationtest/config/checkHardware.conf' - + f = open('/localhome/stationtest/config/checkHardware.conf', 'r') data = f.readlines() f.close() for line in data: - if line[0] in ('#','\n',' '): + if line[0] in ('#', '\n', ' '): continue if line.find('#') > 0: line = line[:line.find('#')] try: key, value = line.strip().split('=') - key = key.replace('_','-') + key = key.replace('_', '-') self.conf[key] = value except: - print 'Not a valid configuration setting: %s' %(line) + print 'Not a valid configuration setting: %s' % (line) - def getInt(self,key, default=0): + def getInt(self, key, default=0): return (int(self.conf.get(key, str(default)))) - def getFloat(self,key, default=0.0): + def getFloat(self, key, default=0.0): return (float(self.conf.get(key, str(default)))) - def getStr(self,key): + def getStr(self, key): return (self.conf.get(key, '')) @@ -263,15 +268,15 @@ def init_logging(): # create logger logger = logging.getLogger() logger.setLevel(logging.DEBUG) - - # check if log dir exist + + # check if log dir exist if not os.access(logPath, os.F_OK): os.mkdir(logPath) - + # create file handler full_filename = os.path.join(logPath, 'checkHardware.log') - #backup_filename = os.path.join(mainPath, 'checkHardware_bk.log') - #sendCmd('cp', '%s %s' %(full_filename, backup_filename)) + # backup_filename = os.path.join(mainPath, 'checkHardware_bk.log') + # sendCmd('cp', '%s %s' % (full_filename, backup_filename)) file_handler = logging.FileHandler(full_filename, mode='w') formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s') file_handler.setFormatter(formatter) @@ -281,29 +286,31 @@ def init_logging(): if len(logger.handlers) == 1: # create console handler stream_handler = logging.StreamHandler() - fmt = '%s %%(levelname)-8s %%(message)s' %(station) + fmt = '%s %%(levelname)-8s %%(message)s' % (station) formatter = logging.Formatter(fmt) stream_handler.setFormatter(formatter) stream_handler.setLevel(log_levels[screen_log_level]) logger.addHandler(stream_handler) return + def backupLogFiles(): - for nr in range(8,-1,-1): + for nr in range(8, -1, -1): if nr == 0: full_filename = os.path.join(logPath, 'checkHardware.log') else: - full_filename = os.path.join(logPath, 'checkHardware.log.%d' %(nr)) - full_filename_new = os.path.join(logPath, 'checkHardware.log.%d' %(nr+1)) + full_filename = os.path.join(logPath, 'checkHardware.log.%d' % (nr)) + full_filename_new = os.path.join(logPath, 'checkHardware.log.%d' % (nr+1)) if os.path.exists(full_filename): os.rename(full_filename, full_filename_new) - return + return + def waitForStart(start_datetime): start_time = time.mktime(start_datetime.timetuple()) if start_time > time.time(): - logger.info('delayed start, sleep till %s' %(time.asctime(start_datetime.timetuple()))) - + logger.info('delayed start, sleep till %s' % (time.asctime(start_datetime.timetuple()))) + while start_time > time.time(): wait_time = start_time - time.time() sleep_time = min(wait_time, 3600.0) @@ -313,13 +320,13 @@ def waitForStart(start_datetime): def main(): getArguments() - #print args - if len(args) == 0 or args.has_key('H'): + # print args + if len(args) == 0 or 'H' in args: printHelp() sys.exit() - backupLogFiles() # backup logfiles, max 10 logfiles .9 is the oldest - + backupLogFiles() # backup logfiles, max 10 logfiles .9 is the oldest + init_logging() init_lofar_lib() init_test_db() @@ -336,60 +343,58 @@ def main(): logger.info('== requested checks and settings ==') logger.info('-'*40) for i in all_keys: - if args.has_key(i): + if i in args: if args.get(i) == '-': - logger.info(' %s' %(getTestInfo(i))) + logger.info(' %s' % (getTestInfo(i))) else: - logger.info(' %s, time = %s' %(getTestInfo(i), args.get(i))) + logger.info(' %s, time = %s' % (getTestInfo(i), args.get(i))) logger.info('-'*40) - + removeAllDataFiles() # use format YYYYMMDD_HH:MM:SS stop_time = -1 - if args.has_key('STOP'): + if 'STOP' in args: stop = args.get('STOP') if len(stop) != 17: - sys.exit('wrong stoptime format must be YYYYMMDD_HH:MM:SS') - stop_datetime = datetime.datetime(int(stop[:4]),int(stop[4:6]),int(stop[6:8]), \ - int(stop[9:11]),int(stop[12:14]),int(stop[15:])) + return 'wrong stoptime format must be YYYYMMDD_HH:MM:SS' + stop_datetime = datetime.datetime(int(stop[:4]), int(stop[4:6]), int(stop[6:8]), + int(stop[9:11]), int(stop[12:14]), int(stop[15:])) stop_time = time.mktime(stop_datetime.timetuple()) - - if args.has_key('START'): + + if 'START' in args: start = args.get('START') if len(start) != 17: - sys.exit('wrong starttime format must be YYYYMMDD_HH:MM:SS') - start_datetime = datetime.datetime(int(start[:4]),int(start[4:6]),int(start[6:8]), \ - int(start[9:11]),int(start[12:14]),int(start[15:])) + return 'wrong starttime format must be YYYYMMDD_HH:MM:SS' + start_datetime = datetime.datetime(int(start[:4]), int(start[4:6]), int(start[6:8]), + int(start[9:11]), int(start[12:14]), int(start[15:])) if (time.mktime(start_datetime.timetuple()) < time.time()): - #print time.mktime(start_datetime.timetuple()), time.time() + # print time.mktime(start_datetime.timetuple()), time.time() logger.error('Stop program, StartTime in past') - sys.exit(2) + return 2 if(time.mktime(start_datetime.timetuple()) > stop_time): logger.error('Stop program, stop before start') - sys.exit(2) + return 2 waitForStart(start_datetime) - - logger.info('run checks till %s' %(time.asctime(stop_datetime.timetuple()))) - + + logger.info('run checks till %s' % (time.asctime(stop_datetime.timetuple()))) + start_time = time.gmtime() # Read in RemoteStation.conf ID, nRSP, nTBB, nLBL, nLBH, nHBA, HBA_SPLIT = readStationConfig() # setup intern database with station layout db = cDB(StID, nRSP, nTBB, nLBL, nLBH, nHBA, HBA_SPLIT) - - + if (stop_time > 0.0): db.setTestEndTime((stop_time-120.0)) - - + # set manualy marked bad antennas global_log_dir = conf.getStr('log-dir-global') host = getHostName() if os.path.exists(global_log_dir): full_filename = os.path.join(global_log_dir, 'bad_antenna_list.txt') - logger.info('add bad_antenna_list data from file "%s" to db' %(full_filename)) + logger.info('add bad_antenna_list data from file "%s" to db' % (full_filename)) f = open(full_filename, 'r') data = f.readlines() for line in data: @@ -402,25 +407,24 @@ def main(): ant_type = ant[:3].strip().upper() if ant_type == 'LBA': ant_nr = int(ant[3:].strip()) - #print 'ant type=%s nr=%d' %(ant_type, ant_nr) + # print 'ant type=%s nr=%d' % (ant_type, ant_nr) if ant_nr < nLBH: db.lbh.ant[ant_nr].on_bad_list = 1 else: db.lbl.ant[ant_nr-nLBH].on_bad_list = 1 elif ant_type == 'HBA': ant_nr = int(ant[3:].strip()) - #print 'ant type=%s nr=%d' %(ant_type, ant_nr) + # print 'ant type=%s nr=%d' % (ant_type, ant_nr) db.hba.tile[ant_nr].on_bad_list = 1 break else: - logger.warn('bad_antenna_list data from file "%s" not found' %(full_filename)) - - # + logger.warn('bad_antenna_list data from file "%s" not found' % (full_filename)) + db.script_versions = 'CHECK=%s,DB=%s,TEST=%s,SEARCH=%s,LOFAR=%s,GENERAL=%s' %\ (check_version, db_version, test_version, search_version, lofar_version, general_version) db.check_start_time = time.gmtime() - - writeMessage('!!! This station will be in use for a test! Please do not use the station! (script version %s) !!!' %(check_version)) + + writeMessage('!!! This station will be in use for a test! Please do not use the station! (script version %s) !!!' % (check_version)) start_level, board_errors = swlevel() sw_level, board_errors = swlevel(2) if start_level == 1: @@ -432,7 +436,7 @@ def main(): spu = cSPU(db) # do RSP tests if requested - if rsp_check == True: + if rsp_check is True: # check if RSPDriver is running if checkActiveRSPDriver() == False: logger.warn('RSPDriver not running') @@ -456,166 +460,174 @@ def main(): else: rsp_ready = True restarts = 2 - - # if all rsp boards ready do all tests + + # if all rsp boards ready do all tests if rsp_ready: - if args.has_key('RV'): + if 'RV' in args: rsp.checkVersions(conf.getStr('bp-version'), conf.getStr('ap-version')) - + resetRSPsettings() - + lbl = cLBA(db, db.lbl) lbh = cLBA(db, db.lbh) hba = cHBA(db, db.hba) - - repeats = int(args.get('R','1')) + + repeats = int(args.get('R', '1')) repeat_cnt = 1 - + runtime = 0 db.tests = '' while (repeat_cnt <= repeats) or ((stop_time > -1) and ((time.time() + runtime) < stop_time)): - + try: runstart = time.time() if stop_time > -1: - logger.info('\n=== Start testrun %d ===\n' %(repeat_cnt)) + logger.info('\n=== Start testrun %d ===\n' % (repeat_cnt)) else: - logger.info('\n=== Start testrun %d of %d ===\n' %(repeat_cnt, repeats)) - - if args.has_key('SPU'): + logger.info('\n=== Start testrun %d of %d ===\n' % (repeat_cnt, repeats)) + + if 'SPU' in args: spu.checkStatus() - - if args.has_key('RBC'): + + if 'RBC' in args: rsp.checkBoard() # check if mode 1,2 is available on this station if StID in CoreStations or StID in RemoteStations: for mode in (1, 2): lbl.reset() - # do all rcumode 1,2 tests + # do all rcumode 1,2 tests if 'RCU%d' % mode in args or 'SH%d' % mode in args: - lbl.checkShort(mode=mode) - + lbl.checkShort(mode=mode) + if 'RCU%d' % mode in args or 'F%d' % mode in args: - lbl.checkFlat(mode=mode) - + lbl.checkFlat(mode=mode) + if 'RCU%d' % mode in args or 'D%d' % mode in args: - lbl.checkDown(mode=mode, subband=conf.getInt('lbl-test-sb',301)) - + lbl.checkDown(mode=mode, subband=conf.getInt('lbl-test-sb', 301)) + if 'RCU%d' % mode in args or 'O%d' % mode in args: lbl.checkOscillation(mode=mode) - + if 'RCU%d' % mode in args or 'SP%d' % mode in args: lbl.checkSpurious(mode=mode) - + if 'RCU%d' % mode in args or 'N%d' % mode in args: - if 'RCU%d' % mode in args or args.get('N%d' %(mode)) == '-': + if 'RCU%d' % mode in args or args.get('N%d' % (mode)) == '-': recordtime = 120 else: - recordtime = int(args.get('N%d' %(mode))) - lbl.checkNoise(mode=mode, - record_time=recordtime, - low_deviation=conf.getFloat('lba-noise-min-deviation', -3.0), - high_deviation=conf.getFloat('lba-noise-max-deviation', 2.5), - max_diff=conf.getFloat('lba-noise-max-difference', 2.0)) - + recordtime = int(args.get('N%d' % (mode))) + lbl.checkNoise( + mode=mode, + record_time=recordtime, + low_deviation=conf.getFloat('lba-noise-min-deviation', -3.0), + high_deviation=conf.getFloat('lba-noise-max-deviation', 2.5), + max_diff=conf.getFloat('lba-noise-max-difference', 2.0)) + if 'RCU%d' % mode in args or 'S%d' % mode in args: - lbl.checkSignal(mode=mode, - subband=conf.getInt('lbl-test-sb',301), - min_signal=conf.getFloat('lba-rf-min-signal', 75.0), - low_deviation=conf.getFloat('lba-rf-min-deviation', -2.0), - high_deviation=conf.getFloat('lba-rf-max-deviation', 2.0)) - + lbl.checkSignal( + mode=mode, + subband=conf.getInt('lbl-test-sb', 301), + min_signal=conf.getFloat('lba-rf-min-signal', 75.0), + low_deviation=conf.getFloat('lba-rf-min-deviation', -2.0), + high_deviation=conf.getFloat('lba-rf-max-deviation', 2.0)) + for mode in (3, 4): lbh.reset() # do all rcumode 3,4 tests if 'RCU%d' % mode in args or 'SH%d' % mode in args: - lbh.checkShort(mode=mode) - + lbh.checkShort(mode=mode) + if 'RCU%d' % mode in args or 'F%d' % mode in args: - lbh.checkFlat(mode=mode) - + lbh.checkFlat(mode=mode) + if 'RCU%d' % mode in args or 'D%d' % mode in args: - lbh.checkDown(mode=mode, subband=conf.getInt('lbh-test-sb',301)) + lbh.checkDown(mode=mode, subband=conf.getInt('lbh-test-sb', 301)) if 'RCU%d' % mode in args or 'O%d' % mode in args: lbh.checkOscillation(mode=mode) - + if 'RCU%d' % mode in args or 'SP%d' % mode in args: lbh.checkSpurious(mode=mode) - + if 'RCU%d' % mode in args or 'N%d' % mode in args: - if 'RCU%d' % mode in args or args.get('N%d' %(mode)) == '-': + if 'RCU%d' % mode in args or args.get('N%d' % (mode)) == '-': recordtime = 120 else: - recordtime = int(args.get('N%d' %(mode))) - lbh.checkNoise(mode=mode, - record_time=recordtime, - low_deviation=conf.getFloat('lba-noise-min-deviation', -3.0), - high_deviation=conf.getFloat('lba-noise-max-deviation', 2.5), - max_diff=conf.getFloat('lba-noise-max-difference', 1.5)) - + recordtime = int(args.get('N%d' % (mode))) + lbh.checkNoise( + mode=mode, + record_time=recordtime, + low_deviation=conf.getFloat('lba-noise-min-deviation', -3.0), + high_deviation=conf.getFloat('lba-noise-max-deviation', 2.5), + max_diff=conf.getFloat('lba-noise-max-difference', 1.5)) + if 'RCU%d' % mode in args or 'S%d' % mode in args: - lbh.checkSignal(mode=mode, - subband=conf.getInt('lbh-test-sb',301), - min_signal=conf.getFloat('lba-rf-min-signal', 75.0), - low_deviation=conf.getFloat('lba-rf-min-deviation', -2.0), - high_deviation=conf.getFloat('lba-rf-max-deviation', 2.0)) - + lbh.checkSignal( + mode=mode, + subband=conf.getInt('lbh-test-sb', 301), + min_signal=conf.getFloat('lba-rf-min-signal', 75.0), + low_deviation=conf.getFloat('lba-rf-min-deviation', -2.0), + high_deviation=conf.getFloat('lba-rf-max-deviation', 2.0)) + for mode in (5, 6, 7): - # do all rcumode 5, 6, 7 tests + # do all rcumode 5, 6, 7 tests hba.reset() - + if 'RCU%d' % mode in args or 'M%d' % mode in args: hba.checkModem(mode=mode) hba.turnOffBadTiles() - + if 'RCU%d' % mode in args or 'O%d' % mode in args: hba.checkOscillation(mode=mode) - + if 'RCU%d' % mode in args or 'SN%d' % mode in args: hba.checkSummatorNoise(mode=mode) - + if 'RCU%d' % mode in args or 'SP%d' % mode in args: hba.checkSpurious(mode=mode) - + if 'RCU%d' % mode in args or 'N%d' % mode in args: - if 'RCU%d' % mode in args or args.get('N%d' %(mode)) == '-': + if 'RCU%d' % mode in args or args.get('N%d' % (mode)) == '-': recordtime = 120 else: - recordtime = int(args.get('N%d' %(mode))) - hba.checkNoise(mode=mode, - record_time=recordtime, - low_deviation=conf.getFloat('hba-noise-min-deviation', -3.0), - high_deviation=conf.getFloat('hba-noise-max-deviation', 2.5), - max_diff=conf.getFloat('hba-noise-max-difference', 2.0)) - - - if 'RCU%d' % mode in args or 'S%d' % mode in args: - hba.checkSignal(mode=mode, subband=conf.getInt('hba-test-sb',155), - min_signal=conf.getFloat('hba-rf-min-signal', 80.0), - low_deviation=conf.getFloat('hba-rf-min-deviation', -24.0), - high_deviation=conf.getFloat('hba-rf-max-deviation', 12.0)) - + recordtime = int(args.get('N%d' % (mode))) + hba.checkNoise( + mode=mode, + record_time=recordtime, + low_deviation=conf.getFloat('hba-noise-min-deviation', -3.0), + high_deviation=conf.getFloat('hba-noise-max-deviation', 2.5), + max_diff=conf.getFloat('hba-noise-max-difference', 2.0)) + + # if 'RCU%d' % mode in args or 'S%d' % mode in args: + if 'S%d' % mode in args: + hba.checkSignal( + mode=mode, + subband=conf.getInt('hba-test-sb', 155), + min_signal=conf.getFloat('hba-rf-min-signal', 80.0), + low_deviation=conf.getFloat('hba-rf-min-deviation', -24.0), + high_deviation=conf.getFloat('hba-rf-max-deviation', 12.0)) + runtime = (time.time() - runstart) - + # All element test if 'E%d' % mode in args: - if args.get('E%d' %(mode)) == '-': + if args.get('E%d' % (mode)) == '-': recordtime = 10 else: - recordtime = int(args.get('E%d' %(mode))) - - hba.checkElements( mode=mode, - record_time=recordtime, - subband=conf.getInt('hba-test-sb',155), - noise_low_deviation=conf.getFloat('ehba-noise-min-deviation', -3.0), - noise_high_deviation=conf.getFloat('ehba-noise-max-deviation', 2.5), - noise_max_diff=conf.getFloat('ehba-noise-max-difference', 1.5), - rf_min_signal=conf.getFloat('ehba-rf-min-signal', 70.0), - rf_low_deviation=conf.getFloat('ehba-rf-min-deviation', -24.0), - rf_high_deviation=conf.getFloat('ehba-rf-max-deviation', 12.0)) - + recordtime = int(args.get('E%d' % (mode))) + + hba.checkElements( + mode=mode, + record_time=recordtime, + subband=conf.getInt('hba-test-sb', 155), + noise_low_deviation=conf.getFloat('ehba-noise-min-deviation', -3.0), + noise_high_deviation=conf.getFloat('ehba-noise-max-deviation', 2.5), + noise_max_diff=conf.getFloat('ehba-noise-max-difference', 1.5), + rf_min_signal=conf.getFloat('ehba-rf-min-signal', 70.0), + rf_low_deviation=conf.getFloat('ehba-rf-min-deviation', -24.0), + rf_high_deviation=conf.getFloat('ehba-rf-max-deviation', 12.0)) + # stop test if driver stopped db.rsp_driver_down = not checkActiveRSPDriver() if db.rsp_driver_down and (restarts > 0): @@ -628,59 +640,68 @@ def main(): break else: time.sleep(30.0) - + # one run done repeat_cnt += 1 - except: logging.error('Caught %s', str(sys.exc_info()[0])) logging.error(str(sys.exc_info()[1])) logging.error('TRACEBACK:\n%s', traceback.format_exc()) logging.error('Aborting NOW') - #logger.error('Program fault, RSP test (%s)' %(sys.exc_value)) - #raise break - - db.rsp_driver_down = not checkActiveRSPDriver() + + db.rsp_driver_down = not checkActiveRSPDriver() if not db.rsp_driver_down: resetRSPsettings() - + # do TBB tests if requested db.tbb_driver_down = not checkActiveTBBDriver() - if (not db.tbb_driver_down) and (tbb_check == True): + if (not db.tbb_driver_down) and (tbb_check is True): # wait for TBB boards ready if waitTBBready(nTBB) == 1: try: - if args.has_key('TV'): + if 'TV' in args: db.addTestDone('TV') tbb.checkVersions(conf.getStr('tbbdriver-version'), conf.getStr('tbbctl-version'), conf.getStr('tp-version'), conf.getStr('mp-version')) - if args.has_key('TM'): + if 'TM' in args: db.addTestDone('TM') tbb.checkMemory() except: - logger.error('Program fault, TBB test (%s)' %(sys.exc_value)) + logging.error('Program fault, TBB test') + logging.error('Caught %s', str(sys.exc_info()[0])) + logging.error(str(sys.exc_info()[1])) + logging.error('TRACEBACK:\n%s', traceback.format_exc()) + logging.error('Aborting NOW') + db.check_stop_time = time.gmtime() - # do db test and write result files to log directory - log_dir = conf.getStr('log-dir-local') - if os.path.exists(log_dir): - logger.info('write result data') - db.test(log_dir) - else: - logger.warn('not a valid log directory') - if not db.rsp_driver_down: - logger.info('Going back to swlevel %d' %(start_level)) - swlevel(start_level) - + try: + # do db test and write result files to log directory + log_dir = conf.getStr('log-dir-local') + if os.path.exists(log_dir): + logger.info('write result data') + db.test(log_dir) + else: + logger.warn('not a valid log directory') + if not db.rsp_driver_down: + logger.info('Going back to swlevel %d' % (start_level)) + swlevel(start_level) + # delete files from data directory + removeAllDataFiles() + except: + logging.error('Program fault, reporting and cleanup') + logging.error('Caught %s', str(sys.exc_info()[0])) + logging.error(str(sys.exc_info()[1])) + logging.error('TRACEBACK:\n%s', traceback.format_exc()) + logging.error('Aborting NOW') + logger.info('Test ready.') - writeMessage('!!! The test is ready and the station can be used again! !!!') + writeMessage('!!! The test is ready and the station can be used again! !!!') - # delete files from data directory - removeAllDataFiles() - sys.exit(0) + return 0 if __name__ == '__main__': - main() + sys.exit(main()) diff --git a/LCU/checkhardware/lib/general_lib.py b/LCU/checkhardware/lib/general_lib.py index c1de15811ae..36d5de786fa 100644 --- a/LCU/checkhardware/lib/general_lib.py +++ b/LCU/checkhardware/lib/general_lib.py @@ -3,13 +3,17 @@ general script """ from subprocess import (Popen, PIPE) +import traceback import time import os +import sys +import logging general_version = '0913' +logger = logging.getLogger() def writeMessage(msg): - res = sendCmd('wall', msg) + sendCmd('wall', msg) return # Return date string in the following format YYYYMMDD @@ -39,10 +43,13 @@ def sendCmd(cmd='', args=''): if len(so) != 0: return (so) else: - print se - return ('No Response') + return ('Error, %s' % se) except: + logger.error('Caught %s', str(sys.exc_info()[0])) + logger.error(str(sys.exc_info()[1])) + logger.error('TRACEBACK:\n%s', traceback.format_exc()) return ('Exception Error') + return ('') # Get Host name diff --git a/LCU/checkhardware/rtsm.py b/LCU/checkhardware/rtsm.py index 8b3a6573d1a..1f9d114fd00 100755 --- a/LCU/checkhardware/rtsm.py +++ b/LCU/checkhardware/rtsm.py @@ -8,7 +8,7 @@ import traceback import os import numpy as np import time -import datetime +#import datetime import logging mainPath = r'/opt/stationtest' @@ -241,8 +241,8 @@ class CSV: return @staticmethod def writeSpectra(data, rcu, check): - dumpTime = time.gmtime(CSV.record_timestamp) - date_str = time.strftime("%Y%m%d", dumpTime) + #dumpTime = time.gmtime(CSV.record_timestamp) + #date_str = time.strftime("%Y%m%d", dumpTime) full_filename = os.path.join(rtsmPath, CSV.filename) @@ -536,10 +536,10 @@ class cDayInfo: def getObsId(): - obs_start_str = "" - obs_stop_str = "" - obs_start_time = 0.0 - obs_stop_time = 0.0 + #obs_start_str = "" + #obs_stop_str = "" + #obs_start_time = 0.0 + #obs_stop_time = 0.0 obsids = "" answer = sendCmd('swlevel') if answer.find("ObsID") > -1: @@ -596,10 +596,10 @@ class RecordBeamletStatistics(Thread): def kill_recording(self): if self.running: logger.debug("kill recording beamlet statistics") - response = sendCmd(cmd='killall', args='rspctl') + sendCmd(cmd='pkill', args='rspctl') logger.debug("recording killed") - self.running = False - self.make_plots() + #self.running = False + #self.make_plots() def make_plots(self): if self.obsid: @@ -624,7 +624,7 @@ def main(): obs_id = "" active_obs_id = "" rcumode = 0 - station = getHostName() + #station = getHostName() DI = cDayInfo() args = getArguments() @@ -638,7 +638,7 @@ def main(): conf = cConfiguration() - StID = getHostName() + #StID = getHostName() logger.info('== Start rtsm (Real Time Station Monitor) ==') @@ -704,7 +704,7 @@ def main(): # start recording beamlets if not beamlet_recording: if obs_start_time > 0.0 and time.time() >= obs_start_time: - duration = obs_stop_time - time.time() - 5 + duration = obs_stop_time - time.time() - 10 if duration > 2: beamlet_recording = RecordBeamletStatistics() beamlet_recording.set_obsid(active_obs_id) diff --git a/LCU/checkhardware/showTestResult.py b/LCU/checkhardware/showTestResult.py index 5687e12fe42..1900b69c923 100755 --- a/LCU/checkhardware/showTestResult.py +++ b/LCU/checkhardware/showTestResult.py @@ -8,28 +8,29 @@ import string # import datetime # import time +logdir = '' def print_help(): """ print help """ print "possible option for this script" - print "-------------------------------" + print "--------------------------------------------------" print "-h print this help screen" - print "-d=2 show last 2 days" - print "-f=full_path_filename" - print "-------------------------------" + print "-L2=2 show last 2 checks from L2 file" + print "-S=2 show last 2 checks from S file" + print "-f=filename full_path_filename, L2 and S are ignored" + print " " + print " if no option is given the last check done is used" + print "--------------------------------------------------" sys.exit(0) -arg_nr = 1 args = dict() -while arg_nr < len(sys.argv): - if sys.argv[arg_nr][0] == '-': - opt = sys.argv[arg_nr][1].upper() - optval = '-' - valpos = sys.argv[arg_nr].find('=') - if valpos != -1: - optval = sys.argv[arg_nr][valpos+1:] - args[opt] = optval - arg_nr += 1 +for argument in sys.argv[1:]: + if argument.startswith('-'): + if '=' in argument: + option, value = argument.strip()[1:].split('=') + args[option.strip().upper()] = value.strip() + else: + args[argument.strip()[1:].upper()] = '-' if 'H' in args: print_help() @@ -48,6 +49,8 @@ station_id = getHostName().upper() def main(): + global logdir + """ main function """ fd = open(run_path+r'/checkHardware.conf', 'r') data = fd.readlines() @@ -56,161 +59,172 @@ def main(): if line.find('log-dir-local') != -1: key, logdir = line.strip().split('=') + data_sets = [] + if 'F' in args: fullfilename = args.get('F') else: - if 'D' in args: + if 'L2' in args: testfilename = '%s_L2_StationTestHistory.csv' % station_id - else: + data_sets.append( ['L2', get_data(testfilename, int(args.get('L2', '1')))] ) + + if 'S' in args: + testfilename = '%s_S_StationTestHistory.csv' % station_id + data_sets.append( ['S', get_data(testfilename, int(args.get('S', '1')))] ) + + if not 'L2' in args and not 'S' in args: testfilename = '%s_StationTest.csv' % station_id - - if os.path.exists(logdir): - fullfilename = os.path.join(logdir, testfilename) - else: - print "not a valid log dir" - sys.exit(-1) - - try: - fd = open(fullfilename, 'r') - data = fd.readlines() - fd.close() - except: - print "%s not found in %s" % (testfilename, logdir) - sys.exit(-1) + data_sets.append( ['', get_data(testfilename, 1)] ) rcu_x = rcu_y = 0 - print "\n" + "-" * 103 - print ">" * 36 + " LAST STATION-CHECK RESULT " + "<" * 36 - print "-" * 103 - _part = '' _part_nr = -1 - first_date = 0 - if 'D' in args: - days = int(args.get('D')) - - days_cnt = 1 - - first_date = data[-1].strip().split(',')[0] - print first_date - for i in range(len(data) - 1, -1, -1): - line = data[i] + # print data for all sets + print "\n\n\n" + for check_type, data in data_sets: + message = "STATION-CHECK RESULTS %s for last %s checks" % (check_type, args.get('%s' % check_type, '1')) + banner_len = 100 + msg_len = len(message) + print "-" * banner_len + print ">" * ((banner_len - msg_len - 6) / 2) + " %s " % message + "<" * ((banner_len - msg_len - 6) / 2) + print "-" * banner_len + + check_nr = int(args.get('%s' % check_type, '1')) - 1 + for line in data: + partnumber = -1 if line[0] == '#': continue - line_date = line.strip().split(',')[0] - if line_date != first_date: - first_date = line_date - days_cnt += 1 - if days_cnt == days: - break - print first_date - - last_date = first_date - for line in data: - partnumber = -1 - if line[0] == '#': - continue - - d = line.strip().split(',') - if len(d) < 4: - continue - date = d[0] - if 'D' in args: - if last_date != date: - print '\n'+'#'*103 - last_date = date - - if first_date != 0 and int(date) < int(first_date): - continue + d = line.strip().split(',') + if len(d) < 4: + continue + date = d[0] - part = d[1] - if d[2] != '---': - partnumber = int(d[2]) - if part == 'LBL': - if partnumber < 48: - print "ERROR: LBL %d NOT a legal partnumber" % partnumber - rcu_x = 0 - rcu_y = 0 + if 'STATION' in line: + if check_nr: + message = "= csv -%s- (last - %d) =" % (check_type, check_nr) else: - rcu_x = (partnumber - 48) * 2 - rcu_y = (partnumber - 48) * 2 + 1 - if part in ('LBH', 'HBA'): - rcu_x = partnumber * 2 - rcu_y = partnumber * 2 + 1 - - msg = d[3].strip() - msg_info = string.join(d[4:], " ") - keyvalue = dict() - for i in range(4, len(d)): - if d[i].find('=') != -1: - key, valstr = d[i].split('=') - vallist = valstr.split(' ') - if len(vallist) == 1: - keyvalue[key] = vallist[0] - elif len(vallist) > 1: - keyvalue[key] = vallist - else: - keyvalue[d[i]] = '-' - - if part == 'NFO': - print_info(msg, keyvalue, msg_info) - - if part == 'SPU': - if part != _part: - _part = part - hdr = "\n== SPU " - print hdr + "=" * (104 - len(hdr)) - print_spu(partnumber, msg, keyvalue, msg_info) - - if part == 'RSP': - if part != _part: - _part = part - hdr = "\n== RSP " - print hdr + "=" * (104 - len(hdr)) - print_rsp(partnumber, msg, keyvalue) - - if part == 'TBB': - if part != _part: - _part = part - hdr = "\n== TBB " - print hdr + "="*(104-len(hdr)) - print_tbb(partnumber, msg, keyvalue) - - if part == 'RCU': - if part != _part: - _part = part - hdr = "\n== RCU " - print hdr + "=" * (104 - len(hdr)) - print_rcu(partnumber, msg, keyvalue) - - if part in ('LBL', 'LBH'): - if part != _part: - _part = part + message = "= csv -%s- (last) =" % check_type + print ' ' + '=' * len(message) + print ' ' + message + print ' ' + '=' * len(message) + check_nr -= 1 + + part = d[1] + if d[2] != '---': + partnumber = int(d[2]) if part == 'LBL': - hdr = "\n== LBA Low " + if partnumber < 48: + print "ERROR: LBL %d NOT a legal partnumber" % partnumber + rcu_x = 0 + rcu_y = 0 + else: + rcu_x = (partnumber - 48) * 2 + rcu_y = (partnumber - 48) * 2 + 1 + if part in ('LBH', 'HBA'): + rcu_x = partnumber * 2 + rcu_y = partnumber * 2 + 1 + + msg = d[3].strip() + msg_info = string.join(d[4:], " ") + keyvalue = dict() + for i in range(4, len(d)): + if d[i].find('=') != -1: + key, valstr = d[i].split('=') + vallist = valstr.split(' ') + if len(vallist) == 1: + keyvalue[key] = vallist[0] + elif len(vallist) > 1: + keyvalue[key] = vallist else: - hdr = "\n== LBA High " - print hdr + "=" * (104 - len(hdr)) - print_lba(partnumber, msg, keyvalue, rcu_x, rcu_y) - - if part == 'HBA': - if part != _part: - _part = part - hdr = "\n== HBA " - print hdr + "=" * (104 - len(hdr)) - - if partnumber != -1 and partnumber != _part_nr: - _part_nr = partnumber - header = "Tile %d (RCU %d/%d)" % (partnumber, rcu_x, rcu_y) - print "\n-- %s %s" % (header, '-' * (99 - len(header))) - - print_hba(partnumber, msg, keyvalue, rcu_x, rcu_y) - - print '\n' + '#' * 103 - + keyvalue[d[i]] = '-' + + if part == 'NFO': + print_info(msg, keyvalue, msg_info) + + if part == 'SPU': + if part != _part: + _part = part + hdr = "\n== SPU " + print hdr + "=" * (banner_len - len(hdr)) + print_spu(partnumber, msg, keyvalue, msg_info) + + if part == 'RSP': + if part != _part: + _part = part + hdr = "\n== RSP " + print hdr + "=" * (banner_len - len(hdr)) + print_rsp(partnumber, msg, keyvalue) + + if part == 'TBB': + if part != _part: + _part = part + hdr = "\n== TBB " + print hdr + "="*(banner_len - len(hdr)) + print_tbb(partnumber, msg, keyvalue) + + if part == 'RCU': + if part != _part: + _part = part + hdr = "\n== RCU " + print hdr + "=" * (banner_len - len(hdr)) + print_rcu(partnumber, msg, keyvalue) + + if part in ('LBL', 'LBH'): + if part != _part: + _part = part + if part == 'LBL': + hdr = "\n== LBA Low " + else: + hdr = "\n== LBA High " + print hdr + "=" * (banner_len - len(hdr)) + print_lba(partnumber, msg, keyvalue, rcu_x, rcu_y) + + if part == 'HBA': + if part != _part: + _part = part + hdr = "\n== HBA " + print hdr + "=" * (banner_len - len(hdr)) + + if partnumber != -1 and partnumber != _part_nr: + _part_nr = partnumber + header = "Tile %d (RCU %d/%d)" % (partnumber, rcu_x, rcu_y) + print "\n-- %s %s" % (header, '-' * (banner_len - len(header))) + + print_hba(partnumber, msg, keyvalue, rcu_x, rcu_y) + + #print '\n' + '#' * banner_len + + +def get_data(filename, n_checks): + if not filename.startswith('/'): + if os.path.exists(logdir): + fullfilename = os.path.join(logdir, filename) + else: + print "not a valid log dir" + sys.exit(-1) + try: + fd = open(fullfilename, 'r') + data = fd.readlines() + fd.close() + except: + print "%s not found in %s" % (filename, logdir) + sys.exit(-1) + + first_line = 0 + check_cnt = 0 + for i in range(len(data) - 1, -1, -1): + line = data[i] + if line[0] == '#': + continue + if 'STATION' in line: + first_line = i + check_cnt += 1 + if check_cnt == n_checks: + break + return data[first_line:] def print_info(msg, keyvalue, msg_info): """ -- GitLab