def __init__(self, config_filename, from_string=False): self._logger = logging.getLogger(__name__) self._programs = [] try: if not from_string: self._tree = ET.parse(config_filename) self._root = self._tree.getroot() else: self._root = ET.fromstring(config_filename) self._node_name = self._root.attrib['name'] self._node_net_mode = self._root.attrib['net_mode'] self._node_op_mode = self._root.attrib['op_mode'] self._reboot_time = int(self._root.attrib['reboot_time']) if self._node_net_mode == "net": beacon = self._root.find("beacon") reporting = self._root.find("reporting") listener = self._root.find("listener") self._beacon_server = beacon.attrib['server'] self._beacon_port = int(beacon.attrib['port']) self._beacon_interval = int(beacon.attrib['interval']) self._report_server = reporting.attrib['server'] self._report_port = reporting.attrib['port'] self._listener_port = int(listener.attrib['port']) elif self._node_net_mode != "single": raise ValueError( "Only net and single are available modes for node!") programs = self._root.find("programs") sleep_times = [] for prog in programs: sleep_times.append(prog.attrib['sleep_time']) self._programs.append(prog.attrib) # self._program_path = self._root.find("program").attrib['path'] # self._program_dbg_child = bool(self._root.find("program").attrib['dbg_child']) self._sleep_time = max(sleep_times) if self._node_op_mode == 'fuzzing': fuzzer = self._root.find("fuzzer") self._fuzzer_type = fuzzer.attrib['type'] self._fuzz_config = [] if self._fuzzer_type not in FUZZERS.keys(): raise ValueError("Unsupported fuzzing type") for elem in FUZZERS[self._fuzzer_type][0]: self._fuzz_config.append(fuzzer.attrib[elem]) self._file_type = fuzzer.attrib['file_type'] elif self._node_op_mode == 'reducing': reducer = self._root.find('reducer') self._reducer_type = reducer.attrib['type'] self._reducer_config = [] if self._reducer_type not in REDUCERS.keys(): raise ValueError('Unsupported reducing type') for elem in REDUCERS[self._reducer_type][0]: self._reducer_config.append(reducer.attrib[elem]) self._file_type = reducer.attrib['file_type'] else: raise ValueError('Unsupported Operation Mode!') except ValueError as ex: self._logger.error( "General error occurred while parsing config: " + str(ex.message) + str(ex.args)) quit()
def __init__(self, config_filename, from_string=False): self._logger = logging.getLogger(__name__) self._programs = [] try: if not from_string: self._tree = ET.parse(config_filename) self._root = self._tree.getroot() else: self._root = ET.fromstring(config_filename) self._node_name = self._root.attrib['name'] self._node_net_mode = self._root.attrib['net_mode'] self._node_op_mode = self._root.attrib['op_mode'] self._reboot_time = int(self._root.attrib['reboot_time']) if self._node_net_mode == "net": beacon = self._root.find("beacon") reporting = self._root.find("reporting") listener = self._root.find("listener") self._beacon_server = beacon.attrib['server'] self._beacon_port = int(beacon.attrib['port']) self._beacon_interval = int(beacon.attrib['interval']) self._report_server = reporting.attrib['server'] self._report_port = reporting.attrib['port'] self._listener_port = int(listener.attrib['port']) elif self._node_net_mode != "single": raise ValueError("Only net and single are available modes for node!") programs = self._root.find("programs") sleep_times = [] for prog in programs: sleep_times.append(prog.attrib['sleep_time']) self._programs.append(prog.attrib) # self._program_path = self._root.find("program").attrib['path'] # self._program_dbg_child = bool(self._root.find("program").attrib['dbg_child']) self._sleep_time = max(sleep_times) if self._node_op_mode == 'fuzzing': fuzzer = self._root.find("fuzzer") self._fuzzer_type = fuzzer.attrib['type'] self._fuzz_config = [] if self._fuzzer_type not in FUZZERS.keys(): raise ValueError("Unsupported fuzzing type") for elem in FUZZERS[self._fuzzer_type][0]: self._fuzz_config.append(fuzzer.attrib[elem]) self._file_type = fuzzer.attrib['file_type'] elif self._node_op_mode == 'reducing': reducer = self._root.find('reducer') self._reducer_type = reducer.attrib['type'] self._reducer_config = [] if self._reducer_type not in REDUCERS.keys(): raise ValueError('Unsupported reducing type') for elem in REDUCERS[self._reducer_type][0]: self._reducer_config.append(reducer.attrib[elem]) self._file_type = reducer.attrib['file_type'] else: raise ValueError('Unsupported Operation Mode!') except ValueError as ex: self._logger.error("General error occurred while parsing config: " + str(ex.message) + str(ex.args)) quit()
def node_detail(self, node): node_config = node.info op_mode_conf = "" programs = None if node.config is not None: add_config, programs, op_mode_conf = ConfigParser(node.config, True).dump_additional_information() node_config += add_config node_detail_html = self._html_template node_detail_html = node_detail_html.replace("SECTION_TITLE", node.name) node_conf_table = "<form action=\"/index.py?func=home&node=" + node.address + \ "&submit=1\" method=\"post\">\r\n" + "<table>\r\n" node_conf_table += "<tr><th/>GENERAL CONFIG<th/></tr>\r\n" # ------------------------------------------------------------------------------------------------------------ # General config settings for i in range(4): node_conf_table += html.node_detail_table_entry(node_config[i][0], node_config[i][1]) del node_config[0:4] for elem in node_config: node_conf_table += html.node_detail_table_entry_editable(elem[0], elem[1]) node_conf_table += "</table>\r\n<table id=\"programs_table\">\r\n" # ------------------------------------------------------------------------------------------------------------ # Program settings if programs is not None: for i, prog in enumerate(programs): node_conf_table += "<tr><th>PROGRAM " + str(i) + "</th><th/></tr>\r\n" single_prog = "" for key, val in prog.items(): single_prog += html.node_detail_table_entry_editable(key, val, "prog-" + str(i) + " " + key) node_conf_table += single_prog node_conf_table += "</table>\r\n" # ------------------------------------------------------------------------------------------------------------ # Fuzzer settings if op_mode_conf != "": node_conf_table += "<table id=\"fuzz_table\" >\r\n<tr><th>FUZZER SETTINGS</th><th/></tr>\r\n" fuzz_types_options = "" for key in FUZZERS.keys(): fuzz_types_options += "<option>"+key+"</option>\r\n" node_conf_table += "<tr>\r\n<td><b>Fuzzer Type</b></td>\r\n<td><select id=\"fuzzers\" " + \ "onLoad=\"set_select_value('" + op_mode_conf["fuzzer_type"] + "')\" " + \ " name=\"fuzzer_type\" onChange=\"changeFuzzer()\">\r\n" + \ fuzz_types_options+"</select>\r\n</td>\r\n</tr>\r\n" for key in FUZZERS[op_mode_conf["fuzzer_type"]][0]: node_conf_table += html.node_detail_table_entry_editable(key, op_mode_conf['fuzz_conf'][key]) node_conf_table += "</table>\r\n" else: node_conf_table += "<br><br><b>No additional information received by now</b>\r\n" node_conf_table += "<br>\r\n" node_conf_table += "<input type=\"submit\" value=\"Submit\" >\r\n</form>\r\n" node_conf_table += html.action_button("Reboot node", "/index.py?func=home&reboot=" + node.address, "post") node_conf_table += html.action_button("Delete node", "/index.py?func=home&del=" + node.address, "post") node_detail_html = node_detail_html.replace("REPLACE_ME", node_conf_table) return self._statuses[200], self._header_html, node_detail_html
def get_scripts(self): scripts = self.__get_file("web/scripts.js") fuzzers = "var fuzzers = [ " for key in FUZZERS.keys(): fuzzers += "'" + key + "', [ " for elem in FUZZERS[key][0]: fuzzers += "'" + elem + "'," fuzzers = fuzzers[:-1] fuzzers += "]," fuzzers = fuzzers[:-1] fuzzers +="];\r\n" scripts = scripts.replace('FUZZERS', fuzzers) return self._statuses[200], self._header_js, scripts
def get_scripts(self): scripts = self.__get_file("web/scripts.js") fuzzers = "var fuzzers = [ " for key in FUZZERS.keys(): fuzzers += "'" + key + "', [ " for elem in FUZZERS[key][0]: fuzzers += "'" + elem + "'," fuzzers = fuzzers[:-1] fuzzers += "]," fuzzers = fuzzers[:-1] fuzzers += "];\r\n" scripts = scripts.replace('FUZZERS', fuzzers) return self._statuses[200], self._header_js, scripts
def node_detail(self, node): node_config = node.info fuzzer_conf = "" if node.config != "": from_conf_file = ConfigParser(node.config) add_config, fuzzer_conf = from_conf_file.dump_additional_information() node_config += add_config node_detail_html = self._html_template node_detail_html = node_detail_html.replace("SECTION_TITLE", node.name) node_conf_table = "<form action=\"/index.py?func=home&node=" + node.address + \ "&submit=1\" method=\"post\">\r\n" + "<table>\r\n" node_conf_table += "<tr><th/><th/></tr>\r\n" # General config settings for i in range(4): node_conf_table += "<tr>\r\n<td><b>" + node_config[i][0] + "</b></td>\r\n" + \ "<td>" + node_config[i][1] + "</td>\r\n</tr>\r\n" del node_config[0:4] for elem in node_config: single_node = "<td><b>" + elem[0] + "</b></td>\r\n" + \ "<td><input type=\"text\" name=\"" + elem[0].lower() + "\" value=\"" + \ elem[1] + "\" size=\"60\"></td>\r\n" node_conf_table += "<tr>\r\n" + single_node + "</tr>\r\n" node_conf_table += "</table>\r\n" if fuzzer_conf != "": node_conf_table += "<table id=\"fuzz_table\" >\r\n<tr><th/><th/></tr>\r\n" # fuzzer settings fuzz_types_options = "" for key in FUZZERS.keys(): fuzz_types_options += "<option>"+key+"</option>\r\n" node_conf_table += "<tr>\r\n<td><b>Fuzzer Type</b></td>\r\n<td><select id=\"fuzzers\" " + \ "onLoad=\"set_select_value('" + fuzzer_conf["fuzzer_type"] + "')\" " + \ " name=\"fuzzer_type\" onChange=\"changeFuzzer()\">\r\n" + \ fuzz_types_options+"</select>\r\n</td>\r\n</tr>\r\n" node_conf_table += "<div id=\"fuzz_config\">\r\n" for key in FUZZERS[fuzzer_conf["fuzzer_type"]][0]: node_conf_table += "<tr>\r\n<td><b>" + key + "</b></td>\r\n" + \ "<td><input type=\"text\" value=\"" + fuzzer_conf["fuzz_conf"][key] + "\" name=\"" + \ key + "\" >" # table end node_conf_table += "\r\n</div>\r\n" node_conf_table += "</table>\r\n" else: node_conf_table += "<br><br><b>No additional information received by now</b>\r\n" node_conf_table += "<br>\r\n" node_conf_table += "<input type=\"submit\" value=\"Submit\">\r\n</form>\r\n" node_conf_table += "<form action=\"/index.py?func=home&reboot=" + node.address + "\" method=\"post\">\r\n" + \ "<input type=\"submit\" value=\"Reboot node\">\r\n</form>\r\n" node_conf_table += "<form action=\"/index.py?func=home&del=" + node.address + "\" method=\"post\">\r\n" + \ "<input type=\"submit\" value=\"Delete node\">\r\n</form>\r\n" node_detail_html = node_detail_html.replace("REPLACE_ME", node_conf_table) return self._statuses[200], self._header_html, node_detail_html