Exemple #1
0
 def PropertiesChanged(self, interface_name, changed_properties,
                       invalidated_properties):
     interface_name = dbus_to_python(interface_name)
     changed_properties = dbus_to_python(changed_properties)
     invalidated_properties = dbus_to_python(invalidated_properties)
     log.debug1("PropertiesChanged('%s', '%s', '%s')",
                interface_name, changed_properties, invalidated_properties)
Exemple #2
0
    def Set(self, interface_name, property_name, new_value, sender=None):
        interface_name = dbus_to_python(interface_name)
        property_name = dbus_to_python(property_name)
        new_value = dbus_to_python(new_value)
        log.debug1("%s.Set('%s', '%s', '%s')", self._log_prefix,
                   interface_name, property_name, new_value)

        if interface_name != DBUS_INTERFACE_ROLE:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.UnknownInterface: "
                "RolekitD does not implement %s" % interface_name)

        if property_name in self._exported_rw_properties:
            if not hasattr(self, "__check_%s", property_name):
                raise RolekitError(MISSING_CHECK, property_name)
            x = getattr(self, "__check_%s", property_name)
            x(new_value)
            self._settings.set(property_name, new_value)
            self._settings.write()
            self.PropertiesChanged(interface_name, {property_name: new_value},
                                   [])
        elif property_name in self._exported_ro_properties:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.PropertyReadOnly: "
                "Property '%s' is read-only" % property_name)
        else:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.AccessDenied: "
                "Property '%s' does not exist" % property_name)
Exemple #3
0
    def Set(self, interface_name, property_name, new_value, sender=None):
        interface_name = dbus_to_python(interface_name)
        property_name = dbus_to_python(property_name)
        new_value = dbus_to_python(new_value)
        log.debug1("%s.Set('%s', '%s', '%s')", self._log_prefix,
                   interface_name, property_name, new_value)

        if interface_name != DBUS_INTERFACE_ROLE:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.UnknownInterface: "
                "RolekitD does not implement %s" % interface_name)

        if property_name in self._exported_rw_properties:
            if not hasattr(self, "__check_%s", property_name):
                raise RolekitError(MISSING_CHECK, property_name)
            x = getattr(self, "__check_%s", property_name)
            x(new_value)
            self._settings.set(property_name, new_value)
            self._settings.write()
            self.PropertiesChanged(interface_name,
                                   { property_name: new_value }, [ ])
        elif property_name in self._exported_ro_properties:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.PropertyReadOnly: "
                "Property '%s' is read-only" % property_name)
        else:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.AccessDenied: "
                "Property '%s' does not exist" % property_name)
Exemple #4
0
 def PropertiesChanged(self, interface_name, changed_properties,
                       invalidated_properties):
     interface_name = dbus_to_python(interface_name)
     changed_properties = dbus_to_python(changed_properties)
     invalidated_properties = dbus_to_python(invalidated_properties)
     log.debug1("%s.PropertiesChanged('%s', '%s', '%s')", self._log_prefix,
                interface_name, changed_properties, invalidated_properties)
Exemple #5
0
        def Get(self, interface_name, property_name, sender=None):
            # get a property
            interface_name = dbus_to_python(interface_name)
            property_name = dbus_to_python(property_name)
            log.debug1("Get('%s', '%s')", interface_name, property_name)

            if interface_name != DBUS_INTERFACE:
                raise dbus.exceptions.DBusException(
                    "org.freedesktop.DBus.Error.UnknownInterface: "
                    "roled does not implement %s" % interface_name)

            return self._get_property(property_name)
Exemple #6
0
        def Get(self, interface_name, property_name, sender=None):
            # get a property
            interface_name = dbus_to_python(interface_name)
            property_name = dbus_to_python(property_name)
            log.debug1("Get('%s', '%s')", interface_name, property_name)

            if interface_name != DBUS_INTERFACE:
                raise dbus.exceptions.DBusException(
                    "org.freedesktop.DBus.Error.UnknownInterface: " "roled does not implement %s" % interface_name
                )

            return self._get_property(property_name)
Exemple #7
0
    def Get(self, interface_name, property_name, sender=None):
        # get a property
        interface_name = dbus_to_python(interface_name)
        property_name = dbus_to_python(property_name)
        log.debug1("%s.Get('%s', '%s')", self._log_prefix, interface_name,
                   property_name)

        if interface_name != DBUS_INTERFACE_ROLE_INSTANCE:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.UnknownInterface: "
                "RolekitD does not implement %s" % interface_name)

        return self.get_dbus_property(self, property_name)
