103 lines
4.4 KiB
Python
Executable File
103 lines
4.4 KiB
Python
Executable File
#!/usr/bin/python3
|
|
|
|
import dbus
|
|
import dbus.mainloop.glib
|
|
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
|
|
import dbus.service
|
|
from gi.repository import GObject
|
|
import logging
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
|
|
import LanguageSelector.macros
|
|
|
|
from LanguageSelector.utils import *
|
|
|
|
DATADIR="/usr/share/language-selector/"
|
|
|
|
class LanguageSelectorServer(dbus.service.Object):
|
|
def __init__(self, bus=dbus.SystemBus(), datadir=DATADIR):
|
|
bus_name = dbus.service.BusName('com.ubuntu.LanguageSelector',
|
|
bus=bus)
|
|
dbus.service.Object.__init__(self, bus_name, '/')
|
|
self._datadir = "/usr/share/language-selector/"
|
|
self._re_locale = re.compile(r'^[\w.@:-]+$')
|
|
|
|
def _authWithPolicyKit(self, sender, connection, priv):
|
|
logging.debug("_authWithPolicyKit")
|
|
system_bus = dbus.SystemBus()
|
|
obj = system_bus.get_object("org.freedesktop.PolicyKit1",
|
|
"/org/freedesktop/PolicyKit1/Authority",
|
|
"org.freedesktop.PolicyKit1.Authority")
|
|
policykit = dbus.Interface(obj, "org.freedesktop.PolicyKit1.Authority")
|
|
subject = ('system-bus-name',
|
|
{ 'name': dbus.String(sender, variant_level = 1) }
|
|
)
|
|
details = { '' : '' }
|
|
flags = dbus.UInt32(1) # AllowUserInteraction = 0x00000001
|
|
cancel_id = ''
|
|
(ok, notused, details) = policykit.CheckAuthorization(
|
|
subject, priv, details, flags, cancel_id)
|
|
return ok
|
|
|
|
@dbus.service.method(dbus_interface='com.ubuntu.LanguageSelector',
|
|
in_signature="s",
|
|
out_signature="b",
|
|
connection_keyword='connection',
|
|
sender_keyword='sender')
|
|
def SetSystemDefaultLanguageEnv(self, sysLanguage, sender, connection):
|
|
""" sysLanguage - the default system LANGUAGE and LANG """
|
|
logging.debug("SetSystemDefaultLanguage")
|
|
if not self._re_locale.search(sysLanguage):
|
|
logging.error('SetSystemDefaultLanguage: Invalid locale "%s", rejecting', sysLanguage)
|
|
return False
|
|
if not self._authWithPolicyKit(sender, connection, "com.ubuntu.languageselector.setsystemdefaultlanguage"):
|
|
return False
|
|
conffiles = ["/etc/default/locale"]
|
|
findString = "LANGUAGE="
|
|
setString = "LANGUAGE=\"%s\"\n" % sysLanguage
|
|
find_string_and_replace(findString, setString, conffiles)
|
|
defaultLanguageLocale = language2locale(sysLanguage)
|
|
findString = "LANG="
|
|
setString = "LANG=\"%s\"\n" % defaultLanguageLocale
|
|
find_string_and_replace(findString, setString, conffiles)
|
|
return True
|
|
|
|
@dbus.service.method(dbus_interface='com.ubuntu.LanguageSelector',
|
|
in_signature="s",
|
|
out_signature="b",
|
|
connection_keyword='connection',
|
|
sender_keyword='sender')
|
|
def SetSystemDefaultFormatsEnv(self, sysFormats, sender, connection):
|
|
""" sysFormats: various LC_* variables (de_DE.UTF-8) """
|
|
logging.debug("SetSystemDefaultFormatsEnv")
|
|
if not self._re_locale.search(sysFormats):
|
|
logging.error('SetSystemDefaultFormatsEnv: Invalid locale "%s", rejecting', sysFormats)
|
|
return False
|
|
if not self._authWithPolicyKit(sender, connection, "com.ubuntu.languageselector.setsystemdefaultlanguage"):
|
|
return False
|
|
conffiles = ["/etc/default/locale"]
|
|
macr = LanguageSelector.macros.LangpackMacros(self._datadir, sysFormats)
|
|
defaultFormatsLocale = macr['SYSLOCALE']
|
|
for var in 'LC_NUMERIC', 'LC_TIME', 'LC_MONETARY', 'LC_PAPER', 'LC_IDENTIFICATION', \
|
|
'LC_NAME', 'LC_ADDRESS', 'LC_TELEPHONE', 'LC_MEASUREMENT':
|
|
findString = "%s=" % var
|
|
setString = "%s=\"%s\"\n" % (var, defaultFormatsLocale)
|
|
find_string_and_replace(findString, setString, conffiles)
|
|
""" /etc/papersize ('a4' or 'letter') """
|
|
papersize = subprocess.check_output(
|
|
['/usr/share/language-tools/locale2papersize', defaultFormatsLocale],
|
|
universal_newlines=True)
|
|
with open('/etc/papersize', 'w') as f:
|
|
f.write(papersize)
|
|
return True
|
|
|
|
if __name__ == "__main__":
|
|
# FIXME: use argparse
|
|
if len(sys.argv) > 1 and sys.argv[1] == "--debug":
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
server = LanguageSelectorServer()
|
|
GObject.MainLoop().run()
|
|
|