Ver código fonte

Merge branch 'master' of git://git.qubes-os.org/marmarek/core-admin

Joanna Rutkowska 10 anos atrás
pai
commit
2347874690
4 arquivos alterados com 66 adições e 18 exclusões
  1. 48 9
      core-modules/01QubesHVm.py
  2. 2 3
      qvm-tools/qvm-check
  3. 8 3
      qvm-tools/qvm-run
  4. 8 3
      qvm-tools/qvm-start

+ 48 - 9
core-modules/01QubesHVm.py

@@ -60,8 +60,12 @@ class QubesHVm(QubesVm):
         attrs['drive'] = { 'save': 'str(self.drive)' }
         attrs['maxmem'].pop('save')
         attrs['timezone'] = { 'default': 'localtime', 'save': 'str(self.timezone)' }
-        attrs['qrexec_installed'] = { 'default': False, 'save': 'str(self.qrexec_installed)' }
-        attrs['guiagent_installed'] = { 'default' : False, 'save': 'str(self.guiagent_installed)' }
+        attrs['qrexec_installed'] = { 'default': False,
+            'attr': '_qrexec_installed',
+            'save': 'str(self._qrexec_installed)' }
+        attrs['guiagent_installed'] = { 'default' : False,
+            'attr': '_guiagent_installed',
+            'save': 'str(self._guiagent_installed)' }
         attrs['_start_guid_first']['eval'] = 'True'
         attrs['services']['default'] = "{'meminfo-writer': False}"
 
@@ -110,6 +114,28 @@ class QubesHVm(QubesVm):
         attrs += [ 'guiagent_installed' ]
         return attrs
 
+    @property
+    def qrexec_installed(self):
+        return self._qrexec_installed or \
+            bool(self.template and self.template.qrexec_installed)
+
+    @qrexec_installed.setter
+    def qrexec_installed(self, value):
+        if self.template and self.template.qrexec_installed and not value:
+            print >>sys.stderr, "WARNING: When qrexec_installed set in template, it will be propagated to the VM"
+        self._qrexec_installed = value
+
+    @property
+    def guiagent_installed(self):
+        return self._guiagent_installed or \
+            bool(self.template and self.template.guiagent_installed)
+
+    @guiagent_installed.setter
+    def guiagent_installed(self, value):
+        if self.template and self.template.guiagent_installed and not value:
+            print >>sys.stderr, "WARNING: When guiagent_installed set in template, it will be propagated to the VM"
+        self._guiagent_installed = value
+
     def create_on_disk(self, verbose, source_template = None):
         if dry_run:
             return
@@ -133,13 +159,26 @@ class QubesHVm(QubesVm):
             f_root.truncate(defaults["hvm_disk_size"])
             f_root.close()
 
-        # create empty private.img
-        if verbose:
-            print >> sys.stderr, "--> Creating private image: {0}".\
-                format(self.private_img)
-        f_private = open(self.private_img, "w")
-        f_private.truncate(defaults["hvm_private_img_size"])
-        f_private.close()
+        if self.template is None:
+            # create empty private.img
+            if verbose:
+                print >> sys.stderr, "--> Creating private image: {0}".\
+                    format(self.private_img)
+            f_private = open(self.private_img, "w")
+            f_private.truncate(defaults["hvm_private_img_size"])
+            f_private.close()
+        else:
+            # copy template private.img
+            template_priv = self.template.private_img
+            if verbose:
+                print >> sys.stderr, "--> Copying the template's private image: {0}".\
+                    format(template_priv)
+
+            # We prefer to use Linux's cp, because it nicely handles sparse files
+            retcode = subprocess.call (["cp", template_priv, self.private_img])
+            if retcode != 0:
+                raise IOError ("Error while copying {0} to {1}".\
+                           format(template_priv, self.private_img))
 
         # fire hooks
         for hook in self.hooks_create_on_disk:

+ 2 - 3
qvm-tools/qvm-check

@@ -21,8 +21,7 @@
 #
 
 from qubes.qubes import QubesVmCollection,QubesException
-from qubes.qubes import shutdown_counter_max
-from optparse import OptionParser;
+from optparse import OptionParser
 import sys
 import time
 
@@ -50,7 +49,7 @@ def main():
 
     else:
         if options.verbose: 
-            print >> sys.stdout, "A VM with the name '{0}' is exist.".format(vmname)
+            print >> sys.stdout, "A VM with the name '{0}' does exist.".format(vmname)
         exit(0)
 
 main()

+ 8 - 3
qvm-tools/qvm-run

@@ -41,10 +41,12 @@ notify_object = None
 from qubes.qubes import defaults
 
 def tray_notify(str, label, timeout = 3000):
-    notify_object.Notify("Qubes", 0, label.icon, "Qubes", str, [], [], timeout, dbus_interface="org.freedesktop.Notifications")
+    if notify_object:
+        notify_object.Notify("Qubes", 0, label.icon, "Qubes", str, [], [], timeout, dbus_interface="org.freedesktop.Notifications")
 
 def tray_notify_error(str, timeout = 3000):
-    notify_object.Notify("Qubes", 0, "dialog-error", "Qubes", str, [], [], timeout, dbus_interface="org.freedesktop.Notifications")
+    if notify_object:
+        notify_object.Notify("Qubes", 0, "dialog-error", "Qubes", str, [], [], timeout, dbus_interface="org.freedesktop.Notifications")
 
 def vm_run_cmd(vm, cmd, options):
     if options.shutdown:
@@ -169,7 +171,10 @@ def main():
 
     if options.tray:
         global notify_object
-        notify_object = dbus.SessionBus().get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications")
+        try:
+            notify_object = dbus.SessionBus().get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications")
+        except dbus.DBusException as ex:
+            print >>sys.stderr, "WARNING: failed connect to tray notification service: %s" % str(ex)
 
     qvm_collection = QubesVmCollection()
     qvm_collection.lock_db_for_reading()

+ 8 - 3
qvm-tools/qvm-start

@@ -31,10 +31,12 @@ import dbus
 notify_object = None
 
 def tray_notify(str, label, timeout = 3000):
-    notify_object.Notify("Qubes", 0, label.icon, "Qubes", str, [], [], timeout, dbus_interface="org.freedesktop.Notifications")
+    if notify_object:
+        notify_object.Notify("Qubes", 0, label.icon, "Qubes", str, [], [], timeout, dbus_interface="org.freedesktop.Notifications")
 
 def tray_notify_error(str, timeout = 3000):
-    notify_object.Notify("Qubes", 0, "dialog-error", "Qubes", str, [], [], timeout, dbus_interface="org.freedesktop.Notifications")
+    if notify_object:
+        notify_object.Notify("Qubes", 0, "dialog-error", "Qubes", str, [], [], timeout, dbus_interface="org.freedesktop.Notifications")
 
 def tray_notify_generic(level, str):
     if level == "info":
@@ -72,7 +74,10 @@ def main():
 
     if options.tray:
         global notify_object
-        notify_object = dbus.SessionBus().get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications")
+        try:
+            notify_object = dbus.SessionBus().get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications")
+        except dbus.DBusException as ex:
+            print >>sys.stderr, "WARNING: failed connect to tray notification service: %s" % str(ex)
 
     qvm_collection = QubesVmCollection()
     qvm_collection.lock_db_for_reading()