Example #1
0
    def testPluginEvent(self):
        logger.debug('-' * 26 + '\n')
        logger.info('Running plugin event test...')

        import onionrplugins as plugins, onionrevents as events, os

        if not plugins.exists('test'):
            os.makedirs(plugins.get_plugins_folder('test'))
            with open(plugins.get_plugins_folder('test') + '/main.py',
                      'a') as main:
                main.write(
                    "print('Running')\n\ndef on_test(pluginapi, data = None):\n    print('received test event!')\n    print('thread test started...')\n    import time\n    time.sleep(1)\n    \n    return True\n\ndef on_start(pluginapi, data = None):\n    print('start event called')\n\ndef on_stop(pluginapi, data = None):\n    print('stop event called')\n\ndef on_enable(pluginapi, data = None):\n    print('enable event called')\n\ndef on_disable(pluginapi, data = None):\n    print('disable event called')\n"
                )
            plugins.enable('test')

        plugins.start('test')
        if not events.call(plugins.get_plugin('test'), 'enable'):
            self.assertTrue(False)

        logger.debug('preparing to start thread', timestamp=False)
        thread = events.event('test', data={'tests': self})
        logger.debug('thread running...', timestamp=False)
        thread.join()
        logger.debug('thread finished.', timestamp=False)

        self.assertTrue(True)
Example #2
0
def register_plugin_commands(cmd) -> bool:
    plugin_cmd = plugin_command(cmd)
    for pl in onionrplugins.get_enabled_plugins():
        pl = onionrplugins.get_plugin(pl)
        if hasattr(pl, plugin_cmd):
            getattr(pl, plugin_cmd)(onionrpluginapi.PluginAPI)
            return True
    return False
Example #3
0
def load_plugin_blueprints(flaskapp, blueprint='flask_blueprint'):
    '''Iterate enabled plugins and load any http endpoints they have'''
    for plugin in onionrplugins.get_enabled_plugins():
        plugin = onionrplugins.get_plugin(plugin)
        try:
            flaskapp.register_blueprint(getattr(plugin, blueprint))
        except AttributeError:
            pass
Example #4
0
def register_plugin_commands(cmd) -> bool:
    """Find a plugin command hook and execute it for a given cmd."""
    plugin_cmd = plugin_command(cmd)
    for pl in onionrplugins.get_enabled_plugins():
        pl = onionrplugins.get_plugin(pl)
        if hasattr(pl, plugin_cmd):
            getattr(pl, plugin_cmd)(onionrpluginapi.PluginAPI)
            return True
    return False
Example #5
0
def event(event_name, data=None, onionr=None):
    '''
        Calls an event on all plugins (if defined)
    '''

    for plugin in plugins.get_enabled_plugins():
        try:
            call(plugins.get_plugin(plugin), event_name, data, onionr)
        except:
            logger.warn('Event \"' + event_name + '\" failed for plugin \"' +
                        plugin + '\".')
Example #6
0
def load_plugin_security_whitelist_endpoints(whitelist: list):
    """Accept a list reference of whitelist endpoints from security/client.py and
    append plugin's specified endpoints to them by attribute"""
    for plugin in onionrplugins.get_enabled_plugins():
        try:
            plugin = onionrplugins.get_plugin(plugin)
        except FileNotFoundError:
            continue
        try:
            whitelist.extend(getattr(plugin, "security_whitelist"))
        except AttributeError:
            pass
Example #7
0
def load_plugin_blueprints(flaskapp, blueprint: str = 'flask_blueprint'):
    """Iterate enabled plugins and load any http endpoints they have"""
    config.reload()
    disabled = config.get('plugins.disabled')
    for plugin in onionrplugins.get_enabled_plugins():
        if plugin in disabled:
            continue
        plugin = onionrplugins.get_plugin(plugin)
        try:
            flaskapp.register_blueprint(getattr(plugin, blueprint))
        except AttributeError:
            pass
Example #8
0
    def testPluginEvent(self):
        logger.debug('-'*26 + '\n')
        logger.info('Running plugin event test...')

        import onionrplugins as plugins, onionrevents as events

        plugins.start('test')
        if not events.call(plugins.get_plugin('test'), 'test'):
            self.assertTrue(False)

        events.event('test', data = {'tests': self})

        self.assertTrue(True)
Example #9
0
def __event_caller(event_name, data = {}, onionr = None):
    '''
        DO NOT call this function, this is for threading code only.
        Instead, call onionrevents.event
    '''
    for plugin in plugins.get_enabled_plugins():
        try:
            call(plugins.get_plugin(plugin), event_name, data, get_pluginapi(onionr, data))
        except ModuleNotFoundError as e:
            logger.warn('Disabling nonexistant plugin "%s"...' % plugin)
            plugins.disable(plugin, onionr, stop_event = False)
        except Exception as e:
            logger.warn('Event "%s" failed for plugin "%s".' % (event_name, plugin))
            logger.debug(str(e))
Example #10
0
def __event_caller(event_name, data = {}):
    '''
        DO NOT call this function, this is for threading code only.
        Instead, call onionrevents.event
    '''
    disabled = config.get('plugins.disabled')
    for plugin in plugins.get_enabled_plugins():
        if plugin in disabled: continue
        try:
            call(plugins.get_plugin(plugin), event_name, data, get_pluginapi(data))
        except ModuleNotFoundError as e:
            logger.warn('Disabling nonexistant plugin "%s"...' % plugin, terminal=True)
            plugins.disable(plugin, stop_event = False)
        except Exception as e:
            logger.warn('Event "%s" failed for plugin "%s".' % (event_name, plugin), terminal=True)
            logger.debug((event_name + ' - ' + plugin + ' - ' + str(e)), terminal=True)
