#!@SH@ # # $NetBSD: dirs,v 1.5 2005/01/31 21:41:06 jlam Exp $ # # +DIRS - reference-counted directory management script # # Usage: ./+DIRS ADD|REMOVE [metadatadir] # ./+DIRS CHECK-ADD|CHECK-REMOVE [metadatadir] # # This script supports two actions, ADD and REMOVE, that will add or # remove the directories needed by the package associated with # . The CHECK-ADD action will check whether any directories # needed by the package are missing, and print an informative message # noting those directories. The CHECK-REMOVE action will check whether # any directories needed by the package still exist, and print an # informative message noting those directories. The CHECK-ADD and # CHECK-REMOVE actions return non-zero if they detect either missing # or existing directories, respectively. # # Lines starting with "# DIR: " are data read by this script that # name the directories that this package requires to exist to function # correctly, e.g. # # # DIR: /etc/foo m # # DIR: /var/log/foo/tmp mo foo-user foo-group 0700 # # The second field in each DIRS entry is a set of flags with the following # meaning: # # m create (make) the directory when ADDing # o directory is owned by the package # CAT="@CAT@" CHGRP="@CHGRP@" CHMOD="@CHMOD@" CHOWN="@CHOWN@" ECHO="@ECHO@" GREP="@GREP@" 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_METADATA_DIR="${2-`${PWD_CMD}`}" : ${PKGNAME=${PKG_METADATA_DIR##*/}} : ${PKG_DBDIR=${PKG_METADATA_DIR%/*}} : ${PKG_REFCOUNT_DBDIR=${PKG_DBDIR}.refcount} PKG_REFCOUNT_DIRS_DBDIR="${PKG_REFCOUNT_DBDIR}/dirs" exitcode=0 case $ACTION in ADD) ${SED} -n "/^\# DIR: /{s/^\# DIR: //;p;}" ${SELF} | ${SORT} -u | while read dir d_flags d_user d_group d_mode; do case $dir in ""|[!/]*) continue ;; esac case $d_flags in *m*) ;; *) continue ;; esac shadow_dir="${PKG_REFCOUNT_DIRS_DBDIR}$dir" perms="$shadow_dir/+PERMISSIONS" preexist="$shadow_dir/+PREEXISTING" token="$shadow_dir/${PKGNAME}" if ${TEST} ! -d "$shadow_dir"; then ${MKDIR} $shadow_dir ${TEST} -d "$dir" && ${ECHO} "${PKGNAME}" > $preexist fi ${MKDIR} $dir if ${TEST} -f "$token" && \ ${GREP} "^${PKG_METADATA_DIR}$" $token >/dev/null; then : else ${ECHO} "${PKG_METADATA_DIR}" >> $token fi case $d_user/$d_group/$d_mode in [!/]*/[!/]*/[!/]*) ${ECHO} "$d_user $d_group $d_mode" > $perms ;; esac case $d_user/$d_group/$d_mode in [!/]*/[!/]*/[!/]*) ${CHOWN} $d_user $dir ${CHGRP} $d_group $dir ${CHMOD} $d_mode $dir ;; esac done ;; REMOVE) ${SED} -n "/^\# DIR: /{s/^\# DIR: //;p;}" ${SELF} | ${SORT} -ru | while read dir d_flags d_user d_group d_mode; do case $dir in ""|[!/]*) continue ;; esac case $d_flags in *m*) ;; *) continue ;; esac shadow_dir="${PKG_REFCOUNT_DIRS_DBDIR}$dir" 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 "") ${TEST} -f "$preexist" || { ${RMDIR} -p $dir 2>/dev/null || ${TRUE}; } ${RM} -f $perms $preexist $token $token.tmp.* ${RMDIR} -p $shadow_dir 2>/dev/null || ${TRUE} ;; *) ${MV} -f $tokentmp $token ;; esac fi done ;; CHECK-ADD) ${SED} -n "/^\# DIR: /{s/^\# DIR: //;p;}" ${SELF} | ${SORT} -u | { while read dir d_flags d_user d_group d_mode; do case $dir in ""|[!/]*) continue ;; *) ${TEST} -d "$dir" && continue ;; esac case $d_flags in *m*) ;; *) continue ;; esac case "$printed_header" in yes) ;; *) printed_header=yes ${ECHO} "===========================================================================" ${ECHO} "The following directories should be created for ${PKGNAME}:" ${ECHO} "" ;; esac case $d_user/$d_group/$d_mode in [!/]*/[!/]*/[!/]*) ${ECHO} " $dir (o=$d_user, g=$d_group, m=$d_mode)" ;; *) ${ECHO} " $dir" ;; esac done case "$printed_header" in yes) ${ECHO} "" ${ECHO} "===========================================================================" exit 1 ;; esac; } ${TEST} $? -eq 0 || exitcode=1 ;; CHECK-REMOVE) ${SED} -n "/^\# DIR: /{s/^\# DIR: //;p;}" ${SELF} | ${SORT} -ru | { while read dir d_flags d_user d_group d_mode; do case $dir in ""|[!/]*) continue ;; *) ${TEST} -d "$dir" || continue ;; esac case $d_flags in *o*) ;; *) continue ;; esac shadow_dir="${PKG_REFCOUNT_DIRS_DBDIR}$dir" ${TEST} -d "$shadow_dir" && continue # refcount isn't zero case "$printed_header" in yes) ;; *) printed_header=yes ${ECHO} "===========================================================================" ${ECHO} "The following directories are no longer being used by ${PKGNAME}," ${ECHO} "and they can be removed if no other packages are using them:" ${ECHO} "" ;; esac ${ECHO} " $dir" done case "$printed_header" in yes) ${ECHO} "" ${ECHO} "===========================================================================" exit 1 ;; esac; } ${TEST} $? -eq 0 || exitcode=1 ;; *) ${ECHO} "Usage: ./+DIRS ADD|REMOVE [metadatadir]" ${ECHO} " ./+DIRS CHECK-ADD|CHECK-REMOVE [metadatadir]" ;; esac exit $exitcode