1 | #!/usr/bin/python |
---|
2 | import logging |
---|
3 | from gettext import gettext as _ |
---|
4 | from xmlrpclib import ServerProxy, Error |
---|
5 | import socket |
---|
6 | import os |
---|
7 | import dbus |
---|
8 | |
---|
9 | from sugar.profile import get_profile |
---|
10 | |
---|
11 | REGISTER_URL = 'http://schoolserver:8080/' |
---|
12 | _PS_PATH = '/org/laptop/Sugar/Presence' |
---|
13 | _PS_IFACE = 'org.laptop.Sugar.Presence' |
---|
14 | _SHELL_PATH = '/org/laptop/Shell' |
---|
15 | _SHELL_IFACE = 'org.laptop.Shell' |
---|
16 | |
---|
17 | class RegisterError(Exception): |
---|
18 | pass |
---|
19 | |
---|
20 | def register_laptop(url=REGISTER_URL): |
---|
21 | if not have_ofw_tree(): |
---|
22 | logging.error('Registration: Cannot obtain data needed to register.') |
---|
23 | raise RegisterError(_('Cannot obtain data needed for registration.')) |
---|
24 | |
---|
25 | sn = read_ofw('mfg-data/SN') |
---|
26 | uuid = read_ofw('mfg-data/U#') |
---|
27 | sn = sn or 'SHF00000000' |
---|
28 | uuid = uuid or '00000000-0000-0000-0000-000000000000' |
---|
29 | |
---|
30 | profile = get_profile() |
---|
31 | if not profile.is_valid(): |
---|
32 | logging.warning('Not registering yet: profile not valid') |
---|
33 | return |
---|
34 | |
---|
35 | server = ServerProxy(url) |
---|
36 | try: |
---|
37 | data = server.register(sn, profile.nick_name, uuid, profile.pubkey) |
---|
38 | except (Error, socket.error), e: |
---|
39 | logging.error('Registration: cannot connect to server: %s' % e) |
---|
40 | raise RegisterError(_('Cannot connect to the server.')) |
---|
41 | |
---|
42 | if data['success'] != 'OK': |
---|
43 | logging.error('Registration: server could not complete request: %s' % |
---|
44 | data['error']) |
---|
45 | raise RegisterError(_('The server could not complete the request.')) |
---|
46 | |
---|
47 | profile.jabber_server = data['jabberserver'] |
---|
48 | profile.backup1 = data['backupurl'] |
---|
49 | profile.save() |
---|
50 | |
---|
51 | # ask sugar to reload profile |
---|
52 | try: |
---|
53 | sugar_reload_profile() |
---|
54 | except: |
---|
55 | pass |
---|
56 | |
---|
57 | # ask presence service to connect to the new school server |
---|
58 | try: |
---|
59 | retry_connections() |
---|
60 | except: |
---|
61 | pass |
---|
62 | |
---|
63 | return True |
---|
64 | |
---|
65 | def retry_connections(): |
---|
66 | obj = dbus.SessionBus().get_object(_PS_IFACE, _PS_PATH) |
---|
67 | ps = dbus.Interface(obj, _PS_IFACE) |
---|
68 | ps.RetryConnections() |
---|
69 | |
---|
70 | def sugar_reload_profile(): |
---|
71 | obj = dbus.SessionBus().get_object(_SHELL_IFACE, _SHELL_PATH) |
---|
72 | shell = dbus.Interface(obj, _SHELL_IFACE) |
---|
73 | shell.ReloadProfile() |
---|
74 | |
---|
75 | def have_ofw_tree(): |
---|
76 | return os.path.exists('/ofw') |
---|
77 | |
---|
78 | def read_ofw(path): |
---|
79 | path = os.path.join('/ofw', path) |
---|
80 | if not os.path.exists(path): |
---|
81 | return None |
---|
82 | fh = open(path, 'r') |
---|
83 | data = fh.read().rstrip('\0\n') |
---|
84 | fh.close() |
---|
85 | return data |
---|
86 | |
---|
87 | if __name__ == "__main__": |
---|
88 | register_laptop() |
---|
89 | |
---|