Example #1
0
    def load_cds_id(_id, client_user_agent = None, cds = None, deleted = False):
        """
Load a UPnP resource by CDS ID.

:param _id: UPnP CDS ID
:param client_user_agent: Client user agent
:param cds: UPnP CDS
:param deleted: True to include deleted resources

:return: (object) Resource object; None on error
:since:  v0.2.00
        """

        _return = None

        if (_id == "0" and cds is not None):
            _return = NamedLoader.get_instance("dNG.data.upnp.resources.RootContainer")
            _return.init_cds_id(_id, client_user_agent, deleted)
        elif (_id is not None and "://" in _id):
            url_elements = urlsplit(_id)

            if (url_elements.scheme != ""):
                resource_class_name = "".join([ word.capitalize() for word in url_elements.scheme.split("-") ])
                resource = NamedLoader.get_instance("dNG.data.upnp.resources.{0}".format(resource_class_name), False)

                if (isinstance(resource, Resource) and resource.init_cds_id(_id, client_user_agent, deleted)): _return = resource
            #
        #

        return _return
Example #2
0
def after_apply_schema(params, last_return = None):
    """
Called for "dNG.pas.Database.applySchema.after"

:param params: Parameter specified
:param last_return: The return value from the last hook called.

:return: (mixed) Return value
:since:  v0.2.00
    """

    user_profile_class = NamedLoader.get_class("dNG.data.user.Profile")

    if (issubclass(user_profile_class, Profile)):
        db_user_profile_class = NamedLoader.get_class("dNG.database.instances.UserProfile")
        Schema.apply_version(db_user_profile_class)

        cli = InteractiveCli.get_instance()

        if (isinstance(cli, InteractiveCli)
            and hasattr(cli, "is_cli_setup")
            and cli.is_cli_setup()
           ): _ensure_administrative_user_account()
    #

    return last_return
Example #3
0
    def _on_run(self, args):
        """
Callback for execution.

:param args: Parsed command line arguments

:since: v0.2.00
        """

        # pylint: disable=attribute-defined-outside-init

        Settings.read_file("{0}/settings/pas_global.json".format(Settings.get("path_data")))
        Settings.read_file("{0}/settings/pas_core.json".format(Settings.get("path_data")), True)
        Settings.read_file("{0}/settings/pas_tasks_daemon.json".format(Settings.get("path_data")), True)
        if (args.additional_settings is not None): Settings.read_file(args.additional_settings, True)

        if (not Settings.is_defined("pas_tasks_daemon_listener_address")): raise IOException("No listener address defined for the TasksDaemon")

        if (args.reload_plugins):
            client = BusClient("pas_tasks_daemon")
            client.request("dNG.pas.Plugins.reload")
        elif (args.stop):
            client = BusClient("pas_tasks_daemon")

            pid = client.request("dNG.pas.Status.getOSPid")
            client.request("dNG.pas.Status.stop")

            self._wait_for_os_pid(pid)
        else:
            self.cache_instance = NamedLoader.get_singleton("dNG.data.cache.Content", False)
            if (self.cache_instance is not None): Settings.set_cache_instance(self.cache_instance)

            self.log_handler = NamedLoader.get_singleton("dNG.data.logging.LogHandler", False)

            if (self.log_handler is not None):
                Hook.set_log_handler(self.log_handler)
                NamedLoader.set_log_handler(self.log_handler)
            #

            Hook.load("tasks")
            Hook.register("dNG.pas.Status.getOSPid", self.get_os_pid)
            Hook.register("dNG.pas.Status.getTimeStarted", self.get_time_started)
            Hook.register("dNG.pas.Status.getUptime", self.get_uptime)
            Hook.register("dNG.pas.Status.stop", self.stop)

            self.server = BusServer("pas_tasks_daemon")
            self._set_time_started(time())

            if (self.log_handler is not None): self.log_handler.info("TasksDaemon starts listening", context = "pas_tasks")

            Hook.call("dNG.pas.Status.onStartup")
            Hook.call("dNG.pas.tasks.Daemon.onStartup")

            self.set_mainloop(self.server.run)
