Hello world,
A cute crontab entry. It sends pleasant little mails to root giving a
description of any new packages installed/upgraded/removed on the system
during the day. The descriptions are either the output of dpkg -s,
the relevant changelog entries, or "Removed foo" as appropriate.
It needs cron, awk, debianutils and dpkg-dev installed to work.
Copy it into /etc/cron.daily, mark it executable, and that's about it.
Anyway, I think it's quite nice.
Thanks to Clinton Roy for the idea and making the code readable :)
(If someone wants to stick this in a convenient .deb, you're quite
welcome)
(The only problem I've noticed so far is that dpkg-parsechangelog -v
doesn't work so well when the `-v' version doesn't exist, for NMUs,
for example. Don't really know what to do about that)
----
#! /bin/bash
#
# Copyright (c) 1999 Anthony Towns
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
umask 022
PKGSTAT=/var/log/pkgstatus
pkgbreak () {
echo "============================================================"
echo
}
if [ -e "$PKGSTAT" ]; then
mv $PKGSTAT $PKGSTAT.old
fi
cat /var/lib/dpkg/status |
awk '/^Package: / { P = $2 }
/^Status: / { S = $4 }
/^Version: / {
V = $2;
if ( S == "installed" )
print P " " V
}' |
sort > $PKGSTAT
if ! [ -e $PKGSTAT.old ]; then
echo "WARNING: Previous list of packages unavailable"
exit 0
fi
MIDDLE=0
OUTPUT=`tempfile`
diff $PKGSTAT.old $PKGSTAT |
awk '/^</ { before[$2] = $3 }
/^>/ { after[$2] = $3 }
END {
for (package in before) {
if (after[package])
print "2U " package " " before[package] " " after[package]
else
print "3R " package
}
for (package in after) {
if (!before[package])
print "1I " package " " after[package]
}
}' |
sort |
sed 's/^[123]//' |
while read act pkg v1 v2
do
if [ "$MIDDLE" = "1" ];
then
pkgbreak
fi
MIDDLE=1
if [ "$act" = "R" ]
# the package was removed
then
echo Removed $pkg
echo
elif [ "$act" = "I" ]
# the package was newly installed
then
dpkg -s $pkg
else
# the package was upgraded
if dpkg --compare-versions $v1 ge $v2
then
# package was downgraded
echo "WARNING: $pkg was downgraded from $v1 to $v2"
echo
else
# find out where the documentation for this package is
# stored. either /usr/doc/$pkg or /usr/share/doc/$pkg
DOCDIR=/usr/doc/$pkg
if ! [ -e $DOCDIR ]
then
DOCDIR=/usr/share/doc/$pkg
fi
# if the package is not a debian native pacakge, use
# the maintainers changelog, otherwise the original
CL=$DOCDIR/changelog.Debian.gz
if ! [ -e $CL ]; then
CL=$DOCDIR/changelog.gz
fi
if [ -e $CL ]
then
T=`tempfile`
zcat $CL >$T
dpkg-parsechangelog -l$T -v$v1
echo
rm $T
else
echo "ERROR: Changelog for $pkg not found."
echo
fi
fi
fi
done 2>&1 |
grep -v "no utmp entry available, using value of LOGNAME" > $OUTPUT
if [ -s $OUTPUT ]; then
HOSTNAME=`hostname`
mail -s "$HOSTNAME: changed packages" root < $OUTPUT
fi
rm -f $OUTPUT
----
Cheers,
aj
--
Anthony Towns <aj@humbug.org.au> <http://azure.humbug.org.au/~aj/>
I don't speak for anyone save myself. PGP encrypted mail preferred.
``There's nothing worse than people with a clue.
They're always disagreeing with you.''
-- Andrew Over
Attachment:
pgpa6UNPwPNwo.pgp
Description: PGP signature