** Description changed:

+ [ Impact ]
+ 
+ If for any reason the user's system has any non-utf8 character as part
+ of the `apt list --installed` command, the Pro Client will fail to parse
+ the return output and break.
+ 
+ Independent of why this happens, the Pro Client should not be relying on
+ CLI output when there are Python bindings available to perform the same
+ task - and python3-apt provides ways to list installed packages.
+ 
+ The fix to this bug is to rely on the programmatic integration with APT
+ instead of calling the CLI.
+ 
+ 
+ [ Test Plan ]
+ 
+ Listing installed packages is part of the regular operation of the Pro
+ Client in many scenarios covered by the integration / acceptance tests.
+ 
+ For this particular issue:
+ - Launch a container for the release to be tested
+ - make `apt list --installed` return a non-utf8 character (can be done by 
mocking the `apt` binary in the system)
+ - see it fail
+ - install the package from -proposed
+ - see it does not fail anymore
+ 
+ 
+ [ Where problems could occur ]
+ 
+ Switching from the CLI call to python3-apt brings the risk of wrong
+ implementation of the integration, which would lead to a different
+ package list to be returned by python3-apt. The regression potential is
+ mitigated by extensive testing - unit, integration and acceptance tests
+ rely on this functionality.
+ 
+ 
+ [ Original description ]
+ 
  ["2024-04-10T08:28:17.952", "DEBUG", "ubuntupro.system", "load_file", 517, 
"Reading file: /etc/os-release", {}]
  ["2024-04-10T08:28:17.953", "DEBUG", "ubuntupro.system", "load_file", 517, 
"Reading file: /proc/version_signature", {}]
  ["2024-04-10T08:28:18.575", "ERROR", "ubuntupro.cli", "wrapper", 1768, 
"Unhandled exception, please file a bug", {"exc_info": "Traceback (most recent 
call
-  last):\n  File \"/usr/lib/python3/dist-packages/uaclient/cli/__init__.py\", 
line 1705, in wrapper\n    return func(*args, **kwargs)\n  File \"/usr/lib/py
+  last):\n  File \"/usr/lib/python3/dist-packages/uaclient/cli/__init__.py\", 
line 1705, in wrapper\n    return func(*args, **kwargs)\n  File \"/usr/lib/py
  thon3/dist-packages/uaclient/cli/__init__.py\", line 1838, in main\n    
return_value = args.action(args, cfg=cfg, extra_args=extra_args)\n  File 
\"/usr/li
  b/python3/dist-packages/uaclient/cli/__init__.py\", line 1475, in 
