pyircbot/pyircbot/core/rpc.py

147 lines
4.8 KiB
Python
Raw Normal View History

"""
.. module:: BotRPC
:synopsis: RPC server
.. moduleauthor:: Dave Pedu <dave@davepedu.com>
"""
2013-12-28 09:58:20 -08:00
import traceback
import logging
from core import jsonrpc
from threading import Thread
class BotRPC(Thread):
def __init__(self, main):
Thread.__init__(self, daemon=True)
2013-12-28 09:58:20 -08:00
self.bot = main
self.log = logging.getLogger('RPC')
self.server = jsonrpc.Server(jsonrpc.JsonRpc20(), jsonrpc.TransportTcpIp(addr=(self.bot.botconfig["bot"]["rpcbind"], self.bot.botconfig["bot"]["rpcport"])))
self.server.register_function( self.importModule )
self.server.register_function( self.deportModule )
self.server.register_function( self.loadModule )
self.server.register_function( self.unloadModule )
self.server.register_function( self.reloadModule )
self.server.register_function( self.redoModule )
2014-01-07 10:17:05 -08:00
self.server.register_function( self.getLoadedModules )
self.server.register_function( self.pluginCommand )
self.server.register_function( self.setPluginVar )
self.server.register_function( self.getPluginVar )
2013-12-28 09:58:20 -08:00
self.start()
def run(self):
2014-10-02 16:53:54 -07:00
"""Internal, starts the RPC server"""
2013-12-28 09:58:20 -08:00
self.server.serve()
def importModule(self, moduleName):
2014-10-02 16:53:54 -07:00
"""Import a module
:param moduleName: Name of the module to import
:type moduleName: str"""
2014-01-07 10:17:05 -08:00
self.log.info("RPC: calling importModule(%s)"%moduleName)
2013-12-28 09:58:20 -08:00
return self.bot.importmodule(moduleName)
def deportModule(self, moduleName):
2014-10-02 16:53:54 -07:00
"""Remove a module's code from memory. If the module is loaded it will be unloaded silently.
:param moduleName: Name of the module to import
:type moduleName: str"""
2014-01-07 10:17:05 -08:00
self.log.info("RPC: calling deportModule(%s)"%moduleName)
2013-12-28 09:58:20 -08:00
self.bot.deportmodule(moduleName)
def loadModule(self, moduleName):
2014-10-02 16:53:54 -07:00
"""Activate a module.
:param moduleName: Name of the module to activate
:type moduleName: str"""
2014-01-07 10:17:05 -08:00
self.log.info("RPC: calling loadModule(%s)"%moduleName)
2013-12-28 09:58:20 -08:00
return self.bot.loadmodule(moduleName)
def unloadModule(self, moduleName):
2014-10-02 16:53:54 -07:00
"""Deactivate a module.
:param moduleName: Name of the module to deactivate
:type moduleName: str"""
2014-01-07 10:17:05 -08:00
self.log.info("RPC: calling unloadModule(%s)"%moduleName)
2013-12-28 09:58:20 -08:00
self.bot.unloadmodule(moduleName)
def reloadModule(self, moduleName):
2014-10-02 16:53:54 -07:00
"""Deactivate and activate a module.
:param moduleName: Name of the target module
:type moduleName: str"""
2014-01-07 10:17:05 -08:00
self.log.info("RPC: calling reloadModule(%s)"%moduleName)
2013-12-28 09:58:20 -08:00
self.bot.unloadmodule(moduleName)
return self.bot.loadmodule(moduleName)
def redoModule(self, moduleName):
2014-10-02 16:53:54 -07:00
"""Reload a running module from disk
:param moduleName: Name of the target module
:type moduleName: str"""
2014-01-07 10:17:05 -08:00
self.log.info("RPC: calling redoModule(%s)"%moduleName)
2013-12-28 09:58:20 -08:00
return self.bot.redomodule(moduleName)
2014-01-07 10:17:05 -08:00
def getLoadedModules(self):
2014-10-02 16:53:54 -07:00
"""Return a list of active modules
:returns: list -- ['ModuleName1', 'ModuleName2']"""
2014-01-07 10:17:05 -08:00
self.log.info("RPC: calling getLoadedModules()")
return list(self.bot.moduleInstances.keys())
2013-12-28 09:58:20 -08:00
2014-10-02 16:53:54 -07:00
def pluginCommand(self, moduleName, methodName, argList):
"""Run a method of an active module
:param moduleName: Name of the target module
:type moduleName: str
:param methodName: Name of the target method
:type methodName: str
:param argList: List of positional arguments to call the method with
:type argList: list
:returns: mixed -- Any basic type the target method may return"""
plugin = self.bot.getmodulebyname(moduleName)
2014-01-07 10:17:05 -08:00
if not plugin:
return (False, "Plugin not found")
method = getattr(plugin, methodName)
if not method:
return (False, "Method not found")
2014-10-02 16:53:54 -07:00
self.log.info("RPC: calling %s.%s(%s)" % (moduleName, methodName, argList))
2014-01-07 10:17:05 -08:00
return (True, method(*argList))
2013-12-28 09:58:20 -08:00
2014-10-02 16:53:54 -07:00
def getPluginVar(self, moduleName, moduleVarName):
"""Extract a property from an active module and return it
:param moduleName: Name of the target module
:type moduleName: str
:param moduleVarName: Name of the target property
:type moduleVarName: str
:returns: mixed -- Any basic type extracted from an active module"""
plugin = self.bot.getmodulebyname(moduleName)
if moduleName == "_core":
2014-01-07 10:17:05 -08:00
plugin = self.bot
if not plugin:
return (False, "Plugin not found")
2014-10-02 16:53:54 -07:00
self.log.info("RPC: getting %s.%s" % (moduleName, moduleVarName))
return (True, getattr(plugin, moduleVarName))
2013-12-28 09:58:20 -08:00
2014-10-02 16:53:54 -07:00
def setPluginVar(self, moduleName, moduleVarName, value):
"""Set a property of an active module
:param moduleName: Name of the target module
:type moduleName: str
:param moduleVarName: Name of the target property
:type moduleVarName: str
:param value: Value the target property will be set to
:type value: str"""
plugin = self.bot.getmodulebyname(moduleName)
if moduleName == "_core":
2014-01-07 10:17:05 -08:00
plugin = self.bot
if not plugin:
return (False, "Plugin not found")
2014-10-02 16:53:54 -07:00
self.log.info("RPC: setting %s.%s = %s )" % (moduleName, moduleVarName, value))
setattr(plugin, moduleVarName, value)
2014-01-07 10:17:05 -08:00
return (True, "Var set")