Example #11
0
    def get_help_message(cmd: str,
                         default: str = 'No help available for this command'):
        """Return help message for a given command, supports plugin commands"""
        pl_cmd = plugin_command(cmd)
        for pl in onionrplugins.get_enabled_plugins():
            pl = onionrplugins.get_plugin(pl)
            if hasattr(pl, pl_cmd):
                try:
                    return getattr(pl, pl_cmd).onionr_help
                except AttributeError:
                    pass

        for i in arguments.get_arguments():
            for alias in i:
                try:
                    return arguments.get_help(cmd)
                except AttributeError:
                    pass
        return default  # Return the help string
Example #12
0
def register():
    """Registers commands and handles help command processing"""
    def get_help_message(cmd: str,
                         default: str = 'No help available for this command'):
        """Return help message for a given command, supports plugin commands"""
        pl_cmd = plugin_command(cmd)
        for pl in onionrplugins.get_enabled_plugins():
            pl = onionrplugins.get_plugin(pl)
            if hasattr(pl, pl_cmd):
                try:
                    return getattr(pl, pl_cmd).onionr_help
                except AttributeError:
                    pass

        for i in arguments.get_arguments():
            for alias in i:
                try:
                    return arguments.get_help(cmd)
                except AttributeError:
                    pass
        return default  # Return the help string

    PROGRAM_NAME = "onionr"

    # Get the command
    try:
        cmd = sys.argv[1]
    except IndexError:
        logger.debug("Detected Onionr run with no commands specified")
        return

    is_help_cmd = False
    if cmd.replace('--', '').lower() == 'help': is_help_cmd = True

    try:
        try:
            if not cmd in ('start', 'details', 'show-details'):
                os.chdir(os.environ['ORIG_ONIONR_RUN_DIR'])
        except KeyError:
            pass
        try:
            arguments.get_func(cmd)()
        except KeyboardInterrupt:
            pass
    except onionrexceptions.NotFound:
        if not register_plugin_commands(cmd) and not is_help_cmd:
            recommend.recommend()
            sys.exit(3)

    if is_help_cmd:
        try:
            sys.argv[2]
        except IndexError:
            for i in arguments.get_arguments():
                logger.info(
                    '%s <%s>: %s' %
                    (PROGRAM_NAME, '/'.join(i), get_help_message(i[0])),
                    terminal=True)
            for pl in onionrplugins.get_enabled_plugins():
                pl = onionrplugins.get_plugin(pl)
                if hasattr(pl, 'ONIONR_COMMANDS'):
                    print('')
                    try:
                        logger.info('%s commands:' % (pl.plugin_name, ),
                                    terminal=True)
                    except AttributeError:
                        logger.info('%s commands:' % (pl.__name__, ),
                                    terminal=True)
                    for plugin_cmd in pl.ONIONR_COMMANDS:
                        logger.info('%s %s: %s' %
                                    (PROGRAM_NAME, plugin_cmd,
                                     get_help_message(plugin_cmd)),
                                    terminal=True)
                    print('')
        else:
            try:
                logger.info(
                    '%s %s: %s' %
                    (PROGRAM_NAME, sys.argv[2], get_help_message(sys.argv[2])),
                    terminal=True)
            except KeyError:
                logger.error('%s: command does not exist.' % [sys.argv[2]],
                             terminal=True)
                sys.exit(3)
        return
Example #13
0
def register():
    """Register commands and handles help command processing."""
    def get_help_message(cmd: str,
                         default: str = 'No help available for this command'):
        """Print help message for a given command, supports plugin commands."""
        pl_cmd = plugin_command(cmd)
        for pl in onionrplugins.get_enabled_plugins():
            pl = onionrplugins.get_plugin(pl)
            if hasattr(pl, pl_cmd):
                try:
                    return getattr(pl, pl_cmd).onionr_help
                except AttributeError:
                    pass

        for i in arguments.get_arguments():
            for _ in i:
                try:
                    return arguments.get_help(cmd)
                except AttributeError:
                    pass
        return default  # Return the help string

    PROGRAM_NAME = "onionr"

    # Get the command
    try:
        cmd = sys.argv[1]
    except IndexError:
        logger.info('Run with --help to see available commands', terminal=True)
        sys.exit(10)

    is_help_cmd = False
    if cmd.replace('--', '').lower() == 'help':
        is_help_cmd = True

    try:
        try:
            arguments.get_func(cmd)()
        except KeyboardInterrupt:
            pass
    except onionrexceptions.NotFound:
        if not register_plugin_commands(cmd) and not is_help_cmd:
            recommend.recommend()
            sys.exit(3)

    if is_help_cmd:
        try:
            sys.argv[2]
        except IndexError:
            for i in arguments.get_arguments():
                _show_term('%s <%s>: %s' %
                           (PROGRAM_NAME, '/'.join(i), get_help_message(i[0])))
            for pl in onionrplugins.get_enabled_plugins():
                pl = onionrplugins.get_plugin(pl)
                if hasattr(pl, 'ONIONR_COMMANDS'):
                    print('')
                    try:
                        _show_term('%s commands:' % (pl.plugin_name, ))
                    except AttributeError:
                        _show_term('%s commands:' % (pl.__name__, ))
                    for plugin_cmd in pl.ONIONR_COMMANDS:
                        _show_term(
                            '%s %s: %s' % (PROGRAM_NAME, plugin_cmd,
                                           get_help_message(plugin_cmd)), )
                    print('')
        else:
            try:
                _show_term(
                    '%s %s: %s' %
                    (PROGRAM_NAME, sys.argv[2], get_help_message(sys.argv[2])))
            except KeyError:
                logger.error('%s: command does not exist.' % [sys.argv[2]],
                             terminal=True)
                sys.exit(3)
        return