/usr/share/system-config-printer/install-printerdriver.py is in system-config-printer-gnome 1.5.7+20160212-0ubuntu2.
This file is owned by root:root, with mode 0o755.
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 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | #!/usr/bin/python3
from gi.repository import GLib, PackageKitGlib
import sys
from debug import *
# progress callback
# http://www.packagekit.org/gtk-doc/PkProgress.html
def progress(progress, type, user_data):
if (type.value_name == "PK_PROGRESS_TYPE_PERCENTAGE" and
progress.props.package is not None):
sys.stdout.write ("P%d\n" % progress.props.percentage)
sys.stdout.flush ()
else:
sys.stdout.write ("P%d\n" % -10)
sys.stdout.flush ()
set_debugging (True)
package = sys.argv[1]
repo = sys.argv[2]
try:
repo_gpg_id = sys.argv[3]
except:
repo_gpg_id = None
# get PackageKit client
pk = PackageKitGlib.Client()
refresh_cache_needed = False
# install repository key
if repo_gpg_id:
debugprint("Signature key supplied")
debugprint("pk.install_signature")
try:
res = pk.install_signature(PackageKitGlib.SigTypeEnum.GPG, repo_gpg_id,
'', None, progress, None)
refresh_cache_needed = True
debugprint("pk.install_signature succeeded")
except GLib.GError:
debugprint("pk.install_signature failed")
sys.exit(1)
if res.get_exit_code() != PackageKitGlib.ExitEnum.SUCCESS:
debugprint("pk.install_signature errored")
sys.exit(1)
# check if we already have the package installed or available
debugprint("pk.resolve")
try:
res = pk.resolve(PackageKitGlib.FilterEnum.NONE, [package],
None, progress, None)
repo_enable_needed = False
debugprint("pk.resolve succeeded")
except GLib.GError:
repo_enable_needed = True
debugprint("pk.resolve failed")
package_ids = res.get_package_array()
if len(package_ids) <= 0:
debugprint("res.get_package_array() failed")
repo_enable_needed = True
if repo_enable_needed:
# Cannot resolve, so we need to install the repo
# add repository; see
# http://www.packagekit.org/gtk-doc/PackageKit-pk-client-sync.html#pk-client-repo-enable
debugprint("pk.repo_enable")
try:
res = pk.repo_enable(repo, True, None, progress, None)
refresh_cache_needed = True
debugprint("pk.repo_enable succeeded")
except GLib.GError:
debugprint("pk.repo_enable failed")
sys.exit(1)
if res.get_exit_code() != PackageKitGlib.ExitEnum.SUCCESS:
debugprint("pk.repo_enable errored")
sys.exit(1)
if refresh_cache_needed:
# download/update the indexes
debugprint("pk.refresh_cache")
try:
res = pk.refresh_cache(False, None, progress, None)
debugprint("pk.refresh_cache succeeded")
except GLib.GError:
debugprint("pk.refresh_cache failed")
if res.get_exit_code() != PackageKitGlib.ExitEnum.SUCCESS:
debugprint("pk.refresh_cache errored")
# map package name to PackageKit ID; do not print progress here, it's fast
debugprint("pk.resolve")
try:
res = pk.resolve(PackageKitGlib.FilterEnum.NONE, [package],
None, progress, None)
debugprint("pk.resolve succeeded")
except GLib.GError:
debugprint("pk.resolve failed")
sys.exit(1)
if res.get_exit_code() != PackageKitGlib.ExitEnum.SUCCESS:
debugprint("pk.resolve errored")
sys.exit(1)
package_ids = res.get_package_array()
if len(package_ids) <= 0:
debugprint("res.get_package_array() failed")
sys.exit(1)
package_id = package_ids[0].get_id()
debugprint("package_id: %s" % package_id)
# install the first match, unless already installed
if package_ids[0].get_info() & PackageKitGlib.InfoEnum.INSTALLED == 0:
debugprint("package not installed")
debugprint("pk.install_packages")
# install package
if repo_gpg_id:
debugprint("Signature key supplied")
repo_gpg_id_supplied = True
else:
debugprint("Signature key not supplied")
repo_gpg_id_supplied = False
try:
res = pk.install_packages(repo_gpg_id_supplied, [package_id], None,
progress, None)
debugprint("pk.install_packages succeeded")
except GLib.GError:
debugprint("pk.install_packages failed, retrying with modified package ID")
# See aptdaemon Ubuntu bug #1397750.
try:
# Remove last element of the package ID, after the last ";"
package_id_mod = package_id[:package_id.rfind(";")+1]
res = pk.install_packages(repo_gpg_id_supplied, [package_id_mod],
None, progress, None)
debugprint("pk.install_packages succeeded")
except GLib.GError:
debugprint("pk.install_packages failed")
sys.exit(1)
if res.get_exit_code() != PackageKitGlib.ExitEnum.SUCCESS:
debugprint("pk.install_packages errored")
sys.exit(1)
debugprint("Package successfully installed")
# If we reach this point, the requested package is on the system, either
# because we have installed it now or because it was already there
# Return the list of files contained in the package
try:
res = pk.get_files([package_id], None, progress, None)
except GLib.GError:
pass
files = res.get_files_array()
if files:
for f in files[0].get_property('files'):
print(f)
# Tell the caller that we are done
print("done")
|