from twisted.application.service import Service, Application
from twisted.application import internet
from twisted.web import resource, server
from twisted.internet import reactor
from twisted.python import log
from sqlalchemy import create_engine, pool
from iro import config, install
from iro.view import xmlrpc
from iro.model import setEngine, setPool
from iro.controller.pool import startPool, dbPool
class IroService(Service):
def startService(self):
log.msg("Starting service...")
engine = create_engine(config.main.dburl,
poolclass = pool.SingletonThreadPool, pool_size=dbPool.maxthreads, )
setEngine(engine)
startPool(reactor)
setPool(dbPool)
reactor.callWhenRunning(config.readConfig)
Service.startService(self)
def get_application():
app = Application("Iro")
if not install.checkConfig():
log.err("You can create a sample configuration file by running iro-install")
raise Exception("Please update or create your configuration file iro.conf.")
config.init()
if not install.checkDatabaseConnection():
raise Exception("Can't connect to database")
if not install.checkDatabase():
raise Exception("Database not in right format. Please run iro-install --install")
routes = [ s for s in config.configParser.sections() if not s in ["main",]]
ao = install.getAllRoutes(routes, False)
for o in ao["orphand"]:
log.msg("Offer(%s) is orphand (no route using this offer)."%o)
if ao["added"]:
raise Exception("offerlist is not up-to-date.\nPlease run iro-install --update")
root = resource.Resource()
root = xmlrpc.appendResource(root)
v2 = resource.Resource()
v2 = xmlrpc.appendResource(root)
root.putChild('2.0', v2)
internet.TCPServer(config.main.port, server.Site(root)).setServiceParent(app)
IroService().setServiceParent(app)
return app
application = get_application()