Well, after some more refining I think I finally have a script I ain’t never gonna touch again (unless something breaks, which can happen quick as we all know).
The script now uses a sysconfig file for the common settings (like sender, receipents, categories to scan for), so it may be deployed en mass.
/etc/sysconfig/zypper-update-report
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
## Type: string ## Default: root ## Config: "" # # Sender address for the update report FROM="Yourupdatemonkey " ## Type: string ## Default: root ## Config: "" # # Receiver address for the update report #RECEIPENTS="tehsysadmin@barfoo.org" ## Type: string ## Default: "securty recommended optional" ## Config: "" # # List of groups, to include in the report CLASSES="security recommended optional" |
/usr/local/sbin/zypper-update-report
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 |
#!/bin/bash # Checks the output of `zypper pch` for security/recommended/optional updates # and prepares a detailed report to be mailed to the administrators [ -f /etc/sysconfig/update-report ] || exit 1 source /etc/sysconfig/update-report # Temporary files TMPDIR="$( mktemp -d /tmp/update-report.XXXXXX )" ZYPP_LIST="$TMPDIR/zypper-list" ZYPP_DETAILS="$TMPDIR/zypper-details" ZYPP_REPORT="$TMPDIR/zypper-report" zypper pch 2>/dev/null > $ZYPP_LIST # Figure out how much updates are still pending PENDING="$( cat $ZYPP_LIST | grep "| Needed" | wc -l )" if [ $PENDING -eq 0 ] ; then exit 0 fi echo > $ZYPP_REPORT echo " Pending updates for $( domainname -f ) on $( date )" >> $ZYPP_REPORT for severity in $CLASSES; do PACKAGES="$( cat $ZYPP_LIST | egrep "${severity}(.*)| Needed" | cut -d| -f2 | sed "s,^ ,," | sort -u )" [ -n "$PACKAGES" ] && echo [ -n "$PACKAGES" ] && echo " Category: $severity" for package in $PACKAGES; do zypper patch-info $package 2>/dev/null > $ZYPP_DETAILS echo "" echo " * Patch: $package" echo " Needs reboot: $( cat $ZYPP_DETAILS | grep "Reboot Required:" | sed -e "s,Reboot Required: ,," )" echo " Affected packages: " for atom in $( cat $ZYPP_DETAILS | grep "^atom:" | cut -d -f2 | sort ); do # Let's check whether or not the package listed in atom is installed ... # If installed, echo the atom, otherwise don't as we don't need to update # the package. RPM_STATUS=$( rpm -qi $atom ) if [ "$RPM_STATUS" != "package $atom is not installed" ] ; then echo " - $atom " fi done done done >> $ZYPP_REPORT if [ -n "$RECEIPENTS" ] ; then cat $ZYPP_REPORT | mail -r "$FROM" -s "[$( date +%F )] Update report for $( domainname -f )" $RECEIPENTS fi trap "rm -rf "$TMPDIR" >/dev/null 2>&1" ERR EXIT # vim: set tw=80 ts=2 sw=2 et softtabstop=2 |