def __init__(self, log_ctl, port=DefaultRPCPort): die_when_parent_die() self._cmd_context = NetTestCommandContext() self._netconfig = NetConfig() self._methods = SlaveMethods(self._cmd_context, self._netconfig, log_ctl) self.register_die_signal(signal.SIGHUP) self.register_die_signal(signal.SIGINT) self.register_die_signal(signal.SIGTERM) self._server_handler = ServerHandler(("", port)) self._finished = False self._log_ctl = log_ctl
def __init__(self, log_ctl, port = DefaultRPCPort): die_when_parent_die() self._cmd_context = NetTestCommandContext() self._netconfig = NetConfig() self._methods = SlaveMethods(self._cmd_context, self._netconfig, log_ctl) self.register_die_signal(signal.SIGHUP) self.register_die_signal(signal.SIGINT) self.register_die_signal(signal.SIGTERM) self._server_handler = ServerHandler(("", port)) self._finished = False self._log_ctl = log_ctl
class NetTestSlave: def __init__(self, log_ctl, port=DefaultRPCPort): die_when_parent_die() self._cmd_context = NetTestCommandContext() self._netconfig = NetConfig() self._methods = SlaveMethods(self._cmd_context, self._netconfig, log_ctl) self.register_die_signal(signal.SIGHUP) self.register_die_signal(signal.SIGINT) self.register_die_signal(signal.SIGTERM) self._server_handler = ServerHandler(("", port)) self._finished = False self._log_ctl = log_ctl def run(self): while not self._finished: if self._server_handler.get_ctl_sock() == None: self._log_ctl.cancel_connection() logging.info("Waiting for connection, performing cleanup.") logging.info("Cleaning up leftover commands.") self._cmd_context.cleanup() logging.info("Cleaning up configured interfaces.") self._netconfig.deconfigure_all() self._netconfig.cleanup() try: self._server_handler.accept_connection() except socket.error: continue self._cmd_context.cleanup() self._log_ctl.set_connection( self._server_handler.get_ctl_sock()) msgs = self._server_handler.get_messages() for msg in msgs: self._process_msg(msg[1]) logging.info("Cleaning up leftover commands.") self._cmd_context.cleanup() logging.info("Cleaning up configured interfaces.") self._netconfig.deconfigure_all() self._netconfig.cleanup() def _process_msg(self, msg): if msg["type"] == "command": method = getattr(self._methods, msg["method_name"], None) if method != None: try: result = method(*msg["args"]) except: log_exc_traceback() type, value, tb = sys.exc_info() exc_trace = ''.join( traceback.format_exception(type, value, tb)) response = {"type": "exception", "Exception": exc_trace} self._server_handler.send_data_to_ctl(response) return if result != None: response = {"type": "result", "result": result} self._server_handler.send_data_to_ctl(response) else: err = "Method '%s' not supported." % msg["method_name"] response = {"type": "error", "err": err} self._server_handler.send_data_to_ctl(response) elif msg["type"] == "log": logger = logging.getLogger() record = logging.makeLogRecord(msg["record"]) logger.handle(record) elif msg["type"] == "exception": if msg["cmd_id"] != None: logging.debug( "Recieved an exception from command with id: %s" % msg["cmd_id"]) else: logging.debug("Recieved an exception from foreground command") logging.error(msg["Exception"]) cmd = self._cmd_context.get_cmd(msg["cmd_id"]) cmd.join() self._cmd_context.del_cmd(cmd) self._server_handler.send_data_to_ctl(msg) elif msg["type"] == "result": if msg["cmd_id"] == None: del msg["cmd_id"] self._server_handler.send_data_to_ctl(msg) cmd = self._cmd_context.get_cmd(None) cmd.join() self._cmd_context.del_cmd(cmd) else: cmd = self._cmd_context.get_cmd(msg["cmd_id"]) cmd.join() del msg["cmd_id"] if cmd.finished(): self._server_handler.send_data_to_ctl(msg) self._cmd_context.del_cmd(cmd) else: cmd.set_result(msg["result"]) else: raise Exception("Recieved unknown command") pipes = self._cmd_context.get_read_pipes() self._server_handler.update_connections(pipes) def register_die_signal(self, signum): signal.signal(signum, self._signal_die_handler) def _signal_die_handler(self, signum, frame): logging.info("Caught signal %d -> dying" % signum) self._finished = True
class NetTestSlave: def __init__(self, log_ctl, port = DefaultRPCPort): die_when_parent_die() self._cmd_context = NetTestCommandContext() self._netconfig = NetConfig() self._methods = SlaveMethods(self._cmd_context, self._netconfig, log_ctl) self.register_die_signal(signal.SIGHUP) self.register_die_signal(signal.SIGINT) self.register_die_signal(signal.SIGTERM) self._server_handler = ServerHandler(("", port)) self._finished = False self._log_ctl = log_ctl def run(self): while not self._finished: if self._server_handler.get_ctl_sock() == None: self._log_ctl.cancel_connection() logging.info("Waiting for connection, performing cleanup.") logging.info("Cleaning up leftover commands.") self._cmd_context.cleanup() logging.info("Cleaning up configured interfaces.") self._netconfig.deconfigure_all() self._netconfig.cleanup() try: self._server_handler.accept_connection() except socket.error: continue self._cmd_context.cleanup() self._log_ctl.set_connection( self._server_handler.get_ctl_sock()) msgs = self._server_handler.get_messages() for msg in msgs: self._process_msg(msg[1]) logging.info("Cleaning up leftover commands.") self._cmd_context.cleanup() logging.info("Cleaning up configured interfaces.") self._netconfig.deconfigure_all() self._netconfig.cleanup() def _process_msg(self, msg): if msg["type"] == "command": method = getattr(self._methods, msg["method_name"], None) if method != None: try: result = method(*msg["args"]) except: log_exc_traceback() type, value, tb = sys.exc_info() exc_trace = ''.join(traceback.format_exception(type, value, tb)) response = {"type": "exception", "Exception": exc_trace} self._server_handler.send_data_to_ctl(response) return if result != None: response = {"type": "result", "result": result} self._server_handler.send_data_to_ctl(response) else: err = "Method '%s' not supported." % msg["method_name"] response = {"type": "error", "err": err} self._server_handler.send_data_to_ctl(response) elif msg["type"] == "log": logger = logging.getLogger() record = logging.makeLogRecord(msg["record"]) logger.handle(record) elif msg["type"] == "exception": if msg["cmd_id"] != None: logging.debug("Recieved an exception from command with id: %s" % msg["cmd_id"]) else: logging.debug("Recieved an exception from foreground command") logging.error(msg["Exception"]) cmd = self._cmd_context.get_cmd(msg["cmd_id"]) cmd.join() self._cmd_context.del_cmd(cmd) self._server_handler.send_data_to_ctl(msg) elif msg["type"] == "result": if msg["cmd_id"] == None: del msg["cmd_id"] self._server_handler.send_data_to_ctl(msg) cmd = self._cmd_context.get_cmd(None) cmd.join() self._cmd_context.del_cmd(cmd) else: cmd = self._cmd_context.get_cmd(msg["cmd_id"]) cmd.join() del msg["cmd_id"] if cmd.finished(): self._server_handler.send_data_to_ctl(msg) self._cmd_context.del_cmd(cmd) else: cmd.set_result(msg["result"]) else: raise Exception("Recieved unknown command") pipes = self._cmd_context.get_read_pipes() self._server_handler.update_connections(pipes) def register_die_signal(self, signum): signal.signal(signum, self._signal_die_handler) def _signal_die_handler(self, signum, frame): logging.info("Caught signal %d -> dying" % signum) self._finished = True