diffcompare.py
来自「Ubuntu packages of security software。 相」· Python 代码 · 共 1,081 行 · 第 1/3 页
PY
1,081 行
def add_host_diff(self, host_state, host, host2=None): section = _("Host") if host.ip: section = _("Host %s") % (host.ip["addr"]) elif host.ipv6: section = _("Host %s") % (host.ipv6["addr"]) elif host.mac: section = _("Host %s") % (host.mac["addr"]) parent = self.append_parent(None, section, host_state) self.diff_it(parent, "", _("Comment"), host.comment, host2.comment) self.diff_it(parent, "", _("LastBoot"), host.uptime.get("lastboot", ""), host2.uptime.get("lastboot", "")) self.diff_it(parent, "", _("OS Match"), host.osmatch.get("name", ""), host2.osmatch.get("name", "")) host_ports = host.ports[:] host2_ports = host2.ports[:] for port in xrange(len(host_ports)): # Making sure that extraports1 will get a sanity value to be processed try: extraports1 = host_ports[port].get("extraports", []) except: extraports1 = {} else: if len(extraports1) == 0: extraports1 = {} elif len(extraports1) == 1: extraports1 = extraports1[0] # Making sure that extraports2 will get a sanity value to be processed try: extraports2 = host2_ports[port].get("extraports", []) except: extraports2 = {} else: if len(extraports2) == 0: extraports2 = {} elif len(extraports2) == 1: extraports2 = extraports2[0] if extraports1 and extraports2: self.add_extraports_diff(parent, "", extraports1, extraports2) elif extraports1 and not extraports2: self.add_extraports_diff(parent, "N", extraports1, extraports2) elif not extraports1 and extraports2: self.add_extraports_diff(parent, "A", extraports1, extraports2) section = _("Ports") parent = self.append_parent(parent, section, "") # Making sure that ports1 will get a sanity value to be processed try: ports1 = host_ports[port].get("port", []) except: ports1 = {} else: if len(ports1) == 0: ports1 = {} elif len(ports1) == 1: ports1 = ports1[0] # Making sure that ports2 will get a sanity value to be processed try: ports2 = host2_ports[port].get("port", []) except: ports2 = {} else: if len(ports2) == 0: ports2 = [{}] elif len(ports2) == 1: ports2 = ports2[0] if type(ports2)!= type([]): ports2 = [ports2] if type(ports1) != type([]): ports1 = [ports1] for p1 in ports1: if not p1: continue p2 = [port2 for port2 in ports2 \ if port2.get("portid", "a") == p1.get("portid", "b")] if p2: # Removing found port ports2.remove(p2[0]) if p1 and p2: self.add_port_diff(parent, "", p1, p2[0]) elif p1 and not p2: self.add_port_diff(parent, "N", p1, {}) for p2 in ports2: # If there is something left... self.add_port_diff(parent, "A", {}, p2) def add_port_diff(self, port_parent, state, port1, port2): if (port1 or port2) and (type(port1) == type({})) and (type(port2) == type({})): section = port1.get("portid", False) if not section: # If port1 is empty, then, try port2 section = port2.get("portid", "") parent = self.append_parent(port_parent, section, state) self.diff_it(parent, "", _("State"), port1.get("port_state", ""), port2.get("port_state", "")) self.diff_it(parent, "", _("Service Name"), port1.get("service_name", ""), port2.get("service_name", "")) self.diff_it(parent, "", _("Product"), port1.get("service_product", ""), port2.get("service_product", "")) self.diff_it(parent, "", _("Service Version"), port1.get("service_version", ""), port2.get("service_version", "")) self.diff_it(parent, "", _("Protocol"), port1.get("protocol", ""), port2.get("protocol", "")) self.diff_it(parent, "", _("Extra Info"), port1.get("service_extrainfo", ""), port2.get("service_extrainfo", "")) self.diff_it(parent, "", _("Service Conf"), port1.get("service_conf", ""), port2.get("service_conf", "")) # Last parent status modification if state.upper() == "A": self.change_status(parent, "A") def add_extraports_diff(self, host_parent, state, extraports1, extraports2): if extraports1 or extraports2: section = _("Extraports") parent = self.append_parent(host_parent, section, state) self.set_parent_status(parent, state) self.diff_it(parent, "", _("Count"), extraports1.get("count"), extraports2.get("count")) self.diff_it(parent, "", _("State"), extraports1.get("state"), extraports2.get("state")) def diff_it(self, parent, section, prop_name, prop1, prop2): if prop1 or prop2: state = diff_state(prop1, prop2) self.set_parent_status(parent, state) self.diff_tree.append(parent, [state, section, prop_name, prop1, prop2, self.colors.get_hex_color(state)]) return state def append_parent(self, parent, section, state): self.set_parent_status(parent, state) return self.diff_tree.append(parent, [state, section, "", "", "", self.colors.get_hex_color(state)]) def search_column(self, widget, column_id): self.diff_view.set_search_column(column_id) def _pack_widgets(self): self._pack_noexpand_nofill(self.diff_title) self._pack_expand_fill(self.diff_box) self.diff_box._pack_noexpand_nofill(hig_box_space_holder()) self.diff_box._pack_expand_fill(self.diff_scrolled) self.diff_scrolled.add(self.diff_view)class DiffLegendWindow(HIGDialog, object): def __init__(self, colors): # Shows colors and chars legend HIGDialog.__init__(self, title=_('Color Descriptions'), buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) self.colors = colors self._create_widgets() self._pack_widgets() self._connect_widgets() def _create_widgets(self): self.table = HIGTable() self.unchanged_button = gtk.ColorButton(self.colors.unchanged) self.unchanged_label = gtk.Label(_("Property remained <b>U</b>nchanged")) self.added_button = gtk.ColorButton(self.colors.added) self.added_label = gtk.Label(_("Property was <b>A</b>dded")) self.modified_button = gtk.ColorButton(self.colors.modified) self.modified_label = gtk.Label(_("Property was <b>M</b>odified")) self.not_present_button = gtk.ColorButton(self.colors.not_present) self.not_present_label = gtk.Label(_("Property is <b>N</b>ot present")) def _pack_widgets(self): self.unchanged_label.set_use_markup(True) self.added_label.set_use_markup(True) self.modified_label.set_use_markup(True) self.not_present_label.set_use_markup(True) self.table.attach_label(self.unchanged_button, 0, 1, 0, 1) self.table.attach_entry(self.unchanged_label, 1, 2, 0, 1) self.table.attach_label(self.added_button, 0, 1, 1, 2) self.table.attach_entry(self.added_label, 1, 2, 1, 2) self.table.attach_label(self.modified_button, 0, 1, 2, 3) self.table.attach_entry(self.modified_label, 1, 2, 2, 3) self.table.attach_label(self.not_present_button, 0, 1, 3, 4) self.table.attach_entry(self.not_present_label, 1, 2, 3, 4) self.vbox.pack_start(self.table) self.vbox.show_all() def _connect_widgets(self): self.unchanged_button.connect("color-set", self.set_color, "unchanged") self.added_button.connect("color-set", self.set_color, "added") self.modified_button.connect("color-set", self.set_color, "modified") self.not_present_button.connect("color-set", self.set_color, "not_present") def set_color(self, widget, prop): self.colors.__setattr__(prop, widget.get_color())class Colors(object): def __init__(self): self.diff_colors = DiffColors() def get_unchanged(self): return gtk.gdk.Color(*self.diff_colors.unchanged) def set_unchanged(self, color): if type(color) == type([]) or type(color) in StringTypes: self.diff_colors.unchanged = color else: self.diff_colors.unchanged = [color.red, color.green, color.blue] def get_added(self): return gtk.gdk.Color(*self.diff_colors.added) def set_added(self, color): if type(color) == type([]) or type(color) in StringTypes: self.diff_colors.added = color else: self.diff_colors.added = [color.red, color.green, color.blue] def get_modified(self): return gtk.gdk.Color(*self.diff_colors.modified) def set_modified(self, color): if type(color) == type([]) or type(color) in StringTypes: self.diff_colors.modified = color else: self.diff_colors.modified = [color.red, color.green, color.blue] def get_not_present(self): return gtk.gdk.Color(*self.diff_colors.not_present) def set_not_present(self, color): if type(color) == type([]) or type(color) in StringTypes: self.diff_colors.not_present = color else: self.diff_colors.not_present = [color.red, color.green, color.blue] def get_hex_unchanged(self): return self._get_hex(self.unchanged) def get_hex_added(self): return self._get_hex(self.added) def get_hex_modified(self): return self._get_hex(self.modified) def get_hex_not_present(self): return self._get_hex(self.not_present) def _get_hex(self, color): if type(color) == type([]): return "#%4s%4s%4s" % (hex(color[0])[2:].zfill(4), hex(color[1])[2:].zfill(4), hex(color[2])[2:].zfill(4)) else: return "#%4s%4s%4s" % (hex(color.red)[2:].zfill(4), hex(color.green)[2:].zfill(4), hex(color.blue)[2:].zfill(4)) def get_hex_color(self, state): state = state.upper() if state == "A": return self.hex_added elif state == "M": return self.hex_modified elif state == "N": return self.hex_not_present else: return self.hex_unchanged unchanged = property(get_unchanged, set_unchanged) added = property(get_added, set_added) modified = property(get_modified, set_modified) not_present = property(get_not_present, set_not_present) hex_unchanged = property(get_hex_unchanged) hex_added = property(get_hex_added) hex_modified = property(get_hex_modified) hex_not_present = property(get_hex_not_present)def diff_state(prop1, prop2): if prop1 == prop2: return "U" # Property remained "Unchanged" at the second scan elif prop1 == "" and prop2 != "": return "A" # Property "Added" at the second scan elif prop1 != "" and prop2 != "": return "M" # Property "Modified" at the second scan else: return "N" # Property "Not present" at the second scanif __name__ == "__main__": from zenmapCore.NmapParser import NmapParser parsed1 = NmapParser("test/xml_test1.xml") parsed2 = NmapParser("test/xml_test2.xml") parsed3 = NmapParser("test/xml_test3.xml") parsed4 = NmapParser("test/xml_test4.xml") parsed1.parse() parsed2.parse() parsed3.parse() parsed4.parse() dw = DiffWindow({"Parsed 1": parsed1, "Parsed 2": parsed2, "Parsed 3": parsed3, "Parsed 4": parsed4}) dw.show_all() dw.connect("delete-event", lambda x,y: gtk.main_quit()) gtk.main()
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?