def __init__(self): self.device_monitor = USB_ports(RunningMode.GTK) self.observer = MonitorObserver(self.device_monitor.monitor, callback = self.refresh, name='monitor-observer') Gtk.Window.__init__(self, title = "USBGnomento") self.set_resizable(True) self.set_border_width(10) # Setting up the self.grid in which the elements are to be positionned self.grid = Gtk.Grid() self.grid.set_column_homogeneous(True) self.grid.set_row_homogeneous(True) self.add(self.grid) # Creating the ListStore model self.usb_list = Gtk.ListStore(str, bool, str, str, str) self.current_filter_usb = None # Creating the filter, feeding it with the usb_list model self.usb_filter = self.usb_list.filter_new() # Setting the filter function self.usb_filter.set_visible_func(self.usb_filter_func) self.treeview = Gtk.TreeView.new_with_model(self.usb_filter) col = Gtk.TreeViewColumn("Known Device", Gtk.CellRendererPixbuf(), stock_id = 0) self.treeview.append_column(col) for i, column_title in enumerate(["Connected", "DescriptorInfo", "Manufacturer", "Product"]): i = i + 1 renderer = Gtk.CellRendererText() renderer.set_property('cell-background', 'grey') column = Gtk.TreeViewColumn(column_title, renderer, text=i) self.treeview.append_column(column) # Creating buttons to filter by device state, and setting up their events self.buttons = list() for usb_type in ["Connected Devices", "Known Devices", "Unknown Devices"]: button = Gtk.Button(usb_type) self.buttons.append(button) button.connect("clicked", self.on_selection_button_clicked) self.scrollable_treelist = Gtk.ScrolledWindow() self.scrollable_treelist.set_vexpand(True) self.grid.attach(self.scrollable_treelist, 0, 0, 8, 10) # Write to know devices button = Gtk.Button("Write selected") self.buttons.append(button) button.connect("clicked", self.write_to_known_devices) # Remove trusted device button = Gtk.Button("Remove selected") self.buttons.append(button) button.connect("clicked", self.remove_from_known_devices) self.grid.attach_next_to(self.buttons[0], self.scrollable_treelist, Gtk.PositionType.BOTTOM, 1, 1) for i, button in enumerate(self.buttons[1:]): self.grid.attach_next_to(button, self.buttons[i], Gtk.PositionType.RIGHT, 1, 1) self.scrollable_treelist.add(self.treeview) self.first_populate_table() self.show_all() self.observer.start()
class USB_ViewFilterWindow(Gtk.Window): def __init__(self): self.device_monitor = USB_ports(RunningMode.GTK) self.observer = MonitorObserver(self.device_monitor.monitor, callback = self.refresh, name='monitor-observer') Gtk.Window.__init__(self, title = "USBGnomento") self.set_resizable(True) self.set_border_width(10) # Setting up the self.grid in which the elements are to be positionned self.grid = Gtk.Grid() self.grid.set_column_homogeneous(True) self.grid.set_row_homogeneous(True) self.add(self.grid) # Creating the ListStore model self.usb_list = Gtk.ListStore(str, bool, str, str, str) self.current_filter_usb = None # Creating the filter, feeding it with the usb_list model self.usb_filter = self.usb_list.filter_new() # Setting the filter function self.usb_filter.set_visible_func(self.usb_filter_func) self.treeview = Gtk.TreeView.new_with_model(self.usb_filter) col = Gtk.TreeViewColumn("Known Device", Gtk.CellRendererPixbuf(), stock_id = 0) self.treeview.append_column(col) for i, column_title in enumerate(["Connected", "DescriptorInfo", "Manufacturer", "Product"]): i = i + 1 renderer = Gtk.CellRendererText() renderer.set_property('cell-background', 'grey') column = Gtk.TreeViewColumn(column_title, renderer, text=i) self.treeview.append_column(column) # Creating buttons to filter by device state, and setting up their events self.buttons = list() for usb_type in ["Connected Devices", "Known Devices", "Unknown Devices"]: button = Gtk.Button(usb_type) self.buttons.append(button) button.connect("clicked", self.on_selection_button_clicked) self.scrollable_treelist = Gtk.ScrolledWindow() self.scrollable_treelist.set_vexpand(True) self.grid.attach(self.scrollable_treelist, 0, 0, 8, 10) # Write to know devices button = Gtk.Button("Write selected") self.buttons.append(button) button.connect("clicked", self.write_to_known_devices) # Remove trusted device button = Gtk.Button("Remove selected") self.buttons.append(button) button.connect("clicked", self.remove_from_known_devices) self.grid.attach_next_to(self.buttons[0], self.scrollable_treelist, Gtk.PositionType.BOTTOM, 1, 1) for i, button in enumerate(self.buttons[1:]): self.grid.attach_next_to(button, self.buttons[i], Gtk.PositionType.RIGHT, 1, 1) self.scrollable_treelist.add(self.treeview) self.first_populate_table() self.show_all() self.observer.start() def first_populate_table(self): for device_id in self.device_monitor.known_devices.keys(): if device_id in self.device_monitor.connected_devices.keys(): self.usb_list.append([Gtk.STOCK_YES, True, self.device_monitor.known_devices[device_id][1], self.device_monitor.known_devices[device_id][0]["Manufacturer"], self.device_monitor.known_devices[device_id][0]["Product"]]) else: self.usb_list.append([Gtk.STOCK_YES, False, self.device_monitor.known_devices[device_id][1], self.device_monitor.known_devices[device_id][0]["Manufacturer"], self.device_monitor.known_devices[device_id][0]["Product"]]) for device_id in self.device_monitor.connected_devices.keys(): if device_id not in self.device_monitor.known_devices.keys(): print (self.device_monitor.connected_devices[device_id][1]) self.usb_list.append([Gtk.STOCK_NO, True, self.device_monitor.connected_devices[device_id][1], self.device_monitor.connected_devices[device_id][0]["Manufacturer"], self.device_monitor.connected_devices[device_id][0]["Product"]]) # Write selected device to file # The device would be kept in a buffer until the program exits def write_to_known_devices(self, button): treeselection = self.treeview.get_selection() model, treeiter = treeselection.get_selected() device = {} if treeiter != None: if model[treeiter][0] == Gtk.STOCK_YES: return if model[treeiter][3]: device["Manufacturer"] = model[treeiter][3] if model[treeiter][4]: device["Product"] = model[treeiter][4] print(device["Product"]) print(device["Manufacturer"]) busnum, devnum = model[treeiter][2].split("\n")[0].split("Bus")[1].split("Address") devnum = devnum.split()[0] dev = usb.core.find(address=int(devnum), bus=int(busnum)) dev_id = read_device.get_descriptors(dev) self.device_monitor.add_to_known_device(dev_id, device, dev) model.set_value(treeiter, 0, Gtk.STOCK_YES) else: dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CANCEL, "A USB device must be selected!") dialog.format_secondary_text("The selected USB device will be written to a 'know_hosts' file") dialog.run() # Remove selected device from file def remove_from_known_devices(self, button): treeselection = self.treeview.get_selection() model, treeiter = treeselection.get_selected() device = {} if treeiter != None: if model[treeiter][0] == Gtk.STOCK_NO: return if model[treeiter][3]: device["Manufacturer"] = model[treeiter][2] if model[treeiter][4]: device["Product"] = model[treeiter][3] busnum, devnum = model[treeiter][2].split("\n")[0].split("Bus")[1].split("Address") devnum = devnum.split()[0] dev = usb.core.find(address=int(devnum), bus=int(busnum)) dev_id = read_device.get_descriptors(dev) self.device_monitor.known_devices.pop(dev_id) model.set_value(treeiter, 0, Gtk.STOCK_NO) else: dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CANCEL, "A USB device must be selected!") dialog.format_secondary_text("The selected USB device was removed") dialog.run() # Check new devices def refresh(self, device): treeselection = self.treeview.get_selection() model, treeiter = treeselection.get_selected() if treeiter != None: index = (model.get_path(treeiter)).get_indices()[0] action = device.action bus_id = device.sys_name if action == 'add': devnum = int(device.attributes.get("devnum")) busnum = int(device.attributes.get("busnum")) dev = usb.core.find(address=devnum, bus=busnum) dev_id = read_device.get_descriptors(dev) dev_name = read_device.get_device_name(device.attributes) self.device_monitor.add_connected_device(bus_id, dev_id, dev_name, dev) if dev_id not in self.device_monitor.known_devices.keys(): self.usb_list.append([Gtk.STOCK_NO, True, str(dev), dev_name["Manufacturer"], dev_name["Product"]]) else: self.usb_list.append([Gtk.STOCK_YES, True, str(dev), dev_name["Manufacturer"], dev_name["Product"]]) if action == 'remove': bus_id = self.device_monitor.remove_connected_device(dev) self.remove_from_usb_list(bus_id) if treeiter != None: self.treeview.set_cursor(index) return True # Remove one entry from the usb_list (to remove from the gtk tree) def remove_from_usb_list(self, bus_id): for entry in self.usb_list: if entry[2] == bus_id: entry.model.remove(entry.iter) break # Tests if the usb is connected, known device or unknown def usb_filter_func(self, model, iter, data): if self.current_filter_usb is None or self.current_filter_usb == "None": return True elif self.current_filter_usb == "Known Devices": return model[iter][0] == Gtk.STOCK_YES elif self.current_filter_usb == "Unknown Devices": return model[iter][0] == False else: return model[iter][1] == True # Called on any of the button clicks def on_selection_button_clicked(self, widget): self.current_filter_usb = widget.get_label() print("{} usb selected!".format(self.current_filter_usb)) self.usb_filter.refilter() def quit_monitor(self): self.device_monitor.usb_monitor_stop() print("The know device list {}".format(self.device_monitor.known_devices))