93 lines
3.2 KiB
Python
Executable File
93 lines
3.2 KiB
Python
Executable File
#! /usr/bin/python3
|
|
|
|
# Wrapper script to run Ubiquity as root using the appropriate privilege
|
|
# escalation method for the frontend.
|
|
|
|
import os
|
|
import sys
|
|
|
|
sys.path.insert(0, '/usr/lib/ubiquity')
|
|
|
|
from ubiquity import osextras
|
|
|
|
|
|
def main():
|
|
newargv = []
|
|
frontend = None
|
|
toexec = []
|
|
|
|
i = 1
|
|
while i < len(sys.argv):
|
|
if not sys.argv[i].startswith('-'):
|
|
frontend = sys.argv[i]
|
|
elif sys.argv[i] == '--autopilot':
|
|
try:
|
|
os.environ['GTK_MODULES'] += os.pathsep + 'autopilot'
|
|
except KeyError:
|
|
os.environ['GTK_MODULES'] = 'autopilot'
|
|
newargv.append(sys.argv[i])
|
|
i += 1
|
|
|
|
if os.getuid() == 0:
|
|
# no privilege escalation required
|
|
inner = ['/usr/lib/ubiquity/bin/ubiquity'] + newargv
|
|
|
|
# Make sure ibus works
|
|
if (os.getenv("GTK_IM_MODULE") == "ibus" and
|
|
os.getenv("XDG_SESSION_COOKIE")):
|
|
ibus_path = os.path.expanduser("~/.config/ibus/bus")
|
|
if os.path.exists(ibus_path):
|
|
# Guess the path to the ibus config file
|
|
ibus_filename = "%s-unix-0" % (
|
|
os.getenv("XDG_SESSION_COOKIE").split("-")[0])
|
|
ibus_config = os.path.join(ibus_path, ibus_filename)
|
|
with open(ibus_config, "r") as fp:
|
|
for line in fp:
|
|
fields = line.strip().split('=', 1)
|
|
# If we get KEY=VALUE, export it in the environment
|
|
if len(fields) == 2:
|
|
os.environ[fields[0]] = fields[1]
|
|
|
|
# Ensure the OOM killer doesn't nom on us.
|
|
with open('/proc/%d/oom_score_adj' % os.getpid(), 'w') as fp:
|
|
fp.write('-1000')
|
|
|
|
# Disable storage automounting
|
|
udisks2 = '/usr/lib/udisks2/udisks2-inhibit'
|
|
if os.path.isfile(udisks2) and os.access(udisks2, os.X_OK):
|
|
toexec += [udisks2] + inner
|
|
elif osextras.find_on_path('udisks'):
|
|
toexec += ['udisks', '--inhibit', '--'] + inner
|
|
elif (osextras.find_on_path('hal-lock') and
|
|
not os.system('pgrep hald>/dev/null')):
|
|
toexec += ['hal-lock',
|
|
'--interface', 'org.freedesktop.Hal.Device.Storage',
|
|
'--exclusive', '--run', ' '.join(inner)]
|
|
else:
|
|
toexec += inner
|
|
else:
|
|
if frontend is None:
|
|
# Try to detect which frontend will be used by looking for a
|
|
# frontend module.
|
|
from importlib import util
|
|
frontend_names = ['gtk_ui', 'kde_ui']
|
|
for f in frontend_names:
|
|
if util.find_spec('ubiquity.frontend.%s' % f) is not None:
|
|
frontend = f
|
|
break
|
|
if frontend is None:
|
|
raise AttributeError('No frontend available; tried %s' %
|
|
', '.join(frontend_names))
|
|
|
|
toexec = ['pkexec', sys.argv[0]]
|
|
toexec.extend(newargv)
|
|
|
|
if 'UBIQUITY_WRAPPER_DEBUG' in os.environ:
|
|
print(toexec, file=sys.stderr)
|
|
os.execvp(toexec[0], toexec)
|
|
sys.exit(127)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|