4
import dbus.mainloop.glib
5
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
7
from UbuntuSystemService.utils import *
11
class HostnameSystemdBackend(dbus.service.Object):
13
the backend implementing the hostnamed systemd interfaces
16
# some class properties
17
DBUS_HOSTNAME_NAME = "org.freedesktop.hostname1"
19
def __init__(self, bus=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")
25
# Initialize properties
27
f = open("/etc/hostname", "r")
28
static_hostname = f.readline()
31
# We couldn't read /etc/hostname, so ignore
32
static_hostname = socket.gethostname()
35
"Hostname" : socket.gethostname(),
36
"StaticHostname" : static_hostname,
37
"PrettyHostname" : "",
42
@dbus.service.method(DBUS_HOSTNAME_NAME,
45
sender_keyword='sender',
46
connection_keyword='conn')
47
def SetHostname(self, name, user_interaction, sender=None, conn=None):
49
Set the current hostname
51
if not authWithPolicyKit(sender, conn,
52
"org.freedesktop.hostname1.set-hostname",
54
raise PermissionDeniedError("Permission denied by policy")
56
if subprocess.call(["hostname", "-b", name]) != 0:
57
raise PermissionDeniedError("Could not run hostname command")
59
self.properties["Hostname"] = name
60
self.PropertiesChanged(self.DBUS_HOSTNAME_NAME,
66
@dbus.service.method(DBUS_HOSTNAME_NAME,
69
sender_keyword='sender',
70
connection_keyword='conn')
71
def SetStaticHostname(self, name, user_interaction, sender=None, conn=None):
73
Set the static hostname
75
if not authWithPolicyKit(sender, conn,
76
"org.freedesktop.hostname1.set-static-hostname",
78
raise PermissionDeniedError("Permission denied by policy")
81
f = open("/etc/hostname", "w")
85
self.properties["StaticHostname"] = name
86
self.PropertiesChanged(self.DBUS_HOSTNAME_NAME,
87
{ "StaticHostname": name },
90
raise PermissionDeniedError("Can't write to /etc/hostname")
92
@dbus.service.method(DBUS_HOSTNAME_NAME,
95
sender_keyword='sender',
96
connection_keyword='conn')
97
def SetPrettyHostname(self, name, user_interaction, sender=None, conn=None):
99
Set the pretty hostname
101
# We don't have a standard place to have this information,
102
# so ignoring for now
105
@dbus.service.method(DBUS_HOSTNAME_NAME,
108
sender_keyword='sender',
109
connection_keyword='conn')
110
def SetIconName(self, name, user_interaction, sender=None, conn=None):
112
Set icon name for this host
114
# We don't have a standard place to have this information,
115
# so ignoring for now
119
@dbus.service.method(dbus.PROPERTIES_IFACE,
122
def Get(self, interface_name, property_name):
123
return self.properties[property_name]
125
@dbus.service.method(dbus.PROPERTIES_IFACE,
127
out_signature='a{sv}')
128
def GetAll(self, interface_name):
129
if interface_name == self.DBUS_HOSTNAME_NAME:
130
return self.properties
132
raise dbus.exceptions.DBusException(
133
'com.example.UnknownInterface',
134
'The Foo object does not implement the %s interface'
137
@dbus.service.method(dbus.PROPERTIES_IFACE,
139
def Set(self, interface_name, property_name, new_value):
140
# All our properties are read-only
143
@dbus.service.signal(dbus.PROPERTIES_IFACE,
144
signature='sa{sv}as')
145
def PropertiesChanged(self, interface_name, changed_properties,
146
invalidated_properties):
150
class LocaleSystemdBackend(dbus.service.Object):
152
the backend implementing the localed systemd interfaces
155
# some class properties
156
DBUS_LOCALE_NAME = "org.freedesktop.locale1"
158
def __init__(self, bus=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")
164
# Initialize properties
167
f = open("/etc/default/locale")
169
if line.startswith("LANG") or line.startswith("LC_"):
170
locale.append(line.strip('\n'))
176
(model, layout, variant, options) = get_keyboard_from_etc()
179
"VConsoleKeymap" : '',
180
"VConsoleKeymapToggle" : '',
181
"X11Layout" : layout,
183
"X11Variant" : variant,
184
"X11Options" : options
188
@dbus.service.method(DBUS_LOCALE_NAME,
191
sender_keyword='sender',
192
connection_keyword='conn')
193
def SetLocale(self, locale, user_interaction, sender=None, conn=None):
195
Set the system locale
197
if not authWithPolicyKit(sender, conn,
198
"org.freedesktop.locale1.set-locale",
200
raise PermissionDeniedError("Permission denied by policy")
203
f = open("/etc/default/locale", "w")
208
self.properties["Locale"] = locale
209
self.PropertiesChanged(self.DBUS_LOCALE_NAME,
210
{ "Locale": locale },
213
raise PermissionDeniedError("Could not save to /etc/default/locale")
215
@dbus.service.method(DBUS_LOCALE_NAME,
218
sender_keyword='sender',
219
connection_keyword='conn')
220
def SetVConsoleKeyboard(self, keymap, keymap_toggle, convert, user_interaction, sender=None, conn=None):
222
Set vconsole keyboard
224
if not authWithPolicyKit(sender, conn,
225
"org.freedesktop.locale1.set-keyboard",
227
raise PermissionDeniedError("Permission denied by policy")
229
@dbus.service.method(DBUS_LOCALE_NAME,
230
in_signature='ssssbb',
232
sender_keyword='sender',
233
connection_keyword='conn')
234
def SetX11Keyboard(self, layout, model, variant, options, convert, user_interaction, sender=None, conn=None):
236
Set the keyboard for X11
238
if not authWithPolicyKit(sender, conn,
239
"org.freedesktop.locale1.set-keyboard",
241
raise PermissionDeniedError("Permission denied by policy")
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
249
self.PropertiesChanged(self.DBUS_LOCALE_NAME,
250
{ "X11Layout": layout,
252
"X11Variant": variant,
253
"X11Options": options },
258
@dbus.service.method(dbus.PROPERTIES_IFACE,
261
def Get(self, interface_name, property_name):
262
return self.properties[property_name]
264
@dbus.service.method(dbus.PROPERTIES_IFACE,
266
out_signature='a{sv}')
267
def GetAll(self, interface_name):
268
if interface_name == self.DBUS_LOCALE_NAME:
269
return self.properties
271
raise dbus.exceptions.DBusException(
272
'com.example.UnknownInterface',
273
'The Foo object does not implement the %s interface'
276
@dbus.service.method(dbus.PROPERTIES_IFACE,
278
def Set(self, interface_name, property_name, new_value):
279
# All our properties are read-only
282
@dbus.service.signal(dbus.PROPERTIES_IFACE,
283
signature='sa{sv}as')
284
def PropertiesChanged(self, interface_name, changed_properties,
285
invalidated_properties):