Skip to content

Instantly share code, notes, and snippets.

@kckrinke
Created October 24, 2016 17:56
Show Gist options
  • Save kckrinke/b15137f99360965bb5f1a5e4c762c3d1 to your computer and use it in GitHub Desktop.
Save kckrinke/b15137f99360965bb5f1a5e4c762c3d1 to your computer and use it in GitHub Desktop.
apt-get hold / un-hold debian package
#!/bin/bash
#
# To hold one or more packages:
# apt-hold <pkg> [pkg2 ...]
#
# To un-hold one ore more packages:
# apt-hold -u <pkg> [pkg2 ...]
# or if this script is symlinked as apt-unhold:
# apt-unhold <pkg> [pkg2 ...]
function display_usage {
while [ $# -gt 0 ]; do echo "$1" 1>&2; shift; done
echo "Place APT packages on hold." 1>&2
echo "usage: $(basename $0) [pkgname...]" 1>&2
exit 1
}
function apt_hold {
local pkg="$1"
dpkg --get-selections | egrep -q "\\b${pkg}\\b\\s*install"
if [ $? -ne 0 ]
then
echo "${pkg} is not set for install"
return 0
fi
echo "Marking ${pkg} for holding"
echo "${pkg} hold" | dpkg --set-selections
return $?
}
function apt_unhold {
local pkg="$1"
dpkg --get-selections | egrep -q "\\b${pkg}\\b\\s*hold"
if [ $? -ne 0 ]
then
echo "${pkg} is not set for hold"
return 0
fi
echo "Marking ${pkg} for installation"
echo "${pkg} install" | dpkg --set-selections
return $?
}
if [ $EUID -ne 0 ]
then
echo "root privileges required."
exit 1
fi
PKG_NAMES=""
DO_UNHOLD=0
[ "$(basename $0)" == "apt-unhold" ] && DO_UNHOLD=1
while [ $# -gt 0 ]
do
case "$1" in
"-h"|"--help") display_usage;;
"-u"|"--unhold") DO_UNHOLD=1;;
*)
export PKG_NAMES="${PKG_NAMES} $1"
;;
esac
shift
done
if [ -z "${PKG_NAMES}" ]
then
dpkg --get-selections | grep hold
if [ $? -ne 0 ]
then
echo "No packages are being held."
fi
exit 0
fi
for pkg in ${PKG_NAMES}
do
if [ $DO_UNHOLD -eq 1 ]
then
apt_unhold "${pkg}"
else
apt_hold "${pkg}"
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment