From d8ac55e449a899431e0e99bce81337247d577ff2 Mon Sep 17 00:00:00 2001 From: John Nielsen Date: Thu, 30 Aug 2012 16:50:55 -0600 Subject: [PATCH] Add script to interactively set/un-set 'automatic' status of installed packages. --- scripts/set_pkg_auto.sh | 116 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100755 scripts/set_pkg_auto.sh diff --git a/scripts/set_pkg_auto.sh b/scripts/set_pkg_auto.sh new file mode 100755 index 0000000..6342e7a --- /dev/null +++ b/scripts/set_pkg_auto.sh @@ -0,0 +1,116 @@ +#!/bin/sh + +# Copyright (c) 2012 John Nielsen +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer +# in this position and unchanged. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This script presents a checklist of all PKGNG packages registered on +# the system, showing for each whether or not it is marked as "automatic" +# (i.e. not explicitly requested by the user). Any changes are recorded +# via 'pkg set ...'. I wrote it to make "pkg autoremove" useful following +# a pkg2ng migration, but other uses are conceivable. + +# Terminal geometry +sz=`stty size` +rows=`echo ${sz} | cut -d ' ' -f 1` +cols=`echo ${sz} | cut -d ' ' -f 2` +drows=$(( ${rows} - 3 )) +dcols=$(( ${cols} - 6 )) + +# Dialog results are stored here +tmpfile=`mktemp -t set_pkg_auto` + +# We always want the same style checklist +export DIALOGOPTS="--extra-button --extra-label \"Select All\" --cancel-label \"Deselect All\" --help-button --help-label Exit" + +# Exit with an error message +die() { + rm -f ${tmpfile} + echo "${1}" + exit 1 +} + +# Don't leave tmpfile behind even if we are killed/interrupted +trap "die \"Interrupt received.\"" 2 15 + +# Run dialog to present the checklist and save the results in tmpfile +run_dialog() { + dialog --checklist "Select packages to consider for auto-removal" ${drows} ${dcols} ${drows} $* 2>${tmpfile} + return $? +} + +# Show the current status from the package database in the checklist +select_current() { + run_dialog `pkg query '%n %o %a' | sed -e 's/1$/on/g' -e 's/0$/off/g'` + return $? +} + +# Select all packages in the checklist +select_all() { + run_dialog `pkg query '%n %o' | sed -e 's/$/ on/g'` + return $? +} + +# De-select all packages in the checklist +select_none() { + run_dialog `pkg query '%n %o' | sed -e 's/$/ off/g'` + return $? +} + +# Update the package database to match selections in the specified file +do_update() { + autopkgs=`sed -e 's/"//g' ${1}` + # First unset all + pkg set -ay -A 0 + # Then set selected + pkg set -y -A 1 ${autopkgs} +} + +# Run select_current for the first checklist +pkgset=current + +# Show the checklist until "OK" or "Exit" is selected +while : ; do + select_${pkgset} + case $? in + 0) # OK, continue with updates + break; + ;; + 3) # Extra (Select all), show the checklist again + pkgset=all + ;; + 1) # Cancel (Deselect all), show the checklist again + pkgset=none + ;; + *) # 4-Help (Exit) or ESC or error, exit. + die "No changes made." + ;; + esac +done + +# If we got this far then tmpfile has a list of 'automatic' packages +do_update ${tmpfile} + +# Clean up +rm -f ${tmpfile} +echo "Updated successfully." -- 1.7.11.3