1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
#!/bin/bash
# wnpp-alert -- check for installed packages which have been orphaned
# or put up for adoption
# This script is in the PUBLIC DOMAIN.
# Authors:
# Arthur Korn <arthur@korn.ch>
# Arthur wrote:
# Get a list of packages with bugnumbers. I tried with LDAP, but this
# is _much_ faster.
# And I (Julian) tried it with Perl's LWP, but this is _much_ faster
# (startup time is huge). And even Perl with wget is slower by 50%....
set -e
PROGNAME=${0##*/}
# TODO: Remove use of OLDCACHEDDIR post-Stretch
OLDCACHEDIR=~/.devscripts_cache
OLDCACHEDDIFF="${OLDCACHEDIR}/wnpp-diff"
CACHEDIR=${XDG_CACHE_HOME:-~/.cache}
CACHEDIR=${CACHEDIR%/}/devscripts
CACHEDDIFF="${CACHEDIR}/wnpp-diff"
CURLORWGET=""
GETCOMMAND=""
usage() { echo \
"Usage: $PROGNAME [--help|-h|--version|-v|--diff|-d] [package ...]
List all installed (or listed) packages with Request for
Adoption (RFA), Request for Help (RFH), or Orphaned (O)
bugs against them, as determined from the WNPP website.
https://www.debian.org/devel/wnpp"
}
version() { echo \
"This is $PROGNAME, from the Debian devscripts package, version ###VERSION###
This script is in the PUBLIC DOMAIN.
Authors: Arthur Korn <arthur@korn.ch>
Modifications: Julian Gilbey <jdg@debian.org>"
}
wnppdiff() {
if [ -f "$OLDCACHEDDIFF" ]; then
mv "$OLDCACHEDDIFF" "$CACHEDDIFF"
fi
if [ ! -f "$CACHEDDIFF" ]; then
# First use
comm -12 $WNPP_PACKAGES $INSTALLED | sed -e 's/\([+.]\)/\\\1/g' | \
xargs -I{} grep -E '^[A-Z]+ [0-9]+ {} ' $WNPP | \
tee "$CACHEDDIFF"
else
comm -12 $WNPP_PACKAGES $INSTALLED | sed -e 's/\([+.]\)/\\\1/g' | \
xargs -I{} grep -E '^[A-Z]+ [0-9]+ {} ' $WNPP > "$WNPP_DIFF" || true
sort -o "$CACHEDDIFF" "$CACHEDDIFF"
sort -o "$WNPP_DIFF" "$WNPP_DIFF"
comm -3 "$CACHEDDIFF" "$WNPP_DIFF" | \
sed -e 's/\t/\+/g' -e 's/^\([^+]\)/-\1/g'
mv "$WNPP_DIFF" "$CACHEDDIFF"
fi
}
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then usage; exit 0; fi
if [ "$1" = "--version" ] || [ "$1" = "-v" ]; then version; exit 0; fi
if command -v wget > /dev/null; then
CURLORWGET="wget"
GETCOMMAND="wget -q -O"
elif command -v curl > /dev/null; then
CURLORWGET="curl"
GETCOMMAND="curl -qfsL -o"
else
echo "$PROGNAME: need either the wget or curl package installed to run this" >&2
exit 1
fi
# Let's abandon this directory from now on, these files are so small
# (see bug#309802)
if [ -d "$CACHEDIR" ]; then
rm -f "$CACHEDIR"/orphaned "$CACHEDIR"/rfa_bypackage
fi
WNPPTMPDIR=$(mktemp --directory --tmpdir wnppalert.XXXXXX)
trap 'rm -rf "$WNPPTMPDIR"' EXIT
cd "$WNPPTMPDIR"
INSTALLED=installed
WNPP=wnpp
WNPP_PACKAGES=wnpp_packages
if [ "$1" = "--diff" ] || [ "$1" = "-d" ]; then
shift
WNPP_DIFF=wnpp_diff
fi
# Here's a really sly sed script. Rather than first grepping for
# matching lines and then processing them, this attempts to sed
# every line; those which succeed execute the 'p' command, those
# which don't skip over it to the label 'd'
WNPPTMP=orphaned
$GETCOMMAND $WNPPTMP https://www.debian.org/devel/wnpp/orphaned || \
{ echo "$PROGNAME: $CURLORWGET https://www.debian.org/devel/wnpp/orphaned failed" >&2; exit 1; }
sed -ne 's/.*<li><a href="https\?:\/\/bugs.debian.org\/\([0-9]*\)">\([^:<]*\)[: ]*\([^<]*\)<\/a>.*/O \1 \2 -- \3/; T d; p; : d' $WNPPTMP > $WNPP
WNPPTMP=rfa_bypackage
$GETCOMMAND $WNPPTMP https://www.debian.org/devel/wnpp/rfa_bypackage || \
{ echo "$PROGNAME: $CURLORWGET https://www.debian.org/devel/wnpp/rfa_bypackage" >&2; exit 1; }
sed -ne 's/.*<li><a href="https\?:\/\/bugs.debian.org\/\([0-9]*\)">\([^:<]*\)[: ]*\([^<]*\)<\/a>.*/RFA \1 \2 -- \3/; T d; p; : d' $WNPPTMP >> $WNPP
WNPPTMP=help_requested
$GETCOMMAND $WNPPTMP https://www.debian.org/devel/wnpp/help_requested || \
{ echo "$PROGNAME: $CURLORWGET https://www.debian.org/devel/wnpp/help_requested" >&2; exit 1; }
sed -ne 's/.*<li><a href="https\?:\/\/bugs.debian.org\/\([0-9]*\)">\([^:<]*\)[: ]*\([^<]*\)<\/a>.*/RFH \1 \2 -- \3/; T d; p; : d' $WNPPTMP >> $WNPP
cut -f3 -d' ' $WNPP | sort > $WNPP_PACKAGES
# A list of installed files.
if [ $# -gt 0 ]; then
printf '%s\n' "$@" | sort -u > $INSTALLED
else
dpkg-query -W -f '${Package} ${Status}\n${Source} ${Status}\n' | \
awk '/^[^ ].*install ok installed/{print $1}' | \
sort -u \
> $INSTALLED
fi
if [ -n "$WNPP_DIFF" ]; then
# This may fail when run from a cronjob (c.f., #309802), so just ignore it
# and carry on.
mkdir -p "$CACHEDIR" >/dev/null 2>&1 || true
if [ -d "$CACHEDIR" ] || [ -d "$OLDCACHEDIR" ]; then
wnppdiff
exit 0
else
echo "$PROGNAME: Unable to create diff; displaying full output"
fi
fi
comm -12 $WNPP_PACKAGES $INSTALLED | sed -e 's/\([+.]\)/\\\1/g' | \
xargs -I{} grep -E '^[A-Z]+ [0-9]+ {} ' $WNPP || true
|