#!/usr/bin/env python
"""Justin Giorgi, Robert Straitt 12/31/12
File: main.py
Scope: Initialization and registration of all core modules and configured mods.
Changelog:
No changes
Status:
Complete within scope of current requirements.
Testing:
No tests, extensive testing necessary.
"""
# Standard library imports
from os import getcwd
from ConfigParser import SafeConfigParser as ConfigParser
# Installed extension imports
from circuits import Component, Debugger
# Local imports
from core import core
from mods import mods
from environment import Environment
# Exception(s)
class ConfigurationError(Exception): pass
class Main(Component):
"""Main class responsible for importing and loading all core classes as well
as enabled mods. No other tasks performed.
"""
def __init__(self, config):
super(Main, self).__init__()
# Prepare environment
self.env = Environment(config)
# Load core (core is a list of core modules to load)
for C in core:
c = C(self.env)
c.register(self)
# Load enabled mods (mods is a dict of modname to mod)
for m in mods:
if self.env.config.has_option("mods", m) and \
self.env.config.getboolean("mods", m):
m = mods[m](self.env)
m.register(self)
def init(config="infocream.conf", cwd=getcwd()):
# Parse config
conf = ConfigParser()
conf.read(config)
# Init debugger if required
components = []
ret = []
# Check for config errors
if conf.getboolean("run", "multiprocess") and conf.getboolean("run",
"thread"):
raise ConfigurationError("Multiprocessing and threading are mutually "
"exclusive.")
# Run in daemon?
if conf.getboolean("run", "daemon"):
print "Initializing Daemonizer..."
components.append(Daemon("infocream.pid", path=cwd, stdin="stdin.txt",
stdout="stdout.txt", stderr="stderr.txt"))
# Run Debugger?
if conf.getboolean("run", "debug"):
print "Initializing Debugger..."
d = Debugger()
components.append(d)
ret.append(d)
else:
ret.append(None)
# Startup main
print "Initializing system..."
m = Main(conf)
components.append(m)
ret.append(m)
print "System components loaded."
# Initialize everything
print "Preparing environment..."
components.reverse() # run first item as root
root = components.pop()
for comp in components:
comp.register(root)
# Run in thread or multiprocess?
if conf.getboolean("run", "thread"):
print "Configuring for interactive operations..."
go = root.start
ret.append(True)
elif conf.getboolean("run", "multiprocess"):
print "Preparing for multiprocessing..."
def initprocesses():
processes = conf.getint("run", "processes")
for x in range(1, processes):
root.start(process=True)
root.run()
go = initprocesses
ret.append(False)
else:
"Configuring for single processes, non-interactive operation..."
go = root.run
ret.append(False)
# Run the system
print "System loaded successfully. Executing Main loop."
go()
# Return
return tuple(ret)
# If run independently initialize automagically
if __name__ == "__main__":
d, m, thread = init()
if thread:
print "Ready for interactive operations."