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)
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
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
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
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 + '\".')
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
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
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)
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))
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)
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
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
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