Exemple #8
0
    def Get(self, interface_name, property_name, sender=None):
        # get a property
        interface_name = dbus_to_python(interface_name)
        property_name = dbus_to_python(property_name)
        log.debug1("%s.Get('%s', '%s')", self._log_prefix, interface_name,
                   property_name)

        if interface_name != DBUS_INTERFACE_ROLE_INSTANCE:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.UnknownInterface: "
                "RolekitD does not implement %s" % interface_name)

        return self.get_dbus_property(self, property_name)
Exemple #9
0
    def __deploy_async(self, name, values):
        values = dbus_to_python(values)
        name = dbus_to_python(name)
        log.debug1("%s.deploy('%s', %s)", self._log_prefix, name, values)

        # limit role instances to max instances per role
        if len(self._instances) >= self._role._MAX_INSTANCES:
            raise RolekitError(TOO_MANY_INSTANCES, "> %d" % \
                               self._role._MAX_INSTANCES)

        # TODO: lock

        # Create the settings object. If no name has been passed in,
        # this function will create one from the next available value.
        # Note: this isn't protected by a lock, so name-generation
        # might be racy.
        settings = RoleSettings(self.get_name(), name)

        # create escaped name and check if it is already in use
        instance_escaped_name = dbus_label_escape(settings.get_name())
        if instance_escaped_name in self._instances:
            raise RolekitError(NAME_CONFLICT, instance_escaped_name)

        try:
            settings.read()
        except ValueError:
            raise RolekitError(NAME_CONFLICT, settings.filename)
        except IOError:
            pass
        else:
            raise RolekitError(NAME_CONFLICT, settings.filename)

        # create role
        role = self._role(
            self,
            settings.get_name(),
            self.get_name(),
            self._directory,
            settings,
            self.busname,
            "%s/%s/%s" %
            (DBUS_PATH_ROLES, self._escaped_name, instance_escaped_name),
            persistent=self.persistent)
        self._instances[instance_escaped_name] = role
        self.InstanceAdded(instance_escaped_name)

        # TODO: unlock

        # deploy role, lock in role now
        result = yield async .call_future(role.deploy_async(values))
        yield result
Exemple #10
0
        def Set(self, interface_name, property_name, new_value, sender=None):
            interface_name = dbus_to_python(interface_name)
            property_name = dbus_to_python(property_name)
            new_value = dbus_to_python(new_value)
            log.debug1("Set('%s', '%s', '%s')", interface_name, property_name, new_value)
            self.accessCheck(sender)

            if interface_name != DBUS_INTERFACE:
                raise dbus.exceptions.DBusException(
                    "org.freedesktop.DBus.Error.UnknownInterface: " "roled does not implement %s" % interface_name
                )

            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.AccessDenied: " "Property '%s' is not settable" % property_name
            )
Exemple #11
0
    def apply_values(self, values):
        # Copy key value pairs for the properties that are read-write to
        # self._settings and write the settings out.
        values = dbus_to_python(values)

        changed = []
        for x in values:
            if x in self._DEFAULTS:
                if x in self._READONLY_SETTINGS:
                    raise RolekitError(READONLY_SETTING, x)
                # use _check_property method from derived or parent class
                self._check_property(x, values[x])
                # set validated setting
                self._settings[x] = values[x]
                changed.append(x)
            else:
                raise RolekitError(UNKNOWN_SETTING, x)

        if len(changed) > 0:
            dbus_changed = dbus.Dictionary(signature="sv")
            for x in changed:
                dbus_changed[x] = self.get_dbus_property(self, x)
            self.PropertiesChanged(DBUS_INTERFACE_ROLE_INSTANCE, dbus_changed,
                                   [])

            # write validated setting
            self._settings.write()
Exemple #12
0
    def _signal_receiver(self, *args, **kwargs):
        _args = []
        for arg in args:
            _args.append(dbus_to_python(arg))
        args = _args
        if not "member" in kwargs:
            return
        signal = kwargs["member"]
        interface = kwargs["interface"]

        if interface != DBUS_INTERFACE or signal != "NotifyUnitFailed" or len(args) != 2:
            return

        log.debug1("NotifyUnitFailed('%s', '%s')", args[0], args[1])

        for obj in self._roles:
            if obj.get_name() != args[0]:
                continue
            instances = obj.get_instances()
            for instance_name in instances:
                if instance_name != args[1]:
                    continue
                instance = instances[instance_name]
                if instance._settings["state"] == RUNNING:
                    state = target_unit_state(instance.target_unit)
                    if state != "active":
                        instance.change_state(ERROR, write=True)
