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