freebsd-ports/Mk/Scripts/check_leftovers.sh
Antoine Brodin 525472b249 Fix a false positive home directory leftover for ports with multiple USERS
or with USERS matching another user in UIDs

Reported by:	adamw (mail/spamassassin)
With hat:	portmgr
2014-12-01 17:57:19 +00:00

162 lines
4.7 KiB
Bash

#! /bin/sh
# $FreeBSD$
#
# MAINTAINER: portmgr@FreeBSD.org
#
# This script is used by poudriere and tinderbox(soon) as the source-of-truth for
# what should be considered a leftover and what is whitelisted.
#
# !!!! This script's input/output format must remain backwards-compatible.
# !!!! If you want to change it, create a new script and have the calling
# !!!! scripts use the new one if available.
#
# Usage: env PORTSDIR=... check_leftovers.sh category/port
# stdin:
# - missing-file
# + new-file
# M modified-file reason...
#
# stdout:
# same -/+/M format, but with files substituted, without approved
# whitelisted files, and hides any directories already in plist.
#
# The PLIST_SUB feature can be disabled by setting PLIST_SUB_SED=
# in environment.
origin="$1"
[ $# -eq 1 ] || { echo "Must supply ORIGIN as parameter" >&2; exit 1; }
[ -n "${PORTSDIR}" ] || { echo "PORTSDIR must be set" >&2; exit 1; }
portdir="${PORTSDIR}/${origin}"
# PREFIX/LOCALBASE may be set in env or want default from port.
if [ -n "${PREFIX}" ]; then
PORT_FLAGS="${PORT_FLAGS} PREFIX=${PREFIX}"
else
PREFIX=$(make -C ${portdir} -VPREFIX)
fi
if [ -n "${LOCALBASE}" ]; then
PORT_FLAGS="${PORT_FLAGS} LOCALBASE=${LOCALBASE}"
else
LOCALBASE=$(make -C ${portdir} -VLOCALBASE)
fi
homedirs=$(awk -F: -v users=$(make -C ${portdir} -V USERS|sed -e 's, ,|,g;/^$/d;s,^,^(,;s,$,)$,') 'users && $1 ~ users {print $9}' ${PORTSDIR}/UIDs|sort -u|sed -e "s|/usr/local|${PREFIX}|"|tr "\n" " ")
plistsub_sed=$(make -C ${portdir} -VPLIST_SUB_SED | /bin/sh ${PORTSDIR}/Mk/Scripts/plist_sub_sed_sort.sh)
tmpplist=$(make -C ${portdir} -VTMPPLIST)
while read modtype path extra; do
# Ignore everything from these files/directories
case "${path}" in
${HOME:-/root}/.ccache/*|/root/.ccache/*|\
/compat/linux/proc/*|\
/dev/*|\
/etc/make.conf.bak|\
/proc/*|\
/tmp/*|\
/var/db/pkg/*|\
/var/db/ports/*|\
/var/log/*|\
/var/mail/*|\
/var/run/*|\
/var/tmp/*) continue ;;
# fc-cache - skip for now
/var/db/fontconfig/*) continue ;;
esac
ignore_path=0
sub_path=$(echo "$path" | sed -e "s|^${PREFIX}/||" -e "${plistsub_sed}")
orig_sub_path="${sub_path}"
# If this is a directory, use @dir in output
is_dir=0
if [ -d "${path}" ]; then
is_dir=1
sub_path="@dir ${sub_path}"
fi
# Handle PORTDOCS/PORTEXAMPLES/etc
case "${orig_sub_path}" in
%%DOCSDIR%%*) sub_path="%%PORTDOCS%%${sub_path}" ;;
%%EXAMPLESDIR%%*) sub_path="%%PORTEXAMPLES%%${sub_path}" ;;
esac
case $modtype in
+)
if [ ${is_dir} -eq 1 ]; then
# home directory of users created
case " ${homedirs} " in
*\ ${path}\ *) continue ;;
*\ ${path}/*\ *) continue ;;
esac
# Don't show dirs already in plist (due to parents)
grep -qE \
"^@(unexec rmdir \"?(%D/|${PREFIX})?${path#${PREFIX}/}[ \"]|dir(rm|rmtry)? ${path#${PREFIX}/}\$)" \
${tmpplist} && continue
fi
# Check absolute paths
case "${path}" in
# Leave qmail's queue dir alone to not cause lost mail
# during upgrades, just as /var/mail is left alone.
/var/qmail/queue/*|/var/qmail/queue) continue ;;
esac
# Check relative/plist paths
case "${sub_path}" in
# gconftool-2 --makefile-uninstall-rule is unpredictable
etc/gconf/gconf.xml.defaults/%gconf-tree*.xml) ;;
*) echo "+ ${sub_path}" ;;
esac
;;
-)
# Skip removal of PREFIX and PREFIX/info from
# bsd.port.mk for now.
# Skip if it is PREFIX and non-LOCALBASE. See misc/kdehier4
# or mail/qmail for examples
[ "${path}" = "${PREFIX}" -a "${LOCALBASE}" != "${PREFIX}" ] &&
ignore_path=1
# The removal of info may be a bug; it's part of BSD.local.dist.
# See ports/74691
[ "${sub_path}" = "info" -a "${LOCALBASE}" != "${PREFIX}" ] &&
ignore_path=1
[ $ignore_path -eq 0 ] && echo "- ${sub_path}"
;;
M)
# Check relative/plist paths
case "${sub_path}" in
# gconftool-2 --makefile-uninstall-rule is unpredictable
etc/gconf/gconf.xml.defaults/%gconf-tree*.xml) ;;
# This is a cache file for gio modules could be modified
# for any gio modules
lib/gio/modules/giomodule.cache) ;;
# removal of info files leaves entry uneasy to cleanup
# in info/dir
info/dir) ;;
*/info/dir) ;;
# The is pear database cache
%%PEARDIR%%/.depdb|%%PEARDIR%%/.filemap) ;;
#ls-R files from texmf are often regenerated
*/ls-R) ;;
# Octave packages database, blank lines can be inserted
# between pre-install and post-deinstall
share/octave/octave_packages) ;;
# xmlcatmgr is constantly updating catalog.ports ignore
# modification to that file
share/xml/catalog.ports) ;;
# Ignore common system config files
/etc/group|\
/etc/make.conf|\
/etc/master.passwd|\
/etc/passwd|\
/etc/pwd.db|\
/etc/shells|\
/etc/spwd.db) ;;
*) echo "M ${sub_path#@dir } ${extra}" ;;
esac
;;
esac
done
exit 0