Source code for recipe_system.adcc.adcclib

#                                                                     QAP Gemini
#
#                                                                     adcclib.py
# ------------------------------------------------------------------------------
import os
import sys
import signal
import time

from copy import copy
from threading import Event
from threading import Thread

from recipe_system.adcc.servers import http_proxy
from recipe_system.adcc.servers import eventsManager

from recipe_system.utils.findexe import findexe

# ------------------------------------------------------------------------------
[docs] def get_adcc_dir(dirtitle="adcc"): dotadcc = {"adcc": ".adcc"} if not os.path.exists(dotadcc[dirtitle]): os.mkdir(dotadcc[dirtitle]) return dotadcc[dirtitle]
[docs] def write_adcc_sr(srname, vals): print("adcclib: adcc startup report in {}".format(srname)) with open(srname, "w+") as sr: sr.write(repr(vals)) return
[docs] class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super().__call__(*args, **kwargs) return cls._instances[cls]
[docs] class ADCC(metaclass=Singleton): def __init__(self, args=None): if args is None: pass else: self.dark = args.dark self.events = eventsManager.EventsManager() self.spec_events = eventsManager.EventsManager() self.http_port = args.httpport self.sreport = args.adccsrn self.racefile = "adccinfo.py" self.verbose = args.verbosity self.web = None def _check_adcc(self, cpid): adccproc = findexe('adcc') xprocx = copy(adccproc) msg = "adcclib: adcc process {} running." try: xprocx.pop(adccproc.index(cpid)) except ValueError as err: pass x = [print(msg.format(p)) for p in xprocx] return xprocx def _check_kill_adcc(self, pids): for pid in pids: os.kill(int(pid), signal.SIGKILL) return def _http_interface(self, run_event): # establish HTTP server and proxy. self.web = Thread(group=None, target=http_proxy.main, name="webface", args=(run_event,), kwargs={ 'port': self.http_port, 'dark': self.dark, 'events': self.events, 'spec_events': self.spec_events, 'verbose': self.verbose } ) return def _handle_locks(self): curpid = os.getpid() adccdir = get_adcc_dir() lockf = os.path.join(adccdir, self.racefile) lfile = True if os.path.exists(lockf) else False pids = self._check_adcc(curpid) msgs = { 'lockrun': "adcclib: adcc running and lockfile detected.", 'portrun': "adcclib: adcc running on port {}", 'norun': "adcclib: No adcc running but lockfile found.", 'rupted': "adcclib: adcc config appears corrupted. Clearing ..." } if pids and lfile: sys.exit(msgs['lockrun']) elif pids and not lfile: sys.exit(msgs['portrun'].format(self.http_port)) elif lfile and not pids: print(msgs['norun']) print(msgs['rupted']) os.unlink(lockf) return def _write_locks(self): """ Write racefile and ADCC Startup Report """ dotadcc = get_adcc_dir() vals = {"http_port": self.http_port, "pid": os.getpid()} rfile = os.path.join(dotadcc, self.racefile) with open(rfile, "w") as ports: ports.write(repr(vals)) sr = os.path.join(dotadcc, self.sreport) write_adcc_sr(sr, vals) return
[docs] def main(self): #globalConf.load(STANDARD_REDUCTION_CONF, env_override=True) self._handle_locks() self._write_locks() # start webinterface run_event = Event() run_event.set() self._http_interface(run_event) self.web.start() try: while True: time.sleep(1) except KeyboardInterrupt: print("\nadcc: exiting due to Ctrl-C") run_event.clear() self.web.join() if os.path.exists(self.racefile): os.remove(self.racefile) return