Exemple #13
0
    def apply_values(self, values):
        # Copy key value pairs for the properties that are read-write to
        # self._settings and write the settings out.
        values = dbus_to_python(values)

        changed = [ ]
        for x in values:
            if x in self._DEFAULTS:
                if x in self._READONLY_SETTINGS:
                    raise RolekitError(READONLY_SETTING, x)
                # use _check_property method from derived or parent class
                self._check_property(x, values[x])
                # set validated setting
                self._settings[x] = values[x]
                changed.append(x)
            else:
                raise RolekitError(UNKNOWN_SETTING, x)

        if len(changed) > 0:
            dbus_changed = dbus.Dictionary(signature="sv")
            for x in changed:
                dbus_changed[x] = self.get_dbus_property(self, x)
            self.PropertiesChanged(DBUS_INTERFACE_ROLE_INSTANCE,
                                   dbus_changed, [ ])

            # write validated setting
            self._settings.write()
Exemple #14
0
    def _signal_receiver(self, *args, **kwargs):
        _args = []
        for arg in args:
            _args.append(dbus_to_python(arg))
        args = _args
        if not "member" in kwargs:
            return
        signal = kwargs["member"]
        interface = kwargs["interface"]

        cb = None
        cb_args = []

        # config signals need special treatment
        # pimp signal name
        if interface.startswith(DBUS_INTERFACE_ROLE):
            signal = "config:Role" + signal

        for callback in self._callbacks:
            if self._callbacks[callback] == signal and self._callbacks[callback] in self._callback:
                cb = self._callback[self._callbacks[callback]]
        if not cb:
            return

        cb_args.extend(args)

        # call back ...
        try:
            if cb[1]:
                # add call data
                cb_args.extend(cb[1])
            # call back
            cb[0](*cb_args)
        except Exception as msg:
            print(msg)
Exemple #15
0
    def _signal_receiver(self, *args, **kwargs):
        _args = []
        for arg in args:
            _args.append(dbus_to_python(arg))
        args = _args
        if not "member" in kwargs:
            return
        signal = kwargs["member"]
        interface = kwargs["interface"]

        if interface != DBUS_INTERFACE or signal != "NotifyUnitFailed" or \
           len(args) != 2:
            return

        log.debug1("NotifyUnitFailed('%s', '%s')", args[0], args[1])

        for obj in self._roles:
            if obj.get_name() != args[0]:
                continue
            instances = obj.get_instances()
            for instance_name in instances:
                if instance_name != args[1]:
                    continue
                instance = instances[instance_name]
                if instance._settings["state"] == RUNNING:
                    state = target_unit_state(instance.target_unit)
                    if state != "active":
                        instance.change_state(ERROR, write=True)
Exemple #16
0
        def Set(self, interface_name, property_name, new_value, sender=None):
            interface_name = dbus_to_python(interface_name)
            property_name = dbus_to_python(property_name)
            new_value = dbus_to_python(new_value)
            log.debug1("Set('%s', '%s', '%s')", interface_name, property_name,
                       new_value)
            self.accessCheck(sender)

            if interface_name != DBUS_INTERFACE:
                raise dbus.exceptions.DBusException(
                    "org.freedesktop.DBus.Error.UnknownInterface: "
                    "roled does not implement %s" % interface_name)

            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.AccessDenied: "
                "Property '%s' is not settable" % property_name)
Exemple #17
0
 def getNamedInstance(self, name, sender=None):
     """ return the role with the name, otherwise raise error """
     name = dbus_to_python(name)
     log.debug1("%s.getNamedInstance('%s')", self._log_prefix, name)
     instance_escaped_name = dbus_label_escape(name)
     if instance_escaped_name in self._instances:
         return self._instances[instance_escaped_name]
     raise RolekitError(INVALID_INSTANCE, name)
