aboutsummaryrefslogtreecommitdiffstats
path: root/server/server.py
blob: 7b39330d162eb19ed6f7dacbfe248e474224fd65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/usr/bin/python2
import logging
from argparse import ArgumentParser

from sleekxmpp.componentxmpp import ComponentXMPP
from sleekxmpp.xmlstream.xmlstream import XMLStream

from user import UserHandler
from config import filename, config
import daemon
from lockfile.pidlockfile import PIDLockFile

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("AliasPlugin", module = "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)
        logging.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)
            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)

    def presence_probe(self, event):
        self.send_presence(pto = event["from"].full)


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')

    args = commandline.parse_args()

    if args.config is None:
        logging.basicConfig(level = args.debug)
        config.name = args.name
        config.port = args.port
        config.secret = args.secret
        config.root = args.root
        config.host = args.host
        config.background = args.background
    else:
        filename = args.config
        logging.basicConfig(level = args.debug)
        config.read(filename)
        
with daemon.DaemonContext(detach_process = config.background,
                          pidfile = PIDLockFile('alias.pid'),
                          working_directory = '.'):
    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))