#!/usr/bin/env python # -*- coding: utf-8 -*- # # kernel_prune.py # # Copyright 2017 Sam Nazarko import argparse import os import urllib import sys import re def main(args): use_web = False repositories = ['bullseye', 'bullseye-devel'] arches = [ 'i386', 'amd64', 'armhf', 'arm64'] kernel_regex = re.compile('(vero364|pc|vero2|vero|rbp1|rbp2|atv)-image-(\d).\d{1,3}.\d{1,3}-\d{1,3}-osmc') parser = argparse.ArgumentParser(description="Kernel pruner 0.1") parser.add_argument("--dry-run", default=False, action="store_true" , help="Prints kernels that would be deleted only") args = parser.parse_args() if not os.path.isdir("/var/repos/apt/debian"): print("Couldn't find APT repository") args.dry_run = True use_web = True if args.dry_run == True: print("Running in dry mode, no kernels will be removed") for arch in arches: for repository in repositories: if args.dry_run == True: file_pkgs = urllib.urlopen('http://apt.osmc.tv/dists/' + repository + '/main/binary-' + arch + '/Packages').read() else: with open('/var/repos/apt/debian/dists/' + repository + '/main/binary-' + arch + '/Packages', 'r') as package_file: file_pkgs = package_file.read() packages = file_pkgs.split('\n\n') package_name = None package_version = None package_depends = None package_architecture = None active_kernels = [] all_kernels = [] for package in packages: for line in package.splitlines(): if line.startswith('Package:'): package_name = str(line.split('Package:',1)[1].lstrip()) if line.startswith('Version:'): package_version = str(line.split('Version:',1)[1].lstrip()) if line.startswith('Depends:'): package_depends = str(line.split('Depends:',1)[1].lstrip()) if line.startswith('Architecture:'): package_architecture = str(line.split('Architecture:',1)[1].lstrip()) # Find the active kernel if package_name.endswith('-kernel-osmc') and package_depends: active_kernel = package_name.split('-kernel-osmc')[0] print(package_depends + " is an active kernel") active_kernels.append(package_depends) # Find all other kernels if kernel_regex.match(package_name): all_kernels.append(package_name) # Work out what to remove for kernel in set.difference(set(all_kernels), set(active_kernels)): if args.dry_run == True: print ("We should remove " + kernel + " from " + arch + " in " + repository) print kernel.replace("image", "headers") else: print ("Removing " + kernel + " from " + arch + " in " + repository) os.chdir("/var/repos/apt/debian") os.system("/usr/bin/reprepro remove " + repository + " " + kernel) os.system("/usr/bin/reprepro remove " + repository + " " + kernel.replace("image", "headers")) os.system("/usr/bin/reprepro remove " + repository + " " + kernel.replace("image", "source")) return 0 if __name__ == '__main__': import sys sys.exit(main(sys.argv))