action_status\n    status, ret = actions.status(\n  File 
\"/usr/lib/python3/dist-package
  s/uaclient/actions.py\", line 173, in status\n    status = 
ua_status.status(cfg=cfg, show_all=show_all)\n  File 
\"/usr/lib/python3/dist-packages/uaclient/
  status.py\", line 418, in status\n    response = _unattached_status(cfg)\n  
File \"/usr/lib/python3/dist-packages/uaclient/status.py\", line 283, in _unat
  tached_status\n    resources = get_available_resources(cfg)\n  File 
\"/usr/lib/python3/dist-packages/uaclient/contract.py\", line 680, in 
get_available_re
  sources\n    resources = client.available_resources()\n  File 
\"/usr/lib/python3/dist-packages/uaclient/contract.py\", line 114, in 
available_resources\n
-    activity_info = self._get_activity_info()\n  File 
\"/usr/lib/python3/dist-packages/uaclient/contract.py\", line 413, in 
_get_activity_info\n    \"deskt
+    activity_info = self._get_activity_info()\n  File 
\"/usr/lib/python3/dist-packages/uaclient/contract.py\", line 413, in 
_get_activity_info\n    \"deskt
  op\": system.is_desktop(),\n  File 
\"/usr/lib/python3/dist-packages/uaclient/system.py\", line 397, in 
is_desktop\n    for package in apt.get_installed_pa
  ckages():\n  File \"/usr/lib/python3/dist-packages/uaclient/apt.py\", line 
727, in get_installed_packages\n    out, _ = system.subp([\"apt\", \"list\", \"
  --installed\"])\n  File 
\"/usr/lib/python3/dist-packages/uaclient/system.py\", line 703, in subp\n    
out, err = _subp(\n  File \"/usr/lib/python3/dist-pa
  ckages/uaclient/system.py\", line 649, in _subp\n    out_result = 
out.decode(\"utf-8\") if out else \"\"\nUnicodeDecodeError: 'utf-8' codec can't 
decode b
  yte 0xe1 in position 109: invalid continuation byte"}]
  ["2024-04-10T08:30:25.404", "DEBUG", "ubuntupro.config", "parse_config", 625, 
"Using client configuration file at /etc/ubuntu-advantage/uaclient.conf", {}
  ]
  ["2024-04-10T08:30:25.408", "DEBUG", "ubuntupro.system", "load_file", 517, 
"Reading file: /etc/ubuntu-advantage/uaclient.conf", {}]
  ["2024-04-10T08:30:25.409", "DEBUG", "ubuntupro.files.files", "read", 60, 
"Tried to load /var/lib/ubuntu-advantage/user-config.json but file does not exis
  t", {}]
  ["2024-04-10T08:30:25.421", "DEBUG", "ubuntupro.http", "configure_web_proxy", 
146, "Setting no_proxy: 169.254.169.254,[fd00:ec2::254],metadata", {}]
  ["2024-04-10T08:30:25.422", "DEBUG", "ubuntupro.http", "configure_web_proxy", 
154, "Setting global proxy dict", {}]
  ["2024-04-10T08:30:25.422", "DEBUG", "ubuntupro.cli", "main", 1825, "Executed 
with sys.argv: ['/usr/bin/pro', 'attach', '<REDACTED>']", {}]
  ["2024-04-10T08:30:25.422", "DEBUG", "ubuntupro.files.files", "read", 60, 
"Tried to load /var/lib/ubuntu-advantage/private/machine-token.json but file doe
  s not exist", {}]
  ["2024-04-10T08:30:25.422", "DEBUG", "ubuntupro.lock", "__enter__", 77, "spin 
lock starting for pro attach", {}]
  ["2024-04-10T08:30:25.423", "DEBUG", "ubuntupro.system", "write_file", 556, 
"Writing file /run/ubuntu-advantage/notices/60-operation_in_progress atomicall
  y via tempfile /run/ubuntu-advantage/notices/tmparyyoirn", {}]
  ["2024-04-10T08:30:25.423", "DEBUG", "ubuntupro.system", "write_file", 556, 
"Writing file /var/lib/ubuntu-advantage/lock atomically via tempfile /var/lib/
  ubuntu-advantage/tmpn1yxl91o", {}]
  ["2024-04-10T08:30:25.424", "DEBUG", "ubuntupro.system", "write_file", 556, 
"Writing file /run/ubuntu-advantage/notices/60-operation_in_progress atomicall
  y via tempfile /run/ubuntu-advantage/notices/tmpwqyq85v1", {}]
  ["2024-04-10T08:30:25.424", "DEBUG", "ubuntupro.files.files", "read", 60, 
"Tried to load /var/lib/ubuntu-advantage/private/machine-token.json but file doe
  s not exist", {}]
  ["2024-04-10T08:30:25.424", "DEBUG", "ubuntupro.system", "load_file", 517, 
"Reading file: /etc/machine-id", {}]
  ["2024-04-10T08:30:25.424", "DEBUG", "ubuntupro.system", "load_file", 517, 
"Reading file: /etc/os-release", {}]
  ["2024-04-10T08:30:25.425", "DEBUG", "ubuntupro.system", "load_file", 517, 
"Reading file: /proc/version_signature", {}]
  ["2024-04-10T08:30:25.970", "DEBUG", "ubuntupro.system", 
"ensure_file_absent", 576, "Removed file: 
/run/ubuntu-advantage/notices/60-operation_in_progress"
  , {}]
  ["2024-04-10T08:30:25.970", "DEBUG", "ubuntupro.system", 
"ensure_file_absent", 576, "Removed file: /var/lib/ubuntu-advantage/lock", {}]
  ["2024-04-10T08:30:25.971", "ERROR", "ubuntupro.cli", "wrapper", 1768, 
"Unhandled exception, please file a bug", {"exc_info": "Traceback (most recent 
call
-  last):\n  File \"/usr/lib/python3/dist-packages/uaclient/cli/__init__.py\", 
line 1705, in wrapper\n    return func(*args, **kwargs)\n  File \"/usr/lib/py
+  last):\n  File \"/usr/lib/python3/dist-packages/uaclient/cli/__init__.py\", 
line 1705, in wrapper\n    return func(*args, **kwargs)\n  File \"/usr/lib/py
  thon3/dist-packages/uaclient/cli/__init__.py\", line 1838, in main\n    
return_value = args.action(args, cfg=cfg, extra_args=extra_args)\n  File 
\"/usr/li
  b/python3/dist-packages/uaclient/cli/__init__.py\", line 257, in new_f\n    
return f(args, cfg=cfg, **kwargs)\n  File \"/usr/lib/python3/dist-packages/uac
  lient/cli/__init__.py\", line 202, in new_f\n    return f(*args, **kwargs)\n  
File \"/usr/lib/python3/dist-packages/uaclient/cli/__init__.py\", line 186,
  in new_f\n    retval = f(*args, cfg=cfg, **kwargs)\n  File 
\"/usr/lib/python3/dist-packages/uaclient/cli/__init__.py\", line 1305, in 
action_attach\n    a
  ctions.attach_with_token(cfg, token=token, allow_enable=allow_enable)\n  File 
\"/usr/lib/python3/dist-packages/uaclient/actions.py\", line 65, in attach_w
  ith_token\n    new_machine_token = contract_client.add_contract_machine(\n  
File \"/usr/lib/python3/dist-packages/uaclient/util.py\", line 92, in decorato
  r\n    return f(*args, **kwargs)\n  File 
\"/usr/lib/python3/dist-packages/uaclient/contract.py\", line 92, in 
add_contract_machine\n    activity_info = se
  lf._get_activity_info()\n  File 
\"/usr/lib/python3/dist-packages/uaclient/contract.py\", line 413, in 
_get_activity_info\n    \"desktop\": system.is_deskt
  op(),\n  File \"/usr/lib/python3/dist-packages/uaclient/system.py\", line 
397, in is_desktop\n    for package in apt.get_installed_packages():\n  File \"/
  usr/lib/python3/dist-packages/uaclient/apt.py\", line 727, in 
get_installed_packages\n    out, _ = system.subp([\"apt\", \"list\", 
\"--installed\"])\n  Fi
  le \"/usr/lib/python3/dist-packages/uaclient/system.py\", line 703, in subp\n 
   out, err = _subp(\n  File \"/usr/lib/python3/dist-packages/uaclient/syste
  m.py\", line 649, in _subp\n    out_result = out.decode(\"utf-8\") if out 
else \"\"\nUnicodeDecodeError: 'utf-8' codec can't decode byte 0xe1 in position
  109: invalid continuation byte"}]
  ["2024-04-10T08:38:29.763", "DEBUG", "ubuntupro.config", "parse_config", 625, 
"Using client configuration file at /etc/ubuntu-advantage/uaclient.conf", {}
  ]
  ["2024-04-10T08:38:29.767", "DEBUG", "ubuntupro.system", "load_file", 517, 
"Reading file: /etc/ubuntu-advantage/uaclient.conf", {}]
  ["2024-04-10T08:38:29.768", "DEBUG", "ubuntupro.files.files", "read", 60, 
"Tried to load /var/lib/ubuntu-advantage/user-config.json but file does not exis
  t", {}]
  ["2024-04-10T08:38:29.780", "DEBUG", "ubuntupro.http", "configure_web_proxy", 
146, "Setting no_proxy: 169.254.169.254,[fd00:ec2::254],metadata", {}]
  ["2024-04-10T08:38:29.780", "DEBUG", "ubuntupro.http", "configure_web_proxy", 
154, "Setting global proxy dict", {}]
  ["2024-04-10T08:38:29.780", "DEBUG", "ubuntupro.cli", "main", 1825, "Executed 
with sys.argv: ['/usr/bin/pro', 'attach', '<REDACTED>']", {}]
  ["2024-04-10T08:38:29.781", "DEBUG", "ubuntupro.files.files", "read", 60, 
"Tried to load /var/lib/ubuntu-advantage/private/machine-token.json but file doe
  s not exist", {}]
  ["2024-04-10T08:38:29.781", "DEBUG", "ubuntupro.lock", "__enter__", 77, "spin 
lock starting for pro attach", {}]
  ["2024-04-10T08:38:29.781", "DEBUG", "ubuntupro.system", "write_file", 556, 
"Writing file /run/ubuntu-advantage/notices/60-operation_in_progress atomicall
  y via tempfile /run/ubuntu-advantage/notices/tmplx6ehdag", {}]
  ["2024-04-10T08:38:29.782", "DEBUG", "ubuntupro.system", "write_file", 556, 
"Writing file /var/lib/ubuntu-advantage/lock atomically via tempfile /var/lib/
  ubuntu-advantage/tmp6ml_ltfj", {}]
  ["2024-04-10T08:38:29.782", "DEBUG", "ubuntupro.system", "write_file", 556, 
"Writing file /run/ubuntu-advantage/notices/60-operation_in_progress atomicall
  y via tempfile /run/ubuntu-advantage/notices/tmpvxf_b1v0", {}]
  ["2024-04-10T08:38:29.783", "DEBUG", "ubuntupro.files.files", "read", 60, 
"Tried to load /var/lib/ubuntu-advantage/private/machine-token.json but file doe
  s not exist", {}]
  ["2024-04-10T08:38:29.783", "DEBUG", "ubuntupro.system", "load_file", 517, 
"Reading file: /etc/machine-id", {}]
  ["2024-04-10T08:38:29.783", "DEBUG", "ubuntupro.system", "load_file", 517, 
"Reading file: /etc/os-release", {}]
  ["2024-04-10T08:38:29.784", "DEBUG", "ubuntupro.system", "load_file", 517, 
"Reading file: /proc/version_signature", {}]
  ["2024-04-10T08:38:30.366", "DEBUG", "ubuntupro.system", 
"ensure_file_absent", 576, "Removed file: 
/run/ubuntu-advantage/notices/60-operation_in_progress"
  , {}]
  ["2024-04-10T08:38:30.367", "DEBUG", "ubuntupro.system", 
"ensure_file_absent", 576, "Removed file: /var/lib/ubuntu-advantage/lock", {}]
  ["2024-04-10T08:38:30.367", "ERROR", "ubuntupro.cli", "wrapper", 1768, 
"Unhandled exception, please file a bug", {"exc_info": "Traceback (most recent 
call
-  last):\n  File \"/usr/lib/python3/dist-packages/uaclient/cli/__init__.py\", 
line 1705, in wrapper\n    return func(*args, **kwargs)\n  File \"/usr/lib/py
+  last):\n  File \"/usr/lib/python3/dist-packages/uaclient/cli/__init__.py\", 
line 1705, in wrapper\n    return func(*args, **kwargs)\n  File \"/usr/lib/py
  thon3/dist-packages/uaclient/cli/__init__.py\", line 1838, in main\n    
return_value = args.action(args, cfg=cfg, extra_args=extra_args)\n  File 
\"/usr/li
  b/python3/dist-packages/uaclient/cli/__init__.py\", line 257, in new_f\n    
return f(args, cfg=cfg, **kwargs)\n  File \"/usr/lib/python3/dist-packages/uac
  lient/cli/__init__.py\", line 202, in new_f\n    return f(*args, **kwargs)\n  
File \"/usr/lib/python3/dist-packages/uaclient/cli/__init__.py\", line 186,
  in new_f\n    retval = f(*args, cfg=cfg, **kwargs)\n  File 
\"/usr/lib/python3/dist-packages/uaclient/cli/__init__.py\", line 1305, in 
action_attach\n    a
  ctions.attach_with_token(cfg, token=token, allow_enable=allow_enable)\n  File 
\"/usr/lib/python3/dist-packages/uaclient/actions.py\", line 65, in attach_w
  ith_token\n    new_machine_token = contract_client.add_contract_machine(\n  
File \"/usr/lib/python3/dist-packages/uaclient/util.py\", line 92, in decorato
  r\n    return f(*args, **kwargs)\n  File 
\"/usr/lib/python3/dist-packages/uaclient/contract.py\", line 92, in 
add_contract_machine\n    activity_info = se
  lf._get_activity_info()\n  File 
\"/usr/lib/python3/dist-packages/uaclient/contract.py\", line 413, in 
_get_activity_info\n    \"desktop\": system.is_deskt
  op(),\n  File \"/usr/lib/python3/dist-packages/uaclient/system.py\", line 
397, in is_desktop\n    for package in apt.get_installed_packages():\n  File \"/
  usr/lib/python3/dist-packages/uaclient/apt.py\", line 727, in 
get_installed_packages\n    out, _ = system.subp([\"apt\", \"list\", 
\"--installed\"])\n  Fi
  le \"/usr/lib/python3/dist-packages/uaclient/system.py\", line 703, in subp\n 
   out, err = _subp(\n  File \"/usr/lib/python3/dist-packages/uaclient/syste
  m.py\", line 649, in _subp\n    out_result = out.decode(\"utf-8\") if out 
else \"\"\nUnicodeDecodeError: 'utf-8' codec can't decode byte 0xe1 in position
  109: invalid continuation byte"}]
  
  ProblemType: Bug
  DistroRelease: Ubuntu 20.04
  Package: ubuntu-advantage-tools 31.2~20.04
  ProcVersionSignature: Ubuntu 5.15.0-101.111~20.04.1-generic 5.15.143
  Uname: Linux 5.15.0-101-generic x86_64
  NonfreeKernelModules: falcon_lsm_serviceable falcon_nf_netcontain falcon_kal 
falcon_lsm_pinned_16407 falcon_lsm_pinned_16206
  ApportVersion: 2.20.11-0ubuntu27.27
  Architecture: amd64
  CasperMD5CheckResult: skip
  Date: Wed Apr 10 08:28:11 2024
  PackageArchitecture: all
  ProcEnviron:
-  TERM=xterm
-  PATH=(custom, no user)
-  LANG=es_ES
-  SHELL=/bin/bash
+  TERM=xterm
+  PATH=(custom, no user)
+  LANG=es_ES
+  SHELL=/bin/bash
  SourcePackage: ubuntu-advantage-tools
  UpgradeStatus: No upgrade log present (probably fresh install)
  apparmor_logs.txt:
-  
+ 
  cloud-id.txt-error: Invalid command specified 'cloud-id'.
  livepatch-status.txt-error: Invalid command specified 
'/snap/bin/canonical-livepatch status'.
  ua-status.json-error: Failed running command 'pro status --format json' 
[exit(1)]. Message:
  uaclient.conf:
-  contract_url: https://contracts.canonical.com
-  log_level: debug
+  contract_url: https://contracts.canonical.com
+  log_level: debug

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2060769

Title:
  pro-client execs `apt list --installed` instead of using python3-apt -
  leading to utf-8 errors

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/ubuntu-advantage-tools/+bug/2060769/+subscriptions


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to