Last active
February 23, 2018 05:56
-
-
Save magnetikonline/5647761 to your computer and use it in GitHub Desktop.
Remove old kernel versions from an Ubuntu Linux install.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import re | |
import subprocess | |
KERNEL_KEEP_MAX = 3 | |
KERNEL_PACKAGE_REGEXP = re.compile(r'^[a-z]+ +(linux-image-[0-9][^ ]+) +([0-9][^ ]+[0-9])') | |
def get_installed_kernel_list(): | |
process = subprocess.Popen(['dpkg','--list'],stdout = subprocess.PIPE) | |
kernel_list = [] | |
for line in process.stdout: | |
match = KERNEL_PACKAGE_REGEXP.search(line) | |
if (not match): | |
continue | |
kernel_list.append(match.group(1,2)) | |
return kernel_list | |
def get_sorted_kernel_list(kernel_list): | |
# correctly sort a Linux kernel version string (e.g. [4.4.0-112.135]) | |
def sorter(a,b): | |
def get_part_list(value): | |
return re.split(r'[\.-]',value) | |
b_list = get_part_list(b) | |
for a_part in get_part_list(a): | |
if (not b_list): | |
# [a] greater than [b] | |
return 1 | |
# compare parts - as integers if both are digits | |
b_part = b_list.pop(0) | |
result = ( | |
cmp(int(a_part),int(b_part)) | |
if (a_part.isdigit() and b_part.isdigit()) | |
else cmp(a_part,b_part) | |
) | |
if (result != 0): | |
# we have a winner | |
return result | |
if (b_list): | |
# [a] less than [b] | |
return -1 | |
# same value | |
return 0 | |
return sorted( | |
kernel_list, | |
sorter, | |
key = lambda x: x[1], | |
reverse = True | |
) | |
def main(): | |
# fetch installed kernel list and sort | |
kernel_list = get_sorted_kernel_list( | |
get_installed_kernel_list() | |
) | |
counter = 0 | |
kernel_keep_list = [] | |
has_removed = False | |
for kernel_package,kernel_version in kernel_list: | |
counter += 1 | |
if (counter > KERNEL_KEEP_MAX): | |
has_removed = True | |
print('Removing kernel: {0}'.format(kernel_package)) | |
# remove kernel and the 'extra' package | |
subprocess.call([ | |
'sudo','apt','purge', | |
kernel_package, | |
re.sub(r'^(linux-image-)',r'\1extra-',kernel_package) | |
]) | |
else: | |
kernel_keep_list.append(kernel_package) | |
# display remaining kernel versions | |
if (has_removed): | |
print('') | |
print('Remaining kernel versions:\n{0}'.format('\n'.join(kernel_keep_list))) | |
if (__name__ == '__main__'): | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment