Przeglądaj źródła

settings: devices

Wojtek Porczyk 6 lat temu
rodzic
commit
1861ff386d
1 zmienionych plików z 33 dodań i 29 usunięć
  1. 33 29
      qubesmanager/settings.py

+ 33 - 29
qubesmanager/settings.py

@@ -572,26 +572,31 @@ class VMSettingsWindow(Ui_SettingsDialog, QDialog):
 
     ######## devices tab
     def __init_devices_tab__(self):
-        self.dev_list = MultiSelectWidget(self)
+        self.dev_list = multiselectwidget.MultiSelectWidget(self)
         self.dev_list.add_all_button.setVisible(False)
         self.devices_layout.addWidget(self.dev_list)
 
         devs = []
-        lspci = subprocess.Popen(["/usr/sbin/lspci",], stdout = subprocess.PIPE)
-        for dev in lspci.stdout:
-            devs.append( (dev.rstrip(), dev.split(' ')[0]) )
+        lspci = subprocess.check_output(['/usr/sbin/lspci']).decode()
+        for dev in lspci.splitlines():
+            devs.append((dev.rstrip(), dev.split(' ')[0]))
 
         class DevListWidgetItem(QListWidgetItem):
-            def __init__(self, name, slot, parent = None):
+            def __init__(self, name, ident, parent = None):
                 super(DevListWidgetItem, self).__init__(name, parent)
-                self.slot = slot
+                self.ident = ident
                 self.Type
 
-        for d in devs:
-            if d[1] in self.vm.pcidevs:
-                self.dev_list.selected_list.addItem( DevListWidgetItem(d[0], d[1]))
+        persistent = [ass.ident.replace('_', ':')
+            for ass in self.vm.devices['pci'].persistent()]
+
+        for name, ident in devs:
+            if ident in persistent:
+                self.dev_list.selected_list.addItem(
+                    DevListWidgetItem(name, ident))
             else:
-                self.dev_list.available_list.addItem( DevListWidgetItem(d[0], d[1]))
+                self.dev_list.available_list.addItem(
+                    DevListWidgetItem(name, ident))
 
         if self.dev_list.selected_list.count() > 0 and self.include_in_balancing.isChecked():
             self.dmm_warning_adv.show()
@@ -610,27 +615,26 @@ class VMSettingsWindow(Ui_SettingsDialog, QDialog):
 
     def __apply_devices_tab__(self):
         msg = []
-        sth_changed = False
-        added = []
 
         try:
-            for i in range(self.dev_list.selected_list.count()):
-                item = self.dev_list.selected_list.item(i)
-                if item.slot not in self.vm.pcidevs:
-                    added.append(item)
-
-            if self.dev_list.selected_list.count() - len(added) < len(self.vm.pcidevs): #sth removed
-                sth_changed = True
-            elif len(added) > 0:
-                sth_changed = True
-
-            if sth_changed == True:
-                pcidevs = []
-                for i in range(self.dev_list.selected_list.count()):
-                    slot = self.dev_list.selected_list.item(i).slot
-                    pcidevs.append(slot)
-                self.vm.pcidevs = pcidevs
-                self.anything_changed = True
+            old = [ass.ident.replace('_', ':')
+                for ass in self.vm.devices['pci'].persistent()]
+
+            new = [self.dev_list.selected_list.item(i).ident
+                    for i in range(self.dev_list.selected_list.count())]
+            for ident in new:
+                if ident not in old:
+                    ass = qubesadmin.devices.DeviceAssignment(
+                        self.vm.app.domains['dom0'],
+                        ident.replace(':', '_'),
+                        persistent=True)
+                    self.vm.devices['pci'].attach(ass)
+            for ass in self.vm.devices['pci'].assignments(persistent=True):
+                if ass.ident.replace('_', ':') not in new:
+                    self.vm.devices['pci'].detach(ass)
+
+            self.anything_changed = True
+
         except Exception as ex:
             if utils.is_debug():
                 traceback.print_exc()