~ts.sch.gr/sch-scripts/trunk

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
75
76
77
78
79
80
81
82
83
#!/bin/sh
# Purges all kernels and headers except for the newest ones for each 
# kernel variant, and except for the active one.
# Copyright (C) 2012 Alkis Georgopoulos <alkisg@gmail.com>
# License GNU GPL version 3 or newer <http://gnu.org/licenses/gpl.html>

# Sets keep_kernels, purge_kernels, keep_headers, purge_headers.
purgeable_kernels() {
    local current installed kernel version_variant variants

    current=$(uname -r)
    installed=$(dpkg -l 'linux-image-*' | awk '/^ii/ { print $2; }' | sort -frV)
    for kernel in $installed; do
        version_variant=${kernel#linux-image-}
        variant=$(echo "$version_variant" | sed "s/[.0-9-]*//")
        version=${version_variant%$variant}
        version=${version%-}
        # echo "version=$version, variant=$variant"
        test "$version" = "" && continue
        test "$variant" = "" && continue
        case " $variants " in
            *" $variant "*)
                # We already have the newest kernel for this variant.
                # But do check if it's the active one.
                if [ "$current" != "$version_variant" ]; then
                    purge_kernels="$purge_kernels $version_variant"
                    continue
                fi
                ;;
        esac
        variants="$variants $variant"
        keep_kernels="$keep_kernels $version_variant"
        # Maintain a $keep_versions list to help $purge_headers
        case " $keep_versions " in
            *" $version ") ;;
            *) keep_versions="$keep_versions $version" ;;
        esac
    done
    keep_kernels=$(echo "$keep_kernels" | sed "s/ / linux-image-/g")
    keep_kernels=${keep_kernels# }
    if [ -n "$purge_kernels" ]; then
        purge_kernels=$(echo "$purge_kernels" | sed "s/ / linux-image-/g")
        purge_kernels=${purge_kernels# }
    fi

    installed=$(dpkg -l 'linux-headers-*' | awk '/^ii/ { print $2; }' | sort -frV)
    for header in $installed; do
        version_variant=${header#linux-headers-}
        variant=$(echo "$version_variant" | sed "s/[.0-9-]*//")
        version=${version_variant%$variant}
        version=${version%-}
        # echo "version=$version, variant=$variant"
        test "$version" = "" && continue
        # test "$variant" = "" && continue
        case " $keep_versions " in
            *" $version "*)
                keep_headers="$keep_headers $version_variant"
                ;;
            *)
                purge_headers="$purge_headers $version_variant"
                ;;
        esac
    done
    keep_headers=$(echo "$keep_headers" | sed "s/ / linux-headers-/g")
    keep_headers=${keep_headers# }
    if [ -n "$purge_headers" ]; then
        purge_headers=$(echo "$purge_headers" | sed "s/ / linux-headers-/g")
        purge_headers=${purge_headers# }
    fi
}

purgeable_kernels
if [ -n "$purge_kernels" ] || [ -n "$purge_headers" ]; then
    echo "Θα διατηρηθούν οι παρακάτω kernels/headers:
$keep_kernels $keep_headers"
    echo "Θα διαγραφούν οι παρακάτω kernels/headers:
$purge_kernels $purge_headers"
    echo "Πατήστε [Enter] για να συνεχίσετε ή Ctrl+C για να διακόψετε."
    echo
    apt-get purge $purge_kernels $purge_headers
else
    echo "Δεν υπάρχουν παλιοί kernels ή headers για διαγραφή."
fi