diff options
Diffstat (limited to 'mk/pkginstall/usergroup')
-rw-r--r-- | mk/pkginstall/usergroup | 382 |
1 files changed, 382 insertions, 0 deletions
diff --git a/mk/pkginstall/usergroup b/mk/pkginstall/usergroup new file mode 100644 index 00000000000..9d89271f35d --- /dev/null +++ b/mk/pkginstall/usergroup @@ -0,0 +1,382 @@ +# $NetBSD: usergroup,v 1.1 2006/05/21 23:50:15 jlam Exp $ +# +# Generate a +USERGROUP script that reference-counts users and groups +# that are required for the proper functioning of the package. +# +case "${STAGE},$1" in +UNPACK,|UNPACK,+USERGROUP) + ${CAT} > ./+USERGROUP << 'EOF' +#!@SH@ +# +# +USERGROUP - users and groups management script +# +# Usage: ./+USERGROUP ADD|REMOVE [metadatadir] +# ./+USERGROUP CHECK-ADD|CHECK-REMOVE [metadatadir] +# +# This script supports two actions, ADD and REMOVE, that will add or +# remove the users and groups needed by the package associated with +# <metadatadir>. The CHECK-ADD action will check whether any users or +# groups needed by the package are missing, and print an informative +# message noting those users and groups. The CHECK-REMOVE action will +# check whether any users and groups needed by the package still exist, +# and print an informative message noting those users and groups. The +# CHECK-ADD and CHECK-REMOVE actions return non-zero if they detect +# either missing or existing users/groups, respectively. +# +# Lines starting with "# USER: " or "# GROUP: " are data read by this +# script that name the users and groups that this package requires to +# exist to function correctly, e.g. +# +# # USER: foo:foogrp::The Foomister +# # GROUP: foogrp +# +# The USER lines are of the form: +# +# user:group[:[userid][:[descr][:[home][:shell]]]] +# +# Only the user and group are required; everything else is optional, +# but the colons must be in the right places when specifying optional +# bits. +# +# The GROUP lines are of the form: +# +# group[:groupid] +# +# Only the group is required; the groupid is optional. +# +AWK="@AWK@" +CAT="@CAT@" +CHGRP="@CHGRP@" +CHMOD="@CHMOD@" +CHOWN="@CHOWN@" +ECHO="@ECHO@" +GREP="@GREP@" +LS="@LS@" +MKDIR="@MKDIR@" +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_USERS_DBDIR="${PKG_REFCOUNT_DBDIR}/users" +PKG_REFCOUNT_GROUPS_DBDIR="${PKG_REFCOUNT_DBDIR}/groups" + +case "${PKG_CREATE_USERGROUP:-@PKG_CREATE_USERGROUP@}" in +[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) + _PKG_CREATE_USERGROUP=yes + ;; +[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) + _PKG_CREATE_USERGROUP=no + ;; +esac + +listwrap() +{ + _length=$1 + _buffer= + while read _line; do + set -- $_line + for _word; do + case $_buffer in + "") _buffer="$_word" ;; + *) _buffer="$_buffer $_word" ;; + esac + if ${TEST} ${#_buffer} -gt $_length; then + ${ECHO} " $_buffer" + _buffer= + fi + done + done + case $_buffer in + "") ;; + *) ${ECHO} " $_buffer" ;; + esac +} + +# DO NOT CHANGE THE FOLLOWING LINE! +# platform-specific adduser/addgroup functions + +exitcode=0 +case $ACTION in +ADD) + ${SED} -n "/^\# GROUP: /{s/^\# GROUP: //;p;}" ${SELF} | ${SORT} -u | + { while read line; do + SAVEIFS="$IFS"; IFS=":" + set -- $line + group="$1"; groupid="$2" + IFS="$SAVEIFS" + case $group in + "") continue ;; + esac + shadow_dir="${PKG_REFCOUNT_GROUPS_DBDIR}/$group" + preexist="$shadow_dir/+PREEXISTING" + token="$shadow_dir/${PKGNAME}" + if ${TEST} ! -d "$shadow_dir"; then + ${MKDIR} $shadow_dir + group_exists $group $groupid && + ${ECHO} "${PKGNAME}" > $preexist + fi + if ${TEST} -f "$token" && \ + ${GREP} "^${PKG_METADATA_DIR}$" $token >/dev/null; then + : + else + ${ECHO} "${PKG_METADATA_DIR}" >> $token + fi + case ${_PKG_CREATE_USERGROUP} in + yes) + group_exists $group $groupid + case $? in + 0) ;; + 1) addgroup "$group" "$groupid" ;; + esac + ;; + esac + done; } + ${SED} -n "/^\# USER: /{s/^\# USER: //;p;}" ${SELF} | ${SORT} -u | + { while read line; do + SAVEIFS="$IFS"; IFS=":" + set -- $line + user="$1"; group="$2"; userid="$3" + descr="$4"; home="$5" shell="$6" + IFS="$SAVEIFS" + case $user in + "") continue ;; + esac + case $group in + "") continue ;; + esac + shadow_dir="${PKG_REFCOUNT_USERS_DBDIR}/$user" + preexist="$shadow_dir/+PREEXISTING" + token="$shadow_dir/${PKGNAME}" + if ${TEST} ! -d "$shadow_dir"; then + ${MKDIR} $shadow_dir + user_exists $user $userid && + ${ECHO} "${PKGNAME}" > $preexist + fi + if ${TEST} -f "$token" && \ + ${GREP} "^${PKG_METADATA_DIR}$" $token >/dev/null; then + : + else + ${ECHO} "${PKG_METADATA_DIR}" >> $token + fi + case ${_PKG_CREATE_USERGROUP} in + yes) + group_exists $group || continue + user_exists $user $userid + case $? in + 0) ;; + 1) adduser "$user" "$group" "$userid" \ + "$descr" "$home" "$shell" + ;; + esac + ;; + esac + done; } + ;; + +REMOVE) + ${SED} -n "/^\# USER: /{s/^\# USER: //;p;}" ${SELF} | ${SORT} -u | + { while read line; do + SAVEIFS="$IFS"; IFS=":" + set -- $line + user="$1"; group="$2"; userid="$3" + descr="$4"; home="$5" shell="$6" + IFS="$SAVEIFS" + case $user in + "") continue ;; + esac + shadow_dir="${PKG_REFCOUNT_USERS_DBDIR}/$user" + 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 + "") + ${RM} -f $preexist $token $token.tmp.* + ${RMDIR} -p $shadow_dir 2>/dev/null || ${TRUE} + ;; + *) + ${MV} -f $tokentmp $token + ;; + esac + fi + done; } + ${SED} -n "/^\# GROUP: /{s/^\# GROUP: //;p;}" ${SELF} | ${SORT} -u | + { while read line; do + SAVEIFS="$IFS"; IFS=":" + set -- $line + group="$1"; groupid="$2" + IFS="$SAVEIFS" + case $group in + "") continue ;; + esac + shadow_dir="${PKG_REFCOUNT_GROUPS_DBDIR}/$group" + 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 + "") + ${RM} -f $preexist $token $token.tmp.* + ${RMDIR} -p $shadow_dir 2>/dev/null || ${TRUE} + ;; + *) + ${MV} -f $tokentmp $token + ;; + esac + fi + done; } + ;; + +CHECK-ADD) + ${SED} -n "/^\# GROUP: /{s/^\# GROUP: //;p;}" ${SELF} | ${SORT} -u | + { while read line; do + SAVEIFS="$IFS"; IFS=":" + set -- $line + group="$1"; groupid="$2" + IFS="$SAVEIFS" + case $group in + "") continue ;; + *) group_exists $group $groupid && continue ;; + esac + case "$printed_header" in + yes) ;; + *) printed_header=yes + ${ECHO} "===========================================================================" + ${ECHO} "The following groups need to be created for ${PKGNAME}:" + ${ECHO} "" + ;; + esac + case $groupid in + "") ${ECHO} " $group" ;; + *) ${ECHO} " $group (gid = $groupid)" ;; + esac + done + case "$printed_header" in + yes) ${ECHO} "" + ${ECHO} "===========================================================================" + exit 1 + ;; + esac; } + ${TEST} $? -eq 0 || exitcode=1 + ${SED} -n "/^\# USER: /{s/^\# USER: //;p;}" ${SELF} | ${SORT} -u | + { while read line; do + SAVEIFS="$IFS"; IFS=":" + set -- $line + user="$1"; group="$2"; userid="$3" + descr="$4"; home="$5" shell="$6" + IFS="$SAVEIFS" + case $user in + "") continue ;; + *) user_exists $user $userid && continue ;; + esac + case "$printed_header" in + yes) ;; + *) printed_header=yes + ${ECHO} "===========================================================================" + ${ECHO} "The following users need to be created for ${PKGNAME}:" + ${ECHO} "" + ;; + esac + : ${home:="@PKG_USER_HOME@"} + : ${shell:="@PKG_USER_SHELL@"} + case $userid in + "") ${ECHO} " $user: $group, $home, $shell" ;; + *) ${ECHO} " $user (uid = $userid): $group, $home, $shell" ;; + esac + done + case "$printed_header" in + yes) ${ECHO} "" + ${ECHO} "===========================================================================" + exit 1 + ;; + esac; } + ${TEST} $? -eq 0 || exitcode=1 + ;; + +CHECK-REMOVE) + ${SED} -n "/^\# USER: /{s/^\# USER: //;p;}" ${SELF} | ${SORT} -u | + { while read line; do + SAVEIFS="$IFS"; IFS=":" + set -- $line + user="$1"; group="$2"; userid="$3" + descr="$4"; home="$5" shell="$6" + IFS="$SAVEIFS" + case $user in + "") continue ;; + *) user_exists $user $userid || continue ;; + esac + shadow_dir="${PKG_REFCOUNT_USERS_DBDIR}/$user" + ${TEST} ! -d "$shadow_dir" || continue # refcount isn't zero + existing_users="$existing_users $user" + done + case $existing_users in + "") ;; + *) ${ECHO} "===========================================================================" + ${ECHO} "The following users are no longer being used by ${PKGNAME}," + ${ECHO} "and they can be removed if no other software is using them:" + ${ECHO} "" + ${ECHO} "$existing_users" | listwrap 40 + ${ECHO} "" + ${ECHO} "===========================================================================" + exit 1 + ;; + esac; } + ${TEST} $? -eq 0 || exitcode=1 + ${SED} -n "/^\# GROUP: /{s/^\# GROUP: //;p;}" ${SELF} | ${SORT} -u | + { while read line; do + SAVEIFS="$IFS"; IFS=":" + set -- $line + group="$1"; groupid="$2" + IFS="$SAVEIFS" + case $group in + "") continue ;; + *) group_exists $group $groupid || continue ;; + esac + shadow_dir="${PKG_REFCOUNT_GROUPS_DBDIR}/$group" + ${TEST} ! -d "$shadow_dir" || continue # refcount isn't zero + existing_groups="$existing_groups $group" + done + case $existing_groups in + "") ;; + *) ${ECHO} "===========================================================================" + ${ECHO} "The following groups are no longer being used by ${PKGNAME}," + ${ECHO} "and they can be removed if no other software is using them:" + ${ECHO} "" + ${ECHO} "$existing_groups" | listwrap 40 + ${ECHO} "" + ${ECHO} "===========================================================================" + exit 1 + ;; + esac; } + ${TEST} $? -eq 0 || exitcode=1 + ;; + +*) + ${ECHO} "Usage: ./+USERGROUP ADD|REMOVE [metadatadir]" + ${ECHO} " ./+USERGROUP CHECK-ADD|CHECK-REMOVE [metadatadir]" + ;; +esac +exit $exitcode + +EOF + ${SED} -n "/^\# GROUP: /p" ${SELF} >> ./+USERGROUP + ${SED} -n "/^\# USER: /p" ${SELF} >> ./+USERGROUP + ${CHMOD} +x ./+USERGROUP + ;; +esac + |