Skip to content

Instantly share code, notes, and snippets.

@likema
Last active May 5, 2020 09:12
Show Gist options
  • Save likema/866147427d091d2fade842dd1869d688 to your computer and use it in GitHub Desktop.
Save likema/866147427d091d2fade842dd1869d688 to your computer and use it in GitHub Desktop.
Remove old Debian/Ubuntu kernel versions.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# vim: set ts=4 sw=4 sts=4 et:
from distutils.version import LooseVersion
from subprocess import Popen, PIPE
from re import compile as rcomp
from os import uname, system
from sys import exit
from argparse import ArgumentParser, ArgumentTypeError
from functools import cmp_to_key
def cmp_version(a, b):
return LooseVersion(a) < LooseVersion(b)
def dpkg_get_selections():
proc = Popen(('dpkg', '--get-selections'), stdout=PIPE, close_fds=True)
for i in proc.stdout:
yield i.decode('utf-8')
proc.wait()
def kernel_versions():
linux_image_re = rcomp(r'^linux-image-([\d.-]+-\S+).*')
for i in dpkg_get_selections():
m = linux_image_re.match(i)
if m:
yield m.group(1)
def packages(versions):
for i in dpkg_get_selections():
for j in versions:
if j in i:
yield i.split()[0]
break
def keep_type(x):
x = int(x)
if x < 1:
raise ArgumentTypeError("Minimum keep is 1")
return x
def parse_args():
parser = ArgumentParser('remove_old_kernels')
parser.add_argument('-k', '--keep', type=keep_type, default=1,
help='The number of kernel versions to keep')
parser.add_argument('-y', '--yes', action='store_const', const='-y',
default='', help='Automatic yes to apt-get prompts')
return parser.parse_args()
args = parse_args()
current = uname()[2]
versions = sorted(filter(lambda x: x != current, kernel_versions()),
key=cmp_to_key(cmp_version))
if not versions:
exit(0)
keep = args.keep - 1
if LooseVersion(versions[-1]) > LooseVersion(current):
versions = versions[:-1]
if keep > 0:
keep -= 1
if keep > 0:
versions = versions[:-keep]
if versions:
print('''The following kernel versions will be removed:
%s
''' % '\n '.join(versions))
system('apt-get remove --purge %s %s' % (
args.yes, ' '.join(packages(versions))))
system('apt-get autoremove --purge %s' % args.yes)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment