Skip to content

Instantly share code, notes, and snippets.

@EntityReborn
Created June 2, 2011 16:19
Show Gist options
  • Save EntityReborn/1004736 to your computer and use it in GitHub Desktop.
Save EntityReborn/1004736 to your computer and use it in GitHub Desktop.
from inspect import getmembers, ismethod
import logging
from twisted.application import internet
from twisted.web import resource, server
from twisted.internet import reactor
class Base(object):
def __init__(self, manager):
self.manager = manager
self.log = logging.getLogger("plugin")
def initialize(self, *args, **kwargs):
"""Initialize the plugin"""
pass
@classmethod
def trigger(cls, *triggers):
"""Register a trigger command to be triggered by a user"""
def call(func):
func.triggers = triggers
return func
return call
def _initTrigs(self):
members = getmembers(self)
for funcdata in members:
func = funcdata[1]
if ismethod(func) and hasattr(func, "triggers"):
self.manager.registerTrigger(func, *func.triggers)
def beforeReload(self, *args, **kwargs):
pass
def afterReload(self, *args, **kwargs):
pass
def disabling(self, *args, **kwargs):
pass
def enabled(self, *args, **kwargs):
pass
def finalize(self, *args, **kwargs):
pass
class Plugin(Base):
class Simple(resource.Resource):
isLeaf = True
def render_GET(self, request):
line = "<html><head><title>Ohai2</title></head><body>Hello, world 2!</body></html>"
self.log.info(line)
return line
def initialize(self, *args, **kwargs):
self.simple = self.Simple()
self.simple.log = self.log
self.site = server.Site(self.simple)
self.server = internet.TCPServer(8080, self.site)
self.startServer()
def startServer(self):
self.log.info("Starting server")
if self.server.running:
self.log.error("Tried to run again.")
return
self.server.startService()
def stopServer(self):
self.log.info("Stopping server")
if not self.server.running:
self.log.error("Tried to stop what is already stopped.")
return
retn = self.server.stopService()
return retn
@Base.trigger("WEBDOWN")
def on_down(self, *args):
self.log.info("WEBDOWN called")
if self.server.running:
self.stopServer()
return True
return "Not running."
@Base.trigger("WEBUP")
def on_up(self, *args):
self.log.info("WEBUP called")
if not self.server.running:
self.startServer()
return True
return "Already running."
def disabling(self, *args, **kwargs):
self.log.info("DISABLING")
if self.server.running:
return self.stopServer()
def beforeReload(self, *args, **kwargs):
self.log.info("BEFORERELOAD")
if self.server.running:
return self.stopServer()
class Manager(object):
def __init__(self):
self.funcs = {}
def registerTrigger(self, func, *triggers):
for trig in triggers:
self.funcs[trig.lower()] = func
def get(self, trigger):
if trigger.lower() in self.funcs:
return self.funcs[trigger.lower()]
return None
m = Manager()
p = Plugin(m)
p._initTrigs()
p.initialize()
print p.server.running
def start():
print "Starting"
m.get("WEBUP")()
def stop():
print "Stopping"
m.get("WEBDOWN")()
reactor.callLater(10, stop) # Works
reactor.callLater(20, start) # Works
reactor.callLater(30, stop) # Fails
reactor.callLater(40, start) # ...?
reactor.callLater(50, stop) # ...?
reactor.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment