summarylogtreecommitdiffstats
path: root/remove-orphaned-kernels
blob: 9e257f2cba3877393f05e090fcc41465e4756132 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#! /usr/bin/python
from subprocess import run
import sys
import os

MODULES = '/usr/lib/modules'


def get_output(*cmd):
    return run(cmd, capture_output=True).stdout.decode('utf8').strip()


def yn_choice(message, default='y'):
    try:
        choices = 'Y/n' if default.lower() in ('y', 'yes') else 'y/N'
        choice = input("%s\n(%s): " % (message, choices))
        values = ('y', 'yes', '') if default == 'y' else ('y', 'yes')
        return choice.strip().lower() in values
    except (KeyboardInterrupt, EOFError):
        sys.exit(1)


running_kernel = get_output('uname', '-r')
running_pkgs = get_output('pacman', '-Qoq', f'{MODULES}/{running_kernel}')
all_kernels = [f'{MODULES}/{k}' for k in os.listdir(MODULES)]
all_pkgs = get_output('pacman', '-Qoq', *all_kernels).split()
orphaned_packages = get_output('pacman', '-Qdtq', *all_pkgs).split()

non_orphaned = []
orphaned_not_running = []
orphaned_running = []

for pkg in sorted(all_pkgs):
    orphaned = pkg in orphaned_packages
    running = pkg in running_pkgs

    if orphaned and not running:
        orphaned_not_running.append(pkg)
    elif orphaned:
        orphaned_running.append(pkg)
    else:
        non_orphaned.append(pkg)

if non_orphaned:
    print(
        "The following required or explicitly-installed kernel packages will be kept:"
    )
    for pkg in non_orphaned:
        print('    ', pkg)

    print()

if orphaned_running:
    print(
        "The following orphaned packages for the currently running kernel will be kept:"
    )
    for pkg in orphaned_running:
        print('    ', pkg)

    print()

if orphaned_not_running:
    print("The following orphaned kernel packages will be removed:")
    for pkg in orphaned_not_running:
        print('    ', pkg)

    print()

if not orphaned_not_running:
    print("Nothing to do")
    sys.exit(0)

if yn_choice("Continue?"):
    sys.exit(run(['sudo', 'pacman', '-Rs'] + orphaned_not_running).returncode)