From 31b1271d60bb87f1c0779259f8f02a6f71a396ea Mon Sep 17 00:00:00 2001
From: Massimiliano Adamo <maxadamo@gmail.com>
Date: Sun, 1 May 2022 20:42:44 +0200
Subject: [PATCH] use python apt instead of subprocess

---
 README.md                |  2 +-
 README.txt               |  2 +-
 ubuntu-kernel-cleanup.py | 28 +++++++++-------------------
 3 files changed, 11 insertions(+), 21 deletions(-)

diff --git a/README.md b/README.md
index 73a7b76..a982497 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@ Purge unused Ubuntu kernels
 
 ### Setup
 
-I havent' created a release process yet.
+I did not create a release process yet.
 
 Meanwhile I use Git LFS to upload the package in the folder [deb/](https://gitlab.com/maxadamo/ubuntu-kernel-cleanup/-/tree/master/deb) directory.
 
diff --git a/README.txt b/README.txt
index d182fe3..dc22180 100644
--- a/README.txt
+++ b/README.txt
@@ -15,7 +15,7 @@ Table of Contents
 
 Setup
 
-I havent’ created a release process yet.
+I did not create a release process yet.
 
 Meanwhile I use Git LFS to upload the package in the folder deb/
 directory.
diff --git a/ubuntu-kernel-cleanup.py b/ubuntu-kernel-cleanup.py
index 39cdeca..25f470f 100755
--- a/ubuntu-kernel-cleanup.py
+++ b/ubuntu-kernel-cleanup.py
@@ -36,24 +36,15 @@ except ModuleNotFoundError as err:
 
 def get_packages_list(pkg_match):
     """
-      run a shell command like this one:
-      dpkg --list linux-image-[1-9]* | awk '/^ii /&&/linux-image-/{print $2}'
-      and create a sorted list of installed kernels.
-      Or if we need the version only it could be:
-      dpkg-query -f '${Status} ${Version}\n' -W linux-image-[1-9]* | awk '/ok installed/{print $NF}'
+      return a list of kernel package versions installed on the system
     """
-    installed = sp.Popen(
-        "dpkg --list %s[1-9]* | awk \'/^ii /&&/%s/{print $2}\'" % (
-            pkg_match, pkg_match),
-        stdout=sp.PIPE, stderr=sp.PIPE, shell=True
-    )
-    installed_out, _ = installed.communicate()
-    installed_list = installed_out.decode('utf-8').split('\n')
-    kernels = [x for x in installed_list if x != '']  # delete empty items
-    kernel_versions = [get_version(item) for item in kernels]
+    c_list = list(CACHE)
+    c_list_names = [element.name for element in c_list if CACHE[element].is_installed]
+    c_list_installed = [element for element in c_list_names if element.startswith(
+        pkg_match) and any(chr.isdigit() for chr in element)]
+    c_list_installed_versions = [re.sub(r"(^\D+-|-\D+)", r"", x) for x in c_list_installed]
 
-    # sort by version and unique
-    return natsorted(list(set(kernel_versions)))
+    return natsorted(c_list_installed_versions)
 
 
 def process_packages(version_number, prefix, execution_type):
@@ -165,7 +156,6 @@ if __name__ == '__main__':
                     # we are running the latest kernel
                     sanitized_kernel_list = kern_list
                     del kern_list[-1]
-
         try:
             sanitized_kernel_list
         except NameError:
@@ -180,9 +170,9 @@ if __name__ == '__main__':
                 for kernel_version in purged_list:
                     process_packages(kernel_version, kernel_pkg, EXECUTION)
 
-    CACHE.close()  # it returns always true... keeps closing :)
+    CACHE.close()  # it returns always true... keeps closing like swivel doors :)
 
-    # purge empty packages
+    # purge empty packages (it doesn't remove kernel but orphan packages without files)
     if EXECUTION == 'real':
         CMD = "dpkg-query -f \'${Package} ${Status}\\n\' -W linux-* | awk  \'/deinstall ok/{print $1}\' | xargs apt-get purge -y"  # pylint: disable=C0301
     else:
-- 
GitLab