~ubuntu-branches/ubuntu/wily/ubuntu-system-service/wily

« back to all changes in this revision

Viewing changes to UbuntuSystemService/systemd.py

  • Committer: Package Import Robot
  • Author(s): Sebastien Bacher
  • Date: 2013-03-26 21:32:36 UTC
  • mfrom: (19.1.1 oneiric-proposed)
  • Revision ID: package-import@ubuntu.com-20130326213236-4d12qjel0lw3o6pt
Tags: 0.2.4
Drop system compatibility, we use systemd-services instead (lp: #1153567)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
import socket
2
 
import dbus
3
 
import dbus.service
4
 
import dbus.mainloop.glib
5
 
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)  
6
 
 
7
 
from UbuntuSystemService.utils import *
8
 
import os
9
 
import subprocess
10
 
 
11
 
class HostnameSystemdBackend(dbus.service.Object):
12
 
    """
13
 
    the backend implementing the hostnamed systemd interfaces
14
 
    """
15
 
 
16
 
    # some class properties
17
 
    DBUS_HOSTNAME_NAME = "org.freedesktop.hostname1"
18
 
 
19
 
    def __init__(self, bus=None):
20
 
        if bus is None:
21
 
            bus = dbus.SystemBus()
22
 
        bus_name = dbus.service.BusName(self.DBUS_HOSTNAME_NAME, bus=bus)
23
 
        dbus.service.Object.__init__(self, bus_name, "/org/freedesktop/hostname1")
24
 
 
25
 
        # Initialize properties
26
 
        try:
27
 
            f = open("/etc/hostname", "r")
28
 
            static_hostname = f.readline()
29
 
            f.close()
30
 
        except Exception:
31
 
            # We couldn't read /etc/hostname, so ignore
32
 
            static_hostname = socket.gethostname()
33
 
 
34
 
        self.properties = {
35
 
            "Hostname" : socket.gethostname(),
36
 
            "StaticHostname" : static_hostname,
37
 
            "PrettyHostname" : "",
38
 
            "IconName" : ""
39
 
            }
40
 
 
41
 
    # hostnamed interface
42
 
    @dbus.service.method(DBUS_HOSTNAME_NAME,
43
 
                         in_signature='sb',
44
 
                         out_signature='',
45
 
                         sender_keyword='sender',
46
 
                         connection_keyword='conn')
47
 
    def SetHostname(self, name, user_interaction, sender=None, conn=None):
48
 
        """
49
 
        Set the current hostname
50
 
        """
51
 
        if not authWithPolicyKit(sender, conn,
52
 
                                 "org.freedesktop.hostname1.set-hostname",
53
 
                                 user_interaction):
54
 
            raise PermissionDeniedError("Permission denied by policy")
55
 
 
56
 
        if subprocess.call(["hostname", "-b", name]) != 0:
57
 
            raise PermissionDeniedError("Could not run hostname command")
58
 
 
59
 
        self.properties["Hostname"] = name
60
 
        self.PropertiesChanged(self.DBUS_HOSTNAME_NAME,
61
 
                               { "Hostname": name },
62
 
                               [])
63
 
 
64
 
        return
65
 
 
66
 
    @dbus.service.method(DBUS_HOSTNAME_NAME,
67
 
                         in_signature='sb',
68
 
                         out_signature='',
69
 
                         sender_keyword='sender',
70
 
                         connection_keyword='conn')
71
 
    def SetStaticHostname(self, name, user_interaction, sender=None, conn=None):
72
 
        """
73
 
        Set the static hostname
74
 
        """
75
 
        if not authWithPolicyKit(sender, conn,
76
 
                                 "org.freedesktop.hostname1.set-static-hostname",
77
 
                                 user_interaction):
78
 
            raise PermissionDeniedError("Permission denied by policy")
79
 
 
80
 
        try:
81
 
            f = open("/etc/hostname", "w")
82
 
            f.write(name)
83
 
            f.close()
84
 
 
85
 
            self.properties["StaticHostname"] = name
86
 
            self.PropertiesChanged(self.DBUS_HOSTNAME_NAME,
87
 
                                   { "StaticHostname": name },
88
 
                                   [])
89
 
        except Exception:
