Parcourir la source

Add UI for managing Qubes update repositories

Depends on QubesOS/qubes-core-admin-linux#48

Fixes QubesOS/qubes-issues#4550
AJ Jordan il y a 5 ans
Parent
commit
fdd06d32a5
2 fichiers modifiés avec 134 ajouts et 2 suppressions
  1. 76 1
      qubesmanager/global_settings.py
  2. 58 1
      ui/globalsettingsdlg.ui

+ 76 - 1
qubesmanager/global_settings.py

@@ -24,6 +24,7 @@ import sys
 import os
 import os.path
 import traceback
+import subprocess
 from PyQt4 import QtCore, QtGui  # pylint: disable=import-error
 
 from qubesadmin import Qubes
@@ -233,8 +234,15 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings,
                 qmemman_config_file.writelines(config_lines)
                 qmemman_config_file.close()
 
-    def __init_updates__(self):
+    def __run_qrexec_repo(self, service, arg=''):
+        # Fake up a "qrexec call" to dom0 because dom0 can't qrexec to itself yet
+        cmd = '/etc/qubes-rpc/' + service
+        p = subprocess.run(['sudo', cmd, arg], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        assert not p.stderr
+        assert p.returncode == 0
+        return p.stdout.decode('utf-8')
 
+    def __init_updates__(self):
         # TODO: remove workaround when it is no longer needed
         self.dom0_updates_file_path = '/var/lib/qubes/updates/disable-updates'
 
@@ -251,6 +259,73 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings,
         self.enable_updates_all.clicked.connect(self.__enable_updates_all)
         self.disable_updates_all.clicked.connect(self.__disable_updates_all)
 
+        repos = dict()
+        for i in self.__run_qrexec_repo('qubes.repos.List').split('\n'):
+            l = i.split('\0')
+            # Keyed by repo name
+            d = repos[l[0]] = dict()
+            d['prettyname'] = l[1]
+            d['enabled'] = True if l[2] == 'enabled' else False
+
+        if repos['qubes-dom0-unstable']['enabled']:
+            self.dom0_updates_repo.setCurrentIndex(3)
+        elif repos['qubes-dom0-current-testing']['enabled']:
+            self.dom0_updates_repo.setCurrentIndex(2)
+        elif repos['qubes-dom0-security-testing']['enabled']:
+            self.dom0_updates_repo.setCurrentIndex(1)
+        elif repos['qubes-dom0-current']['enabled']:
+            self.dom0_updates_repo.setCurrentIndex(0)
+        else:
+            raise Exception('Cannot detect enabled dom0 update repositories')
+
+        if repos['qubes-templates-itl-testing']['enabled']:
+            self.itl_tmpl_updates_repo.setCurrentIndex(1)
+        elif repos['qubes-templates-itl']['enabled']:
+            self.itl_tmpl_updates_repo.setCurrentIndex(0)
+        else:
+            raise Exception('Cannot detect enabled ITL template update repositories')
+
+        if repos['qubes-templates-community-testing']['enabled']:
+            self.comm_tmpl_updates_repo.setCurrentIndex(2)
+        elif repos['qubes-templates-community']['enabled']:
+            self.comm_tmpl_updates_repo.setCurrentIndex(1)
+        else:
+            self.comm_tmpl_updates_repo.setCurrentIndex(0)
+
+        self.dom0_updates_repo.currentIndexChanged.connect(self.__handle_dom0_updates_combobox)
+        self.itl_tmpl_updates_repo.currentIndexChanged.connect(self.__handle_itl_tmpl_updates_combobox)
+        self.comm_tmpl_updates_repo.currentIndexChanged.connect(self.__handle_comm_tmpl_updates_combobox)
+
+    def __manage_repos(self, l, action):
+        for i in l:
+            assert self.__run_qrexec_repo('qubes.repos.' + action, i) == 'ok\n'
+
+    def __handle_dom0_updates_combobox(self, idx):
+        idx += 1
+        l = ['qubes-dom0-current', 'qubes-dom0-security-testing',
+             'qubes-dom0-current-testing', 'qubes-dom0-unstable']
+        enable = l[:idx]
+        disable = l[idx:]
+        self.__manage_repos(enable, 'Enable')
+        self.__manage_repos(disable, 'Disable')
+
+    def __handle_itl_tmpl_updates_combobox(self, idx):
+        idx += 1
+        l = ['qubes-templates-itl', 'qubes-templates-itl-testing']
+        enable = l[:idx]
+        disable = l[idx:]
+        self.__manage_repos(enable, 'Enable')
+        self.__manage_repos(disable, 'Disable')
+
+    def __handle_comm_tmpl_updates_combobox(self, idx):
+        # We don't increment idx by 1 because this is the only combobox that
+        # has an explicit "disable this repository entirely" option
+        l = ['qubes-templates-community', 'qubes-templates-community-testing']
+        enable = l[:idx]
+        disable = l[idx:]
+        self.__manage_repos(enable, 'Enable')
+        self.__manage_repos(disable, 'Disable')
+
     def __enable_updates_all(self):
         reply = QtGui.QMessageBox.question(
             self, self.tr("Change state of all qubes"),

+ 58 - 1
ui/globalsettingsdlg.ui

@@ -98,7 +98,7 @@
      </layout>
     </widget>
    </item>
-   <item row="3" column="0" colspan="2">
+   <item row="4" column="0" colspan="2">
     <widget class="QDialogButtonBox" name="buttonBox">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
@@ -209,6 +209,30 @@
       <string>Updates</string>
      </property>
      <layout class="QGridLayout" name="gridLayout_3">
+      <item row="1" column="0">
+       <widget class="QComboBox" name="dom0_updates_repo">
+        <item>
+         <property name="text">
+          <string>Stable updates</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Testing updates (security only)</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Testing updates</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Unstable updates</string>
+         </property>
+        </item>
+       </widget>
+      </item>
       <item row="1" column="1">
        <widget class="QPushButton" name="disable_updates_all">
         <property name="text">
@@ -243,6 +267,39 @@
         </property>
        </widget>
       </item>
+      <item row="2" column="0">
+       <widget class="QComboBox" name="itl_tmpl_updates_repo">
+        <item>
+         <property name="text">
+          <string>ITL template updates</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>ITL template updates (testing)</string>
+         </property>
+        </item>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QComboBox" name="comm_tmpl_updates_repo">
+        <item>
+         <property name="text">
+          <string>(Community templates disabled)</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Community template updates</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Community template updates (testing)</string>
+         </property>
+        </item>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>