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 + -
显示快捷键?