90
 
            raise PermissionDeniedError("Can't write to /etc/hostname")
91
 
 
92
 
    @dbus.service.method(DBUS_HOSTNAME_NAME,
93
 
                         in_signature='sb',
94
 
                         out_signature='',
95
 
                         sender_keyword='sender',
96
 
                         connection_keyword='conn')
97
 
    def SetPrettyHostname(self, name, user_interaction, sender=None, conn=None):
98
 
        """
99
 
        Set the pretty hostname
100
 
        """
101
 
        # We don't have a standard place to have this information,
102
 
        # so ignoring for now
103
 
        pass
104
 
 
105
 
    @dbus.service.method(DBUS_HOSTNAME_NAME,
106
 
                         in_signature='sb',
107
 
                         out_signature='',
108
 
                         sender_keyword='sender',
109
 
                         connection_keyword='conn')
110
 
    def SetIconName(self, name, user_interaction, sender=None, conn=None):
111
 
        """
112
 
        Set icon name for this host
113
 
        """
114
 
        # We don't have a standard place to have this information,
115
 
        # so ignoring for now
116
 
        pass
117
 
 
118
 
    # Properties
119
 
    @dbus.service.method(dbus.PROPERTIES_IFACE,
120
 
                         in_signature='ss',
121
 
                         out_signature='v')
122
 
    def Get(self, interface_name, property_name):
123
 
        return self.properties[property_name]
124
 
 
125
 
    @dbus.service.method(dbus.PROPERTIES_IFACE,
126
 
                         in_signature='s',
127
 
                         out_signature='a{sv}')
128
 
    def GetAll(self, interface_name):
129
 
        if interface_name == self.DBUS_HOSTNAME_NAME:
130
 
            return self.properties
131
 
        else:
132
 
            raise dbus.exceptions.DBusException(
133
 
                'com.example.UnknownInterface',
134
 
                'The Foo object does not implement the %s interface'
135
 
                % interface_name)
136
 
 
137
 
    @dbus.service.method(dbus.PROPERTIES_IFACE,
138
 
                         in_signature='ssv')
139
 
    def Set(self, interface_name, property_name, new_value):
140
 
        # All our properties are read-only
141
 
        pass
142
 
 
143
 
    @dbus.service.signal(dbus.PROPERTIES_IFACE,
144
 
                         signature='sa{sv}as')
145
 
    def PropertiesChanged(self, interface_name, changed_properties,
146
 
                          invalidated_properties):
147
 
        pass
148
 
 
149
 
 
150
 
class LocaleSystemdBackend(dbus.service.Object):
151
 
    """
152
 
    the backend implementing the localed systemd interfaces
153
 
    """
154
 
 
155
 
    # some class properties
156
 
    DBUS_LOCALE_NAME = "org.freedesktop.locale1"
157
 
 
158
 
    def __init__(self, bus=None):
159
 
        if bus is None:
160
 
            bus = dbus.SystemBus()
161
 
        bus_name = dbus.service.BusName(self.DBUS_LOCALE_NAME, bus=bus)
162
 
        dbus.service.Object.__init__(self, bus_name, "/org/freedesktop/locale1")
163
 
 
164
 
        # Initialize properties
165
 
        locale = []
166
 
        try:
167
 
            f = open("/etc/default/locale")
168
 
            for line in f:
169
 
                if line.startswith("LANG") or line.startswith("LC_"):
170
 
                    locale.append(line.strip('\n'))
171
 
 
172
 
            f.close()
173
 
        except Exception:
174
 
            pass
175
 
 
176
 
        (model, layout, variant, options) = get_keyboard_from_etc()
177
 
        self.properties = {
178
 
            "Locale" : locale,
179
 
            "VConsoleKeymap" : '',
180
 
            "VConsoleKeymapToggle" : '',
181
 
            "X11Layout" : layout,
182
 
            "X11Model" : model,
183
 
            "X11Variant" : variant,
184
 
            "X11Options" : options
185
 
            }
186
 
 
187
 
    # localed interface
188
 
    @dbus.service.method(DBUS_LOCALE_NAME,
189
 
                         in_signature='asb',
190
 
                         out_signature='',
191
 
                         sender_keyword='sender',
192
 
                         connection_keyword='conn')
