summaryrefslogtreecommitdiff
path: root/mk/pkginstall/usergroup
diff options
context:
space:
mode:
Diffstat (limited to 'mk/pkginstall/usergroup')
-rw-r--r--mk/pkginstall/usergroup382
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
+