Example #4
0
    def _on_run(self, args):
        """
Callback for execution.

:param args: Parsed command line arguments

:since: v0.2.00
        """

        Settings.read_file("{0}/settings/pas_global.json".format(Settings.get("path_data")))
        Settings.read_file("{0}/settings/pas_core.json".format(Settings.get("path_data")), True)
        Settings.read_file("{0}/settings/pas_http.json".format(Settings.get("path_data")), True)
        if (args.additional_settings is not None): Settings.read_file(args.additional_settings, True)

        if (args.reload_plugins):
            client = BusClient("pas_http_bus")
            client.request("dNG.pas.Plugins.reload")
        elif (args.stop):
            client = BusClient("pas_http_bus")

            pid = client.request("dNG.pas.Status.getOSPid")
            client.request("dNG.pas.Status.stop")

            self._wait_for_os_pid(pid)
        else:
            self.log_handler = NamedLoader.get_singleton("dNG.data.logging.LogHandler", False)

            if (self.log_handler is not None):
                Hook.set_log_handler(self.log_handler)
                NamedLoader.set_log_handler(self.log_handler)
            #

            self.cache_instance = NamedLoader.get_singleton("dNG.data.cache.Content", False)
            if (self.cache_instance is not None): Settings.set_cache_instance(self.cache_instance)

            Hook.load("http")
            Hook.register("dNG.pas.Status.getOSPid", self.get_os_pid)
            Hook.register("dNG.pas.Status.getTimeStarted", self.get_time_started)
            Hook.register("dNG.pas.Status.getUptime", self.get_uptime)
            Hook.register("dNG.pas.Status.stop", self.stop)
            self._set_time_started(time())

            http_server = _HttpServer.get_instance()
            self.server = BusServer("pas_http_bus")

            if (http_server is not None):
                Hook.register("dNG.pas.Status.onStartup", http_server.start)
                Hook.register("dNG.pas.Status.onShutdown", http_server.stop)

                if (self.log_handler is not None): self.log_handler.info("pas.http starts listening", context = "pas_http_site")
                Hook.call("dNG.pas.Status.onStartup")

                self.set_mainloop(self.server.run)
def load_all(params, last_return = None):
    """
Load and register all SQLAlchemy objects to generate database tables.

:param params: Parameter specified
:param last_return: The return value from the last hook called.

:since: v0.1.00
    """

    NamedLoader.get_class("dNG.database.instances.FileCenterEntry")

    return last_return
Example #6
0
def load_all(params, last_return = None):
    """
Load and register all SQLAlchemy objects to generate database tables.

:param params: Parameter specified
:param last_return: The return value from the last hook called.

:return: (mixed) Return value
:since:  v0.2.00
    """

    user_profile_class = NamedLoader.get_class("dNG.data.user.Profile")
    if (issubclass(user_profile_class, Profile)): NamedLoader.get_class("dNG.database.instances.UserProfile")

    return last_return
Example #7
0
def load_all(params, last_return = None):
    """
Load and register all SQLAlchemy objects to generate database tables.

:param params: Parameter specified
:param last_return: The return value from the last hook called.

:return: (mixed) Return value
:since:  v0.2.00
    """

    NamedLoader.get_class("dNG.database.instances.DataLinker")
    NamedLoader.get_class("dNG.database.instances.DataLinkerMeta")

    return last_return
def delete(params, last_return=None):
    """
Called for "dNG.pas.user.Profile.delete"

:param params: Parameter specified
:param last_return: The return value from the last hook called.

:return: (mixed) Return value
:since:  v0.2.00
    """

    # pylint: disable=star-args

    if ("username" not in params):
        raise ValueException("Missing required argument")
    else:
        user_profile_class = NamedLoader.get_class("dNG.data.user.Profile")

        try:
            user_profile = user_profile_class.load_username(params['username'])

            Hook.call("dNG.pas.user.Profile.onDelete",
                      user_profile_id=user_profile.get_id())
            user_profile.delete()
        except NothingMatchedException:
            pass
    #

    return last_return
