Exemplo n.º 1
0
    def __init__(self, init=True):
        # Read the config files
        self.__user_config = utility.load_json(utility.CONFIG_FILE_PATH)
        self.__system_config = utility.load_json(
            utility.SYSTEM_CONFIG_FILE_PATH)
        # If there any breaking changes in long_breaks, short_breaks or any other keys, use the __force_upgrade list
        self.__force_upgrade = []
        # self.__force_upgrade = ['long_breaks', 'short_breaks']

        if init:
            if self.__user_config is None:
                utility.initialize_safeeyes()
                self.__user_config = self.__system_config
                self.save()
            else:
                system_config_version = self.__system_config['meta'][
                    'config_version']
                meta_obj = self.__user_config.get('meta', None)
                if meta_obj is None:
                    # Corrupted user config
                    self.__user_config = self.__system_config
                else:
                    user_config_version = str(
                        meta_obj.get('config_version', '0.0.0'))
                    if LooseVersion(user_config_version) != LooseVersion(
                            system_config_version):
                        # Update the user config
                        self.__merge_dictionary(self.__user_config,
                                                self.__system_config)
                        self.__user_config = self.__system_config
                        # Update the style sheet
                        utility.replace_style_sheet()

            utility.merge_plugins(self.__user_config)
            self.save()
