Merge ~lamoura/ubuntu/+source/ubuntu-advantage-tools:upload-29.2-mantic into ubuntu/+source/ubuntu-advantage-tools:ubuntu/devel
- Git
- lp:~lamoura/ubuntu/+source/ubuntu-advantage-tools
- upload-29.2-mantic
- Merge into ubuntu/devel
Status: | Merged |
---|---|
Merged at revision: | 1a4649696bcb308d722454964caaeb8599fcde45 |
Proposed branch: | ~lamoura/ubuntu/+source/ubuntu-advantage-tools:upload-29.2-mantic |
Merge into: | ubuntu/+source/ubuntu-advantage-tools:ubuntu/devel |
Diff against target: |
390 lines (+211/-18) 13 files modified
debian/changelog (+9/-0) debian/ubuntu-advantage-tools.postinst (+3/-3) features/proxy_config.feature (+15/-2) preferences.d/ubuntu-pro-esm-apps (+7/-4) preferences.d/ubuntu-pro-esm-infra (+7/-5) sru/release-29/test-esm-pinning.sh (+6/-0) sru/release-29/test-key-rename-failure.sh (+118/-0) uaclient/cli.py (+14/-0) uaclient/exceptions.py (+7/-0) uaclient/http/__init__.py (+13/-2) uaclient/http/tests/test_http.py (+8/-1) uaclient/messages.py (+3/-0) uaclient/version.py (+1/-1) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Sergio Durigan Junior (community) | Approve | ||
Ubuntu Sponsors | Pending | ||
Canonical Server Reporter | Pending | ||
Review via email: mp+449741@code.launchpad.net |
Commit message
Description of the change
New release addressing the bugs identified on the SRU review of 29.1
Lucas Albuquerque Medeiros de Moura (lamoura) wrote : | # |
Sergio Durigan Junior (sergiodj) wrote : | # |
Thanks, Lucas.
There's a small nit on sru/release-
Sergio Durigan Junior (sergiodj) wrote : | # |
So I talked to Lucas in private, and while pedantically speaking the comparison operator '==' shouldn't be used when comparing strings with '[', bash still supports it (although it is not the standard) and this won't affect the release per se.
Therefore, in order to avoid spending even more time changing the code, I will go ahead and upload the package as is. Lucas also told me that they plan to tackle this specific issue in the next releases.
Uploaded:
$ dput ubuntu-
Trying to upload package to ubuntu
Checking signature on .changes
gpg: /home/sergio/
Checking signature on .dsc
gpg: /home/sergio/
Uploading to ubuntu (via ftp to upload.ubuntu.com):
Uploading ubuntu-
Uploading ubuntu-
Uploading ubuntu-
Uploading ubuntu-
Successfully uploaded packages.
Preview Diff
1 | diff --git a/debian/changelog b/debian/changelog |
2 | index 6d7a651..1378858 100644 |
3 | --- a/debian/changelog |
4 | +++ b/debian/changelog |
5 | @@ -1,3 +1,12 @@ |
6 | +ubuntu-advantage-tools (29.2) mantic; urgency=medium |
7 | + |
8 | + * d/ubuntu-advantage-tools.postinst: |
9 | + - replace deb-systemd-invoke back to systemctl |
10 | + * proxy: alert user if ca-certificates is not installed when using |
11 | + a TLS-in-TLS proxy |
12 | + |
13 | + -- Lucas Moura <lucas.moura@canonical.com> Thu, 17 Aug 2023 19:45:48 -0300 |
14 | + |
15 | ubuntu-advantage-tools (29.1) mantic; urgency=medium |
16 | |
17 | * anbox: allow enabling service on container using the --access-only flag |
18 | diff --git a/debian/ubuntu-advantage-tools.postinst b/debian/ubuntu-advantage-tools.postinst |
19 | index b332333..b11748f 100644 |
20 | --- a/debian/ubuntu-advantage-tools.postinst |
21 | +++ b/debian/ubuntu-advantage-tools.postinst |
22 | @@ -256,11 +256,11 @@ remove_old_systemd_units() { |
23 | # The failed state is ephemeral and only needs to be cleared if |
24 | # it is there so that the system doesn't say it is degraded. |
25 | # If the old timer was not running, then this is a noop. |
26 | - deb-systemd-invoke --system daemon-reload > /dev/null || true |
27 | - deb-systemd-invoke reset-failed ua-license-check.timer > /dev/null 2>&1 || true |
28 | + systemctl --system daemon-reload > /dev/null || true |
29 | + systemctl reset-failed ua-license-check.timer > /dev/null 2>&1 || true |
30 | # In rare race-condition scenarios, the service can also get into |
31 | # the same failed state. |
32 | - deb-systemd-invoke reset-failed ua-license-check.service > /dev/null 2>&1 || true |
33 | + systemctl reset-failed ua-license-check.service > /dev/null 2>&1 || true |
34 | fi |
35 | deb-systemd-helper purge ua-license-check.path > /dev/null || true |
36 | deb-systemd-helper unmask ua-license-check.path > /dev/null || true |
37 | diff --git a/features/proxy_config.feature b/features/proxy_config.feature |
38 | index 0b6359d..755f5dc 100644 |
39 | --- a/features/proxy_config.feature |
40 | +++ b/features/proxy_config.feature |
41 | @@ -1257,7 +1257,19 @@ Feature: Proxy configuration |
42 | Proxy authentication failed |
43 | """ |
44 | |
45 | - When I run `pro config set https_proxy=https://someuser:somepassword@$behave_var{machine-name proxy}.lxd:3129` with sudo |
46 | + When I run `apt remove ca-certificates -y` with sudo |
47 | + And I run `rm -f /etc/ssl/certs/ca-certificates.crt` with sudo |
48 | + And I verify that running `pro config set https_proxy=https://someuser:somepassword@$behave_var{machine-name proxy}.lxd:3129` `with sudo` exits `1` |
49 | + Then stderr matches regexp: |
50 | + """ |
51 | + Failed to access URL: https://.* |
52 | + Cannot verify certificate of server |
53 | + Please install "ca-certificates" and try again. |
54 | + """ |
55 | + |
56 | + When I run `apt install ca-certificates -y` with sudo |
57 | + And I run `update-ca-certificates` with sudo |
58 | + And I run `pro config set https_proxy=https://someuser:somepassword@$behave_var{machine-name proxy}.lxd:3129` with sudo |
59 | And I run `pro config set ua_apt_https_proxy=https://someuser:somepassword@$behave_var{machine-name proxy}.lxd:3129` with sudo |
60 | |
61 | When I run `truncate -s 0 /var/log/squid/access.log` `with sudo` on the `proxy` machine |
62 | @@ -1285,7 +1297,8 @@ Feature: Proxy configuration |
63 | """ |
64 | |
65 | # Pre-install canonical-livepatch to tell it to trust the cert |
66 | - When I run `snap install canonical-livepatch` with sudo |
67 | + When I run `apt install snapd -y` with sudo |
68 | + And I run `snap install canonical-livepatch` with sudo |
69 | And I run shell command `canonical-livepatch config ca-certs=@stdin < /usr/local/share/ca-certificates/ca.crt` with sudo |
70 | |
71 | When I run `truncate -s 0 /var/log/squid/access.log` `with sudo` on the `proxy` machine |
72 | diff --git a/preferences.d/ubuntu-pro-esm-apps b/preferences.d/ubuntu-pro-esm-apps |
73 | index aa60598..5ded6f8 100644 |
74 | --- a/preferences.d/ubuntu-pro-esm-apps |
75 | +++ b/preferences.d/ubuntu-pro-esm-apps |
76 | @@ -1,7 +1,10 @@ |
77 | -# This file was created by ubuntu-advantage-tools |
78 | - |
79 | -# Pin esm-apps packages to a slightly higher value than the archive, |
80 | -# so those are preferred when the service is enabled |
81 | +# This file is used by Ubuntu Pro and supplied by the ubuntu-advantage-tools |
82 | +# package. It has no effect if Ubuntu Pro services are not in use since no |
83 | +# other apt repositories are expected to match o=UbuntuESMApps. |
84 | +# |
85 | +# Pin esm-apps packages to a slightly higher value than the default, |
86 | +# so those are preferred over a non-ESM package from the archive when the |
87 | +# service is enabled. |
88 | |
89 | Package: * |
90 | Pin: release o=UbuntuESMApps |
91 | diff --git a/preferences.d/ubuntu-pro-esm-infra b/preferences.d/ubuntu-pro-esm-infra |
92 | index af9bf5a..e956e0a 100644 |
93 | --- a/preferences.d/ubuntu-pro-esm-infra |
94 | +++ b/preferences.d/ubuntu-pro-esm-infra |
95 | @@ -1,8 +1,10 @@ |
96 | -# This file was created by ubuntu-advantage-tools |
97 | - |
98 | -# Pin esm-infra packages to a slightly higher value than the archive, |
99 | -# so those are preferred when the service is enabled |
100 | - |
101 | +# This file is used by Ubuntu Pro and supplied by the ubuntu-advantage-tools |
102 | +# package. It has no effect if Ubuntu Pro services are not in use since no |
103 | +# other apt repositories are expected to match o=UbuntuESM. |
104 | +# |
105 | +# Pin esm-infra packages to a slightly higher value than the default, |
106 | +# so those are preferred over a non-ESM package from the archive when the |
107 | +# service is enabled. |
108 | Package: * |
109 | Pin: release o=UbuntuESM |
110 | Pin-Priority: 510 |
111 | diff --git a/sru/release-29/test-esm-pinning.sh b/sru/release-29/test-esm-pinning.sh |
112 | index b9db8c6..b64d8e3 100755 |
113 | --- a/sru/release-29/test-esm-pinning.sh |
114 | +++ b/sru/release-29/test-esm-pinning.sh |
115 | @@ -104,6 +104,12 @@ check_esm_pin "infra" 510 |
116 | check_esm_pin "apps" 510 |
117 | echo -e "###########################################\n" |
118 | |
119 | +# Check pin for archive packages |
120 | +echo -e "\n* Check pins for package in archive" |
121 | +echo "###########################################" |
122 | +lxc exec $name -- apt-cache policy toilet python3-ipdb |
123 | +echo -e "###########################################\n" |
124 | + |
125 | # Disable esm-apps and esm-infra |
126 | # ---------------------------------------------------------------- |
127 | disable_esm_services |
128 | diff --git a/sru/release-29/test-key-rename-failure.sh b/sru/release-29/test-key-rename-failure.sh |
129 | new file mode 100644 |
130 | index 0000000..6ad58e8 |
131 | --- /dev/null |
132 | +++ b/sru/release-29/test-key-rename-failure.sh |
133 | @@ -0,0 +1,118 @@ |
134 | +#!/bin/bash |
135 | +set -e |
136 | + |
137 | +series=$1 |
138 | +token=$2 |
139 | +install_from=$3 # either path to a .deb, or 'staging', or 'proposed' |
140 | + |
141 | +name=$series-dev |
142 | + |
143 | +function cleanup { |
144 | + lxc delete $name --force |
145 | +} |
146 | + |
147 | +function on_err { |
148 | + echo -e "Test Failed" |
149 | + cleanup |
150 | + exit 1 |
151 | +} |
152 | +trap on_err ERR |
153 | + |
154 | +lxc launch ubuntu-daily:$series $name |
155 | +sleep 5 |
156 | + |
157 | +# Install latest ubuntu-advantage-tools |
158 | +lxc exec $name -- apt-get update > /dev/null |
159 | +lxc exec $name -- apt-get install -y ubuntu-advantage-tools > /dev/null |
160 | +echo -e "\n* Latest u-a-t is installed" |
161 | +echo "###########################################" |
162 | +lxc exec $name -- apt-cache policy ubuntu-advantage-tools |
163 | +echo -e "###########################################\n" |
164 | + |
165 | +# Attach so we can have some gpg keys in place |
166 | +lxc exec $name -- pro attach $token |
167 | +echo -e "\n* Pro is attached" |
168 | +echo "###########################################" |
169 | +lxc exec $name -- pro status --wait |
170 | +echo -e "###########################################\n" |
171 | + |
172 | +# Upgrade u-a-t to new version |
173 | +# ---------------------------------------------------------------- |
174 | +if [ $install_from == 'staging' ]; then |
175 | + lxc exec $name -- sudo add-apt-repository ppa:ua-client/staging -y > /dev/null |
176 | + lxc exec $name -- apt-get update > /dev/null |
177 | + lxc exec $name -- apt-get install ubuntu-advantage-tools -y > /dev/null |
178 | +elif [ $install_from == 'proposed' ]; then |
179 | + lxc exec $name -- sh -c "echo \"deb http://archive.ubuntu.com/ubuntu $series-proposed main\" | tee /etc/apt/sources.list.d/proposed.list" |
180 | + lxc exec $name -- apt-get update > /dev/null |
181 | + lxc exec $name -- apt-get install ubuntu-advantage-tools -y > /dev/null |
182 | +else |
183 | + lxc file push $install_from $name/new-ua.deb |
184 | + lxc exec $name -- dpkg -i /new-ua.deb > /dev/null |
185 | +fi |
186 | +# ---------------------------------------------------------------- |
187 | + |
188 | +echo -e "\n* Renaiming keys back to their original name" |
189 | +echo "###########################################" |
190 | +lxc exec $name -- mv /etc/apt/trusted.gpg.d/ubuntu-pro-esm-infra.gpg /etc/apt/trusted.gpg.d/ubuntu-advantage-esm-infra-trusty.gpg |
191 | +lxc exec $name -- mv /etc/apt/trusted.gpg.d/ubuntu-pro-esm-apps.gpg /etc/apt/trusted.gpg.d/ubuntu-advantage-esm-apps.gpg |
192 | +echo -e "###########################################\n" |
193 | + |
194 | +echo -e "\n* List gpg keys" |
195 | +echo "###########################################" |
196 | +lxc exec $name -- ls /etc/apt/trusted.gpg.d/ |
197 | +echo -e "###########################################\n" |
198 | + |
199 | +# Modify the postinst script to fail after renaming just one key |
200 | +lxc exec $name -- sed -i "s/^\s\+SERVICES=.*/error/g" /var/lib/dpkg/info/ubuntu-advantage-tools.postinst |
201 | +echo -e "\n* Running postinst script again" |
202 | +echo "###########################################" |
203 | +lxc exec $name -- dpkg-reconfigure ubuntu-advantage-tools || true |
204 | +echo -e "###########################################\n" |
205 | + |
206 | +# Check that only one key got renamed |
207 | +echo -e "\n* List gpg keys" |
208 | +echo "###########################################" |
209 | +lxc exec $name -- ls /etc/apt/trusted.gpg.d/ |
210 | +echo -e "###########################################\n" |
211 | + |
212 | +# Make sure the services are still enabled |
213 | +echo -e "\n* Check that services are still enabled" |
214 | +echo "###########################################" |
215 | +lxc exec $name -- pro status --wait |
216 | +echo -e "###########################################\n" |
217 | + |
218 | +# Check that apt update is working as expected |
219 | +echo -e "\n* Check that APT update is working as expected" |
220 | +echo "###########################################" |
221 | +lxc exec $name -- apt update |
222 | +echo -e "###########################################\n" |
223 | + |
224 | +# Disable service which key was not renamed |
225 | +echo -e "\n* Disable esm-apps service which gpg key was not renamed" |
226 | +echo "###########################################" |
227 | +lxc exec $name -- pro disable esm-apps |
228 | +lxc exec $name -- pro status |
229 | +echo -e "###########################################\n" |
230 | + |
231 | +# Check that the GPG key is still there |
232 | +echo -e "\n* List gpg keys" |
233 | +echo "###########################################" |
234 | +lxc exec $name -- ls /etc/apt/trusted.gpg.d/ |
235 | +echo -e "###########################################\n" |
236 | + |
237 | +# Enable esm-apps |
238 | +echo -e "\n* Enable esm-apps and check new gpg key is created" |
239 | +echo "###########################################" |
240 | +lxc exec $name -- pro enable esm-apps |
241 | +lxc exec $name -- pro status |
242 | +lxc exec $name -- ls /etc/apt/trusted.gpg.d/ |
243 | +echo -e "###########################################\n" |
244 | + |
245 | +# Check that the new GPG key is there |
246 | +echo -e "\n* check ubuntu-pro-esm-apps.gpg key now exists" |
247 | +echo "###########################################" |
248 | +lxc exec $name -- ls /etc/apt/trusted.gpg.d/ |
249 | +echo -e "###########################################\n" |
250 | + |
251 | +cleanup |
252 | diff --git a/uaclient/cli.py b/uaclient/cli.py |
253 | index 120158b..9807a59 100644 |
254 | --- a/uaclient/cli.py |
255 | +++ b/uaclient/cli.py |
256 | @@ -2000,6 +2000,20 @@ def main_error_handler(func): |
257 | _warn_about_new_version() |
258 | |
259 | sys.exit(1) |
260 | + except exceptions.PycurlCACertificatesError as exc: |
261 | + tmpl = messages.SSL_VERIFICATION_ERROR_CA_CERTIFICATES |
262 | + if apt.is_installed("ca-certificates"): |
263 | + tmpl = messages.SSL_VERIFICATION_ERROR_OPENSSL_CONFIG |
264 | + msg = tmpl.format(url=exc.url) |
265 | + event.error(error_msg=msg.msg, error_code=msg.name) |
266 | + event.info(info_msg=msg.msg, file_type=sys.stderr) |
267 | + |
268 | + lock.clear_lock_file_if_present() |
269 | + event.process_events() |
270 | + |
271 | + _warn_about_new_version() |
272 | + |
273 | + sys.exit(1) |
274 | except exceptions.UserFacingError as exc: |
275 | with util.disable_log_to_console(): |
276 | LOG.error(exc.msg) |
277 | diff --git a/uaclient/exceptions.py b/uaclient/exceptions.py |
278 | index 447b4eb..156abb2 100644 |
279 | --- a/uaclient/exceptions.py |
280 | +++ b/uaclient/exceptions.py |
281 | @@ -522,6 +522,13 @@ class PycurlError(UserFacingError): |
282 | super().__init__(msg=msg.msg, msg_code=msg.name) |
283 | |
284 | |
285 | +class PycurlCACertificatesError(UserFacingError): |
286 | + def __init__(self, url: str) -> None: |
287 | + msg = messages.PYCURL_CA_CERTIFICATES_ERROR |
288 | + self.url = url |
289 | + super().__init__(msg=msg.msg, msg_code=msg.name) |
290 | + |
291 | + |
292 | class ProxyAuthenticationFailed(UserFacingError): |
293 | def __init__(self) -> None: |
294 | msg = messages.PROXY_AUTH_FAIL |
295 | diff --git a/uaclient/http/__init__.py b/uaclient/http/__init__.py |
296 | index 36b616e..6540f85 100644 |
297 | --- a/uaclient/http/__init__.py |
298 | +++ b/uaclient/http/__init__.py |
299 | @@ -72,6 +72,8 @@ def validate_proxy( |
300 | raise |
301 | except exceptions.ProxyAuthenticationFailed: |
302 | raise |
303 | + except exceptions.PycurlCACertificatesError: |
304 | + raise |
305 | except Exception as e: |
306 | with util.disable_log_to_console(): |
307 | msg = getattr(e, "reason", str(e)) |
308 | @@ -208,7 +210,9 @@ def should_use_pycurl(https_proxy, target_url): |
309 | return ret |
310 | |
311 | |
312 | -def _handle_pycurl_error(error, authentication_error_code): |
313 | +def _handle_pycurl_error( |
314 | + error, url, authentication_error_code, ca_certificates_error_code |
315 | +): |
316 | code = None |
317 | msg = None |
318 | if len(error.args) > 0: |
319 | @@ -221,6 +225,8 @@ def _handle_pycurl_error(error, authentication_error_code): |
320 | and "HTTP code 407 from proxy" in msg |
321 | ): |
322 | raise exceptions.ProxyAuthenticationFailed() |
323 | + elif code == ca_certificates_error_code: |
324 | + raise exceptions.PycurlCACertificatesError(url) |
325 | else: |
326 | raise exceptions.PycurlError(error) |
327 | |
328 | @@ -302,7 +308,12 @@ def _readurl_pycurl_https_in_https( |
329 | try: |
330 | c.perform() |
331 | except pycurl.error as e: |
332 | - _handle_pycurl_error(e, authentication_error_code=pycurl.E_RECV_ERROR) |
333 | + _handle_pycurl_error( |
334 | + e, |
335 | + url=req.get_full_url(), |
336 | + authentication_error_code=pycurl.E_RECV_ERROR, |
337 | + ca_certificates_error_code=pycurl.E_SSL_CACERT_BADFILE, |
338 | + ) |
339 | |
340 | code = int(c.getinfo(pycurl.RESPONSE_CODE)) |
341 | body = body_output.getvalue().decode("utf-8") |
342 | diff --git a/uaclient/http/tests/test_http.py b/uaclient/http/tests/test_http.py |
343 | index 9b00c30..1161e76 100644 |
344 | --- a/uaclient/http/tests/test_http.py |
345 | +++ b/uaclient/http/tests/test_http.py |
346 | @@ -453,9 +453,16 @@ class TestHandlePycurlError: |
347 | ("PYCURL_ERROR", "HTTP code 407 from proxy: proxy"), |
348 | exceptions.ProxyAuthenticationFailed, |
349 | ), |
350 | + (("PYCURL_ERROR", "test"), exceptions.PycurlError), |
351 | + ( |
352 | + ("CA_CERTIFICATES_ERROR", "test"), |
353 | + exceptions.PycurlCACertificatesError, |
354 | + ), |
355 | ), |
356 | ) |
357 | def test_handle_pycurl_error(self, error_args, expected_exception): |
358 | with pytest.raises(expected_exception): |
359 | m_error = mock.MagicMock(args=error_args) |
360 | - http._handle_pycurl_error(m_error, "PYCURL_ERROR") |
361 | + http._handle_pycurl_error( |
362 | + m_error, "url", "PYCURL_ERROR", "CA_CERTIFICATES_ERROR" |
363 | + ) |
364 | diff --git a/uaclient/messages.py b/uaclient/messages.py |
365 | index 4fd06d8..a5cee3c 100644 |
366 | --- a/uaclient/messages.py |
367 | +++ b/uaclient/messages.py |
368 | @@ -1411,6 +1411,9 @@ PYCURL_REQUIRED = NamedMessage( |
369 | ), |
370 | ) |
371 | PYCURL_ERROR = FormattedNamedMessage("pycurl-error", "PycURL Error: {e}") |
372 | +PYCURL_CA_CERTIFICATES_ERROR = NamedMessage( |
373 | + "pycurl-ca-certificates-error", "Problem reading SSL CA certificates" |
374 | +) |
375 | |
376 | PROXY_AUTH_FAIL = NamedMessage( |
377 | "proxy-auth-fail", "Proxy authentication failed" |
378 | diff --git a/uaclient/version.py b/uaclient/version.py |
379 | index b8e1f94..5191f37 100644 |
380 | --- a/uaclient/version.py |
381 | +++ b/uaclient/version.py |
382 | @@ -15,7 +15,7 @@ from uaclient.defaults import CANDIDATE_CACHE_PATH, UAC_RUN_PATH |
383 | from uaclient.exceptions import ProcessExecutionError |
384 | from uaclient.system import subp |
385 | |
386 | -__VERSION__ = "29.1" |
387 | +__VERSION__ = "29.2" |
388 | PACKAGED_VERSION = "@@PACKAGED_VERSION@@" |
389 | |
390 | CANDIDATE_REGEX = r"Candidate: (?P<candidate>.*?)\n" |
Xenial: advantage- tools/29. 2~16.04~ rc1: Published /autopkgtest. ubuntu. com/request. cgi?release= xenial& package= ubuntu- advantage- tools&arch= amd64&trigger= ubuntu- advantage- tools%2F29. 2~16.04~ rc1&ppa= ua-client% 2Fstaging♻️ /autopkgtest. ubuntu. com/request. cgi?release= xenial& package= ubuntu- advantage- tools&arch= arm64&trigger= ubuntu- advantage- tools%2F29. 2~16.04~ rc1&ppa= ua-client% 2Fstaging♻️ /autopkgtest. ubuntu. com/request. cgi?release= xenial& package= ubuntu- advantage- tools&arch= armhf&trigger= ubuntu- advantage- tools%2F29. 2~16.04~ rc1&ppa= ua-client% 2Fstaging♻️ /autopkgtest. ubuntu. com/request. cgi?release= xenial& package= ubuntu- advantage- tools&arch= ppcel64& trigger= ubuntu- advantage- tools%2F29. 2~16.04~ rc1&ppa= ua-client% 2Fstaging♻️ /autopkgtest. ubuntu. com/request. cgi?release= xenial& package= ubuntu- advantage- tools&arch= riscv64& trigger= ubuntu- advantage- tools%2F29. 2~16.04~ rc1&ppa= ua-client% 2Fstaging♻️ /autopkgtest. ubuntu. com/request. cgi?release= xenial& package= ubuntu- advantage- tools&arch= s390x&trigger= ubuntu- advantage- tools%2F29. 2~16.04~ rc1&ppa= ua-client% 2Fstaging♻️ /autopkgtest. ubuntu. com/request. cgi?release= xenial& package= ubuntu- advantage- tools&arch= amd64&trigger= ubuntu- advantage- tools%2F29. 2~16.04~ rc1&ppa= ua-client% 2Fstaging💍 /autopkgtest. ubuntu. com/request. cgi?release= xenial& package= ubuntu- advantage- tools&arch= arm64&trigger= ubuntu- advantage- tools%2F29. 2~16.04~ rc1&ppa= ua-client% 2Fstaging💍 /autopkgtest. ubuntu. com/request. cgi?release= xenial& package= ubuntu- advantage- tools&arch= armhf&trigger= ubuntu- advantage- tools%2F29. 2~16.04~ rc1&ppa= ua-client% 2Fstaging💍 /autopkgtest. ubuntu. com/request. cgi?release= xenial& package= ubuntu- advantage- tools&arch= ppcel64& trigger= ubuntu- advantage- tools%2F29. 2~16.04~ rc1&ppa= ua-client% 2Fstaging💍 /autopkgtest. ubuntu. com/request. cgi?release= xenial& package= ubuntu- advantage- tools&arch= riscv64& trigger= ubuntu- advantage- tools%2F29. 2~16.04~ rc1&ppa= ua-client% 2Fstaging💍 /autopkgtest. ubuntu. com/request. cgi?release= xenial& package= ubuntu- advantage- tools&arch= s390x&trigger= ubuntu- advantage- tools%2F29. 2~16.04~ rc1&ppa= ua-client% 2Fstaging💍
- Source ubuntu-
+ amd64: https:/
+ arm64: https:/
+ armhf: https:/
+ ppcel64: https:/
+ riscv64: https:/
+ s390x: https:/
+ amd64: https:/
+ arm64: https:/
+ armhf: https:/
+ ppcel64: https:/
+ riscv64: https:/
+ s390x: https:/
Bionic: advantage- tools/29. 2~18.04~ rc1: Published /autopkgtest. ubuntu. com/request. cgi?release= bionic& package= ubuntu- advantage- tools&arch= amd64&trigger= ubuntu- advantage- tools%2F29. 2~18.04~ rc1&ppa= ua-client% 2Fstaging♻️ /autopkgtest. ubuntu. com/request. cgi?release= bionic& package= ubuntu- advantage- tools&arch= arm64&trigger= ubuntu- advantage- tools%2F29. 2~18.04~ rc1&ppa= ua-client% 2Fstaging♻️ /autopkgtest. ubuntu. com/request. cgi?release= bionic& package= ubuntu- advantage- tools&arch= armhf&trigger= ubuntu- advantage- tools%2F29. 2~18.04~ rc1&ppa= ua-client% 2Fstaging♻️ /autopkgtest. ubuntu. com/request. cgi?release= bionic& package= ubuntu- advantage- tools&arch= ppcel64& trigger= ubuntu- advantage- tools%2F29. 2~18.04~ rc1&ppa= ua-client% 2Fstaging♻️ /autopkgtest. ubuntu. com/r...
- Source ubuntu-
+ amd64: https:/
+ arm64: https:/
+ armhf: https:/
+ ppcel64: https:/
+ riscv64: https:/