# $NetBSD: usergroup,v 1.3 2009/10/29 20:19:27 joerg 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 # . 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@" MV="@MV@" PWD_CMD="@PWD_CMD@" RM="@RM@" RMDIR="@RMDIR@" SED="@SED@" SORT="@SORT@" TEST="@TEST@" TRUE="@TRUE@" SELF=$0 ACTION=$1 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_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