Example #9
0
    def get_rootdevice(self, identifier):
        """
Returns a UPnP rootdevice for the given identifier.

:param identifier: Parsed UPnP identifier

:return: (object) UPnP rootdevice; None if not found
:since:  v0.2.00
        """

        _return = None

        with self.lock:
            if (identifier['class'] == "device" and identifier['usn'] in self.usns):
                if (identifier['uuid'] in self.managed_devices):
                    if (self.log_handler is not None): self.log_handler.debug("{0!r} got request to return the hosted device '{1}'", self, identifier['usn'], context = "pas_upnp")
                    _return = self.managed_devices[identifier['uuid']]
                    _return.set_configid(self.configid)
                else:
                    if (self.log_handler is not None): self.log_handler.debug("{0!r} got request to create an object for device '{1}'", self, identifier['usn'], context = "pas_upnp")

                    _return = (NamedLoader.get_instance("dNG.data.upnp.devices.{0}".format(identifier['type']), False) if (identifier['class'] == "device") else None)
                    if (_return is None): _return = Device()
                    if (_return.init_xml_desc(self.usns[identifier['usn']], self.get_desc_xml(identifier)) == False): _return = None
                #
            #
        #

        return _return
Example #10
0
    def get_class(is_not_implemented_class_aware = False):
        """
Returns the persistent tasks implementation class based on the configuration
set.

:param is_not_implemented_class_aware: True to return
       "dNG.runtime.NotImplementedClass" instead of None

:return: (object) Tasks implementation class; None if not available
:since:  v0.2.00
        """

        _return = None

        persistent_tasks = Persistent.get_executing_instance()

        if (isinstance(persistent_tasks, AbstractPersistent) and persistent_tasks.is_executing_daemon()):
            _return = persistent_tasks
        else:
            persistent_tasks_proxy = NamedLoader.get_singleton("dNG.data.tasks.PersistentProxy")

            if (isinstance(persistent_tasks_proxy, AbstractPersistentProxy)
                and persistent_tasks_proxy.is_available()
               ): _return = persistent_tasks_proxy
        #

        if (_return is None and is_not_implemented_class_aware): _return = NotImplementedClass

        return _return
Example #11
0
    def __init__(self, timeout_retries = 5):
        """
Constructor __init__(Abstract)

:param timeout_retries: Retries before timing out

:since: v0.2.00
        """

        SupportsMixin.__init__(self)

        self.io_chunk_size = 65536
        """
IO chunk size
        """
        self._lock = ThreadLock()
        """
Thread safety lock
        """
        self.log_handler = NamedLoader.get_singleton("dNG.data.logging.LogHandler", False)
        """
Retries before timing out
        """
        self.stream_size = -1
        """
Requested stream size
        """
        self.timeout_retries = (5 if (timeout_retries is None) else timeout_retries)
        """
def delete(params, last_return = None):
    """
Called for "dNG.pas.user.Profile.delete"

:param params: Parameter specified
:param last_return: The return value from the last hook called.

:return: (mixed) Return value
:since:  v0.2.00
    """

    # pylint: disable=star-args

    if ("username" not in params): raise ValueException("Missing required argument")
    else:
        user_profile_class = NamedLoader.get_class("dNG.data.user.Profile")

        try:
            user_profile = user_profile_class.load_username(params['username'])

            Hook.call("dNG.pas.user.Profile.onDelete", user_profile_id = user_profile.get_id())
            user_profile.delete()
        except NothingMatchedException: pass
    #

    return last_return
Example #13
0
    def _init_host_protocol_info(self):
        """
Initializes the client settings UPnP host based protocol info dictionary if
the UPnP host has been previously defined.

:since: v0.2.00
        """

        if (self.host is not None and self.host_protocol_info_dict is None):
            with self._lock:
                # Thread safety
                if (self.host_protocol_info_dict is None):
                    self.host_protocol_info_dict = { }

                    control_point = NamedLoader.get_singleton("dNG.net.upnp.ControlPoint")

                    connection_manager = None
                    device = control_point.get_rootdevice_for_host(self.host, "MediaRenderer")

                    if (device is not None): connection_manager = device.get_service("ConnectionManager")

                    if (connection_manager is not None and connection_manager.is_action_supported("GetProtocolInfo")):
                        connection_manager_proxy = connection_manager.get_proxy()

                        protocol_info = connection_manager_proxy.GetProtocolInfo()

                        supported_list = protocol_info.get("Source", "").split(",")
                        self.host_protocol_info_dict['upnp_protocol_source_supported_list'] = supported_list

                        supported_list = protocol_info.get("Sink", "").split(",")
                        self.host_protocol_info_dict['upnp_protocol_sink_supported_list'] = supported_list
Example #14
0
    def init_device(self, control_point, udn = None, configid = None):
        """
