소스 검색

qvm-template-postprocess: do not generate appmenus twice

Skip initial generate, as it's done before actual menu entries are
extracted from the template. But do call it if we aren't going to
extract menu entries initially - it will create just "settings" menu
entry.
Marek Marczykowski-Górecki 3 년 전
부모
커밋
8795668233
2개의 변경된 파일20개의 추가작업 그리고 9개의 파일을 삭제
  1. 6 6
      qubesadmin/tests/tools/qvm_template_postprocess.py
  2. 14 3
      qubesadmin/tools/qvm_template_postprocess.py

+ 6 - 6
qubesadmin/tests/tools/qvm_template_postprocess.py

@@ -220,7 +220,7 @@ class TC_00_qvm_template_postprocess(qubesadmin.tests.QubesTestCase):
         vm = self.app.domains['test-vm']
         vm = self.app.domains['test-vm']
         with mock.patch('subprocess.check_call') as mock_proc:
         with mock.patch('subprocess.check_call') as mock_proc:
             qubesadmin.tools.qvm_template_postprocess.import_appmenus(
             qubesadmin.tools.qvm_template_postprocess.import_appmenus(
-                vm, self.source_dir.name)
+                vm, self.source_dir.name, skip_generate=False)
         self.assertEqual(mock_proc.mock_calls, [
         self.assertEqual(mock_proc.mock_calls, [
             mock.call(['qvm-appmenus',
             mock.call(['qvm-appmenus',
                 '--set-default-whitelist=' + os.path.join(self.source_dir.name,
                 '--set-default-whitelist=' + os.path.join(self.source_dir.name,
@@ -282,7 +282,7 @@ class TC_00_qvm_template_postprocess(qubesadmin.tests.QubesTestCase):
         vm = self.app.domains['test-vm']
         vm = self.app.domains['test-vm']
         with mock.patch('subprocess.check_call') as mock_proc:
         with mock.patch('subprocess.check_call') as mock_proc:
             qubesadmin.tools.qvm_template_postprocess.import_appmenus(
             qubesadmin.tools.qvm_template_postprocess.import_appmenus(
-                vm, self.source_dir.name)
+                vm, self.source_dir.name, skip_generate=False)
         self.assertEqual(mock_proc.mock_calls, [
         self.assertEqual(mock_proc.mock_calls, [
             mock.call(['runuser', '-u', 'user', '--', 'env', 'DISPLAY=:0',
             mock.call(['runuser', '-u', 'user', '--', 'env', 'DISPLAY=:0',
                 'qvm-appmenus',
                 'qvm-appmenus',
@@ -316,7 +316,7 @@ class TC_00_qvm_template_postprocess(qubesadmin.tests.QubesTestCase):
         vm = self.app.domains['test-vm']
         vm = self.app.domains['test-vm']
         with mock.patch('subprocess.check_call') as mock_proc:
         with mock.patch('subprocess.check_call') as mock_proc:
             qubesadmin.tools.qvm_template_postprocess.import_appmenus(
             qubesadmin.tools.qvm_template_postprocess.import_appmenus(
-                vm, self.source_dir.name)
+                vm, self.source_dir.name, skip_generate=False)
         self.assertEqual(mock_proc.mock_calls, [])
         self.assertEqual(mock_proc.mock_calls, [])
         self.assertAllCalled()
         self.assertAllCalled()
 
 
@@ -373,7 +373,7 @@ class TC_00_qvm_template_postprocess(qubesadmin.tests.QubesTestCase):
         mock_import_root_img.assert_called_once_with(self.app.domains[
         mock_import_root_img.assert_called_once_with(self.app.domains[
             'test-vm'], self.source_dir.name)
             'test-vm'], self.source_dir.name)
         mock_import_appmenus.assert_called_once_with(self.app.domains[
         mock_import_appmenus.assert_called_once_with(self.app.domains[
-            'test-vm'], self.source_dir.name)
+            'test-vm'], self.source_dir.name, skip_generate=True)
         if qubesadmin.tools.qvm_template_postprocess.have_events:
         if qubesadmin.tools.qvm_template_postprocess.have_events:
             mock_domain_shutdown.assert_called_once_with([self.app.domains[
             mock_domain_shutdown.assert_called_once_with([self.app.domains[
                 'test-vm']])
                 'test-vm']])
@@ -428,7 +428,7 @@ class TC_00_qvm_template_postprocess(qubesadmin.tests.QubesTestCase):
         mock_reset_private_img.assert_called_once_with(self.app.domains[
         mock_reset_private_img.assert_called_once_with(self.app.domains[
             'test-vm'])
             'test-vm'])
         mock_import_appmenus.assert_called_once_with(self.app.domains[
         mock_import_appmenus.assert_called_once_with(self.app.domains[
-            'test-vm'], self.source_dir.name)
+            'test-vm'], self.source_dir.name, skip_generate=True)
         if qubesadmin.tools.qvm_template_postprocess.have_events:
         if qubesadmin.tools.qvm_template_postprocess.have_events:
             mock_domain_shutdown.assert_called_once_with([self.app.domains[
             mock_domain_shutdown.assert_called_once_with([self.app.domains[
                 'test-vm']])
                 'test-vm']])
@@ -469,7 +469,7 @@ class TC_00_qvm_template_postprocess(qubesadmin.tests.QubesTestCase):
         mock_reset_private_img.assert_called_once_with(self.app.domains[
         mock_reset_private_img.assert_called_once_with(self.app.domains[
             'test-vm'])
             'test-vm'])
         mock_import_appmenus.assert_called_once_with(self.app.domains[
         mock_import_appmenus.assert_called_once_with(self.app.domains[
-            'test-vm'], self.source_dir.name)
+            'test-vm'], self.source_dir.name, skip_generate=False)
         if qubesadmin.tools.qvm_template_postprocess.have_events:
         if qubesadmin.tools.qvm_template_postprocess.have_events:
             self.assertFalse(mock_domain_shutdown.called)
             self.assertFalse(mock_domain_shutdown.called)
         self.assertEqual(self.app.service_calls, [])
         self.assertEqual(self.app.service_calls, [])

+ 14 - 3
qubesadmin/tools/qvm_template_postprocess.py

@@ -143,8 +143,14 @@ def reset_private_img(vm):
     vm.volumes['private'].clear_data()
     vm.volumes['private'].clear_data()
 
 
 
 
-def import_appmenus(vm, source_dir):
-    '''Import appmenus settings into VM object (later: GUI VM)'''
+def import_appmenus(vm, source_dir, skip_generate=True):
+    """Import appmenus settings into VM object (later: GUI VM)
+
+    :param vm: QubesVM object of just imported template
+    :param source_dir: directory with source files
+    :param skip_generate: do not generate actual menu entries,
+            only set item lists
+    """
     if os.getuid() == 0:
     if os.getuid() == 0:
         try:
         try:
             qubes_group = grp.getgrnam('qubes')
             qubes_group = grp.getgrnam('qubes')
@@ -171,6 +177,9 @@ def import_appmenus(vm, source_dir):
             as fd:
             as fd:
         vm.features['netvm-menu-items'] = ' '.join([x.rstrip() for x in fd])
         vm.features['netvm-menu-items'] = ' '.join([x.rstrip() for x in fd])
 
 
+    if skip_generate:
+        return
+
     # TODO: change this to qrexec calls to GUI VM, when GUI VM will be
     # TODO: change this to qrexec calls to GUI VM, when GUI VM will be
     # implemented
     # implemented
     try:
     try:
@@ -283,7 +292,9 @@ def post_install(args):
         vm.log.info('Clearing private volume')
         vm.log.info('Clearing private volume')
         reset_private_img(vm)
         reset_private_img(vm)
     vm.installed_by_rpm = not args.no_installed_by_rpm
     vm.installed_by_rpm = not args.no_installed_by_rpm
-    import_appmenus(vm, args.dir)
+    # do not generate actual menu entries, if post-install service will be
+    # executed anyway
+    import_appmenus(vm, args.dir, skip_generate=not args.skip_start)
 
 
     conf_path = os.path.join(args.dir, 'template.conf')
     conf_path = os.path.join(args.dir, 'template.conf')
     if os.path.exists(conf_path):
     if os.path.exists(conf_path):