diff options
author | jlam <jlam> | 2006-05-21 23:50:15 +0000 |
---|---|---|
committer | jlam <jlam> | 2006-05-21 23:50:15 +0000 |
commit | c96b7ee78eedfde311f6a5db6fbfc5793fbe1c47 (patch) | |
tree | 0c523987180f677a1b6f7605da0f810de5df2349 /mk/pkginstall/files | |
parent | 2bdde7af8a649f77c51bafe61f47d7d78fa3e592 (diff) | |
download | pkgsrc-c96b7ee78eedfde311f6a5db6fbfc5793fbe1c47.tar.gz |
Move mk/install to mk/pkginstall to better reflect the contents (the
pkginstall framework).
Diffstat (limited to 'mk/pkginstall/files')
-rw-r--r-- | mk/pkginstall/files | 459 |
1 files changed, 459 insertions, 0 deletions
diff --git a/mk/pkginstall/files b/mk/pkginstall/files new file mode 100644 index 00000000000..aad8bb1062a --- /dev/null +++ b/mk/pkginstall/files @@ -0,0 +1,459 @@ +# $NetBSD: files,v 1.1 2006/05/21 23:50:15 jlam 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 VIEW-REMOVE depotdir viewdir +# ./+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 +# <metadatadir>. 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 VIEW-REMOVE action will remove from <viewdir> the +# links to the configuration files in <depotdir>. 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 + +case $ACTION in +VIEW-REMOVE) + DEPOTDIR="$2" + VIEWDIR="$3" + ${TEST} -n "${DEPOTDIR}" -a -n "${VIEWDIR}" || exit 0 + ;; +*) + PKG_METADATA_DIR="${2-`${PWD_CMD}`}" + : ${PKGNAME=${PKG_METADATA_DIR##*/}} + : ${PKG_DBDIR=${PKG_METADATA_DIR%/*}} + : ${PKG_REFCOUNT_DBDIR=${PKG_DBDIR}.refcount} + PKG_REFCOUNT_FILES_DBDIR="${PKG_REFCOUNT_DBDIR}/files" + ;; +esac + +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"; then + : + else + case "$f_flags:$_PKG_CONFIG:$_PKG_RCD_SCRIPTS" in + *f*:*:*|[!r]:yes:*|[!r][!r]:yes:*|[!r][!r][!r]:yes:*|*r*:yes:yes) + case "$printed_header" in + yes) ;; + *) printed_header=yes + ${ECHO} "===========================================================================" + ${ECHO} "Installing files needed by ${PKGNAME}:" + ;; + esac + if ${TEST} -f "$file"; then + ${ECHO} "" + ${ECHO} " $file already exists." + elif ${TEST} -f "$f_eg"; then + ${ECHO} "" + ${ECHO} " $file" + ${ECHO} " [$f_eg]" + ${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 + case "$printed_header" in + yes) ${ECHO} "" + ${ECHO} "===========================================================================" + ;; + esac; } + ;; + +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" && \ + ${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 + ;; + +VIEW-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 + ${DEPOTDIR}/*) link="${VIEWDIR}/${file#${DEPOTDIR}/}" ;; + [!/]*) link="${VIEWDIR}/$file" ;; + *) continue ;; + esac + dir="${link%[^/]*}" + if ${TEST} -h "$link"; then + ${RM} -f $link + ${RMDIR} -p $dir 2>/dev/null || ${TRUE} + fi + 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; } + ${RM} -fr $tmpdir + ${TEST} $? -eq 0 || exitcode=1 + ;; + +*) + ${ECHO} "Usage: ./+FILES ADD|REMOVE|PERMS [metadatadir]" + ${ECHO} " ./+FILES VIEW-REMOVE depotdir viewdir" + ${ECHO} " ./+FILES CHECK-ADD|CHECK-REMOVE|CHECK-PERMS [metadatadir]" + ;; +esac +exit $exitcode + +EOF + ${SED} -n "/^\# FILE: /p" ${SELF} >> ./+FILES + ${CHMOD} +x ./+FILES + ;; +esac + |