class SheriffHeadless(ScriptListener): def __init__(self, lcm_obj, config, spawn_deputy, script_name, script_done_action): self.sheriff = Sheriff(lcm_obj) self.script_manager = ScriptManager(self.sheriff) self.spawn_deputy = spawn_deputy self.spawned_deputy = None self.config = config self.script_name = script_name self.script = None self.mainloop = None self.lcm_obj = lcm_obj self._should_exit = False if script_done_action is None: self.script_done_action = "exit" else: self.script_done_action = script_done_action def _shutdown(self): if self.spawned_deputy: print("Terminating local deputy..") try: self.spawned_deputy.terminate() except AttributeError: os.kill(self.spawned_deputy.pid, signal.SIGTERM) self.spawned_deputy.wait() self.spawned_deputy = None self.sheriff.shutdown() self.script_manager.shutdown() def _start_script(self): if not self.script: return False print("Running script %s" % self.script_name) errors = self.script_manager.execute_script(self.script) if errors: print("Script failed to run. Errors detected:\n" + "\n".join(errors)) self._shutdown() sys.exit(1) return False def script_finished(self, script_object): # Overriden from ScriptListener. Called by ScriptManager when a # script is finished. if self.script_done_action == "exit": self._request_exit() elif self.script_done_action == "observe": self.sheriff.set_observer(True) def _request_exit(self): self._should_exit = True def run(self): # parse the config file if self.config is not None: self.sheriff.load_config(self.config) self.script_manager.load_config(self.config) # start a local deputy? if self.spawn_deputy: procman_deputy_cmd = find_procman_deputy_cmd() args = [procman_deputy_cmd, "-i", "localhost"] if not procman_deputy_cmd: sys.stderr.write("Can't find procman-deputy.") sys.exit(1) self.spawned_deputy = subprocess.Popen(args) else: self.spawned_deputy = None # run a script if self.script_name: self.script = self.script_manager.get_script(self.script_name) if not self.script: print "No such script: %s" % self.script_name self._shutdown() sys.exit(1) errors = self.script_manager.check_script_for_errors(self.script) if errors: print "Unable to run script. Errors were detected:\n\n" print "\n ".join(errors) self._shutdown() sys.exit(1) self.script_manager.add_listener(self) signal.signal(signal.SIGINT, lambda *s: self._request_exit()) signal.signal(signal.SIGTERM, lambda *s: self._request_exit()) signal.signal(signal.SIGHUP, lambda *s: self._request_exit()) try: if self.script: time.sleep(0.2) self._start_script() while not self._should_exit: self.lcm_obj.handle_timeout(200) except KeyboardInterrupt: pass except IOError: pass finally: print("Sheriff terminating..") self._shutdown() return 0
class SheriffHeadless(ScriptListener): def __init__(self, lcm_obj, config, spawn_deputy, script_name, script_done_action): self.sheriff = Sheriff(lcm_obj) self.script_manager = ScriptManager(self.sheriff) self.spawn_deputy = spawn_deputy self.spawned_deputy = None self.config = config self.script_name = script_name self.script = None self.mainloop = None self.lcm_obj = lcm_obj self._should_exit = False if script_done_action is None: self.script_done_action = "exit" else: self.script_done_action = script_done_action def _shutdown(self): if self.spawned_deputy: print("Terminating local deputy..") try: self.spawned_deputy.terminate() except AttributeError: os.kill(self.spawned_deputy.pid, signal.SIGTERM) self.spawned_deputy.wait() self.spawned_deputy = None self.sheriff.shutdown() self.script_manager.shutdown() def _start_script(self): if not self.script: return False print("Running script %s" % self.script_name) errors = self.script_manager.execute_script(self.script) if errors: print("Script failed to run. Errors detected:\n" + "\n".join(errors)) self._shutdown() sys.exit(1) return False def script_finished(self, script_object): # Overriden from ScriptListener. Called by ScriptManager when a # script is finished. if self.script_done_action == "exit": self._request_exit() elif self.script_done_action == "observe": self.sheriff.set_observer(True) def _request_exit(self): self._should_exit = True def run(self): # parse the config file if self.config is not None: self.sheriff.load_config(self.config) self.script_manager.load_config(self.config) # start a local deputy? if self.spawn_deputy: procman_deputy_cmd = find_procman_deputy_cmd() args = [ procman_deputy_cmd, "-i", "localhost" ] if not procman_deputy_cmd: sys.stderr.write("Can't find procman-deputy.") sys.exit(1) self.spawned_deputy = subprocess.Popen(args) else: self.spawned_deputy = None # run a script if self.script_name: self.script = self.script_manager.get_script(self.script_name) if not self.script: print "No such script: %s" % self.script_name self._shutdown() sys.exit(1) errors = self.script_manager.check_script_for_errors(self.script) if errors: print "Unable to run script. Errors were detected:\n\n" print "\n ".join(errors) self._shutdown() sys.exit(1) self.script_manager.add_listener(self) signal.signal(signal.SIGINT, lambda *s: self._request_exit()) signal.signal(signal.SIGTERM, lambda *s: self._request_exit()) signal.signal(signal.SIGHUP, lambda *s: self._request_exit()) try: if self.script: time.sleep(0.2) self._start_script() while not self._should_exit: self.lcm_obj.handle_timeout(200) except KeyboardInterrupt: pass except IOError: pass finally: print("Sheriff terminating..") self._shutdown() return 0