Exemple #18
0
 def getNamedInstance(self, name, sender=None):
     """ return the role with the name, otherwise raise error """
     name = dbus_to_python(name)
     log.debug1("%s.getNamedInstance('%s')", self._log_prefix, name)
     instance_escaped_name = dbus_label_escape(name)
     if instance_escaped_name in self._instances:
         return self._instances[instance_escaped_name]
     raise RolekitError(INVALID_INSTANCE, name)
Exemple #19
0
    def __deploy_async(self, name, values):
        values = dbus_to_python(values)
        name = dbus_to_python(name)
        log.debug1("%s.deploy('%s', %s)", self._log_prefix, name, values)

        # limit role instances to max instances per role
        if len(self._instances) >= self._role._MAX_INSTANCES:
            raise RolekitError(TOO_MANY_INSTANCES, "> %d" % \
                               self._role._MAX_INSTANCES)

        # TODO: lock

        # Create the settings object. If no name has been passed in,
        # this function will create one from the next available value.
        # Note: this isn't protected by a lock, so name-generation
        # might be racy.
        settings = RoleSettings(self.get_name(), name)

        # create escaped name and check if it is already in use
        instance_escaped_name = dbus_label_escape(settings.get_name())
        if instance_escaped_name in self._instances:
            raise RolekitError(NAME_CONFLICT, instance_escaped_name)

        try:
            settings.read()
        except ValueError:
            raise RolekitError(NAME_CONFLICT, settings.filename)
        except IOError:
            pass
        else:
            raise RolekitError(NAME_CONFLICT, settings.filename)

        # create role
        role = self._role(self, settings.get_name(), self.get_name(),
                          self._directory, settings, self.busname,
                          "%s/%s/%s" % (DBUS_PATH_ROLES, self._escaped_name,
                                        instance_escaped_name),
                          persistent=self.persistent)
        self._instances[instance_escaped_name] = role
        self.InstanceAdded(instance_escaped_name)

        # TODO: unlock

        # deploy role, lock in role now
        result = yield async.call_future(role.deploy_async(values))
        yield result
Exemple #20
0
 def getNamedRole(self, name, sender=None):
     """ return the role with the name, otherwise raise error """
     name = dbus_to_python(name)
     log.debug1("getNamedRole('%s')", name)
     for obj in self._roles:
         if obj.get_name() == name:
             return obj
     raise RolekitError(INVALID_ROLE, name)
Exemple #21
0
 def getNamedRole(self, name, sender=None):
     """ return the role with the name, otherwise raise error """
     name = dbus_to_python(name)
     log.debug1("getNamedRole('%s')", name)
     for obj in self._roles:
         if obj.get_name() == name:
             return obj
     raise RolekitError(INVALID_ROLE, name)
Exemple #22
0
    def __redeploy_async(self, values, sender):
        values = dbus_to_python(values)

        # Make sure we are in the proper state
        self.assert_state(READY_TO_START, ERROR)

        # Log
        log.debug1("%s.redeploy(%s)", self._log_prefix, values)

        # Check values
        try:
            self.check_values(values)
        except Exception as e:
            # checking of values failed, set state to error
            self.change_state(ERROR, error=str(e), write=True)
            raise

        try:
            # Change to redeploying state
            self.change_state(REDEPLOYING)

            # Uninstall firewall
            self.uninstallFirewall()

            # Copy _DEFAULTS to self._settings
            self.copy_defaults()

            # Install package groups and packages
            log.debug9("TRACE: Installing packages")
            yield async .call_future(self.installPackages())

            # Install firewall
            self.installFirewall()

            # Call do_redeploy_async
            log.debug9("TRACE: Performing role-specific redeployment")
            yield async .call_future(self.do_redeploy_async(values, sender))

            # Continue only after successful deployment:
            # Apply values to self._settings
            log.debug9(
                "TRACE: role-specific redeployment complete, applying values")
            self.apply_values(values)

            # Change to ready to start state
            self.change_state(READY_TO_START, write=True)

            # Attempt to start the newly-deployed role
            # We do this because many role-installers will conclude by
            # starting anyway and we want to ensure that our role mechanism
            # is in sync with them.
            log.debug9("TRACE: Starting %s" % self.get_name())
            yield async .call_future(self.__start_async(sender))

        except Exception as e:
            # Something failed, set state to error
            self.change_state(ERROR, error=str(e), write=True)
            raise