Initialize a host device.

:return: (bool) Returns true if initialization was successful.
:since:  v0.2.00
        """

        AbstractDevice.init_device(self, control_point, udn, configid)

        self.device_model = "UPnP media server"
        self.device_model_desc = "Python based UPnP media server"
        self.device_model_url = "https://www.direct-netware.de/redirect?mp;core"
        self.device_model_version = "#echo(mpCoreVersion)#"
        self.manufacturer = "direct Netware Group"
        self.manufacturer_url = "http://www.direct-netware.de"

        #service = AvTransport()
        #if (service.init_host(self, configid = self.configid)): self.add_service(service)

        service = ConnectionManager()
        if (service.init_host(self, configid = self.configid)): self.add_service(service)

        service = ContentDirectory()
        if (service.init_host(self, configid = self.configid)): self.add_service(service)

        service = NamedLoader.get_instance("dNG.data.upnp.services.ScheduledRecording", False)
        if (service is not None and service.init_host(self, configid = self.configid)): self.add_service(service)

        service = XMSMediaReceiverRegistrar()
        if (service.init_host(self, configid = self.configid)): self.add_service(service)

        return True
    def _get_user_profile(self, user_id):
        """
Returns the user profile instance for the given user ID.

:param user_id: User ID

:return: (object) User profile instance; None if not found
:since:  v0.2.00
        """

        _return = None

        if (user_id is not None):
            _return = self.permission_user_profile_cache.get(user_id)

            if (_return is None):
                user_profile_class = NamedLoader.get_class("dNG.data.user.Profile")

                _return = (None if (user_profile_class is None) else user_profile_class.load_id(user_id))
                if (_return is not None): self.permission_user_profile_cache[user_id] = _return
            #

            if (_return is not None and (not _return.is_valid())): _return = None
        #

        return _return
def after_apply_schema(params, last_return = None):
    """
Called for "dNG.pas.Database.applySchema.after"

:param params: Parameter specified
:param last_return: The return value from the last hook called.

:return: (mixed) Return value
:since:  v0.2.00
    """

    acl_entry_class = NamedLoader.get_class("dNG.database.instances.AclEntry")
    Schema.apply_version(acl_entry_class)

    permission_class = NamedLoader.get_class("dNG.database.instances.Permission")
    Schema.apply_version(permission_class)

    return last_return
Example #17
0
def after_apply_schema(params, last_return = None):
    """
Called for "dNG.pas.Database.applySchema.after"

:param params: Parameter specified
:param last_return: The return value from the last hook called.

:return: (mixed) Return value
:since:  v0.2.00
    """

    category_class = NamedLoader.get_class("dNG.database.instances.ContentorCategory")
    Schema.apply_version(category_class)

    document_class = NamedLoader.get_class("dNG.database.instances.ContentorDocument")
    Schema.apply_version(document_class)

    return last_return
Example #18
0
def after_apply_schema(params, last_return = None):
    """
Called for "dNG.pas.Database.applySchema.after"

:param params: Parameter specified
:param last_return: The return value from the last hook called.

:return: (mixed) Return value
:since:  v0.2.00
    """

    datalinker_class = NamedLoader.get_class("dNG.database.instances.DataLinker")
    Schema.apply_version(datalinker_class)

    datalinker_meta_class = NamedLoader.get_class("dNG.database.instances.DataLinkerMeta")
    Schema.apply_version(datalinker_meta_class)

    return last_return
Example #19
0
    def load_plugin(plugin, prefix = None):
        """
Load and register all plugins for the given plugin name and prefix (defaults
to "dNG.plugins").