193
 
    def SetLocale(self, locale, user_interaction, sender=None, conn=None):
194
 
        """
195
 
        Set the system locale
196
 
        """
197
 
        if not authWithPolicyKit(sender, conn,
198
 
                                 "org.freedesktop.locale1.set-locale",
199
 
                                 user_interaction):
200
 
            raise PermissionDeniedError("Permission denied by policy")
201
 
 
202
 
        try:
203
 
            f = open("/etc/default/locale", "w")
204
 
            for line in locale:
205
 
                f.write(line + "\n")
206
 
            f.close();
207
 
 
208
 
            self.properties["Locale"] = locale
209
 
            self.PropertiesChanged(self.DBUS_LOCALE_NAME,
210
 
                                   { "Locale": locale },
211
 
                                   [])
212
 
        except Exception:
213
 
            raise PermissionDeniedError("Could not save to /etc/default/locale")
214
 
 
215
 
    @dbus.service.method(DBUS_LOCALE_NAME,
216
 
                         in_signature='ssbb',
217
 
                         out_signature='',
218
 
                         sender_keyword='sender',
219
 
                         connection_keyword='conn')
220
 
    def SetVConsoleKeyboard(self, keymap, keymap_toggle, convert, user_interaction, sender=None, conn=None):
221
 
        """
222
 
        Set vconsole keyboard
223
 
        """
224
 
        if not authWithPolicyKit(sender, conn,
225
 
                                 "org.freedesktop.locale1.set-keyboard",
226
 
                                 user_interaction):
227
 
            raise PermissionDeniedError("Permission denied by policy")
228
 
 
229
 
    @dbus.service.method(DBUS_LOCALE_NAME,
230
 
                         in_signature='ssssbb',
231
 
                         out_signature='',
232
 
                         sender_keyword='sender',
233
 
                         connection_keyword='conn')
234
 
    def SetX11Keyboard(self, layout, model, variant, options, convert, user_interaction, sender=None, conn=None):
235
 
        """
236
 
        Set the keyboard for X11
237
 
        """
238
 
        if not authWithPolicyKit(sender, conn,
239
 
                                 "org.freedesktop.locale1.set-keyboard",
240
 
                                 user_interaction):
241
 
            raise PermissionDeniedError("Permission denied by policy")
242
 
 
243
 
        if set_keyboard_to_etc(model, layout, variant, options):
244
 
            self.properties["X11Layout"] = layout
245
 
            self.properties["X11Model"] = model
246
 
            self.properties["X11Variant"] = variant
247
 
            self.properties["X11Options"] = options
248
 
 
249
 
            self.PropertiesChanged(self.DBUS_LOCALE_NAME,
250
 
                                   { "X11Layout": layout,
251
 
                                     "X11Model": model,
252
 
                                     "X11Variant": variant,
253
 
                                     "X11Options": options },
254
 
                                   [])
255
 
        return
256
 
    
257
 
    # Properties
258
 
    @dbus.service.method(dbus.PROPERTIES_IFACE,
259
 
                         in_signature='ss',
260
 
                         out_signature='v')
261
 
    def Get(self, interface_name, property_name):
262
 
        return self.properties[property_name]
263
 
 
264
 
    @dbus.service.method(dbus.PROPERTIES_IFACE,
265
 
                         in_signature='s',
266
 
                         out_signature='a{sv}')
267
 
    def GetAll(self, interface_name):
268
 
        if interface_name == self.DBUS_LOCALE_NAME:
269
 
            return self.properties
270
 
        else:
271
 
            raise dbus.exceptions.DBusException(
272
 
                'com.example.UnknownInterface',
273
 
                'The Foo object does not implement the %s interface'
274
 
                % interface_name)
275
 
 
276
 
    @dbus.service.method(dbus.PROPERTIES_IFACE,
277
 
                         in_signature='ssv')
278
 
    def Set(self, interface_name, property_name, new_value):
279
 
        # All our properties are read-only
280
 
        pass
281
 
 
282
 
    @dbus.service.signal(dbus.PROPERTIES_IFACE,
283
 
                         signature='sa{sv}as')
284
 
    def PropertiesChanged(self, interface_name, changed_properties,
285
 
                          invalidated_properties):
286
 
        pass