base-files: vkpurge: add wildcard support

closes #4614

Co-authored-by: maxice8 <thinkabit.ukim@gmail.com>
Co-authored-by: Duncaen <duncaen@voidlinux.org>
This commit is contained in:
Martin Dimov 2018-11-11 02:46:21 +01:00 committed by maxice8
parent a7fadf0e0a
commit f39996c2ff
3 changed files with 115 additions and 148 deletions

View file

@ -3,135 +3,92 @@
# A simple script to remove old kernel files/modules. # A simple script to remove old kernel files/modules.
# Brought to you by yours truly Juan RP in the Public Domain. # Brought to you by yours truly Juan RP in the Public Domain.
# #
: ${progname:=$(basename $0)} : "${progname:="${0##*/}"}"
case "$(xbps-uhelper arch)" in usage() {
aarch64*|ppc64*) KIMAGE="vmlinux";;
*) KIMAGE="vmlinuz";;
esac
usage()
{
cat <<_EOF cat <<_EOF
Usage: $progname <target> [<version>] Usage: $progname list [version ...]
$progname rm all
Targets: $progname rm <version ...>
list Lists old installed kernels.
rm <version...|all> Remove kernel <version> or all old kernels.
Example:
$ $progname list
$ $progname rm 4.9.81_1
_EOF _EOF
exit 1 exit 1
} }
list_kernels() list_kernels() {
{ running=$(uname -r)
local k kpkg installed kver _f installed=$(xbps-query -o "/boot/vmlinu[xz]-*" 2>/dev/null | awk '{print $2}')
for arg; do
case "$arg" in
all) pattern="*" ;;
*) pattern=$arg ;;
esac
for k in /boot/vmlinu[xz]-*; do
case "$installed" in
*"$k"*) continue ;;
esac
kver=${k##*-}
case "$kver" in
"$running") ;;
$pattern) printf "%s\n" "$kver" ;;
esac
done
done | sort -u
}
for k in /boot/$KIMAGE-*; do run_hooks() {
_f=$(basename $k) dir="$1"
kver=$(echo ${_f}|sed -e 's|-rc|rc|') kver="$2"
installed=$(xbps-query -o "$k" 2>/dev/null) for d in /etc/kernel.d/"${dir}"/*; do
[ -n "$installed" ] && continue [ -x "$d" ] || continue
kpkg="$(xbps-uhelper getpkgversion ${_f} 2>/dev/null)" printf "Running %s kernel hook: %s...\n" "$dir" "${d##*/}"
[ "$(uname -r)" = "$kpkg" ] && continue "$d" kernel "$kver"
[ -n "$kpkg" ] && echo "$kpkg"
done done
} }
run_hooks() remove_kernel() {
{ rmkver="$1"
local dir="$1"
local kver="$2"
local d
for d in /etc/kernel.d/${dir}/*; do
[ ! -x "$d" ] && continue
echo "Running ${dir} kernel hook: $(basename $d)..."
$d kernel $kver
done
}
remove_kernel()
{
local rmkver="$1"
local installed f kfile
if [ ! -f /boot/$KIMAGE-${rmkver} -a ! -d /lib/modules/${rmkver} ]; then
echo "Kernel ${rmkver} not installed."
exit 0
fi
installed=$(xbps-uhelper version "linux${rmkver%*.*}" 2>/dev/null)
if [ -n "$installed" -a "$installed" = "$rmkver" ]; then
echo "Kernel $rmkver is currently installed."
exit 0
fi
# Execute pre-remove kernel hooks. # Execute pre-remove kernel hooks.
run_hooks pre-remove $rmkver run_hooks pre-remove "$rmkver"
# Remove kernel files in /boot.
for f in config System.map $KIMAGE; do for f in \
kfile="/boot/${f}-${rmkver}" /boot/config-"${rmkver}" \
[ ! -f "${kfile}" ] && continue /boot/System.map-"${rmkver}" \
echo "Removing ${kfile}..." /boot/vmlinu[xz]-"${rmkver}" \
rm -f ${kfile} /usr/lib/modules/"${rmkver}"; do
[ -e "$f" ] || continue
printf "Removing %s...\n" "$f"
rm -rf "$f"
done done
# Remove kernel modules
if [ -d "/lib/modules/${rmkver}" ]; then
echo "Removing /lib/modules/${rmkver}..."
rm -rf /lib/modules/${rmkver}
fi
# Execute post-remove kernel hooks. # Execute post-remove kernel hooks.
run_hooks post-remove $rmkver run_hooks post-remove "$rmkver"
# Remove kernel-headers.
if [ -d /usr/src/kernel-headers-${rmkver} ]; then for f in \
rm -rf /usr/src/kernel-headers-${rmkver} /usr/src/kernel-headers-"${rmkver}" \
fi /usr/lib/debug/boot/vmlinu[xz]-"${rmkver}" \
# Remove debugging symbols. /usr/lib/debug/usr/lib/modules/"${rmkver}" \
dfile=/usr/lib/debug/boot/vmlinux-${rmkver} /boot/dtbs/dtbs-"${rmkver}"; do
if [ -f "${dfile}" ]; then [ -e "$f" ] || continue
echo "Removing ${dfile}..." printf "Removing %s...\n" "$f"
rm -f ${dfile} rm -rf "$f"
fi done
if [ -d /usr/lib/debug/usr/lib/modules/${rmkver} ]; then
echo "Removing /usr/lib/debug/usr/lib/modules/${rmkver}..."
rm -rf /usr/lib/debug/usr/lib/modules/${rmkver}
fi
# Remove dtb files
if [ -d "/boot/dtbs/dtbs-${rmkver}" ]; then
echo "Removing /boot/dtbs/dtbs-${rmkver}..."
rm -rf "/boot/dtbs/dtbs-${rmkver}"
fi
} }
if [ "$1" = "list" ]; then case "$1" in
list_kernels list) list_kernels "${2:-all}" ;;
elif [ "$1" = "rm" ]; then rm)
if [ "$(id -u)" -ne 0 ]; then [ -z "$2" ] && usage
echo "You have to run this script as root!" if [ "$(id -u)" -ne 0 ]; then
exit 1 printf "You have to run this script as root!\n" >&2
fi exit 1
fi
if [ -z "$2" ]; then
usage
elif [ "$2" = "all" ]; then
kernels=$(list_kernels)
for k in ${kernels}; do
echo "Removing kernel $k files ..."
remove_kernel "$k"
done
else
shift shift
for k; do for kver in $(list_kernels "$@"); do
echo "Removing kernel $k files ..." printf "Removing kernel %s...\n" "$kver"
remove_kernel "$k" remove_kernel "$kver"
done done
fi ;;
else *) usage ;;
usage esac
fi
exit 0 exit 0

View file

@ -1,4 +1,4 @@
.Dd July 24, 2016 .Dd April 6, 2019
.Dt VKPURGE 8 .Dt VKPURGE 8
.Os .Os
.Sh NAME .Sh NAME
@ -7,52 +7,62 @@
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Cm list .Cm list
.Op Ar version
.Nm
.Cm rm all
.Nm .Nm
.Cm rm .Cm rm
.Op Ar versions\ ... | Cm all .Ar version ...
.Sh DESCRIPTION .Sh DESCRIPTION
The The
.Nm .Nm
command is used to properly remove old or unwanted kernels from Void Linux utility lists and removes removable kernel versions leaved
systems, by running the appropiate removal hooks and doing the removal. behind by
.Ss Justification
.Xr xbps-install 1 .Xr xbps-install 1
will leave old kernels in place when the kernel package gets upgraded, and and
.Xr xbps-remove 1 .Xr xbps-remove 1 .
will only be able to remove the latest kernel in a version, .Nm
for example 4.3.4_4, but it would need to leave behind 4.3.4_3. runs the appropriate removal hooks and deletes the kernel,
.Sh OPTIONS modules and other miscellaneous files.
.Bl -tag -width Ds .Pp
.It Ic list .Nm
Provide a list of installed kernel versions. only removes kernel versions that are:
.It Ic rm .Bl -bullet -compact
Remove kernels. .It
Must be followed by either a version number or the literal not currently booted.
.Sq Ic all . .It
not provided by any installed xbps package.
.El
.Pp
The
.Ar version
arguments support
.Xr sh 1
pattern matching.
.Pp
The following commands are available:
.Bl -tag -width 4n
.It Ic list Op Ar version
List removable kernel versions.
Optionally list only versions matching
.Ar version .
.It Ic rm all
Remove all removable kernel versions.
.It Ic rm Ar version ...
Remove all removable kernel versions matching
.Ar version .
.El .El
.Sh EXIT STATUS .Sh EXIT STATUS
.Nm .Ex -std
exits with a 0 code unless the help text was printed.
Since there is no proper invocation to trigger a print of the help,
this can be summarized: if there was a proper invocation of
.Nm
then the command will exit 0.
Otherwise, the exit code is 1.
.Sh EXAMPLES .Sh EXAMPLES
The following will list all installed kernels. The following command lists installed kernels matching a pattern.
.Bd -literal -offset indent .Bd -literal -offset indent
$ vkpurge list $ vkpurge list '4.18.*'
.Ed .Ed
.Pp .Pp
The following command will delete the kernel version 2.6.39_2 with all The following command will delete the kernel versions matching the pattern and a specified version.
kernel-specific files such as compiled modules.
.Bd -literal -offset indent .Bd -literal -offset indent
# vkpurge rm 2.6.39_2 # vkpurge rm '2.6.*' 4.3.4_1
.Ed
.Pp
The following command will delete the kernels with version 2.6.39_2 and 4.3.4_1
.Bd -literal -offset indent
# vkpurge rm 2.6.39_2 4.3.4_1
.Ed .Ed
.Sh SEE ALSO .Sh SEE ALSO
.Xr xbps-install 1 , .Xr xbps-install 1 ,

View file

@ -1,7 +1,7 @@
# Template file for 'base-files' # Template file for 'base-files'
pkgname=base-files pkgname=base-files
version=0.140 version=0.140
revision=3 revision=4
bootstrap=yes bootstrap=yes
depends="xbps-triggers" depends="xbps-triggers"
short_desc="Void Linux base system files" short_desc="Void Linux base system files"