:param plugin: Plugin name
:param prefix: Plugin name prefix

:return: (bool) True on success
:since:  v0.2.00
        """

        # pylint: disable=no-member

        _return = False

        if (prefix is None): prefix = "dNG.plugins"
        package = "{0}.{1}".format(prefix, plugin)

        if (NamedLoader._load_package(package) is not None):
            package_path = path.join(Manager._get_loader().get_base_dir(), package.replace(".", path.sep))
            if (not os.access(package_path, os.R_OK)): package_path = None
        else: package_path = None

        if (package_path is not None and path.isdir(package_path)):
            for dir_entry in os.listdir(package_path):
                if (dir_entry.endswith(".py") and dir_entry != "__init__.py"):
                    module_name = "{0}.{1}".format(package, dir_entry[:-3])
                    module = NamedLoader._load_module(module_name)

                    if (module is not None and hasattr(module, "register_plugin")):
                        with ExceptionLogTrap("pas_plugins"):
                            if (package not in Manager._plugins): Manager._plugins[package] = [ ]
                            if (module_name not in Manager._plugins[package]): Manager._plugins[package].append(module_name)

                            module.register_plugin()
                            _return = True
                        #
                    #
                #
            #
        #

        return _return
Example #20
0
def before_apply_schema(params, last_return = None):
    """
Called for "dNG.pas.Database.applySchema.before"

:param params: Parameter specified
:param last_return: The return value from the last hook called.

:return: (mixed) Return value
:since:  v0.2.00
    """

    audio_class = NamedLoader.get_class("dNG.database.instances.MpUpnpAudioResource")
    if (audio_class is not None): audio_class.before_apply_schema()

    image_class = NamedLoader.get_class("dNG.database.instances.MpUpnpImageResource")
    if (image_class is not None): image_class.before_apply_schema()

    video_class = NamedLoader.get_class("dNG.database.instances.MpUpnpVideoResource")
    if (video_class is not None): video_class.before_apply_schema()

    return last_return
Example #21
0
    def __init__(self):
        """
Constructor __init__(Resources)

:since: v0.2.00
        """

        ClientSettingsMixin.__init__(self)
        SupportsMixin.__init__(self)

        self.criteria_definition = None
        """
UPnP search criteria definition instance
        """
        self.executed = False
        """
True if search has been executed and results are ready
        """
        self.limit = 50
        """
UPnP resource search results limit
        """
        self.limit_max = int(Settings.get("pas_upnp_resource_search_limit_max", 50))
        """
UPnP resource search results limit
        """
        self.log_handler = NamedLoader.get_singleton("dNG.data.logging.LogHandler", False)
        """
The LogHandler is called whenever debug messages should be logged or errors
happened.
        """
        self.offset = 0
        """
UPnP resource search results offset
        """
        self.resources = [ ]
        """
UPnP resources matching the criteria definition
        """
        self.total = 0
        """
UPnP resource search results count from all segments
        """
        self.root_resource = None
        """
UPnP root resource for searching matches
        """
        self.sort_tuples = [ ]
        """
Sort list to be applied
        """

        self.supported_features['sortable'] = self._supports_sortable
    def run(self):
        """
Task execution

:since: v0.2.00
        """

        if (self.__class__.EMAIL_RENDERER is None): raise ValueException("Defined e-mail renderer is invalid")

        user_profile_class = NamedLoader.get_class("dNG.data.user.Profile")
        user_profile = user_profile_class.load_username(self.username)

        user_profile_data = user_profile.get_data_attributes("name", "lang", "email")

        email = self.get_email_recipient()
        if (email is None): email = user_profile_data['email']

        L10n.init("core", user_profile_data['lang'])
        L10n.init("pas_core", user_profile_data['lang'])
        L10n.init("pas_http_user", user_profile_data['lang'])

        l10n = L10n.get_instance(user_profile_data['lang'])

        email_renderer = NamedLoader.get_instance(self.__class__.EMAIL_RENDERER, l10n = l10n)
        content = email_renderer.render(user_profile_data, self.vid, self.vid_timeout_days)

        subject = self.get_email_subject(l10n)
        if (subject is None): subject = l10n.get("pas_http_user_title_verification")

        part = Part(Part.TYPE_MESSAGE_BODY, "text/plain", content)

        message = Message()
        message.add_body(part)
        message.set_subject(subject)
        message.set_to(Message.format_address(user_profile_data['name'], email))

        smtp_client = SmtpClient()
        smtp_client.set_message(message)
        smtp_client.send()
Example #23
0
def after_apply_schema(params, last_return = None):
#
	"""