Exemplo n.º 2
0
    def __load_plugin(self, plugin):
        """
        Load the given plugin.
        """
        plugin_enabled = plugin['enabled']
        if plugin['id'] in self.__plugins and not plugin_enabled:
            # A disabled plugin but that was loaded earlier
            plugin_obj = self.__plugins[plugin['id']]
            if plugin_obj['enabled']:
                # Previously enabled but now disabled
                plugin_obj['enabled'] = False
                utility.remove_if_exists(self.__plugins_on_start, plugin_obj)
                utility.remove_if_exists(self.__plugins_on_stop, plugin_obj)
                utility.remove_if_exists(self.__plugins_on_exit, plugin_obj)
                utility.remove_if_exists(self.__plugins_update_next_break,
                                         plugin_obj)
                # Call the plugin.disable method if available
                if utility.has_method(plugin_obj['module'], 'disable'):
                    plugin_obj['module'].disable()
                logging.info("Successfully unloaded the plugin '%s'",
                             plugin['id'])

            if not plugin_obj['break_override_allowed']:
                # Remaining methods also should be removed
                utility.remove_if_exists(self.__plugins_on_init, plugin_obj)
                utility.remove_if_exists(self.__plugins_on_pre_break,
                                         plugin_obj)
                utility.remove_if_exists(self.__plugins_on_start_break,
                                         plugin_obj)
                utility.remove_if_exists(self.__plugins_on_stop_break,
                                         plugin_obj)
                utility.remove_if_exists(self.__plugins_on_countdown,
                                         plugin_obj)
                utility.remove_if_exists(self.__widget_plugins, plugin_obj)
                utility.remove_if_exists(self.__tray_actions_plugins,
                                         plugin_obj)
                del self.__plugins[plugin['id']]
            return

        # Look for plugin.py
        if os.path.isfile(
                os.path.join(utility.SYSTEM_PLUGINS_DIR, plugin['id'],
                             'plugin.py')):
            plugin_dir = utility.SYSTEM_PLUGINS_DIR
        elif os.path.isfile(
                os.path.join(utility.USER_PLUGINS_DIR, plugin['id'],
                             'plugin.py')):
            plugin_dir = utility.USER_PLUGINS_DIR
        else:
            logging.error('plugin.py not found for the plugin: %s',
                          plugin['id'])
            return
        # Look for config.json
        plugin_path = os.path.join(plugin_dir, plugin['id'])
        plugin_config_path = os.path.join(plugin_path, 'config.json')
        if not os.path.isfile(plugin_config_path):
            logging.error('config.json not found for the plugin: %s',
                          plugin['id'])
            return
        plugin_config = utility.load_json(plugin_config_path)
        if plugin_config is None:
            return

        if plugin_enabled or plugin_config.get('break_override_allowed',
                                               False):
            if plugin['id'] in self.__plugins:
                # The plugin is already enabled or partially loaded due to break_override_allowed

                # Validate the dependencies again
                if utility.check_plugin_dependencies(
                        plugin['id'], plugin_config,
                        plugin.get('settings', {}), plugin_path):
                    plugin_obj['enabled'] = False
                    utility.remove_if_exists(self.__plugins_on_start,
                                             plugin_obj)
                    utility.remove_if_exists(self.__plugins_on_stop,
                                             plugin_obj)
                    utility.remove_if_exists(self.__plugins_on_exit,
                                             plugin_obj)
                    utility.remove_if_exists(self.__plugins_update_next_break,
                                             plugin_obj)
                    utility.remove_if_exists(self.__plugins_on_init,
                                             plugin_obj)
                    utility.remove_if_exists(self.__plugins_on_pre_break,
                                             plugin_obj)
                    utility.remove_if_exists(self.__plugins_on_start_break,
                                             plugin_obj)
                    utility.remove_if_exists(self.__plugins_on_stop_break,
                                             plugin_obj)
                    utility.remove_if_exists(self.__plugins_on_countdown,
                                             plugin_obj)
                    utility.remove_if_exists(self.__widget_plugins, plugin_obj)
                    utility.remove_if_exists(self.__tray_actions_plugins,
                                             plugin_obj)
                    del self.__plugins[plugin['id']]

                # Use the existing plugin object
                plugin_obj = self.__plugins[plugin['id']]

                # Update the config
                plugin_obj['config'] = dict(plugin.get('settings', {}))
                plugin_obj['config']['path'] = os.path.join(
                    plugin_dir, plugin['id'])

                if plugin_obj['enabled']:
                    # Already loaded completely
                    return
                # Plugin was partially loaded due to break_override_allowed
                if plugin_enabled:
                    # Load the rest of the methods
                    plugin_obj['enabled'] = True
                    module = plugin_obj['module']
                    self.__init_plugin(module, plugin_obj)
            else:
                # This is the first time to load the plugin
                # Check for dependencies
                if utility.check_plugin_dependencies(
                        plugin['id'], plugin_config,
                        plugin.get('settings', {}), plugin_path):
                    return

                # Load the plugin module
                module = importlib.import_module((plugin['id'] + '.plugin'))
                logging.info("Successfully loaded %s", str(module))
                plugin_obj = {
                    'id':
                    plugin['id'],
                    'module':
                    module,
                    'config':
                    dict(plugin.get('settings', {})),
                    'enabled':
                    plugin_enabled,
                    'break_override_allowed':
                    plugin_config.get('break_override_allowed', False)
                }
                # Inject the plugin directory into the config
                plugin_obj['config']['path'] = os.path.join(
                    plugin_dir, plugin['id'])
                self.__plugins[plugin['id']] = plugin_obj
                if utility.has_method(module, 'enable'):
                    module.enable()
                if plugin_enabled:
                    self.__init_plugin(module, plugin_obj)
                if utility.has_method(module, 'init', 3):
                    self.__plugins_on_init.append(plugin_obj)
                if utility.has_method(module, 'on_pre_break', 1):
                    self.__plugins_on_pre_break.append(plugin_obj)
                if utility.has_method(module, 'on_start_break', 1):
                    self.__plugins_on_start_break.append(plugin_obj)
                if utility.has_method(module, 'on_stop_break', 0):
                    self.__plugins_on_stop_break.append(plugin_obj)
                if utility.has_method(module, 'on_countdown', 2):
                    self.__plugins_on_countdown.append(plugin_obj)
                if utility.has_method(module, 'get_widget_title',
                                      1) and utility.has_method(
                                          module, 'get_widget_content', 1):
                    self.__widget_plugins.append(plugin_obj)
                if utility.has_method(module, 'get_tray_action', 1):
                    self.__tray_actions_plugins.append(plugin_obj)