Ticket #1152: xs-register

File xs-register, 2.4 KB (added by dsd, 15 years ago)
Line 
1#!/usr/bin/python
2import logging
3from gettext import gettext as _
4from xmlrpclib import ServerProxy, Error
5import socket
6import os
7import dbus
8
9from sugar.profile import get_profile
10
11REGISTER_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
17class RegisterError(Exception):
18    pass
19
20def 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
65def retry_connections():
66    obj = dbus.SessionBus().get_object(_PS_IFACE, _PS_PATH)
67    ps = dbus.Interface(obj, _PS_IFACE)
68    ps.RetryConnections()
69
70def sugar_reload_profile():
71    obj = dbus.SessionBus().get_object(_SHELL_IFACE, _SHELL_PATH)
72    shell = dbus.Interface(obj, _SHELL_IFACE)
73    shell.ReloadProfile()
74
75def have_ofw_tree():
76    return os.path.exists('/ofw')
77
78def 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
87if __name__ == "__main__":
88    register_laptop()
89