Exemplo n.º 1
0
    def _domain_event_callback(self, _conn, domain, event, _detail, _opaque):
        '''Generic libvirt event handler (virConnectDomainEventCallback),
        translate libvirt event into qubes.events.
        '''
        if not self.events_enabled:
            return

        try:
            vm = self.domains[domain.name()]
        except KeyError:
            # ignore events for unknown domains
            return

        if event == libvirt.VIR_DOMAIN_EVENT_STOPPED:
            vm.on_libvirt_domain_stopped()
        elif event == libvirt.VIR_DOMAIN_EVENT_SUSPENDED:
            try:
                vm.fire_event('domain-paused')
            except Exception:  # pylint: disable=broad-except
                self.log.exception(
                    'Uncaught exception from domain-paused handler '
                    'for domain %s', vm.name)
        elif event == libvirt.VIR_DOMAIN_EVENT_RESUMED:
            try:
                vm.fire_event('domain-unpaused')
            except Exception:  # pylint: disable=broad-except
                self.log.exception(
                    'Uncaught exception from domain-unpaused handler '
                    'for domain %s', vm.name)
Exemplo n.º 2
0
 def on_property_set_default_netvm(self, event, name, newvalue,
         oldvalue=None):
     # pylint: disable=unused-argument
     for vm in self.domains:
         if hasattr(vm, 'provides_network') and not vm.provides_network and \
                 hasattr(vm, 'netvm') and vm.property_is_default('netvm'):
             # fire property-del:netvm as it is responsible for resetting
             # netvm to it's default value
             vm.fire_event('property-pre-del:netvm', pre_event=True,
                 name='netvm', oldvalue=oldvalue)
             vm.fire_event('property-del:netvm',
                 name='netvm', oldvalue=oldvalue)
Exemplo n.º 3
0
 def on_property_set_default_netvm(self, event, name, newvalue,
         oldvalue=None):
     # pylint: disable=unused-argument
     for vm in self.domains:
         if hasattr(vm, 'provides_network') and not vm.provides_network and \
                 hasattr(vm, 'netvm') and vm.property_is_default('netvm'):
             # fire property-del:netvm as it is responsible for resetting
             # netvm to it's default value
             vm.fire_event('property-pre-del:netvm', pre_event=True,
                 name='netvm', oldvalue=oldvalue)
             vm.fire_event('property-del:netvm',
                 name='netvm', oldvalue=oldvalue)
Exemplo n.º 4
0
    def _domain_event_callback(_conn, domain, event, _detail, opaque):
        '''Generic libvirt event handler (virConnectDomainEventCallback),
        translate libvirt event into qubes.events.
        '''
        app = opaque
        try:
            vm = app.domains[domain.name()]
        except KeyError:
            # ignore events for unknown domains
            return

        if event == libvirt.VIR_DOMAIN_EVENT_STOPPED:
            vm.fire_event('domain-shutdown')
Exemplo n.º 5
0
 def on_property_set_default_fw_netvm(self,
                                      event,
                                      name,
                                      newvalue,
                                      oldvalue=None):
     # pylint: disable=unused-argument,invalid-name
     for vm in self.domains:
         if not vm.provides_network and vm.property_is_default('netvm'):
             # fire property-del:netvm as it is responsible for resetting
             # netvm to it's default value
             vm.fire_event('property-del:netvm',
                           name='netvm',
                           newvalue=newvalue,
                           oldvalue=oldvalue)
Exemplo n.º 6
0
    def load(self, lock=False):
        '''Open qubes.xml

        :throws EnvironmentError: failure on parsing store
        :throws xml.parsers.expat.ExpatError: failure on parsing store
        :raises lxml.etree.XMLSyntaxError: on syntax error in qubes.xml
        '''

        fh = self._acquire_lock()
        self.xml = lxml.etree.parse(fh)

        # stage 1: load labels and pools
        for node in self.xml.xpath('./labels/label'):
            label = qubes.Label.fromxml(node)
            self.labels[label.index] = label

        for node in self.xml.xpath('./pools/pool'):
            name = node.get('name')
            assert name, "Pool name '%s' is invalid " % name
            try:
                self.pools[name] = self._get_pool(**node.attrib)
            except qubes.exc.QubesException as e:
                self.log.error(str(e))

        # stage 2: load VMs
        for node in self.xml.xpath('./domains/domain'):
            # pylint: disable=no-member
            cls = self.get_vm_class(node.get('class'))
            vm = cls(self, node)
            vm.load_properties(load_stage=2)
            vm.init_log()
            self.domains.add(vm, _enable_events=False)

        if 0 not in self.domains:
            self.domains.add(
                qubes.vm.adminvm.AdminVM(self, None),
                _enable_events=False)

        self._migrate_global_properties()

        # stage 3: load global properties
        self.load_properties(load_stage=3)

        # stage 4: fill all remaining VM properties
        for vm in self.domains:
            vm.load_properties(load_stage=4)
            vm.load_extras()

        # stage 5: misc fixups

        self.property_require('default_netvm', allow_none=True)
        self.property_require('default_template')
        self.property_require('clockvm', allow_none=True)
        self.property_require('updatevm', allow_none=True)

        for vm in self.domains:
            vm.events_enabled = True
            vm.fire_event('domain-load')

        # get a file timestamp (before closing it - still holding the lock!),
        #  to detect whether anyone else have modified it in the meantime
        self.__load_timestamp = os.path.getmtime(self._store)

        if not lock:
            self._release_lock()
Exemplo n.º 7
0
    def load(self, lock=False):
        '''Open qubes.xml

        :throws EnvironmentError: failure on parsing store
        :throws xml.parsers.expat.ExpatError: failure on parsing store
        :raises lxml.etree.XMLSyntaxError: on syntax error in qubes.xml
        '''

        fh = self._acquire_lock()
        self.xml = lxml.etree.parse(fh)

        # stage 1: load labels and pools
        for node in self.xml.xpath('./labels/label'):
            label = qubes.Label.fromxml(node)
            self.labels[label.index] = label

        for node in self.xml.xpath('./pools/pool'):
            name = node.get('name')
            assert name, "Pool name '%s' is invalid " % name
            try:
                self.pools[name] = self._get_pool(**node.attrib)
            except qubes.exc.QubesException as e:
                self.log.error(str(e))

        # stage 2: load VMs
        for node in self.xml.xpath('./domains/domain'):
            # pylint: disable=no-member
            cls = self.get_vm_class(node.get('class'))
            vm = cls(self, node)
            vm.load_properties(load_stage=2)
            vm.init_log()
            self.domains.add(vm, _enable_events=False)

        if 0 not in self.domains:
            self.domains.add(
                qubes.vm.adminvm.AdminVM(self, None),
                _enable_events=False)

        self._migrate_global_properties()

        # stage 3: load global properties
        self.load_properties(load_stage=3)

        # stage 4: fill all remaining VM properties
        for vm in self.domains:
            vm.load_properties(load_stage=4)
            vm.load_extras()

        # stage 5: misc fixups

        self.property_require('default_netvm', allow_none=True)
        self.property_require('default_template')
        self.property_require('clockvm', allow_none=True)
        self.property_require('updatevm', allow_none=True)

        for vm in self.domains:
            vm.events_enabled = True
            vm.fire_event('domain-load')

        # get a file timestamp (before closing it - still holding the lock!),
        #  to detect whether anyone else have modified it in the meantime
        self.__load_timestamp = os.path.getmtime(self._store)

        if not lock:
            self._release_lock()