10
from threading import Thread
10
11
from . import Config, server, storage
13
17
def __init__(self):
14
18
"""Initialize the daemon."""
15
19
self.__dict__.update(Config.items('Daemon'))
33
37
# Set up logging in daemon thread
34
38
logging.basicConfig(level=logging.DEBUG,
35
39
format='%(asctime)s %(levelname)s %(message)s',
37
logging.notice('Daemon spawned.')
40
filename=self.logfile)
41
self.log = logging.getLogger('')
42
self.log.info('Daemon spawned.')
39
44
while self.__alive:
40
45
# Reload configuration (e.g. after SIGHUP)
115
118
if signum == signal.SIGTERM:
116
logging.notice('Received SIGTERM.')
119
self.log.info('Received SIGTERM.')
117
120
# Trigger the main loop 'else' clause in __init__()
118
121
self.__alive = False
120
123
if signum == signal.SIGHUP:
121
logging.notice('Received SIGHUP.')
124
self.log.info('Received SIGHUP.')
122
125
# Stop Servers and close Stores, but leave _running = True.
125
logging.notice('Received unhandled signal %d' % signum)
128
self.log.info('Received unhandled signal %d' % signum)
129
131
def __start(self):
130
logging.notice('Opening store.')
132
self.log.info('Opening store.')
131
133
# Initialize a data store in the main thread
132
134
store_type = Config.get('Storage', 'type')
133
self.store = store_types[store_type]()
135
self.store = storage.types[store_type]()
134
136
# Start servers, each in their own thread
135
for server_type in server_types:
137
for server_type, server_class in server.types.iteritems():
137
if bool(Config.get('Server', server_type['name'])):
138
s = server_type['class']()
139
if bool(eval(Config.get('Server', server_type))):
140
self.log.info('Starting %s server.' % server_type)
139
142
self.servers.append(s)
140
t = threading.thread(s.serve_forever)
143
t = Thread(target=s.serve_forever)
141
145
self.server_threads.append(t)
142
146
except NoOptionError:
146
149
def __stop(self):
147
logging.notice('Shutting down servers.')
148
for s in self.servers:
150
for t in self.server_threads:
152
logging.notice('Closing store.')
151
self.log.info('Shutting down servers.')
152
[s.shutdown() for s in self.servers]
153
self.log.info('Joining threads.')
154
[t.join() for t in self.server_threads]
155
self.log.info('Closing store.')