]>
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 | ||
22 | list="$("${DPKG}" -l | awk '/^[ih][^nc][ ]+(linux|kfreebsd|gnumach)-image-[0-9]+\./ && $2 !~ /-dbg$/ && $2 !~ /-dbgsym$/ { print $2,$3; }' \ | |
23 | | sed -e 's#^\(linux\|kfreebsd\|gnumach\)-image-##' -e 's#:[^:]\+ # #')" | |
24 | debverlist="$(echo "$list" | cut -d' ' -f 2 | sort --unique --reverse --version-sort)" | |
25 | ||
26 | if [ -n "$1" ]; then | |
27 | installed_version="$(echo "$list" | awk "\$1 == \"$1\" { print \$2;exit; }")" | |
28 | fi | |
29 | unamer="$(uname -r)" | |
30 | if [ -n "$unamer" ]; then | |
31 | running_version="$(echo "$list" | awk "\$1 == \"$unamer\" { print \$2;exit; }")" | |
32 | fi | |
33 | latest_version="$(echo "$debverlist" | sed -n 1p)" | |
34 | previous_version="$(echo "$debverlist" | sed -n 2p)" | |
35 | ||
36 | debkernels="$(echo "$latest_version | |
37 | $installed_version | |
38 | $running_version | |
39 | $previous_version" | sort -u | sed -e '/^$/ d')" | |
40 | kernels="$( (echo "$1 | |
41 | $unamer"; for deb in $debkernels; do echo "$list" | awk "\$2 == \"$deb\" { print \$1; }"; done; ) \ | |
42 | | sed -e 's#\.#\\.#g' -e '/^$/ d' | sort -u)" | |
43 | ||
44 | generateconfig() { | |
45 | cat <<EOF | |
46 | // DO NOT EDIT! File autogenerated by $0 | |
47 | APT::NeverAutoRemove | |
48 | { | |
49 | EOF | |
50 | for package in $(apt-config dump --no-empty --format '%v%n' 'APT::VersionedKernelPackages'); do | |
51 | for kernel in $kernels; do | |
52 | echo " \"^${package}-${kernel}$\";" | |
53 | done | |
54 | done | |
55 | echo '};' | |
56 | if [ "${APT_AUTO_REMOVAL_KERNELS_DEBUG:-true}" = 'true' ]; then | |
57 | cat <<EOF | |
58 | /* Debug information: | |
59 | # dpkg list: | |
60 | $(dpkg -l | grep '\(linux\|kfreebsd\|gnumach\)-image-') | |
61 | # list of installed kernel packages: | |
62 | $list | |
63 | # list of different kernel versions: | |
64 | $debverlist | |
65 | # Installing kernel: $installed_version ($1) | |
66 | # Running kernel: $running_version ($unamer) | |
67 | # Last kernel: $latest_version | |
68 | # Previous kernel: $previous_version | |
69 | # Kernel versions list to keep: | |
70 | $debkernels | |
71 | # Kernel packages (version part) to protect: | |
72 | $kernels | |
73 | */ | |
74 | EOF | |
75 | fi | |
76 | } | |
77 | generateconfig "$@" > "${config_file}.dpkg-new" | |
78 | mv -f "${config_file}.dpkg-new" "$config_file" | |
79 | chmod 444 "$config_file" |