]>
Commit | Line | Data |
---|---|---|
1 | #!/bin/sh | |
2 | set -e | |
3 | # Mark as not-for-autoremoval those kernel packages that are: | |
4 | # - the currently booted version | |
5 | # - the kernel version we've been called for | |
6 | # - the latest kernel version (as determined by debian version number) | |
7 | # - the second-latest kernel version | |
8 | # | |
9 | # In the common case this results in two kernels saved (booted into the | |
10 | # second-latest kernel, we install the latest kernel in an upgrade), but | |
11 | # can save up to four. Kernel refers here to a distinct release, which can | |
12 | # potentially be installed in multiple flavours counting as one kernel. | |
13 | ||
14 | eval $(apt-config shell APT_CONF_D Dir::Etc::parts/d) | |
15 | test -n "${APT_CONF_D}" || APT_CONF_D="/etc/apt/apt.conf.d" | |
16 | config_file="${APT_CONF_D}/01autoremove-kernels" | |
17 | ||
18 | eval $(apt-config shell DPKG Dir::bin::dpkg/f) | |
19 | test -n "$DPKG" || DPKG="/usr/bin/dpkg" | |
20 | ||
21 | list="$("${DPKG}" -l | awk '/^[ih][^nc][ ]+(linux|kfreebsd|gnumach)-image-[0-9]+\./ && $2 !~ /-dbg(:.*)?$/ && $2 !~ /-dbgsym(:.*)?$/ { print $2,$3; }' \ | |
22 | | sed -e 's#^\(linux\|kfreebsd\|gnumach\)-image-##' -e 's#:[^:]\+ # #')" | |
23 | debverlist="$(echo "$list" | cut -d' ' -f 2 | sort --unique --reverse --version-sort)" | |
24 | ||
25 | if [ -n "$1" ]; then | |
26 | installed_version="$(echo "$list" | awk "\$1 == \"$1\" { print \$2;exit; }")" | |
27 | fi | |
28 | unamer="$(uname -r)" | |
29 | if [ -n "$unamer" ]; then | |
30 | running_version="$(echo "$list" | awk "\$1 == \"$unamer\" { print \$2;exit; }")" | |
31 | fi | |
32 | latest_version="$(echo "$debverlist" | sed -n 1p)" | |
33 | previous_version="$(echo "$debverlist" | sed -n 2p)" | |
34 | ||
35 | debkernels="$(echo "$latest_version | |
36 | $installed_version | |
37 | $running_version | |
38 | $previous_version" | sort -u | sed -e '/^$/ d')" | |
39 | kernels="$( (echo "$1 | |
40 | $unamer"; for deb in $debkernels; do echo "$list" | awk "\$2 == \"$deb\" { print \$1; }"; done; ) \ | |
41 | | sed -e 's#\([\.\+]\)#\\\1#g' -e '/^$/ d' | sort -u)" | |
42 | ||
43 | generateconfig() { | |
44 | cat <<EOF | |
45 | // DO NOT EDIT! File autogenerated by $0 | |
46 | APT::NeverAutoRemove | |
47 | { | |
48 | EOF | |
49 | for package in $(apt-config dump --no-empty --format '%v%n' 'APT::VersionedKernelPackages'); do | |
50 | for kernel in $kernels; do | |
51 | echo " \"^${package}-${kernel}$\";" | |
52 | done | |
53 | done | |
54 | echo '};' | |
55 | if [ "${APT_AUTO_REMOVAL_KERNELS_DEBUG:-true}" = 'true' ]; then | |
56 | cat <<EOF | |
57 | /* Debug information: | |
58 | # dpkg list: | |
59 | $(dpkg -l | grep '\(linux\|kfreebsd\|gnumach\)-image-') | |
60 | # list of installed kernel packages: | |
61 | $list | |
62 | # list of different kernel versions: | |
63 | $debverlist | |
64 | # Installing kernel: $installed_version ($1) | |
65 | # Running kernel: $running_version ($unamer) | |
66 | # Last kernel: $latest_version | |
67 | # Previous kernel: $previous_version | |
68 | # Kernel versions list to keep: | |
69 | $debkernels | |
70 | # Kernel packages (version part) to protect: | |
71 | $kernels | |
72 | */ | |
73 | EOF | |
74 | fi | |
75 | } | |
76 | generateconfig "$@" > "${config_file}.dpkg-new" | |
77 | mv -f "${config_file}.dpkg-new" "$config_file" | |
78 | chmod 444 "$config_file" |