Exemple #23
0
    def __redeploy_async(self, values, sender):
        values = dbus_to_python(values)

        # Make sure we are in the proper state
        self.assert_state(READY_TO_START, ERROR)

        # Log
        log.debug1("%s.redeploy(%s)", self._log_prefix, values)

        # Check values
        try:
            self.check_values(values)
        except Exception as e:
            # checking of values failed, set state to error
            self.change_state(ERROR, error=str(e), write=True)
            raise

        try:
            # Change to redeploying state
            self.change_state(REDEPLOYING)

            # Uninstall firewall
            self.uninstallFirewall()

            # Copy _DEFAULTS to self._settings
            self.copy_defaults()

            # Install package groups and packages
            log.debug9("TRACE: Installing packages")
            yield async.call_future(self.installPackages())

            # Install firewall
            self.installFirewall()

            # Call do_redeploy_async
            log.debug9("TRACE: Performing role-specific redeployment")
            yield async.call_future(self.do_redeploy_async(values, sender))

            # Continue only after successful deployment:
            # Apply values to self._settings
            log.debug9("TRACE: role-specific redeployment complete, applying values")
            self.apply_values(values)

            # Change to ready to start state
            self.change_state(READY_TO_START, write=True)

            # Attempt to start the newly-deployed role
            # We do this because many role-installers will conclude by
            # starting anyway and we want to ensure that our role mechanism
            # is in sync with them.
            log.debug9("TRACE: Starting %s" % self.get_name())
            yield async.call_future(self.__start_async(sender))

        except Exception as e:
            # Something failed, set state to error
            self.change_state(ERROR, error=str(e), write=True)
            raise
Exemple #24
0
        def GetAll(self, interface_name, sender=None):
            interface_name = dbus_to_python(interface_name)
            log.debug1("GetAll('%s')", interface_name)

            if interface_name != DBUS_INTERFACE:
                raise dbus.exceptions.DBusException(
                    "org.freedesktop.DBus.Error.UnknownInterface: " "roled does not implement %s" % interface_name
                )

            return {"version": self._get_property("version"), "roles": self._get_property("roles")}
Exemple #25
0
 def getAllRoleInstancesByState(self, state, sender=None):
     """ return the list of all roles instances that are in a particular state """
     state = dbus_to_python(state)
     log.debug1("getAllRoleInstancesByState('%s')", state)
     ret_list = []
     for obj in self._roles:
         for instance in obj.get_instances().values():
             if instance.get_state() == state:
                 ret_list.append(instance)
     return ret_list
Exemple #26
0
 def getAllRoleInstancesByState(self, state, sender=None):
     """ return the list of all roles instances that are in a particular state """
     state = dbus_to_python(state)
     log.debug1("getAllRoleInstancesByState('%s')", state)
     ret_list = []
     for obj in self._roles:
         for instance in obj.get_instances().values():
             if instance.get_state() == state:
                 ret_list.append(instance)
     return ret_list
Exemple #27
0
    def Set(self, interface_name, property_name, new_value, sender=None):
        interface_name = dbus_to_python(interface_name)
        property_name = dbus_to_python(property_name)
        new_value = dbus_to_python(new_value)
        log.debug1("%s.Set('%s', '%s', '%s')", self._log_prefix,
                   interface_name, property_name, new_value)

        if interface_name != DBUS_INTERFACE_ROLE_INSTANCE:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.UnknownInterface: "
                "RolekitD does not implement %s" % interface_name)

        if property_name in self._DEFAULTS or \
           property_name in self._READONLY_SETTINGS:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.PropertyReadOnly: "
                "Property '%s' is read-only" % property_name)
        else:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.AccessDenied: "
                "Property '%s' does not exist" % property_name)
Exemple #28
0
    def Set(self, interface_name, property_name, new_value, sender=None):
        interface_name = dbus_to_python(interface_name)
        property_name = dbus_to_python(property_name)
        new_value = dbus_to_python(new_value)
        log.debug1("%s.Set('%s', '%s', '%s')", self._log_prefix,
                   interface_name, property_name, new_value)

        if interface_name != DBUS_INTERFACE_ROLE_INSTANCE:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.UnknownInterface: "
                "RolekitD does not implement %s" % interface_name)

        if property_name in self._DEFAULTS or \
           property_name in self._READONLY_SETTINGS:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.PropertyReadOnly: "
                "Property '%s' is read-only" % property_name)
        else:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.AccessDenied: "
                "Property '%s' does not exist" % property_name)
