def run_server(argv): import getopt do_daemon = True pidfile = None try: optlist, args = getopt.getopt(argv[1:], "nh?p:") except getopt.GetoptError: print(_DOC) sys.exit(2) for opt, optarg in optlist: if opt in ("-h", "-?"): print(_DOC) return elif opt == "-n": do_daemon = False elif opt == "-p": pidfile = optarg if do_daemon: from pycopia import daemonize daemonize.daemonize(pidfile=pidfile) logging.msg("qaagent", "initializing") h = pyro.register_server(PosixAgent()) def _exit_checker(poller): if _EXIT: pyro.unregister_server(h) try: pyro.loop(2.0, _exit_checker) finally: if do_daemon and pidfile: os.unlink(pidfile)
def subprocess(self, _meth, *args, **kwargs): """Run a python method asynchronously as a subprocess.""" logging.msg("subprocess", str(_meth)) pm = proctools.get_procmanager() proc = pm.submethod(_meth, args, kwargs) proc.callback = self._status_cb self._status[proc.childpid] = None return proc.childpid
def pipe(self, cmd, user=None): """Run a subprocess, but connect by pipes rather than pty.""" logging.msg("pipe", cmd, "user=", str(user)) pm = proctools.get_procmanager() if type(user) is str: user = passwd.getpwnam(user) proc = pm.spawnpipe(cmd, pwent=user, callback=self._status_cb) text = proc.read() sts = proc.wait() proc.close() return sts, text
def run(self, cmd, user=None): """Run a subprocess, wait for completion and return status and stdout as text. """ logging.msg("run", cmd, "user=", str(user)) pm = proctools.get_procmanager() if type(user) is str: user = passwd.getpwnam(user) proc = pm.spawnpty(cmd, pwent=user) text = proc.read() sts = proc.wait() proc.close() return sts, text
def kill(self, pid): """Kills a process that was started by spawn.""" logging.msg("kill", str(pid)) try: sts = self._status.pop(pid) except KeyError: return -errno.ENOENT else: if sts is None: # a running process pm = proctools.get_procmanager() proc = pm.getbypid(pid) proc.kill() proc.wait() sts = self.poll(pid) return sts else: # already exited return sts
def _status_cb(self, proc): self._status[proc.childpid] = proc.exitstatus logging.msg("exited", str(proc.exitstatus))
user = passwd.getpwnam(user) proc = pm.spawnpipe(cmd, pwent=user, callback=self._status_cb) text = proc.read() sts = proc.wait() proc.close() return sts, text def spawn(self, cmd, user=None, async=False): """Spawn a subprocess and return immediatly.""" pm = proctools.get_procmanager() if type(user) is str: user = passwd.getpwnam(user) proc = pm.spawnpty(cmd, callback=self._status_cb, pwent=user, async=async) # status with a key present, but None value means a running process. self._status[proc.childpid] = None logging.msg("spawn", cmd, "user=%s async=%s pid=%d" % (user, async, proc.childpid)) return proc.childpid def subprocess(self, _meth, *args, **kwargs): """Run a python method asynchronously as a subprocess.""" logging.msg("subprocess", str(_meth)) pm = proctools.get_procmanager() proc = pm.submethod(_meth, args, kwargs) proc.callback = self._status_cb self._status[proc.childpid] = None return proc.childpid def _status_cb(self, proc): self._status[proc.childpid] = proc.exitstatus logging.msg("exited", str(proc.exitstatus))