Called for "dNG.pas.Database.applySchema.after"

:param params: Parameter specified
:param last_return: The return value from the last hook called.

:return: (mixed) Return value
:since:  v0.1.00
	"""

	list_class = NamedLoader.get_class("dNG.database.instances.DiscussList")
	Schema.apply_version(list_class)

	topic_class = NamedLoader.get_class("dNG.database.instances.DiscussTopic")
	Schema.apply_version(topic_class)

	post_class = NamedLoader.get_class("dNG.database.instances.DiscussPost")
	Schema.apply_version(post_class)

	return last_return
Example #24
0
    def load_encapsulating_entry(_id, client_user_agent = None, cds = None, deleted = False):
        """
Loads a matching MpEntry for the given MpEntry instance based ID or VFS URL.

:param _id: MpEntry instance based ID or VFS URL
:param client_user_agent: Client user agent
:param cds: UPnP CDS
:param deleted: True to include deleted resources

:return: (object) Resource object; None on error
:since:  v0.2.00
        """

        if (_id is None): raise TypeException("MpEntry ID or VFS URL given is invalid")
        _return = None

        if ("://" in _id
            and (_id.startswith("mp-entry:") or _id.startswith("mp-entry-"))
           ): _return = MpEntry.load_cds_id(_id, client_user_agent, cds, deleted)
        else:
            vfs_object = Implementation.load_vfs_url(_id, True)

            if (vfs_object.is_directory()): entry_class_name = "dNG.data.upnp.resources.MpEntry"
            else:
                mimetype = vfs_object.get_mimetype()
                mimetype_definition = MimeType.get_instance().get(mimetype = mimetype)

                mimeclass = (mimetype.split("/", 1)[0] if (mimetype_definition is None) else mimetype_definition['class'])
                camel_case_mimeclass = "".join([ word.capitalize() for word in re.split("\\W", mimeclass) ])

                entry_class_name = "dNG.data.upnp.resources.MpEntry{0}".format(camel_case_mimeclass)
                if (not NamedLoader.is_defined(entry_class_name)): entry_class_name = "dNG.data.upnp.resources.MpEntry"
            #

            _return = NamedLoader.get_instance(entry_class_name, False)
            if (_return is not None and (not _return.init_cds_id(_id, client_user_agent, deleted))): _return = None
        #

        return _return
Example #25
0
    def run(self):
        """
Task execution

:since: v0.2.00
        """

        user_profile_class = NamedLoader.get_class("dNG.data.user.Profile")
        user_profile = user_profile_class.load_username(self.username)

        secid = user_profile_class.generate_secid()
        secid_hashed = Tmd5.password_hash(re.sub("\\W+", "", secid), Settings.get("pas_user_profile_password_salt"), self.username)

        user_profile.set_data_attributes(secid = secid_hashed)
        user_profile.save()

        user_profile_data = user_profile.get_data_attributes("name", "lang", "email")

        L10n.init("core", user_profile_data['lang'])
        L10n.init("pas_core", user_profile_data['lang'])
        L10n.init("pas_http_user", user_profile_data['lang'])

        l10n = L10n.get_instance(user_profile_data['lang'])

        email_renderer = NamedLoader.get_instance("dNG.data.text.user.SecIDUpdatedEMailRenderer", l10n = l10n)
        content = email_renderer.render(user_profile_data, secid)
        subject = l10n.get("pas_http_user_title_sec_id_updated")

        part = Part(Part.TYPE_MESSAGE_BODY, "text/plain", content)

        message = Message()
        message.add_body(part)
        message.set_subject(subject)
        message.set_to(Message.format_address(user_profile_data['name'], user_profile_data['email']))

        smtp_client = SmtpClient()
        smtp_client.set_message(message)
        smtp_client.send()
Example #26
0
    def _get_hook(self):
        """