Exemple #29
0
        def GetAll(self, interface_name, sender=None):
            interface_name = dbus_to_python(interface_name)
            log.debug1("GetAll('%s')", interface_name)

            if interface_name != DBUS_INTERFACE:
                raise dbus.exceptions.DBusException(
                    "org.freedesktop.DBus.Error.UnknownInterface: "
                    "roled does not implement %s" % interface_name)

            return {
                'version': self._get_property("version"),
                'roles': self._get_property("roles"),
            }
Exemple #30
0
    def check_values(self, values):
        # Check key value pairs for the properties
        values = dbus_to_python(values)

        for x in values:
            if x in self._DEFAULTS:
                if x in self._READONLY_SETTINGS:
                    raise RolekitError(READONLY_SETTING, x)
                # use _check_property method from derived or parent class
                self._check_property(x, values[x])
            else:
                log.error("Unknown property: %s" % x)
                raise RolekitError(UNKNOWN_SETTING, x)
Exemple #31
0
    def GetAll(self, interface_name, sender=None):
        interface_name = dbus_to_python(interface_name)
        log.debug1("%s.GetAll('%s')", self._log_prefix, interface_name)

        if interface_name != DBUS_INTERFACE_ROLE:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.UnknownInterface: "
                "RolekitD does not implement %s" % interface_name)

        ret = dbus.Dictionary(signature="sv")
        for x in ["name", "DEFAULTS"]:
            ret[x] = self.get_dbus_property(x)
        return ret
Exemple #32
0
    def check_values(self, values):
        # Check key value pairs for the properties
        values = dbus_to_python(values)

        for x in values:
            if x in self._DEFAULTS:
                if x in self._READONLY_SETTINGS:
                    raise RolekitError(READONLY_SETTING, x)
                # use _check_property method from derived or parent class
                self._check_property(x, values[x])
            else:
                log.error("Unknown property: %s" % x)
                raise RolekitError(UNKNOWN_SETTING, x)
Exemple #33
0
    def GetAll(self, interface_name, sender=None):
        interface_name = dbus_to_python(interface_name)
        log.debug1("%s.GetAll('%s')", self._log_prefix, interface_name)

        if interface_name != DBUS_INTERFACE_ROLE:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.UnknownInterface: "
                "RolekitD does not implement %s" % interface_name)

        ret = dbus.Dictionary(signature = "sv")
        for x in [ "name", "DEFAULTS" ]:
            ret[x] = self.get_dbus_property(x)
        return ret
Exemple #34
0
    def GetAll(self, interface_name, sender=None):
        interface_name = dbus_to_python(interface_name)
        log.debug1("%s.GetAll('%s')", self._log_prefix, interface_name)

        if interface_name != DBUS_INTERFACE_ROLE_INSTANCE:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.UnknownInterface: "
                "RolekitD does not implement %s" % interface_name)

        ret = {}
        for name in self._DEFAULTS:
            ret[name] = self.get_dbus_property(self, name)
        # add settings that are not in _DEFAULTS
        for name in self._ADDITIONAL_PROPERTIES:
            ret[name] = self.get_dbus_property(self, name)
        return ret
Exemple #35
0
    def GetAll(self, interface_name, sender=None):
        interface_name = dbus_to_python(interface_name)
        log.debug1("%s.GetAll('%s')", self._log_prefix, interface_name)

        if interface_name != DBUS_INTERFACE_ROLE_INSTANCE:
            raise dbus.exceptions.DBusException(
                "org.freedesktop.DBus.Error.UnknownInterface: "
                "RolekitD does not implement %s" % interface_name)

        ret = { }
        for name in self._DEFAULTS:
            ret[name] = self.get_dbus_property(self, name)
        # add settings that are not in _DEFAULTS
        for name in  self._ADDITIONAL_PROPERTIES:
            ret[name] = self.get_dbus_property(self, name)
        return ret
Exemple #36
0
    def _signal_receiver(self, *args, **kwargs):
        _args = []
        for arg in args:
            _args.append(dbus_to_python(arg))
        args = _args
        if not "member" in kwargs:
            return
        signal = kwargs["member"]
        interface = kwargs["interface"]

        cb = None
        cb_args = []

        # config signals need special treatment
        # pimp signal name
        if interface.startswith(DBUS_INTERFACE_ROLE):
            signal = "config:Role" + signal

        for callback in self._callbacks:
            if self._callbacks[callback] == signal and \
                    self._callbacks[callback] in self._callback:
                cb = self._callback[self._callbacks[callback]]
        if not cb:
            return

        cb_args.extend(args)

        # call back ...
        try:
            if cb[1]:
                # add call data
                cb_args.extend(cb[1])
            # call back
            cb[0](*cb_args)
        except Exception as msg:
            print(msg)
