diff options
Diffstat (limited to 'server/server.py')
| -rw-r--r-- | server/server.py | 137 |
1 files changed, 87 insertions, 50 deletions
diff --git a/server/server.py b/server/server.py index 3bd953e..30925e1 100644 --- a/server/server.py +++ b/server/server.py @@ -1,54 +1,91 @@ +#!/usr/bin/python2 import logging -logger = logging.getLogger(__name__) -from sleekxmpp.componentxmpp import ComponentXMPP -from sleekxmpp.xmlstream.xmlstream import XMLStream - -from user import UserHandler - -class ObjectComponent(ComponentXMPP): - - def __init__(self, jid, secret, server, port, root): - ComponentXMPP.__init__(self, jid, secret, server, port) - self.register_plugin('xep_0030') - self.register_plugin('xep_0077', pconfig = {'root': root}) - self.plugin['xep_0077'].setForm('pubkey','privkey','salt') - self.register_plugin("AliasPlugin", module = "alias_plugin", pconfig = {'root': root}) - self.add_event_handler("session_start", self.start) - self.add_event_handler("presence_probe", self.presence_probe) - self.add_event_handler("message", self.message) - self.add_event_handler("changed_subscription", self.presence_subscription) - self.userHandler = UserHandler(root) - - def start(self, event): - for user in self.userHandler.get_user_list(): - self.send_presence(pto = user) - - def disconnect(self, reconnect = False): - for user in self.userHandler.get_user_list(): - self.send_presence(pto = user, ptype = "unavailable") - XMLStream.disconnect(self, reconnect) - logger.info('Component {} disconnected'.format(self.boundjid.bare)) - - def message(self, msg): - msg.reply("Thanks for sending\n{[body]}".format(msg)).send() - - def presence_subscription(self, subscription): - if subscription["type"] == "subscribe": - userJID = subscription["from"].full - if not self.userHandler.registered(userJID): - self.userHandler.register(userJID) - logger.info('registering user {}'.format(userJID)) - subscription.reply().send() - self.send_presence(pto = userJID) - self.send_presence_subscription(pto = userJID, ptype = "subscribe") - if subscription["type"] == "unsubscribe": - userJID = subscription["from"].full - if self.userHandler.registered(userJID): - self.userHandler.unregister(userJID) - logger.info('unregistering user {}'.format(userJID)) - - def presence_probe(self, event): - self.send_presence(pto = event["from"].full) +from argparse import ArgumentParser +from config import config +import daemon +import daemon.pidfile +from server import ObjectComponent +import os.path +import sys +if __name__ == '__main__': + commandline = ArgumentParser(description = 'Connect the alias \ + component to a given server') + commandline.add_argument('-p', '--port', + help = 'Port to connect to', + type = int) + commandline.add_argument('-s', '--secret', + help = 'password') + commandline.add_argument('-n', '--name', + help = 'Name the component will have') + commandline.add_argument('-r', '--root', + help = 'Root directory of the user files') + commandline.add_argument('-c', '--config', + help = 'Name of the config file to use') + commandline.add_argument('-d', '--debug', + help = 'Set log level to DEBUG', + action = 'store_const', + const = logging.DEBUG, + default = logging.INFO) + commandline.add_argument('-o', '--host', + help = 'Host to connect to') + commandline.add_argument('-b', '--background', + help = 'run the server in the background', + action = 'store_true') + commandline.add_argument('--logfile', + help = 'location of the log file (default /var/log/${name}.log') + commandline.add_argument('--pidfile', + help = 'location of the pid file (default /var/run/${name}.pid') + args = commandline.parse_args() + if args.config is None: + config.name = args.name + config.port = args.port + config.secret = args.secret + config.root = args.root + config.host = args.host + config.background = args.background + config.logfile = args.logfile + config.pidfile = args.pidfile + else: + filename = args.config + config.read(filename) + if config.logfile is None: + config.logfile = os.path.join('/var/log/', config.name + '.log') + if config.pidfile is None: + config.pidfile = os.path.join('/var/run/', config.name + '.pid') + + #set up the root logger + logging.getLogger('').setLevel(args.debug) + formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") + if config.background: + #save logs in a file + fh = logging.FileHandler(config.logfile) + fh.setFormatter(formatter) + logging.getLogger('').addHandler(fh) + else: + #save logs to the console + ch = logging.StreamHandler() + ch.setFormatter(formatter) + logging.getLogger('').addHandler(ch) + if config.background: + context = daemon.DaemonContext(detach_process = True, + pidfile = daemon.pidfile.TimeoutPIDLockFile(config.pidfile,10), + files_preserve=[fh.stream.fileno()], + working_directory=os.path.abspath(config.root), + stdout=sys.stdout, stderr=sys.stderr) + else: + context = daemon.DaemonContext(detach_process = False, + stdout=sys.stdout, stderr=sys.stderr, + working_directory=os.path.abspath(config.root)) + + with context: + component = ObjectComponent(config.name, config.secret, + config.host, config.port, + config.root) + if component.connect(): + logging.info('Component {} connected'.format(component.boundjid)) + component.process(False) + else: + logging.error("Component {} couldn't connect".format(component.boundjid)) |
