pkgsrc/mk/pkginstall/usergroup

385 lines
9.9 KiB
Text

# $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
# <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@"
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