Exemple #37
0
    def deploy_async(self, values, sender=None):
        """deploy role"""
        remove_instance = False

        values = dbus_to_python(values)

        # Make sure we are in the proper state
        self.assert_state(NASCENT)

        # Log
        log.debug1("%s.deploy(%s)", self._log_prefix, values)

        # Check values
        try:
            self.check_values(values)
        except Exception as e:
            # Check values failed, remove the instance again if verification
            # failed, set state to error, save it (will be visible in the
            # .old backup file).
            self.change_state(ERROR, error=str(e), write=True)

            # cleanup
            self.__remove_instance()
            raise

        try:
            # Change to deploying state
            self.change_state(DEPLOYING)

            # Copy _DEFAULTS to self._settings
            self.copy_defaults()

            # Install package groups and packages
            log.debug9("TRACE: Installing packages")
            yield async.call_future(self.installPackages())

            # Install firewall
            self.installFirewall()

            # Call do_deploy
            log.debug9("TRACE: Performing role-specific deployment")
            try:
                target = yield async.call_future(self.do_deploy_async(values, sender))
            except RolekitError as e:
                if e.code == INVALID_VALUE:
                    # If we failed because the input values were incorrect,
                    # also remove the instance.
                    remove_instance = True
                raise

            # Continue only after successful deployment:
            # Apply values to self._settings
            log.debug9("TRACE: role-specific deployment complete, applying values")
            self.apply_values(values)

            # Set up systemd target files
            log.debug9("TRACE: Creating systemd target files")
            self.create_target(target)

            # Change to ready to start state
            self.change_state(READY_TO_START, write=True)

            # In case this was a nextboot deployment, make sure to remove
            # the deferred role settings and systemd unit
            try:
                # Remove settings
                deferredsettings = "%s/%s/%s.json" % (ETC_ROLEKIT_DEFERREDROLES, self.get_type(), self.get_name())
                os.unlink(deferredsettings)

                # Remove systemd service unit
                deferredunit = "%s/deferred-role-deployment-%s-%s.service" % (
                    SYSTEMD_UNITS, self.get_type(), self.get_name())
                disable_units([deferredunit])
                os.unlink(deferredunit)
            except FileNotFoundError:
                # Files didn't exist; ignore that
                pass
            except PermissionError:
                # SELinux bug?
                log.fatal("ERROR: permission error attempting to delete %s or %s" % (
                    deferredsettings, deferredunit
                ))
                # We'll continue anyway, since the service should be runnable at this point
                # The ConditionPathExists will prevent the service from trying to deploy
                # again

            # Tell systemd to reload the daemon configuration
            log.debug9("Reloading systemd units\n")
            with SystemdJobHandler() as job_handler:
                job_handler.manager.Reload()


            # Start monitoring the role
            self.monitor_unit()

            # Attempt to start the newly-deployed role
            # We do this because many role-installers will conclude by
            # starting anyway and we want to ensure that our role mechanism
            # is in sync with them.
            log.debug9("TRACE: Starting %s" % self.get_name())
            yield async.call_future(self.__start_async(sender))

        except Exception as e:
            # Something failed, set state to error
            self.change_state(ERROR, error=str(e), write=True)
            if remove_instance:
                self.__remove_instance()
            raise