Returns the task hook to be called.

:return: (mixed) Task hook either as str or an instance of "AbstractHook"
:since:  v0.2.00
        """

        _return = (NamedLoader.get_instance("dNG.tasks.DatabaseLrtHook", hook = self.hook, **self.params)
                   if (self.params.get("_lrt_hook", False)) else
                   self.hook
                  )

        return _return
Example #27
0
def load_all(params, last_return = None):
    """
Load and register all SQLAlchemy objects to generate database tables.

:param params: Parameter specified
:param last_return: The return value from the last hook called.

:since: v0.2.00
    """

    NamedLoader.get_class("dNG.database.instances.MpUpnpAudioResource")
    NamedLoader.get_class("dNG.database.instances.MpUpnpImageResource")
    NamedLoader.get_class("dNG.database.instances.MpUpnpResource")
    NamedLoader.get_class("dNG.database.instances.MpUpnpVideoResource")

    return last_return
    def run(self):
        """
Task execution

:since: v0.2.00
        """

        user_profile_class = NamedLoader.get_class("dNG.data.user.Profile")

        user_profile = user_profile_class.load_username(self.username)

        original_user_profile_data = user_profile.get_data_attributes(*self.values_changed.keys())

        user_profile.set_data_attributes(**self.values_changed)
        user_profile.save()

        DatabaseTasksProxy.get_instance().add("dNG.pas.user.Profile.onEdited.{0}".format(self.username),
                                              "dNG.pas.user.Profile.onEdited",
                                              1,
                                              user_profile_id = user_profile.get_id(),
                                              user_profile_data_changed = self.values_changed,
                                              original_user_profile_data = original_user_profile_data
                                             )

        task_data = DatabaseTasks.get_instance().get(self.vid)

        if (task_data is not None and "_task" in task_data):
            task_data['_task'].set_status_completed()
            task_data['_task'].save()
        #

        user_profile_data = user_profile.get_data_attributes("id", "name", "lang")

        L10n.init("core", user_profile_data['lang'])
        L10n.init("pas_core", user_profile_data['lang'])
        L10n.init("pas_http_user", user_profile_data['lang'])

        l10n = L10n.get_instance(user_profile_data['lang'])

        _return = PredefinedHttpRequest()
        _return.set_module("output")
        _return.set_service("http")
        _return.set_action("done")

        _return.set_parameter_chained("title", l10n.get("pas_http_user_title_change_profile"))
        _return.set_parameter_chained("message", l10n.get("pas_http_user_done_change_profile"))
        _return.set_parameter_chained("lang", l10n.get_lang())
        _return.set_parameter_chained("target_iline", "m=user;s=profile;lang={0};dsd=upid+{1}".format(user_profile_data['lang'], user_profile_data['id']))

        return _return
Example #29
0
    def reload_plugins(prefix = None):
        """
Reload all plugins or the plugins matching the given prefix.

:param prefix: Plugin prefix

:return: (bool) True on success
:since:  v0.2.00
        """

        # pylint: disable=broad-except, no-member

        _return = True

        for package in Manager._plugins:
            if (prefix is None or package.startswith("{0}.".format(prefix))):
                modules = (Manager._plugins[package].copy()
                           if (hasattr(Manager._plugins[package], "copy")) else
                           copy(Manager._plugins[package])
                          )

                if (_mode == _MODE_IMPORT_MODULE
                    and hasattr(importlib, "invalidate_caches")
                   ): importlib.invalidate_caches()

                for module_name in modules:
                    try:
                        module = NamedLoader._get_module(module_name)

                        if (module is not None and hasattr(module, "unregister_plugin")): module.unregister_plugin()

                        try: reload(module)
                        except Exception: Manager._plugins[package].remove(module_name)

                        if (module is not None and hasattr(module, "on_plugin_reloaded")): module.on_plugin_reloaded()
                    except Exception as handled_exception:
                        if (Manager._log_handler is not None): Manager._log_handler.error(handled_exception, context = "pas_plugins")
                        _return = False
                    #
                #

                package_prefix = (package[:package.rindex(".")] if (prefix is None) else prefix)
                package_plugin = package[1 + package.rindex("."):]

                Manager.load_plugin(package_plugin, package_prefix)
            #
        #

        return _return
    def run(self):
        """
