# $NetBSD: files,v 1.11 2020/04/15 13:33:32 sborrill Exp $ # # Generate a +FILES script that reference counts config files that are # required for the proper functioning of the package. # case "${STAGE},$1" in UNPACK,|UNPACK,+FILES) ${CAT} > ./+FILES << 'EOF' #!@SH@ # # +FILES - reference-counted configuration file management script # # Usage: ./+FILES ADD|REMOVE|PERMS [metadatadir] # ./+FILES CHECK-ADD|CHECK-REMOVE|CHECK-PERMS [metadatadir] # # This script supports two actions, ADD and REMOVE, that will add or # remove the configuration files needed by the package associated with # . The CHECK-ADD action will check whether any files # needed by the package are missing, and print an informative message # noting those files. The CHECK-REMOVE action will check whether # any files needed by the package still exist, and print an informative # message noting those files. The CHECK-ADD and CHECK-REMOVE actions # return non-zero if they detect either missing or existing files, # respectively. The PERMS action # will correct any ownership or permission discrepancies between the # existing files and the data in this script, and the CHECK-PERMS # action will check whether any files have the wrong ownership or # permission and print an informative message noting those files. The # CHECK-PERMS action will return non-zero if it detects files with # wrong ownership or permissions. # # Lines starting with "# FILE: " are data read by this script that # name the files that this package requires to exist to function # correctly, along with the locations of the example files, e.g. # # # FILE: /etc/bar.conf c /example/bar.conf # # FILE: /etc/baz/conf c /example/baz.conf 0600 foo-user foo-group # # For each FILE entry, if the file path is relative, then it is taken to # be relative to ${PKG_PREFIX}. # # The second field in each FILE entry is a set of flags with the following # meaning: # # c file is copied into place # f ignore ${PKG_CONFIG} # r file is an rc.d script (consider ${PKG_RCD_SCRIPTS}) # AWK="@AWK@" CAT="@CAT@" CP="@CP@" CHGRP="@CHGRP@" CHMOD="@CHMOD@" CHOWN="@CHOWN@" CMP="@CMP@" ECHO="@ECHO@" GREP="@GREP@" LS="@LS@" MKDIR="@MKDIR@" MV="@MV@" PWD_CMD="@PWD_CMD@" RM="@RM@" RMDIR="@RMDIR@" SED="@SED@" SORT="@SORT@" TEST="@TEST@" TRUE="@TRUE@" SELF=$0 ACTION=$1 : "${PKG_PREFIX=@PREFIX@}" case "${PKG_CONFIG:-@PKG_CONFIG@}" in [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) _PKG_CONFIG=yes ;; [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) _PKG_CONFIG=no ;; esac case "${PKG_CONFIG_PERMS:-@PKG_CONFIG_PERMS@}" in [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) _PKG_CONFIG_PERMS=yes ;; [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) _PKG_CONFIG_PERMS=no ;; esac case "${PKG_RCD_SCRIPTS:-@PKG_RCD_SCRIPTS@}" in [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) _PKG_RCD_SCRIPTS=yes ;; [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) _PKG_RCD_SCRIPTS=no ;; esac CURDIR=`${PWD_CMD}` PKG_METADATA_DIR="${2-${CURDIR}}" : ${PKGNAME="${PKG_METADATA_DIR##*/}"} : ${PKG_DBDIR="${PKG_METADATA_DIR%/*}"} : "${PKG_REFCOUNT_DBDIR=${PKG_DBDIR}.refcount}" PKG_REFCOUNT_FILES_DBDIR="${PKG_REFCOUNT_DBDIR}/files" exitcode=0 case $ACTION in ADD) ${SED} -n "/^\# FILE: /{s/^\# FILE: //;p;}" "${SELF}" | ${SORT} -u | while read file f_flags f_eg f_mode f_user f_group; do case $file in "") continue ;; [!/]*) file="${PKG_PREFIX}/$file" ;; esac case $f_flags in *c*) ;; *) continue ;; esac case $f_eg in "") continue ;; [!/]*) f_eg="${PKG_PREFIX}/$f_eg" ;; esac shadow_dir="${PKG_REFCOUNT_FILES_DBDIR}$file" perms="$shadow_dir/+PERMISSIONS" preexist="$shadow_dir/+PREEXISTING" token="$shadow_dir/${PKGNAME}" if ${TEST} ! -d "$shadow_dir"; then ${MKDIR} "$shadow_dir" ${TEST} ! -f "$file" || ${ECHO} "${PKGNAME}" > "$preexist" fi if ${TEST} -f "$token" && \ ${GREP} "^${PKG_METADATA_DIR}$" "$token" >/dev/null; then : else ${ECHO} "${PKG_METADATA_DIR}" >> "$token" fi case $f_mode$f_user$f_group in "") ;; *) ${ECHO} "$f_mode $f_user $f_group" > "$perms" ;; esac if ${TEST} ! -f "$file" -a ! -f "$f_eg" -a ! -c "$f_eg"; then : else case "$f_flags:$_PKG_CONFIG:$_PKG_RCD_SCRIPTS" in *f*:*:*|[!r]:yes:*|[!r][!r]:yes:*|[!r][!r][!r]:yes:*|*r*:yes:yes) if ${TEST} -f "$file"; then ${ECHO} "${PKGNAME}: $file already exists" elif ${TEST} -f "$f_eg" -o -c "$f_eg"; then ${ECHO} "${PKGNAME}: copying $f_eg to $file" ${CP} "$f_eg" "$file" case $f_user in "") ;; *) ${CHOWN} "$f_user" "$file" ;; esac case $f_group in "") ;; *) ${CHGRP} "$f_group" "$file" ;; esac case $f_mode in "") ;; *) ${CHMOD} "$f_mode" "$file" ;; esac fi ;; esac fi done ;; REMOVE) ${SED} -n "/^\# FILE: /{s/^\# FILE: //;p;}" "${SELF}" | ${SORT} -ru | while read file f_flags f_eg f_mode f_user f_group; do case $file in "") continue ;; [!/]*) file="${PKG_PREFIX}/$file" ;; esac case $f_flags in *c*) ;; *) continue ;; esac case $f_eg in "") continue ;; [!/]*) f_eg="${PKG_PREFIX}/$f_eg" ;; esac shadow_dir="${PKG_REFCOUNT_FILES_DBDIR}$file" perms="$shadow_dir/+PERMISSIONS" preexist="$shadow_dir/+PREEXISTING" token="$shadow_dir/${PKGNAME}" tokentmp="$token.tmp.$$" if ${TEST} -f "$token" && \ ${GREP} "^${PKG_METADATA_DIR}$" "$token" >/dev/null; then ${CAT} "$token" | ${GREP} -v "^${PKG_METADATA_DIR}$" > "$tokentmp" case `${CAT} "$tokentmp" | ${SED} -n "$="` in "") if ${TEST} -f "$preexist"; then : elif ${TEST} -f "$file" -a \( -f "$f_eg" -o -c "$f_eg" \) && \ ${CMP} -s "$file" "$f_eg"; then case "$f_flags:$_PKG_CONFIG:$_PKG_RCD_SCRIPTS" in *f*:*:*|[!r]:yes:*|[!r][!r]:yes:*|[!r][!r][!r]:yes:*|*r*:yes:yes) ${RM} -f "$file" ;; esac fi ${RM} -f "$perms" "$preexist" "$token" "$token.tmp".* ${RMDIR} -p "$shadow_dir" 2>/dev/null || ${TRUE} ;; *) ${MV} -f "$tokentmp" "$token" ;; esac fi done ;; PERMS) ${SED} -n "/^\# FILE: /{s/^\# FILE: //;p;}" "${SELF}" | ${SORT} -ru | while read file f_flags f_eg f_mode f_user f_group; do case $_PKG_CONFIG:$_PKG_CONFIG_PERMS in yes:yes) ;; *) continue ;; esac case $file in "") continue ;; [!/]*) file="${PKG_PREFIX}/$file" ;; esac case $f_user in "") ;; *) ${CHOWN} "$f_user" "$file" ;; esac case $f_group in "") ;; *) ${CHGRP} "$f_group" "$file" ;; esac case $f_mode in "") ;; *) ${CHMOD} "$f_mode" "$file" ;; esac done ;; CHECK-ADD) ${SED} -n "/^\# FILE: /{s/^\# FILE: //;p;}" "${SELF}" | ${SORT} -ru | { while read file f_flags f_eg f_mode f_user f_group; do case $file in "") continue ;; [!/]*) file="${PKG_PREFIX}/$file" ;; esac ${TEST} ! -f "$file" || continue case $f_flags in *c*) ;; *) continue ;; esac case $f_eg in "") continue ;; [!/]*) f_eg="${PKG_PREFIX}/$f_eg" ;; esac case "$printed_header" in yes) ;; *) printed_header=yes ${ECHO} "===========================================================================" ${ECHO} "The following files should be created for ${PKGNAME}:" ;; esac ${ECHO} "" case $f_mode:$f_user:$f_group in ::) ${ECHO} " $file" ;; [!:]*::) ${ECHO} " $file (m=$f_mode)" ;; [!:]*:[!:]*:) ${ECHO} " $file (m=$f_mode, o=$f_user)" ;; [!:]*:[!:]*:[!:]*) ${ECHO} " $file (m=$f_mode, o=$f_user, g=$f_group)" ;; esac ${TEST} ! -f "$f_eg" || ${ECHO} " [$f_eg]" done case "$printed_header" in yes) ${ECHO} "" ${ECHO} "===========================================================================" exit 1 ;; esac; } ${TEST} $? -eq 0 || exitcode=1 ;; CHECK-REMOVE) ${SED} -n "/^\# FILE: /{s/^\# FILE: //;p;}" "${SELF}" | ${SORT} -ru | { while read file f_flags f_eg f_mode f_user f_group; do case $file in "") continue ;; [!/]*) file="${PKG_PREFIX}/$file" ;; esac ${TEST} -f "$file" || continue shadow_dir="${PKG_REFCOUNT_FILES_DBDIR}$file" ${TEST} ! -d "$shadow_dir" || continue # refcount isn't zero case "$printed_header" in yes) ;; *) printed_header=yes ${ECHO} "===========================================================================" ${ECHO} "The following files are no longer being used by ${PKGNAME}," ${ECHO} "and they can be removed if no other packages are using them:" ${ECHO} "" ;; esac ${ECHO} " $file" done case "$printed_header" in yes) ${ECHO} "" ${ECHO} "===========================================================================" exit 1 ;; esac; } ${TEST} $? -eq 0 || exitcode=1 ;; CHECK-PERMS) tmpdir="./.pkginstall.$$" ${MKDIR} -p "$tmpdir" 2>/dev/null || exit 1 ${CHMOD} 0700 "$tmpdir" ${SED} -n "/^\# FILE: /{s/^\# FILE: //;p;}" "${SELF}" | ${SORT} -ru | { while read file f_flags f_eg f_mode f_user f_group; do case $file in "") continue ;; [!/]*) file="${PKG_PREFIX}/$file" ;; esac ${TEST} -f "$file" || continue case $f_mode:$f_user:$f_group in ::) continue ;; esac perms=`${LS} -l "$file" | ${AWK} '{ print $1":"$3":"$4 }'` testpath="$tmpdir/file_perms" ${ECHO} > "$testpath" ${CHMOD} "$f_mode" "$testpath" 2>/dev/null longmode=`${LS} -l "$testpath" | ${AWK} '{ print $1 }'` case $f_mode:$f_user:$f_group in :[!:]*:) case "$perms" in *:"$f_user":*) continue ;; esac ;; :[!:]*:[!:]*) case "$perms" in *:"$f_user":"$f_group") continue ;; esac ;; [!:]*::) case "$perms" in "$longmode":*:*) continue ;; esac ;; [!:]*:[!:]*:) case "$perms" in "$longmode":"$f_user":*) continue ;; esac ;; [!:]*:[!:]*:[!:]*) case "$perms" in "$longmode":"$f_user":"$f_group") continue ;; esac ;; esac case "$printed_header" in yes) ;; *) printed_header=yes ${ECHO} "===========================================================================" ${ECHO} "The following files are used by ${PKGNAME} and have" ${ECHO} "the wrong ownership and/or permissions:" ${ECHO} "" ;; esac case $f_mode:$f_user:$f_group in [!:]*::) ${ECHO} " $file (m=$f_mode)" ;; [!:]*:[!:]*:) ${ECHO} " $file (m=$f_mode, o=$f_user)" ;; [!:]*:[!:]*:[!:]*) ${ECHO} " $file (m=$f_mode, o=$f_user, g=$f_group)" ;; esac done case "$printed_header" in yes) ${ECHO} "" ${ECHO} "===========================================================================" exit 1 ;; esac; } ${TEST} $? -eq 0 || exitcode=1 ${RM} -fr "$tmpdir" ;; *) ${ECHO} "Usage: ./+FILES ADD|REMOVE|PERMS [metadatadir]" ${ECHO} " ./+FILES CHECK-ADD|CHECK-REMOVE|CHECK-PERMS [metadatadir]" ;; esac exit $exitcode EOF ${SED} -n "/^\# FILE: /p" "${SELF}" >> ./+FILES ${CHMOD} +x ./+FILES ;; esac