Exemple #38
0
    def deploy_async(self, values, sender=None):
        """deploy role"""
        remove_instance = False

        values = dbus_to_python(values)

        # Make sure we are in the proper state
        self.assert_state(NASCENT)

        # Log
        log.debug1("%s.deploy(%s)", self._log_prefix, values)

        # Check values
        try:
            self.check_values(values)
        except Exception as e:
            # Check values failed, remove the instance again if verification
            # failed, set state to error, save it (will be visible in the
            # .old backup file).
            self.change_state(ERROR, error=str(e), write=True)

            # cleanup
            self.__remove_instance()
            raise

        try:
            # Change to deploying state
            self.change_state(DEPLOYING)

            # Copy _DEFAULTS to self._settings
            self.copy_defaults()

            # Install package groups and packages
            log.debug9("TRACE: Installing packages")
            yield async .call_future(self.installPackages())

            # Install firewall
            self.installFirewall()

            # Call do_deploy
            log.debug9("TRACE: Performing role-specific deployment")
            try:
                target = yield async .call_future(
                    self.do_deploy_async(values, sender))
            except RolekitError as e:
                if e.code == INVALID_VALUE:
                    # If we failed because the input values were incorrect,
                    # also remove the instance.
                    remove_instance = True
                raise

            # Continue only after successful deployment:
            # Apply values to self._settings
            log.debug9(
                "TRACE: role-specific deployment complete, applying values")
            self.apply_values(values)

            # Set up systemd target files
            log.debug9("TRACE: Creating systemd target files")
            self.create_target(target)

            # Change to ready to start state
            self.change_state(READY_TO_START, write=True)

            # In case this was a nextboot deployment, make sure to remove
            # the deferred role settings and systemd unit
            try:
                # Remove settings
                deferredsettings = "%s/%s/%s.json" % (
                    ETC_ROLEKIT_DEFERREDROLES, self.get_type(),
                    self.get_name())
                os.unlink(deferredsettings)

                # Remove systemd service unit
                deferredunit = "%s/deferred-role-deployment-%s-%s.service" % (
                    SYSTEMD_UNITS, self.get_type(), self.get_name())
                disable_units([deferredunit])
                os.unlink(deferredunit)
            except FileNotFoundError:
                # Files didn't exist; ignore that
                pass
            except PermissionError:
                # SELinux bug?
                log.fatal(
                    "ERROR: permission error attempting to delete %s or %s" %
                    (deferredsettings, deferredunit))
                # We'll continue anyway, since the service should be runnable at this point
                # The ConditionPathExists will prevent the service from trying to deploy
                # again

            # Tell systemd to reload the daemon configuration
            log.debug9("Reloading systemd units\n")
            with SystemdJobHandler() as job_handler:
                job_handler.manager.Reload()

            # Start monitoring the role
            self.monitor_unit()

            # Attempt to start the newly-deployed role
            # We do this because many role-installers will conclude by
            # starting anyway and we want to ensure that our role mechanism
            # is in sync with them.
            log.debug9("TRACE: Starting %s" % self.get_name())
            yield async .call_future(self.__start_async(sender))

        except Exception as e:
            # Something failed, set state to error
            self.change_state(ERROR, error=str(e), write=True)
            if remove_instance:
                self.__remove_instance()
            raise
Exemple #39
0
 def getInstances(self):
     return dbus_to_python(self.role.getInstances())
Exemple #40
0
 def getNamedInstance(self, name):
     return dbus_to_python(self.role.getNamedInstance(name))
Exemple #41
0
 def getNamedInstanceObj(self, name):
     return RolekitClientRoleInstance(self.bus, dbus_to_python(self.role.getNamedInstance(name)))
Exemple #42
0
 def get_property(self, prop):
     return dbus_to_python(self.properties.Get(DBUS_INTERFACE_ROLE, prop))
Exemple #43
0
 def getInstances(self):
     return dbus_to_python(self.role.getInstances())
Exemple #44
0
 def get_property(self, prop):
     return dbus_to_python(self.properties.Get(DBUS_INTERFACE_ROLE, prop))
Exemple #45
0
 def decommission(self, force, reply_handler, error_handler, sender=None):
     """decommission role"""
     force = dbus_to_python(force)
     async .start_with_dbus_callbacks(
         self.__decommission_async(force, sender), reply_handler,
         error_handler)
Exemple #46
0
 def getNamedInstance(self, name):
     return dbus_to_python(self.role.getNamedInstance(name))
Exemple #47
0
 def decommission(self, force, reply_handler, error_handler, sender=None):
     """decommission role"""
     force = dbus_to_python(force)
     async.start_with_dbus_callbacks(self.__decommission_async(force,
                                                               sender),
                                     reply_handler, error_handler)
Exemple #48
0
 def getNamedInstanceObj(self, name):
     return RolekitClientRoleInstance(
         self.bus, dbus_to_python(self.role.getNamedInstance(name)))
Exemple #49
0
 def get_properties(self):
     return dbus_to_python(self.properties.GetAll(DBUS_INTERFACE_ROLE))
Exemple #50
0
 def get_properties(self):
     return dbus_to_python(self.properties.GetAll(DBUS_INTERFACE_ROLE))