Task execution

:since: v0.2.00
        """

        user_profile_class = NamedLoader.get_class("dNG.data.user.Profile")

        user_profile = user_profile_class.load_username(self.username)
        user_profile.unlock()
        user_profile.save()

        database_tasks_proxy = DatabaseTasksProxy.get_instance()

        database_tasks_proxy.add("dNG.pas.user.Profile.updateSecID.{0}".format(self.username),
                                 "dNG.pas.user.Profile.updateSecID",
                                 1,
                                 username = self.username
                                )

        database_tasks_proxy.remove("dNG.pas.user.Profile.delete.{0}".format(self.username))

        task_data = DatabaseTasks.get_instance().get(self.vid)

        if (task_data is not None and "_task" in task_data):
            task_data['_task'].set_status_completed()
            task_data['_task'].save()
        #

        user_profile_data = user_profile.get_data_attributes("name", "lang")

        L10n.init("core", user_profile_data['lang'])
        L10n.init("pas_core", user_profile_data['lang'])
        L10n.init("pas_http_user", user_profile_data['lang'])

        l10n = L10n.get_instance(user_profile_data['lang'])

        _return = PredefinedHttpRequest()
        _return.set_module("output")
        _return.set_service("http")
        _return.set_action("done")

        _return.set_parameter_chained("title", l10n.get("pas_http_user_title_registration"))
        _return.set_parameter_chained("message", l10n.get("pas_http_user_done_registration"))
        _return.set_parameter_chained("lang", l10n.get_lang())
        _return.set_parameter_chained("target_iline", "m=user;s=status;a=login;lang={0}".format(user_profile_data['lang']))

        return _return
Example #31
0
def after_apply_schema(params, last_return = None):
    """
Called for "dNG.pas.Database.applySchema.after"

:param params: Parameter specified
:param last_return: The return value from the last hook called.

:return: (mixed) Return value
:since:  v0.2.00
    """

    resource_class = NamedLoader.get_class("dNG.database.instances.MpUpnpResource")
    Schema.apply_version(resource_class)

    audio_class = NamedLoader.get_class("dNG.database.instances.MpUpnpAudioResource")
    Schema.apply_version(audio_class)

    image_class = NamedLoader.get_class("dNG.database.instances.MpUpnpImageResource")
    Schema.apply_version(image_class)

    video_class = NamedLoader.get_class("dNG.database.instances.MpUpnpVideoResource")
    Schema.apply_version(video_class)

    return last_return
Example #32
0
def _ensure_administrative_user_account():
    """
Checks if at least one active administrative user profile exists. Creates
one if this is not the case.

:since: v0.2.00
    """

    cli = InteractiveCli.get_instance()
    cli.output_info("Validating administrative account ...")

    user_profile_class = NamedLoader.get_class("dNG.data.user.Profile")

    if (next(user_profile_class.load_list(limit = 1, _type = "ad"), None) is not None): cli.output_info("Administrative account is available")
    else:
        cli.output_info("No valid administrative account found")

        Settings.read_file("{0}/settings/pas_user_profile.json".format(Settings.get("path_data")))
        password = "".join(choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for _ in range(20))
        password_encrypted = Tmd5.password_hash(password, Settings.get("pas_user_profile_password_salt"), "root")

        cli.output("")
        cli.output("A new default account will be generated.")
        cli.output("")
        cli.output("---------------------------------")
        cli.output("User name: root")
        cli.output("   e-mail: [email protected]")
        cli.output(" Password: {0}", password)
        cli.output("---------------------------------")
        cli.output("")
        cli.output("Please change this account as soon as possible.")
        cli.output("")

        user_profile = user_profile_class()

        user_profile.set_data_attributes(type = user_profile_class.get_type_int("ad"),
                                         name = "root",
                                         password = password_encrypted,
                                         locked = False,
                                         email = "*****@*****.**"
                                        )

        user_profile.save()