/usr/lib/python3/dist-packages/galternatives/app.py is in galternatives 0.92.4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | from __future__ import absolute_import
from . import logger, eprint, _, PACKAGE, APPID, alternative
from .appdata import *
from .gui import MainWindow, AboutDialog
from .utils import cached_property
try:
from .log import set_logger
except ImportError:
set_logger = None
from gi.repository import Gio, GLib, Gtk
import shutil
import os
class GAlternativesApp(Gtk.Application):
use_polkit = False
target_group = None
def __init__(self, *args, **kwargs):
super(GAlternativesApp, self).__init__(
*args, application_id=APPID,
flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE,
**kwargs)
self.add_main_option(
'debug', ord('d'), GLib.OptionFlags.NONE, GLib.OptionArg.NONE,
_('Enable debug output'), None)
self.add_main_option(
'normal', ord('n'), GLib.OptionFlags.NONE, GLib.OptionArg.NONE,
_('Do not try to acquire root (as normal user)'), None)
self.add_main_option(
'altdir', 0, GLib.OptionFlags.NONE, GLib.OptionArg.FILENAME,
_('Specify the alternatives directory'), None)
self.add_main_option(
'admindir', 0, GLib.OptionFlags.NONE, GLib.OptionArg.FILENAME,
_('Specify the administrative directory'), None)
self.add_main_option(
'log', 0, GLib.OptionFlags.NONE, GLib.OptionArg.FILENAME,
_('Specify the log file'), None)
# BUG: Gtk.Application.add_option_group() not working
def do_handle_local_options(self, options):
if not self.debug:
self.debug = bool(options.contains('debug'))
if set_logger:
set_logger(PACKAGE, self.debug)
logger.debug(_('Testing galternatives...'))
# GtkBuilder will error out if the version requirements are not met.
# No need to check it again.
if os.getuid():
# not root
if options.contains('normal'):
logger.warn(_(
'No root detected, but continue as in your wishes'))
elif shutil.which('pkexec'):
self.use_polkit = True
else:
dialog = Gtk.MessageDialog(
None, Gtk.DialogFlags.DESTROY_WITH_PARENT,
Gtk.MessageType.WARNING, Gtk.ButtonsType.OK_CANCEL,
_('<b><tt>pkexec</tt> required for privileged '
'operations.</b>'),
use_markup=True,
secondary_text=_(
'The program needs pkexec to perform privileged '
'alternatives system modifications under normal user. '
'Unless you have modified your system to explicitly '
'allow your normal user to do so, GAlternatives will '
'not work.'))
if dialog.run() != Gtk.ResponseType.OK:
return 1
dialog.destroy()
self.paths = {}
for option in alternative.Alternative.PATHS:
value = options.lookup_value(option)
if value:
value = value.unpack()
value.pop()
self.paths[option] = bytearray(value).decode('utf-8')
return -1
def do_local_command_line(self, arguments):
self.debug = False
for i, arg in enumerate(arguments):
if arg.startswith('-dd'):
self.debug = 2
break
return Gtk.Application.do_local_command_line(self, arguments)
def do_command_line(self, command_line):
args = command_line.get_arguments()
if len(args) > 2:
eprint(_('Specifying more than one group not allowed'))
return 2
if len(args) > 1:
self.target_group = args[1]
if self.target_group not in self.window.alt_db:
eprint(_('No such group'))
self.window.destroy()
return 1
self.activate()
return 0
def do_startup(self):
Gtk.Application.do_startup(self)
self.set_app_menu(
Gtk.Builder.new_from_file(get_data_path('glade/menubar.ui'))
.get_object('menu'))
# Cannot use add_action_entries()
# see https://bugzilla.gnome.org/show_bug.cgi?id=678655
for name, activate in {
'about': self.on_about,
}.items():
action = Gio.SimpleAction(name=name)
action.connect('activate', activate)
self.add_action(action)
def do_activate(self):
if self.debug > 1:
self.window.edit_warning_show_check.set_active(False)
self.window.show()
def on_about(self, action, param):
self.about_dialog.present()
@cached_property
def about_dialog(self):
return AboutDialog(
transient_for=self.window and self.window.main_window)
@cached_property
def window(self):
return MainWindow(self, self.paths, self.target_group)
|