diff --git a/as-ap-currinfo/as_ap_currinfo/as_ap_currinfo.py b/as-ap-currinfo/as_ap_currinfo/as_ap_currinfo.py index 67ea0505..8b47988f 100644 --- a/as-ap-currinfo/as_ap_currinfo/as_ap_currinfo.py +++ b/as-ap-currinfo/as_ap_currinfo/as_ap_currinfo.py @@ -1,19 +1,17 @@ """CurrInfo Soft IOC.""" import os as _os -import sys as _sys import signal as _signal -import logging as _log +import sys as _sys import pcaspy as _pcaspy import pcaspy.tools as _pcaspy_tools - from siriuspy import util as _util -from siriuspy.envars import VACA_PREFIX as _vaca_prefix from siriuspy.currinfo import BOCurrInfoApp as _BOCurrInfoApp, \ - SICurrInfoApp as _SICurrInfoApp, LICurrInfoApp as _LICurrInfoApp, \ + LICurrInfoApp as _LICurrInfoApp, SICurrInfoApp as _SICurrInfoApp, \ TSCurrInfoApp as _TSCurrInfoApp - +from siriuspy.envars import VACA_PREFIX as _VACA_PREFIX +from siriuspy.logging import configure_logging, get_logger INTERVAL = 0.5 STOP_EVENT = False @@ -21,7 +19,9 @@ def _stop_now(signum, frame): _ = frame - print(_signal.Signals(signum).name+' received at '+_util.get_timestamp()) + get_logger(_stop_now).warning( + _signal.Signals(signum).name + " received at " + _util.get_timestamp() + ) _sys.stdout.flush() _sys.stderr.flush() global STOP_EVENT @@ -30,28 +30,29 @@ def _stop_now(signum, frame): def _attribute_access_security_group(server, dbase): for k, val in dbase.items(): - if k.endswith(('-RB', '-Sts', '-Cte', '-Mon')): - val.update({'asg': 'rbpv'}) + if k.endswith(("-RB", "-Sts", "-Cte", "-Mon")): + val.update({"asg": "rbpv"}) path_ = _os.path.abspath(_os.path.dirname(__file__)) - server.initAccessSecurityFile(path_ + '/access_rules.as') + server.initAccessSecurityFile(path_ + "/access_rules.as") def _get_app(acc): acc = acc.lower() - if acc == 'bo': + if acc == "bo": return _BOCurrInfoApp() - elif acc == 'si': + elif acc == "si": return _SICurrInfoApp() - elif acc == 'li': + elif acc == "li": return _LICurrInfoApp() - elif acc == 'ts': + elif acc == "ts": return _TSCurrInfoApp() else: - raise ValueError('There is no App defined for accelarator '+acc+'.') + raise ValueError( + "There is no App defined for accelarator " + acc + "." + ) class _PCASDriver(_pcaspy.Driver): - def __init__(self, app): """Initialize driver.""" super().__init__() @@ -69,7 +70,7 @@ def read(self, reason): def write(self, reason, value): """Write IOC pvs according to main application.""" ret_val = self.app.write(reason, value) - if reason.endswith('-Cmd'): + if reason.endswith("-Cmd"): value = self.getParam(reason) + 1 if ret_val: return super().write(reason, value) @@ -84,6 +85,7 @@ def update_pv(self, pvname, value, **kwargs): def run(acc): """Main module function.""" + logger = get_logger(run) acc = acc.upper() # define abort function @@ -91,48 +93,50 @@ def run(acc): _signal.signal(_signal.SIGTERM, _stop_now) # configure log file - _util.configure_log_file() - _log.info('Starting...') + configure_logging() + logger.info("Starting...") # define IOC, init pvs database and create app object _version = _util.get_last_commit_hash() - _ioc_prefix = _vaca_prefix + ('-' if _vaca_prefix else '') - if acc == 'BO': - _ioc_prefix += acc + '-Glob:AP-CurrInfo:' - _log.debug('Creating App Object.') + _ioc_prefix = _VACA_PREFIX + ("-" if _VACA_PREFIX else "") + if acc == "BO": + _ioc_prefix += acc + "-Glob:AP-CurrInfo:" + logger.debug("Creating App Object.") app = _get_app(acc) dbase = app.pvs_database - if acc == 'BO': - dbase['Version-Cte']['value'] = _version + if acc == "BO": + dbase["Version-Cte"]["value"] = _version else: - dbase[acc+'-Glob:AP-CurrInfo:Version-Cte']['value'] = _version + dbase[acc + "-Glob:AP-CurrInfo:Version-Cte"]["value"] = _version # check if another IOC is running pvname = _ioc_prefix + next(iter(dbase)) if _util.check_pv_online(pvname, use_prefix=False): - raise ValueError('Another instance of this IOC is already running!') + raise ValueError("Another instance of this IOC is already running!") # check if another IOC is running _util.print_ioc_banner( - ioc_name=acc.lower()+'-ap-currinfo', + ioc_name=acc.lower() + "-ap-currinfo", db=dbase, - description=acc.upper()+'-AP-CurrInfo Soft IOC', + description=acc.upper() + "-AP-CurrInfo Soft IOC", version=_version, - prefix=_ioc_prefix) + prefix=_ioc_prefix, + ) # create a new simple pcaspy server and driver to respond client's requests - _log.info('Creating Server.') + logger = get_logger(run) + logger.info("Creating Server.") server = _pcaspy.SimpleServer() _attribute_access_security_group(server, dbase) - _log.info('Setting Server Database.') + logger.info("Setting Server Database.") server.createPV(_ioc_prefix, dbase) - _log.info('Creating Driver.') + logger.info("Creating Driver.") _PCASDriver(app) app.init_database() # initiate a new thread responsible for listening for client connections server_thread = _pcaspy_tools.ServerThread(server) - _log.info('Starting Server Thread.') + logger.info("Starting Server Thread.") server_thread.start() # main loop @@ -140,9 +144,9 @@ def run(acc): app.process(INTERVAL) app.close() - _log.info('Stoping Server Thread...') + logger.info("Stoping Server Thread...") # send stop signal to server thread server_thread.stop() server_thread.join() - _log.info('Server Thread stopped.') - _log.info('Good Bye.') + logger.info("Server Thread stopped.") + logger.info("Good Bye.") diff --git a/as-ap-currinfo/as_ap_currinfo/lifetime/lifetime.py b/as-ap-currinfo/as_ap_currinfo/lifetime/lifetime.py index d9ace29d..c965188b 100644 --- a/as-ap-currinfo/as_ap_currinfo/lifetime/lifetime.py +++ b/as-ap-currinfo/as_ap_currinfo/lifetime/lifetime.py @@ -1,18 +1,15 @@ """CurrInfo Lifetime Soft IOC.""" import os as _os -import sys as _sys import signal as _signal -import logging as _log +import sys as _sys import pcaspy as _pcaspy import pcaspy.tools as _pcaspy_tools - from siriuspy import util as _util -from siriuspy.envars import VACA_PREFIX as _vaca_prefix - from siriuspy.currinfo import SILifetimeApp as _SILifetimeApp - +from siriuspy.envars import VACA_PREFIX as _VACA_PREFIX +from siriuspy.logging import configure_logging, get_logger INTERVAL = 0.1 STOP_EVENT = False @@ -20,7 +17,9 @@ def _stop_now(signum, frame): _ = frame - print(_signal.Signals(signum).name+' received at '+_util.get_timestamp()) + get_logger(_stop_now).warning( + _signal.Signals(signum).name + " received at " + _util.get_timestamp() + ) _sys.stdout.flush() _sys.stderr.flush() global STOP_EVENT @@ -29,14 +28,13 @@ def _stop_now(signum, frame): def _attribute_access_security_group(server, dbase): for k, val in dbase.items(): - if k.endswith(('-RB', '-Sts', '-Cte', '-Mon')): - val.update({'asg': 'rbpv'}) + if k.endswith(("-RB", "-Sts", "-Cte", "-Mon")): + val.update({"asg": "rbpv"}) path_ = _os.path.abspath(_os.path.dirname(__file__)) - server.initAccessSecurityFile(path_ + '/access_rules.as') + server.initAccessSecurityFile(path_ + "/access_rules.as") class _PCASDriver(_pcaspy.Driver): - def __init__(self, app): """Initialize driver.""" super().__init__() @@ -54,7 +52,7 @@ def read(self, reason): def write(self, reason, value): """Write IOC pvs according to main application.""" ret_val = self.app.write(reason, value) - if reason.endswith('-Cmd'): + if reason.endswith("-Cmd"): value = self.getParam(reason) + 1 if ret_val: return super().write(reason, value) @@ -69,52 +67,60 @@ def update_pv(self, pvname, value, **kwargs): def run(): """Main module function.""" + logger = get_logger(run) # define abort function _signal.signal(_signal.SIGINT, _stop_now) _signal.signal(_signal.SIGTERM, _stop_now) # configure log file - _util.configure_log_file() + configure_logging() + logger.info("Starting...") # define IOC, init pvs database and create app object _version = _util.get_last_commit_hash() - _ioc_prefix = _vaca_prefix + ('-' if _vaca_prefix else '') - _ioc_prefix += 'SI-Glob:AP-CurrInfo:' + _ioc_prefix = _VACA_PREFIX + ("-" if _VACA_PREFIX else "") + _ioc_prefix += "SI-Glob:AP-CurrInfo:" + logger.debug("Creating App Object.") app = _SILifetimeApp() dbase = app.pvs_database - dbase['VersionLifetime-Cte']['value'] = _version + dbase["VersionLifetime-Cte"]["value"] = _version # check if another IOC is running pvname = _ioc_prefix + next(iter(dbase)) if _util.check_pv_online(pvname, use_prefix=False): - raise ValueError('Another instance of this IOC is already running!') + raise ValueError("Another instance of this IOC is already running!") # print ioc banner _util.print_ioc_banner( - ioc_name='si-ap-currinfo-lifetime', + ioc_name="si-ap-currinfo-lifetime", db=dbase, - description='SI-AP-CurrInfo-Lifetime Soft IOC', + description="SI-AP-CurrInfo-Lifetime Soft IOC", version=_version, - prefix=_ioc_prefix) + prefix=_ioc_prefix, + ) # create a new simple pcaspy server and driver to respond client's requests - _log.info('Creating Server.') + logger.info("Creating Server.") server = _pcaspy.SimpleServer() _attribute_access_security_group(server, dbase) - _log.info('Setting Server Database.') + logger.info("Setting Server Database.") server.createPV(_ioc_prefix, dbase) - _log.info('Creating Driver.') + logger.info("Creating Driver.") pcas_driver = _PCASDriver(app) app.init_database() # initiate a new thread responsible for listening for client connections server_thread = _pcaspy_tools.ServerThread(server) + logger.info("Starting Server Thread.") server_thread.start() # main loop while not STOP_EVENT: pcas_driver.app.process(INTERVAL) + logger.info("Stoping Server Thread...") # sends stop signal to server thread server_thread.stop() server_thread.join() + logger.info("Server Thread stopped.") + logger.info("Good Bye.") diff --git a/as-ap-injctrl/as_ap_injctrl/as_ap_injctrl.py b/as-ap-injctrl/as_ap_injctrl/as_ap_injctrl.py index 4da1ed8a..27b478ad 100644 --- a/as-ap-injctrl/as_ap_injctrl/as_ap_injctrl.py +++ b/as-ap-injctrl/as_ap_injctrl/as_ap_injctrl.py @@ -1,24 +1,25 @@ """AS-AP-InjCtrl Soft IOC.""" import os as _os -import sys as _sys import signal as _signal +import sys as _sys import pcaspy as _pcaspy import pcaspy.tools as _pcaspy_tools - from siriuspy import util as _util -from siriuspy.envars import VACA_PREFIX as _vaca_prefix - +from siriuspy.envars import VACA_PREFIX as _VACA_PREFIX from siriuspy.injctrl.main import App as _App +from siriuspy.logging import configure_logging, get_logger, LogMonHandler -INTERVAL = 0.1 +INTERVAL = 1 / 10 # [s] STOP_EVENT = False def _stop_now(signum, frame): _ = frame - print(_signal.Signals(signum).name+' received at '+_util.get_timestamp()) + get_logger(_stop_now).warning( + _signal.Signals(signum).name + " received at " + _util.get_timestamp() + ) _sys.stdout.flush() _sys.stderr.flush() global STOP_EVENT @@ -27,14 +28,13 @@ def _stop_now(signum, frame): def _attribute_access_security_group(server, dbase): for k, val in dbase.items(): - if k.endswith(('-RB', '-Sts', '-Cte', '-Mon')): - val.update({'asg': 'rbpv'}) + if k.endswith(("-RB", "-Sts", "-Cte", "-Mon")): + val.update({"asg": "rbpv"}) path_ = _os.path.abspath(_os.path.dirname(__file__)) - server.initAccessSecurityFile(path_ + '/access_rules.as') + server.initAccessSecurityFile(path_ + "/access_rules.as") class _PCASDriver(_pcaspy.Driver): - def __init__(self, app): """Initialize driver.""" super().__init__() @@ -50,7 +50,7 @@ def read(self, reason): def write(self, reason, value): """Write IOC pvs according to main application.""" ret_val = self.app.write(reason, value) - if reason.endswith('-Cmd'): + if reason.endswith("-Cmd"): value = self.getParam(reason) + 1 if ret_val: return super().write(reason, value) @@ -58,6 +58,7 @@ def write(self, reason, value): def update_pv(self, pvname, value, **kwargs): """Update PV.""" + _ = kwargs self.setParam(pvname, value) self.updatePV(pvname) @@ -69,48 +70,60 @@ def run(): _signal.signal(_signal.SIGTERM, _stop_now) # configure log file - _util.configure_log_file() + configure_logging() # define IOC, init pvs database and create app object _version = _util.get_last_commit_hash() - _ioc_prefix = _vaca_prefix + ('-' if _vaca_prefix else '') - _ioc_prefix += 'AS-Glob:AP-InjCtrl:' + _ioc_prefix = _VACA_PREFIX + ("-" if _VACA_PREFIX else "") + _ioc_prefix += "AS-Glob:AP-InjCtrl:" app = _App() dbase = app.pvs_database - dbase['Version-Cte']['value'] = _version + dbase["Version-Cte"]["value"] = _version # check if another IOC is running pvname = _ioc_prefix + next(iter(dbase)) if _util.check_pv_online(pvname, use_prefix=False): - raise ValueError('Another instance of this IOC is already running!') + raise ValueError("Another instance of this IOC is already running!") # check if another IOC is running _util.print_ioc_banner( - ioc_name='AS-AP-InjCtrl', + ioc_name="AS-AP-InjCtrl", db=dbase, - description='AS-AP-InjCtrl Soft IOC', + description="AS-AP-InjCtrl Soft IOC", version=_version, - prefix=_ioc_prefix) + prefix=_ioc_prefix, + logger=get_logger(run), + ) # create a new simple pcaspy server and driver to respond client's requests + logger = get_logger(run) + logger.info("Creating Server.") server = _pcaspy.SimpleServer() _attribute_access_security_group(server, dbase) + logger.info("Setting Server Database.") server.createPV(_ioc_prefix, dbase) - driver = _PCASDriver(app) + logger.info("Creating Driver.") + _PCASDriver(app) app.init_database() + # Add handler to update 'Log-Mon' PV to the root logger: + get_logger().addHandler(LogMonHandler(app.update_log)) # initiate a new thread responsible for listening for client connections server_thread = _pcaspy_tools.ServerThread(server) + logger.info("Starting Server Thread.") server_thread.start() # main loop - driver.app.scanning = True + app.scanning = True while not STOP_EVENT: - driver.app.process(INTERVAL) + app.process(INTERVAL) - driver.app.scanning = False - driver.app.quit = True + logger.info("Stoping Server Thread...") + app.scanning = False + app.quit = True # sends stop signal to server thread server_thread.stop() server_thread.join() + logger.info("Server Thread stopped.") + logger.info("Good Bye.") diff --git a/as-ps-diag/as_ps_diag/as_ps_diag.py b/as-ps-diag/as_ps_diag/as_ps_diag.py index 77b60025..07168cc8 100755 --- a/as-ps-diag/as_ps_diag/as_ps_diag.py +++ b/as-ps-diag/as_ps_diag/as_ps_diag.py @@ -2,22 +2,19 @@ """AS PS Diagnostic.""" import os as _os -import sys as _sys import signal as _signal -import logging as _log +import sys as _sys import pcaspy as _pcaspy import pcaspy.tools as _pcaspy_tools from pcaspy import Driver as _Driver - from siriuspy import util as _util -from siriuspy.envars import VACA_PREFIX as _vaca_prefix -from siriuspy.search import PSSearch as _PSSearch - -from siriuspy.diagsys.psdiag.csdev import get_ps_diag_propty_database as \ - _get_database +from siriuspy.diagsys.psdiag.csdev import \ + get_ps_diag_propty_database as _get_database from siriuspy.diagsys.psdiag.main import PSDiagApp as _App - +from siriuspy.envars import VACA_PREFIX as _VACA_PREFIX +from siriuspy.logging import configure_logging, get_logger +from siriuspy.search import PSSearch as _PSSearch _COMMIT_HASH = _util.get_last_commit_hash() @@ -27,8 +24,9 @@ def _stop_now(signum, frame): global STOP_EVENT - _log.warning(_signal.Signals(signum).name + - ' received at ' + _util.get_timestamp()) + get_logger(_stop_now).warning( + _signal.Signals(signum).name + " received at " + _util.get_timestamp() + ) _sys.stdout.flush() _sys.stderr.flush() STOP_EVENT = True @@ -36,14 +34,13 @@ def _stop_now(signum, frame): def _attribute_access_security_group(server, dbase): for k, val in dbase.items(): - if k.endswith(('-RB', '-Sts', '-Cte', '-Mon')): - val.update({'asg': 'rbpv'}) + if k.endswith(("-RB", "-Sts", "-Cte", "-Mon")): + val.update({"asg": "rbpv"}) path_ = _os.path.abspath(_os.path.dirname(__file__)) - server.initAccessSecurityFile(path_ + '/access_rules.as') + server.initAccessSecurityFile(path_ + "/access_rules.as") class _PSDiagDriver(_Driver): - def __init__(self, app): super().__init__() self.app = app @@ -62,96 +59,112 @@ def write(self, reason, value): return False def update_pv( - self, pvname, value=None, alarm=None, severity=None, field='value', - **kwargs): + self, + pvname, + value=None, + alarm=None, + severity=None, + field="value", + **kwargs, + ): """.""" _ = kwargs - if field == 'value': + if field == "value": self.setParam(pvname, value) - elif field == 'status': + elif field == "status": if value is not None: self.setParam(pvname, value) self.setParamStatus(pvname, alarm, severity) self.updatePV(pvname) -def run(section='', sub_section='', device='', debug=False): +def run(section="", sub_section="", device="", debug=False): """Run IOC.""" + logger = get_logger(run) + # define abort function _signal.signal(_signal.SIGINT, _stop_now) _signal.signal(_signal.SIGTERM, _stop_now) # configure log - _util.configure_log_file(debug=debug) + configure_logging(debug=debug) + logger.info("Starting...") - _log.info("Loading power supplies") - _log.info("{:12s}: {}".format('\tSection', section or 'None')) - _log.info("{:12s}: {}".format('\tSub Section', sub_section or 'None')) - _log.info("{:12s}: {}".format('\tDevice', device or 'None')) + logger.info("Loading power supplies") + logger.info("%12s: %s", "\tSection", section or "None") + logger.info("%12s: %s", "\tSub Section", sub_section or "None") + logger.info("%12s: %s", "\tDevice", device or "None") # create PV database device_filter = dict() if section: - device_filter['sec'] = section + device_filter["sec"] = section if sub_section: - device_filter['sub'] = sub_section + device_filter["sub"] = sub_section if device: - device_filter['dev'] = device - device_filter['dis'] = 'PS' + device_filter["dev"] = device + device_filter["dis"] = "PS" psnames = _PSSearch.get_psnames(device_filter) if not psnames: - _log.warning('No devices found. Aborting.') + logger.warning("No devices found. Aborting.") _sys.exit(0) _version = _util.get_last_commit_hash() - prefix = _vaca_prefix + ('-' if _vaca_prefix else '') + prefix = _VACA_PREFIX + ("-" if _VACA_PREFIX else "") pvdb = dict() for psname in psnames: - _log.debug('{:32s}'.format(psname)) + logger.debug("%32s", psname) dbase = _get_database(psname) for key, value in dbase.items(): - if key == 'DiagVersion-Cte': - value['value'] = _COMMIT_HASH - pvname = psname + ':' + key + if key == "DiagVersion-Cte": + value["value"] = _COMMIT_HASH + pvname = psname + ":" + key pvdb[pvname] = value # check if another IOC is running pvname = prefix + next(iter(pvdb)) if _util.check_pv_online(pvname, use_prefix=False): - raise ValueError('Another instance of this IOC is already running!') + raise ValueError("Another instance of this IOC is already running!") # create app app = _App(psnames) # create a new simple pcaspy server - _log.info("Creating server with %d devices and '%s' prefix", - len(psnames), prefix) + logger.info( + "Creating server with %d devices and '%s' prefix", len(psnames), prefix + ) server = _pcaspy.SimpleServer() _attribute_access_security_group(server, pvdb) + logger.info("Setting Server Database.") server.createPV(prefix, pvdb) # create driver - _log.info('Creating driver') + logger.info("Creating driver") try: driver = _PSDiagDriver(app) except Exception: - _log.error('Failed to create driver. Aborting', exc_info=True) + logger.exception("Failed to create driver. Aborting") _sys.exit(1) _util.print_ioc_banner( - 'AS PS Diagnostic', pvdb, - 'IOC that provides power supplies diagnostics.', - _version, prefix) + "AS PS Diagnostic", + pvdb, + "IOC that provides power supplies diagnostics.", + _version, + prefix, + ) # initiate a new thread responsible for listening for client connections server_thread = _pcaspy_tools.ServerThread(server) + logger.info("Starting Server Thread.") server_thread.start() # main loop driver.app.scanning = True while not STOP_EVENT: driver.app.process(INTERVAL) + logger.info("Stoping Server Thread...") driver.app.scanning = False driver.app.quit = True @@ -159,3 +172,5 @@ def run(section='', sub_section='', device='', debug=False): # sends stop signal to server thread server_thread.stop() server_thread.join() + logger.info("Server Thread stopped.") + logger.info("Good Bye.") diff --git a/as-ps/as_ps/as_ps.py b/as-ps/as_ps/as_ps.py index 95e8d3f8..97fb7209 100644 --- a/as-ps/as_ps/as_ps.py +++ b/as-ps/as_ps/as_ps.py @@ -14,27 +14,22 @@ from siriuspy import util as _util from siriuspy.envars import VACA_PREFIX as _VACA_PREFIX from siriuspy.pwrsupply.factory import BBBFactory +from siriuspy.logging import configure_logging, get_logger -from .main import App, __version__ - +from .main import App STOP_EVENT = False # _multiprocessing.Event() -PCAS_DRIVER = None - -_PREFIX = _VACA_PREFIX + ('-' if _VACA_PREFIX else '') -_COMMIT_HASH = __version__ def _stop_now(signum, frame): - global STOP_EVENT _ = frame - print(_signal.Signals(signum).name + ' received at ' + - _util.get_timestamp()) + get_logger(_stop_now).warning( + _signal.Signals(signum).name + ' received at ' + _util.get_timestamp() + ) _sys.stdout.flush() _sys.stderr.flush() + global STOP_EVENT STOP_EVENT = True - if PCAS_DRIVER is not None: - PCAS_DRIVER.app.scan = False def _attribute_access_security_group(server, dbase): @@ -49,7 +44,7 @@ class _PCASDriver(_pcaspy.Driver): def __init__(self, bbblist, dbset): super().__init__() - self.app = App(self, bbblist, dbset, _PREFIX) + self.app = App(self, bbblist, dbset) def read(self, reason): value = self.app.read(reason) @@ -72,16 +67,14 @@ def run(bbbnames): 4. Creates a Driver to handle requests 5. Starts a thread (thread_server) that listens to client connections """ - global PCAS_DRIVER + logger = get_logger(run) # Define abort function _signal.signal(_signal.SIGINT, _stop_now) _signal.signal(_signal.SIGTERM, _stop_now) - _util.configure_log_file() - - print('') - print('--- PS IOC structures initialization ---\n') + configure_logging() + logger.info('--- PS IOC structures initialization ---\n') # Create BBBs bbblist = list() @@ -91,39 +84,50 @@ def run(bbbnames): bbb, dbase = BBBFactory.create(_EthBridgeClient, bbbname=bbbname) bbblist.append(bbb) dbset.update(dbase) - dbset = {_PREFIX: dbset} + + version = _util.get_last_commit_hash() + ioc_prefix = _VACA_PREFIX + ("-" if _VACA_PREFIX else "") # check if another instance of this IOC is already running - pvname = _PREFIX + next(iter(dbset[_PREFIX])) + pvname = ioc_prefix + next(iter(dbset)) if _util.check_pv_online(pvname, use_prefix=False): raise ValueError('Another instance of this IOC is already running !') + # print info about the IOC + _util.print_ioc_banner( + ioc_name='PS IOC', + db=dbset, + description='Power Supply IOC (FAC)', + version=version, + prefix=ioc_prefix) + # Create a new simple pcaspy server and driver to respond client's requests + logger.info("Creating Server.") server = _pcaspy.SimpleServer() - for prefix, dbase in dbset.items(): - # Set security access - _attribute_access_security_group(server, dbase) - server.createPV(prefix, dbase) - - # Create driver to handle requests - PCAS_DRIVER = _PCASDriver(bbblist, dbset) + # Set security access + _attribute_access_security_group(server, dbset) + logger.info("Setting Server Database.") + server.createPV(ioc_prefix, dbset) + logger.info("Creating Driver.") + driver = _PCASDriver(bbblist, dbset) # Create a new thread responsible for listening for client connections thread_server = _pcaspy_tools.ServerThread(server) - - # Start threads and processing + logger.info("Starting Server Thread.") thread_server.start() # Main loop - run app.proccess while not STOP_EVENT: try: - PCAS_DRIVER.app.process() + driver.app.process() except Exception: - _log.warning('[!!] - exception while processing main loop') + _log.exception('[!!] - exception while processing main loop') _traceback.print_exc() break - + driver.app.scan = False + logger.info("Stoping Server Thread...") # Signal received, exit - print('exiting...') thread_server.stop() thread_server.join() + logger.info("Server Thread stopped.") + logger.info("Good Bye.") diff --git a/as-ps/as_ps/main.py b/as-ps/as_ps/main.py index c8359b69..45282374 100644 --- a/as-ps/as_ps/main.py +++ b/as-ps/as_ps/main.py @@ -1,21 +1,16 @@ """Main application.""" import time as _time -import logging as _log import re as _re import numpy as _np from pcaspy import Alarm as _Alarm from pcaspy import Severity as _Severity -from siriuspy.util import print_ioc_banner as _print_ioc_banner -from siriuspy.util import get_last_commit_hash as _get_last_commit_hash from siriuspy.thread import LoopQueueThread as _LoopQueueThread from siriuspy.namesys import SiriusPVName as _SiriusPVName from siriuspy.pwrsupply.csdev import PSSOFB_MAX_NR_UDC as _PSSOFB_MAX_NR_UDC from siriuspy.pwrsupply.bsmp.constants import UDC_MAX_NR_DEV as _UDC_MAX_NR_DEV - - -__version__ = _get_last_commit_hash() +from siriuspy.logging import get_logger as _get_logger class App: @@ -25,11 +20,12 @@ class App: _regexp_setpoint = _re.compile('^.*-(SP|Sel)$') _sofb_value_length = _PSSOFB_MAX_NR_UDC * _UDC_MAX_NR_DEV - def __init__(self, driver, bbblist, dbset, prefix): + def __init__(self, driver, bbblist, dbset): """Init application.""" # --- init begin self._driver = driver + self._logger = _get_logger(self) # flag to indicate sofb processing is taking place self._sofb_processing = False @@ -45,7 +41,7 @@ def __init__(self, driver, bbblist, dbset, prefix): self._bbblist = bbblist # NOTE: change IOC to accept only one BBB sofbmode_pvname = self.bbblist[0].psnames[0] + ':SOFBMode-Sts' - if sofbmode_pvname in dbset[prefix]: + if sofbmode_pvname in dbset: self._sofbmode_sts_pvname = sofbmode_pvname else: self._sofbmode_sts_pvname = None @@ -58,17 +54,6 @@ def __init__(self, driver, bbblist, dbset, prefix): for bbb in bbblist: bbb.init() - # -- init end - print('---\n') - - # print info about the IOC - _print_ioc_banner( - ioc_name='PS IOC', - db=dbset[prefix], - description='Power Supply IOC (FAC)', - version=__version__, - prefix=prefix) - @property def driver(self): """Pcaspy driver.""" @@ -86,7 +71,7 @@ def process(self): qsize = self._queue.qsize() if qsize > 2: logmsg = f'[Q] - write queue size is large: {qsize}' - _log.warning(logmsg) + self._logger.warning(logmsg) # then scan bbb state for updates. for bbb in self.bbblist: @@ -97,11 +82,12 @@ def process(self): _time.sleep(max(dt_, 0)) # NOTE: measure this interval for various BBBs... - # _log.info("process.... {:.3f} ms".format(1000*(t1_-t0_))) + # self._logger.info("process.... {:.3f} ms".format(1000*(t1_-t0_))) def read(self, reason): """Read from database.""" - # _log.info("[{:.2s}] - {:.32s} = {:.50s}".format( + _ = reason + # self._logger.info("[{:.2s}] - {:.32s} = {:.50s}".format( # 'R ', reason, str(self.driver.getParam(reason)))) def write(self, reason, value): @@ -124,13 +110,18 @@ def write(self, reason, value): if self._counter_sofbupdate_cmd == 1000: # prints SOFBUpdate-Cmd after 1000 events ignorestr = ' (1000 events)' - _log.info("[{:.2s}] - {:.32s} = {:.50s}{}".format( - wstr, reason, str(value), ignorestr)) + self._logger.info( + "[%2s] - %32s = %50s %d", + wstr, + reason, + str(value), + ignorestr + ) self._counter_sofbupdate_cmd = 0 else: # print all other write events - _log.info("[{:.2s}] - {:.32s} = {:.50s}{}".format( - wstr, reason, str(value), ignorestr)) + self._logger.info( + "[%2s] - %32s = %50s %s", wstr, reason, str(value), ignorestr) # NOTE: This modified behaviour is to allow loading # global_config to complete without artificial warning @@ -181,8 +172,8 @@ def _write_operation(self, bbb, pvname, value): # signal SOFB processing status = self._check_write_sofb(pvname, value) if not status: - _log.info("[{:.2s}] - {:.32s} = {:.50s}".format( - 'W!', pvname, 'Invalid length!')) + self._logger.info( + "[%2s] - %32s = %50s", 'W!', pvname, 'Invalid length!') return self._sofb_processing = True @@ -315,11 +306,10 @@ def _check_value_changed(self, reason, new_value): # simple type comparison return new_value != old_value except Exception as exception: - print() - print('--- debug ---') - print('exception : {}'.format(type(exception))) - print('reason : {}'.format(reason)) - print('old_value : {}'.format(str(old_value)[:1000])) - print('new_value : {}'.format(str(new_value)[:1000])) - print(' !!!') + self._logger.warning('--- debug ---') + self._logger.warning('exception : %s', str(type(exception))) + self._logger.warning('reason : %s', reason) + self._logger.warning('old_value : %s', str(old_value)[:1000]) + self._logger.warning('new_value : %s', str(new_value)[:1000]) + self._logger.warning(' !!!') return True diff --git a/bl-ap-imgproc/bl_ap_imgproc/bl_ap_imgproc.py b/bl-ap-imgproc/bl_ap_imgproc/bl_ap_imgproc.py index 14ff0d50..ca0b944d 100644 --- a/bl-ap-imgproc/bl_ap_imgproc/bl_ap_imgproc.py +++ b/bl-ap-imgproc/bl_ap_imgproc/bl_ap_imgproc.py @@ -1,7 +1,7 @@ """IOC Module.""" import os as _os -import logging as _log +import sys as _sys import signal as _signal from threading import Event as _Event @@ -9,6 +9,7 @@ from pcaspy.tools import ServerThread from siriuspy import util as _util +from siriuspy.logging import get_logger, LogMonHandler, configure_logging from siriuspy.dvfimgproc.csdev import Constants from siriuspy.dvfimgproc.main import App @@ -17,7 +18,11 @@ def _stop_now(signum, frame): - _log.info('SIGINT received') + _ = frame + get_logger(_stop_now).warning( + _signal.Signals(signum).name+' received at '+_util.get_timestamp()) + _sys.stdout.flush() + _sys.stderr.flush() global stop_event stop_event.set() @@ -34,12 +39,13 @@ class _Driver(_pcaspy.Driver): def __init__(self, app): super().__init__() + self._logger = get_logger(self) self.app = app self.app.driver = self self.app.init_driver() def read(self, reason): - _log.debug("Reading {0:s}.".format(reason)) + self._logger.debug("Reading {0:s}.".format(reason)) return super().read(reason) def write(self, reason, value): @@ -49,22 +55,21 @@ def write(self, reason, value): # NOTE: app.write should update driver pv values in database ret_val = self.app.write(reason, value) if ret_val: - _log.info('YES Write %s: %s', reason, str(value)) + self._logger.info('YES Write %s: %s', reason, str(value)) else: value = self.getParam(reason) - _log.warning('NO Write %s: %s', reason, str(value)) + self._logger.warning('NO Write %s: %s', reason, str(value)) return True def check_read_only(self, reason): is_read_only = reason.endswith(('-Sts', '-RB', '-Mon', '-Cte')) if is_read_only: - _log.debug('PV {0:s} is read only.'.format(reason)) + self._logger.debug(f'PV {reason:s} is read only.') return is_read_only def check_value_none(self, val): if val is None: - msg = 'client tried to set None value. refusing...' - _log.error(msg) + self._logger.error('client tried to set None value. refusing...') return True return False @@ -106,14 +111,14 @@ def ioc_is_running(const): def create_server(const): """.""" - _log.info('Creating Server.') + get_logger(create_server).info('Creating Server.') ioc_prefix = const.get_prefix() db = const.get_database() server = _pcaspy.SimpleServer() _attribute_access_security_group(server, db) - _log.info('Setting Server Database.') + get_logger(create_server).info('Setting Server Database.') server.createPV(ioc_prefix, db) return server @@ -122,34 +127,47 @@ def initialize_server_thread(server): """.""" server_thread = ServerThread(server) server_thread.daemon = True - _log.info('Starting Server Thread.') + get_logger(initialize_server_thread).info('Starting Server Thread.') server_thread.start() return server_thread def stop_server_thread(server_thread): """.""" - _log.info('Stoping Server Thread...') + get_logger(stop_server_thread).info('Stoping Server Thread...') # send stop signal to server thread server_thread.stop() server_thread.join() - _log.info('Server Thread stopped.') + get_logger(stop_server_thread).info('Server Thread stopped.') return server_thread def create_driver_app(const): """.""" - _log.info('Creating Driver.') + logger = get_logger(create_driver_app) + logger.info('Creating Driver.') app = App(const=const) _Driver(app) # a handle to Drive object is set within the app object. + + dbase = app._database + _util.print_ioc_banner( + ioc_name='BL ImgProc IOC', + db=dbase, + description='Image Processing IOC (FAC)', + version=dbase['ImgVersion-Cte']['value'], + prefix=const.devname, + logger=logger) + + # Add handler to update 'Log-Mon' PV to the root logger: + get_logger().addHandler(LogMonHandler(app.update_log)) return app def run(devname, debug=False): """Start the IOC.""" # initial configurations - _util.configure_log_file(debug=debug) - _log.info('Starting...') + configure_logging(debug=debug) + get_logger(run).info('Starting...') define_abort_function() # application constants with database diff --git a/si-ap-fofb/si_ap_fofb/si_ap_fofb.py b/si-ap-fofb/si_ap_fofb/si_ap_fofb.py index 59dbf739..7041485c 100644 --- a/si-ap-fofb/si_ap_fofb/si_ap_fofb.py +++ b/si-ap-fofb/si_ap_fofb/si_ap_fofb.py @@ -1,23 +1,25 @@ """SI-AP-FOFB Soft IOC.""" import os as _os -import sys as _sys import signal as _signal +import sys as _sys + import pcaspy as _pcaspy import pcaspy.tools as _pcaspy_tools - from siriuspy import util as _util -from siriuspy.envars import VACA_PREFIX as _vaca_prefix - +from siriuspy.envars import VACA_PREFIX as _VACA_PREFIX from siriuspy.fofb.main import App as _App +from siriuspy.logging import configure_logging, get_logger, LogMonHandler -INTERVAL = 1/10 # [s] +INTERVAL = 1 / 10 # [s] STOP_EVENT = False def _stop_now(signum, frame): _ = frame - print(_signal.Signals(signum).name+' received at '+_util.get_timestamp()) + get_logger(_stop_now).warning( + _signal.Signals(signum).name + " received at " + _util.get_timestamp() + ) _sys.stdout.flush() _sys.stderr.flush() global STOP_EVENT @@ -26,14 +28,13 @@ def _stop_now(signum, frame): def _attribute_access_security_group(server, dbase): for k, val in dbase.items(): - if k.endswith(('-RB', '-Sts', '-Cte', '-Mon')): - val.update({'asg': 'rbpv'}) + if k.endswith(("-RB", "-Sts", "-Cte", "-Mon")): + val.update({"asg": "rbpv"}) path_ = _os.path.abspath(_os.path.dirname(__file__)) - server.initAccessSecurityFile(path_ + '/access_rules.as') + server.initAccessSecurityFile(path_ + "/access_rules.as") class _PCASDriver(_pcaspy.Driver): - def __init__(self, app): """Initialize driver.""" super().__init__() @@ -49,7 +50,7 @@ def read(self, reason): def write(self, reason, value): """Write IOC pvs according to main application.""" ret_val = self.app.write(reason, value) - if reason.endswith('-Cmd'): + if reason.endswith("-Cmd"): value = self.getParam(reason) + 1 if ret_val: return super().write(reason, value) @@ -57,55 +58,69 @@ def write(self, reason, value): def update_pv(self, pvname, value, **kwargs): """Update PV.""" + _ = kwargs self.setParam(pvname, value) self.updatePV(pvname) def run(): """Run main module function.""" + logger = get_logger(run) + # define abort function _signal.signal(_signal.SIGINT, _stop_now) _signal.signal(_signal.SIGTERM, _stop_now) # configure log file - _util.configure_log_file() + configure_logging() + logger.info("Starting...") # define IOC, init pvs database and create app object _version = _util.get_last_commit_hash() - _ioc_prefix = _vaca_prefix + ('-' if _vaca_prefix else '') - _ioc_prefix += 'SI-Glob:AP-FOFB:' + _ioc_prefix = _VACA_PREFIX + ("-" if _VACA_PREFIX else "") + _ioc_prefix += "SI-Glob:AP-FOFB:" + logger.debug("Creating App Object.") app = _App() dbase = app.pvs_database - dbase['Version-Cte']['value'] = _version + dbase["Version-Cte"]["value"] = _version # check if another IOC is running pvname = _ioc_prefix + next(iter(dbase)) if _util.check_pv_online(pvname, use_prefix=False): - raise ValueError('Another instance of this IOC is already running!') + raise ValueError("Another instance of this IOC is already running!") # check if another IOC is running _util.print_ioc_banner( - ioc_name='SI-AP-FOFB', + ioc_name="SI-AP-FOFB", db=dbase, - description='SI-AP-FOFB Soft IOC', + description="SI-AP-FOFB Soft IOC", version=_version, - prefix=_ioc_prefix) + prefix=_ioc_prefix, + logger=get_logger(run), + ) # create a new simple pcaspy server and driver to respond client's requests + logger.info("Creating Server.") server = _pcaspy.SimpleServer() _attribute_access_security_group(server, dbase) + logger.info("Setting Server Database.") server.createPV(_ioc_prefix, dbase) + logger.info("Creating Driver.") driver = _PCASDriver(app) app.init_database() + # Add handler to update 'Log-Mon' PV to the root logger: + get_logger().addHandler(LogMonHandler(app.update_log)) # initiate a new thread responsible for listening for client connections server_thread = _pcaspy_tools.ServerThread(server) + logger.info("Starting Server Thread.") server_thread.start() # main loop driver.app.scanning = True while not STOP_EVENT: driver.app.process(INTERVAL) + logger.info("Stoping Server Thread...") driver.app.scanning = False driver.app.quit = True @@ -113,3 +128,5 @@ def run(): # sends stop signal to server thread server_thread.stop() server_thread.join() + logger.info("Server Thread stopped.") + logger.info("Good Bye.")