def update(self, nodes): results = cmdresult.CmdResult() running = self._isrunning(nodes) zone = self.config.zoneid if not zone: zone = "NOZONE" cmds = [] for (node, isrunning) in running: if isrunning: env = _make_env_params(node) env += " BRO_DNS_FAKE=1" args = " ".join(_make_bro_params(node, False)) cmds += [(node.name, os.path.join(self.config.scriptsdir, "update") + " %s %s %s/tcp %s" % (util.format_bro_addr( node.addr), zone, node.getPort(), args), env, None)] self.ui.info("updating %s ..." % node.name) res = execute.run_localcmds(cmds) for (tag, success, output) in res: node = self.config.nodes(tag=tag)[0] if not success: self.ui.info("failed to update %s: %s" % (tag, output[0])) results.set_node_fail(node) else: self.ui.info("%s: %s" % (tag, output[0])) results.set_node_success(node) return results
def update(self, nodes): results = cmdresult.CmdResult() running = self._isrunning(nodes) zone = self.config.zoneid if not zone: zone = "NOZONE" cmds = [] for (node, isrunning) in running: if isrunning: env = _make_env_params(node) env += " BRO_DNS_FAKE=1" args = " ".join(_make_bro_params(node, False)) cmds += [(node.name, os.path.join(self.config.scriptsdir, "update") + " %s %s %s/tcp %s" % (util.format_bro_addr(node.addr), zone, node.getPort(), args), env, None)] self.ui.info("updating %s ..." % node.name) res = execute.run_localcmds(cmds) for (tag, success, output) in res: node = self.config.nodes(tag=tag)[0] if not success: self.ui.info("failed to update %s: %s" % (tag, output[0])) results.set_node_fail(node) else: self.ui.info("%s: %s" % (tag, output[0])) results.set_node_success(node) return results
def make_layout(path, cmdout, silent=False): class Port: def __init__(self, startport): # This is the first port number to use. self.p = startport # Record the port number that the specified node will use (if node is # None, then don't record it) and return that port number. def use_port(self, node): port = self.p # Increment the port number, since we're using the current one. self.p += 1 if node is not None: node.setPort(port) return port manager = config.Config.manager() broport = Port(config.Config.broport) if config.Config.standalone: if not silent: cmdout.info("generating standalone-layout.zeek ...") filename = os.path.join(path, "standalone-layout.zeek") ostr = "# Automatically generated. Do not edit.\n" # This is the port that standalone nodes listen on for remote # control by default. ostr += "redef Broker::default_port = %s/tcp;\n" % broport.use_port( manager) ostr += "event bro_init()\n" ostr += "\t{\n" ostr += "\tif ( getenv(\"BROCTL_DISABLE_LISTEN\") == \"\" )\n" ostr += "\t\tBroker::listen();\n" ostr += "\t}\n" else: if not silent: cmdout.info("generating cluster-layout.zeek ...") filename = os.path.join(path, "cluster-layout.zeek") workers = config.Config.workers() proxies = config.Config.proxies() loggers = config.Config.loggers() # If no loggers are defined, then manager does the logging. manager_is_logger = "F" if loggers else "T" ostr = "# Automatically generated. Do not edit.\n" ostr += "redef Cluster::manager_is_logger = %s;\n" % manager_is_logger ostr += "redef Cluster::nodes = {\n" # Control definition. For now just reuse the manager information. ostr += '\t["control"] = [$node_type=Cluster::CONTROL, $ip=%s, $p=%s/tcp],\n' % ( util.format_bro_addr(manager.addr), broport.use_port(None)) # Loggers definition for lognode in loggers: ostr += '\t["%s"] = [$node_type=Cluster::LOGGER, $ip=%s, $p=%s/tcp],\n' % ( lognode.name, util.format_bro_addr( lognode.addr), broport.use_port(lognode)) # Manager definition ostr += '\t["%s"] = [$node_type=Cluster::MANAGER, $ip=%s, $p=%s/tcp],\n' % ( manager.name, util.format_bro_addr( manager.addr), broport.use_port(manager)) # Proxies definition (all proxies use same logger as the manager) for p in proxies: ostr += '\t["%s"] = [$node_type=Cluster::PROXY, $ip=%s, $p=%s/tcp, $manager="%s"],\n' % ( p.name, util.format_bro_addr( p.addr), broport.use_port(p), manager.name) # Workers definition for w in workers: p = w.count % len(proxies) ostr += '\t["%s"] = [$node_type=Cluster::WORKER, $ip=%s, $p=%s/tcp, $interface="%s", $manager="%s"],\n' % ( w.name, util.format_bro_addr( w.addr), broport.use_port(w), w.interface, manager.name) # Activate time-machine support if configured. if config.Config.timemachinehost: ostr += '\t["time-machine"] = [$node_type=Cluster::TIME_MACHINE, $ip=%s, $p=%s],\n' % ( config.Config.timemachinehost, config.Config.timemachineport) ostr += "};\n" try: with open(filename, "w") as out: out.write(ostr) except IOError as e: cmdout.error("failed to write file: %s" % e) return False return True
def make_layout(path, cmdout, silent=False): class Port: def __init__(self, startport): # This is the first port number to use. self.p = startport # Record the port number that the specified node will use (if node is # None, then don't record it) and return that port number. def use_port(self, node): port = self.p # Increment the port number, since we're using the current one. self.p += 1 if node is not None: node.setPort(port) return port manager = config.Config.manager() broport = Port(config.Config.broport) if config.Config.nodes("standalone"): if not silent: cmdout.info("generating standalone-layout.bro ...") filename = os.path.join(path, "standalone-layout.bro") ostr = "# Automatically generated. Do not edit.\n" # This is the port that standalone nodes listen on for remote # control by default. ostr += "redef Communication::listen_port = %s/tcp;\n" % broport.use_port(manager) ostr += "redef Communication::nodes += {\n" ostr += '\t["control"] = [$host=%s, $zone_id="%s", $class="control", $events=Control::controller_events],\n' % (util.format_bro_addr(manager.addr), manager.zone_id) ostr += "};\n" else: if not silent: cmdout.info("generating cluster-layout.bro ...") filename = os.path.join(path, "cluster-layout.bro") workers = config.Config.nodes("workers") proxies = config.Config.nodes("proxies") loggers = config.Config.nodes("loggers") mylogger = Logger(loggers) # If no loggers are defined, then manager does the logging. manager_is_logger = "F" if loggers else "T" ostr = "# Automatically generated. Do not edit.\n" ostr += "redef Cluster::manager_is_logger = %s;\n" % manager_is_logger ostr += "redef Cluster::nodes = {\n" # Control definition. For now just reuse the manager information. ostr += '\t["control"] = [$node_type=Cluster::CONTROL, $ip=%s, $zone_id="%s", $p=%s/tcp],\n' % (util.format_bro_addr(manager.addr), config.Config.zoneid, broport.use_port(None)) # Loggers definition for lognode in loggers: ostr += '\t["%s"] = [$node_type=Cluster::LOGGER, $ip=%s, $zone_id="%s", $p=%s/tcp],\n' % (lognode.name, util.format_bro_addr(lognode.addr), lognode.zone_id, broport.use_port(lognode)) # Manager definition ostr += '\t["%s"] = [$node_type=Cluster::MANAGER, $ip=%s, $zone_id="%s", $p=%s/tcp, %s$workers=set(' % (manager.name, util.format_bro_addr(manager.addr), manager.zone_id, broport.use_port(manager), mylogger.next_logger()) ostr += ", ".join('"%s"' % s.name for s in workers) ostr += ")],\n" # Proxies definition (all proxies use same logger as the manager) for p in proxies: ostr += '\t["%s"] = [$node_type=Cluster::PROXY, $ip=%s, $zone_id="%s", $p=%s/tcp, %s$manager="%s", $workers=set(' % (p.name, util.format_bro_addr(p.addr), p.zone_id, broport.use_port(p), mylogger.logger, manager.name) ostr += ", ".join('"%s"' % s.name for s in workers) ostr += ")],\n" # Workers definition for w in workers: p = w.count % len(proxies) ostr += '\t["%s"] = [$node_type=Cluster::WORKER, $ip=%s, $zone_id="%s", $p=%s/tcp, $interface="%s", %s$manager="%s", $proxy="%s"],\n' % (w.name, util.format_bro_addr(w.addr), w.zone_id, broport.use_port(w), w.interface, mylogger.next_logger(), manager.name, proxies[p].name) # Activate time-machine support if configured. if config.Config.timemachinehost: ostr += '\t["time-machine"] = [$node_type=Cluster::TIME_MACHINE, $ip=%s, $p=%s],\n' % (config.Config.timemachinehost, config.Config.timemachineport) ostr += "};\n" try: with open(filename, "w") as out: out.write(ostr) except IOError as e: cmdout.error("failed to write file: %s" % e) return False return True
def make_layout(path, cmdout, silent=False): class Port: def __init__(self, startport): self.p = startport def next_port(self, node): self.p += 1 node.setPort(self.p) return self.p manager = config.Config.manager() broport = Port(config.Config.broport - 1) filename = os.path.join(path, "cluster-layout.bro") # If there is a standalone node, delete any cluster-layout file to # avoid the cluster framework from activating and get out of here. if config.Config.nodes("standalone"): if os.access(filename, os.W_OK): os.unlink(filename) # We do need to establish the port for the manager. if not silent: cmdout.info("generating standalone-layout.bro ...") filename = os.path.join(path, "standalone-layout.bro") with open(filename, "w") as out: out.write("# Automatically generated. Do not edit.\n") # This is the port that standalone nodes listen on for remote # control by default. out.write("redef Communication::listen_port = %s/tcp;\n" % broport.next_port(manager)) out.write("redef Communication::nodes += {\n") out.write("\t[\"control\"] = [$host=%s, $zone_id=\"%s\", $class=\"control\", $events=Control::controller_events],\n" % (util.format_bro_addr(manager.addr), manager.zone_id)) out.write("};\n") else: if not silent: cmdout.info("generating cluster-layout.bro ...") workers = config.Config.nodes("workers") proxies = config.Config.nodes("proxies") with open(filename, "w") as out: out.write("# Automatically generated. Do not edit.\n") out.write("redef Cluster::nodes = {\n") # Control definition. For now just reuse the manager information. out.write("\t[\"control\"] = [$node_type=Cluster::CONTROL, $ip=%s, $zone_id=\"%s\", $p=%s/tcp],\n" % (util.format_bro_addr(manager.addr), config.Config.zoneid, broport.next_port(manager))) # Manager definition out.write("\t[\"%s\"] = [$node_type=Cluster::MANAGER, $ip=%s, $zone_id=\"%s\", $p=%s/tcp, $workers=set(" % (manager.name, util.format_bro_addr(manager.addr), manager.zone_id, broport.next_port(manager))) for s in workers: out.write("\"%s\"" % s.name) if s != workers[-1]: out.write(", ") out.write(")],\n") # Proxies definition for p in proxies: out.write("\t[\"%s\"] = [$node_type=Cluster::PROXY, $ip=%s, $zone_id=\"%s\", $p=%s/tcp, $manager=\"%s\", $workers=set(" % (p.name, util.format_bro_addr(p.addr), p.zone_id, broport.next_port(p), manager.name)) for s in workers: out.write("\"%s\"" % s.name) if s != workers[-1]: out.write(", ") out.write(")],\n") # Workers definition for w in workers: p = w.count % len(proxies) out.write("\t[\"%s\"] = [$node_type=Cluster::WORKER, $ip=%s, $zone_id=\"%s\", $p=%s/tcp, $interface=\"%s\", $manager=\"%s\", $proxy=\"%s\"],\n" % (w.name, util.format_bro_addr(w.addr), w.zone_id, broport.next_port(w), w.interface, manager.name, proxies[p].name)) # Activate time-machine support if configured. if config.Config.timemachinehost: out.write("\t[\"time-machine\"] = [$node_type=Cluster::TIME_MACHINE, $ip=%s, $p=%s],\n" % (config.Config.timemachinehost, config.Config.timemachineport)) out.write("};\n")
def make_layout(path, cmdout, silent=False): class Port: def __init__(self, startport): # This is the first port number to use. self.p = startport # Record the port number that the specified node will use (if node is # None, then don't record it) and return that port number. def use_port(self, node): port = self.p # Increment the port number, since we're using the current one. self.p += 1 if node is not None: node.setPort(port) return port manager = config.Config.manager() broport = Port(config.Config.broport) if config.Config.nodes("standalone"): if not silent: cmdout.info("generating standalone-layout.bro ...") filename = os.path.join(path, "standalone-layout.bro") ostr = "# Automatically generated. Do not edit.\n" # This is the port that standalone nodes listen on for remote # control by default. ostr += "redef Communication::listen_port = %s/tcp;\n" % broport.use_port(manager) ostr += "redef Communication::nodes += {\n" ostr += "\t[\"control\"] = [$host=%s, $zone_id=\"%s\", $class=\"control\", $events=Control::controller_events],\n" % (util.format_bro_addr(manager.addr), manager.zone_id) ostr += "};\n" else: if not silent: cmdout.info("generating cluster-layout.bro ...") filename = os.path.join(path, "cluster-layout.bro") workers = config.Config.nodes("workers") proxies = config.Config.nodes("proxies") loggers = config.Config.nodes("loggers") if loggers: # Use the first logger in list, since only one logger is allowed. logger = loggers[0] manager_is_logger = "F" loggerstr = '$logger="%s", ' % logger.name else: # If no logger exists, then manager does the logging. manager_is_logger = "T" loggerstr = "" ostr = "# Automatically generated. Do not edit.\n" ostr += "redef Cluster::manager_is_logger = %s;\n" % manager_is_logger ostr += "redef Cluster::nodes = {\n" # Control definition. For now just reuse the manager information. ostr += '\t["control"] = [$node_type=Cluster::CONTROL, $ip=%s, $zone_id="%s", $p=%s/tcp],\n' % (util.format_bro_addr(manager.addr), config.Config.zoneid, broport.use_port(None)) # Logger definition if loggers: ostr += '\t["%s"] = [$node_type=Cluster::LOGGER, $ip=%s, $zone_id="%s", $p=%s/tcp],\n' % (logger.name, util.format_bro_addr(logger.addr), logger.zone_id, broport.use_port(logger)) # Manager definition ostr += '\t["%s"] = [$node_type=Cluster::MANAGER, $ip=%s, $zone_id="%s", $p=%s/tcp, %s$workers=set(' % (manager.name, util.format_bro_addr(manager.addr), manager.zone_id, broport.use_port(manager), loggerstr) for s in workers: ostr += '"%s"' % s.name if s != workers[-1]: ostr += ", " ostr += ")],\n" # Proxies definition for p in proxies: ostr += '\t["%s"] = [$node_type=Cluster::PROXY, $ip=%s, $zone_id="%s", $p=%s/tcp, %s$manager="%s", $workers=set(' % (p.name, util.format_bro_addr(p.addr), p.zone_id, broport.use_port(p), loggerstr, manager.name) for s in workers: ostr += '"%s"' % s.name if s != workers[-1]: ostr += ", " ostr += ")],\n" # Workers definition for w in workers: p = w.count % len(proxies) ostr += '\t["%s"] = [$node_type=Cluster::WORKER, $ip=%s, $zone_id="%s", $p=%s/tcp, $interface="%s", %s$manager="%s", $proxy="%s"],\n' % (w.name, util.format_bro_addr(w.addr), w.zone_id, broport.use_port(w), w.interface, loggerstr, manager.name, proxies[p].name) # Activate time-machine support if configured. if config.Config.timemachinehost: ostr += '\t["time-machine"] = [$node_type=Cluster::TIME_MACHINE, $ip=%s, $p=%s],\n' % (config.Config.timemachinehost, config.Config.timemachineport) ostr += "};\n" try: with open(filename, "w") as out: out.write(ostr) except IOError as e: cmdout.error("failed to write file: %s" % e) return False return True
def make_layout(path, cmdout, silent=False): class Port: def __init__(self, startport): # This is the first port number to use. self.p = startport # Record the port number that the specified node will use (if node is # None, then don't record it) and return that port number. def use_port(self, node): port = self.p # Increment the port number, since we're using the current one. self.p += 1 if node is not None: node.setPort(port) return port manager = config.Config.manager() broport = Port(config.Config.broport) if config.Config.standalone: if not silent: cmdout.info("generating standalone-layout.zeek ...") filename = os.path.join(path, "standalone-layout.zeek") ostr = "# Automatically generated. Do not edit.\n" # This is the port that standalone nodes listen on for remote # control by default. ostr += "redef Broker::default_port = %s/tcp;\n" % broport.use_port(manager) ostr += "event zeek_init()\n" ostr += "\t{\n" ostr += "\tif ( getenv(\"BROCTL_DISABLE_LISTEN\") == \"\" )\n" ostr += "\t\tBroker::listen();\n" ostr += "\t}\n" else: if not silent: cmdout.info("generating cluster-layout.zeek ...") filename = os.path.join(path, "cluster-layout.zeek") workers = config.Config.workers() proxies = config.Config.proxies() loggers = config.Config.loggers() # If no loggers are defined, then manager does the logging. manager_is_logger = "F" if loggers else "T" ostr = "# Automatically generated. Do not edit.\n" ostr += "redef Cluster::manager_is_logger = %s;\n" % manager_is_logger ostr += "redef Cluster::nodes = {\n" # Control definition. For now just reuse the manager information. ostr += '\t["control"] = [$node_type=Cluster::CONTROL, $ip=%s, $p=%s/tcp],\n' % (util.format_bro_addr(manager.addr), broport.use_port(None)) # Loggers definition for lognode in loggers: ostr += '\t["%s"] = [$node_type=Cluster::LOGGER, $ip=%s, $p=%s/tcp],\n' % (lognode.name, util.format_bro_addr(lognode.addr), broport.use_port(lognode)) # Manager definition ostr += '\t["%s"] = [$node_type=Cluster::MANAGER, $ip=%s, $p=%s/tcp],\n' % (manager.name, util.format_bro_addr(manager.addr), broport.use_port(manager)) # Proxies definition (all proxies use same logger as the manager) for p in proxies: ostr += '\t["%s"] = [$node_type=Cluster::PROXY, $ip=%s, $p=%s/tcp, $manager="%s"],\n' % (p.name, util.format_bro_addr(p.addr), broport.use_port(p), manager.name) # Workers definition for w in workers: p = w.count % len(proxies) ostr += '\t["%s"] = [$node_type=Cluster::WORKER, $ip=%s, $p=%s/tcp, $interface="%s", $manager="%s"],\n' % (w.name, util.format_bro_addr(w.addr), broport.use_port(w), w.interface, manager.name) # Activate time-machine support if configured. if config.Config.timemachinehost: ostr += '\t["time-machine"] = [$node_type=Cluster::TIME_MACHINE, $ip=%s, $p=%s],\n' % (config.Config.timemachinehost, config.Config.timemachineport) ostr += "};\n" try: with open(filename, "w") as out: out.write(ostr) except IOError as e: cmdout.error("failed to write file: %s" % e) return False return True
def make_layout(path, cmdout, silent=False): class Port: def __init__(self, startport): self.p = startport def next_port(self, node): self.p += 1 node.setPort(self.p) return self.p manager = config.Config.manager() filename = os.path.join(path, "cluster-layout.bro") # If there is a standalone node, delete any cluster-layout file to # avoid the cluster framework from activating and get out of here. if config.Config.nodes("standalone"): if os.access(filename, os.W_OK): os.unlink(filename) # We do need to establish the port for the manager. if not silent: cmdout.info("generating standalone-layout.bro ...") filename = os.path.join(path, "standalone-layout.bro") with open(filename, "w") as out: out.write("# Automatically generated. Do not edit.\n") # This is the port that standalone nodes listen on for remote # control by default. out.write("redef Communication::listen_port = %s/tcp;\n" % config.Config.broport) out.write("redef Communication::nodes += {\n") out.write("\t[\"control\"] = [$host=%s, $zone_id=\"%s\", $class=\"control\", $events=Control::controller_events],\n" % (util.format_bro_addr(manager.addr), manager.zone_id)) out.write("};\n") else: if not silent: cmdout.info("generating cluster-layout.bro ...") broport = Port(config.Config.broport) workers = config.Config.nodes("workers") proxies = config.Config.nodes("proxies") with open(filename, "w") as out: out.write("# Automatically generated. Do not edit.\n") out.write("redef Cluster::nodes = {\n") # Control definition. For now just reuse the manager information. out.write("\t[\"control\"] = [$node_type=Cluster::CONTROL, $ip=%s, $zone_id=\"%s\", $p=%s/tcp],\n" % (util.format_bro_addr(manager.addr), config.Config.zoneid, config.Config.broport)) # Manager definition out.write("\t[\"%s\"] = [$node_type=Cluster::MANAGER, $ip=%s, $zone_id=\"%s\", $p=%s/tcp, $workers=set(" % (manager.name, util.format_bro_addr(manager.addr), manager.zone_id, broport.next_port(manager))) for s in workers: out.write("\"%s\"" % s.name) if s != workers[-1]: out.write(", ") out.write(")],\n") # Proxies definition for p in proxies: out.write("\t[\"%s\"] = [$node_type=Cluster::PROXY, $ip=%s, $zone_id=\"%s\", $p=%s/tcp, $manager=\"%s\", $workers=set(" % (p.name, util.format_bro_addr(p.addr), p.zone_id, broport.next_port(p), manager.name)) for s in workers: out.write("\"%s\"" % s.name) if s != workers[-1]: out.write(", ") out.write(")],\n") # Workers definition for w in workers: p = w.count % len(proxies) out.write("\t[\"%s\"] = [$node_type=Cluster::WORKER, $ip=%s, $zone_id=\"%s\", $p=%s/tcp, $interface=\"%s\", $manager=\"%s\", $proxy=\"%s\"],\n" % (w.name, util.format_bro_addr(w.addr), w.zone_id, broport.next_port(w), w.interface, manager.name, proxies[p].name)) # Activate time-machine support if configured. if config.Config.timemachinehost: out.write("\t[\"time-machine\"] = [$node_type=Cluster::TIME_MACHINE, $ip=%s, $p=%s],\n" % (config.Config.timemachinehost, config.Config.timemachineport)) out.write("};\n")