Created
June 2, 2011 16:19
-
-
Save EntityReborn/1004736 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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