385 lines
9.9 KiB
Text
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
|
|
|