-
Notifications
You must be signed in to change notification settings - Fork 89
/
install-printerdriver.py
168 lines (150 loc) · 5.34 KB
/
install-printerdriver.py
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
157
158
159
160
161
162
163
164
165
166
167
168
#!/usr/bin/python3
import gi
gi.require_version('PackageKitGlib', '1.0')
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)
try:
package = sys.argv[1]
except:
debugprint("Missing package name to install.")
sys.exit(1)
try:
repo = sys.argv[2]
except:
debugprint("Missing name of repo.")
sys.exit(1)
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")