pkgsrc/mk/pkginstall/usergroupfuncs.Linux
sbd 9d8345a50e Add the '-r' option to useradd/groupadd when no uid/git is given so that
a system account/group (differance id range) will be created.
2013-04-05 03:30:40 +00:00

157 lines
4.3 KiB
Text

# $NetBSD: usergroupfuncs.Linux,v 1.6 2013/04/05 03:30:40 sbd Exp $
#
# Platform-specific adduser and addgroup functionality
# on top of shadow-utils. (Not libuser)
# group_exists group [groupid]
# Returns 0 if $group exists and has gid $groupid
# Returns 1 if neither $group nor $groupid exist
# Returns 2 if $group or $groupid exist but don't match
# Returns 3 for all errors
#
group_exists()
{
_group="$1"; _groupid="$2"
${TEST} -n "$_group" || return 3
# Check using chgrp to work properly in an NSS/NIS environment.
_tmpdir="./.pkginstall.$$"
${MKDIR} -p $_tmpdir 2>/dev/null || return 3
${CHMOD} 0700 $_tmpdir
_testpath="$_tmpdir/group_exists"
${ECHO} > $_testpath
if ${CHGRP} $_group $_testpath >/dev/null 2>&1; then
# $_group exists
_id=`${LS} -ln $_testpath 2>/dev/null | ${AWK} '{ print $4 }'`
${TEST} -n "$_groupid" || _groupid=$_id
if ${TEST} "$_groupid" = "$_id"; then
${RM} -fr $_tmpdir; return 0
fi
${RM} -fr $_tmpdir; return 2
elif ${TEST} -z "$_groupid"; then
# $_group doesn't exist and $_groupid is not set
${RM} -fr $_tmpdir; return 1
elif ${CHGRP} $_groupid $_testpath >/dev/null 2>&1; then
_name=`${LS} -l $_testpath 2>/dev/null | ${AWK} '{ print $4 }'`
if ${TEST} "$_name" != "$_groupid"; then
# $_group doesn't exist, but $_groupid exists
${RM} -fr $_tmpdir; return 2
fi
# neither $_group nor $_groupid exist
${RM} -fr $_tmpdir; return 1
fi
${RM} -fr $_tmpdir; return 3
}
# user_exists user [userid]
# Returns 0 if $user exists and has uid $userid
# Returns 1 if neither $user nor $userid exist
# Returns 2 if $user or $userid exist but don't match
# Returns 3 for all errors
#
user_exists()
{
_user="$1"; _userid="$2"
${TEST} -n "$_user" || return 3
# Check using chown to work properly in an NSS/NIS environment.
_tmpdir="./.pkginstall.$$"
${MKDIR} -p $_tmpdir 2>/dev/null || return 3
${CHMOD} 0700 $_tmpdir
_testpath="$_tmpdir/user_exists"
${ECHO} > $_testpath
if ${CHOWN} $_user $_testpath >/dev/null 2>&1; then
# $_user exists
_id=`${LS} -ln $_testpath 2>/dev/null | ${AWK} '{ print $3 }'`
${TEST} -n "$_userid" || _userid=$_id
if ${TEST} "$_userid" = "$_id"; then
${RM} -fr $_tmpdir; return 0
fi
${RM} -fr $_tmpdir; return 2
elif ${TEST} -z "$_userid"; then
# $_user doesn't exist and $_userid is not set
${RM} -fr $_tmpdir; return 1
elif ${CHOWN} $_userid $_testpath >/dev/null 2>&1; then
_name=`${LS} -l $_testpath 2>/dev/null | ${AWK} '{ print $3 }'`
if ${TEST} "$_name" != "$_userid"; then
# $_user doesn't exist, but $_userid exists
${RM} -fr $_tmpdir; return 2
fi
# neither $_user nor $_userid exist
${RM} -fr $_tmpdir; return 1
fi
${RM} -fr $_tmpdir; return 3
}
# The useradd command on Linux is a complete mess.
# At least Red Hat derivatives want to create home directories
# by default. They have support for -M, but no --help.
# Other Linux distributions lack -M support, some at least have
# --help.
# LSB just wants useradd, but doesn't specify any behavior, so
# it is useless for writing portable scripts.
call_useradd()
{
case $userid in
"")
${USERADD} \
-r -c "$descr" -d "$home" -s "$shell" \
-g $group $user "$@"
;;
*)
${USERADD} \
-c "$descr" -d "$home" -s "$shell" \
-g $group -u $userid $user "$@"
;;
esac
}
# adduser user group [userid] [descr] [home] [shell]
adduser()
{
user="$1"; group="$2"; userid="$3"
descr="$4"; home="$5" shell="$6"
${TEST} $# -eq 6 || return 1
${TEST} -n "$user" || return 2
${TEST} -n "$group" || return 2
USERADD="@USERADD@"
case $user in
${PKGNAME%-[0-9]*}) descr_dflt="$user user" ;;
*) descr_dflt="${PKGNAME%-[0-9]*} $user user" ;;
esac
: ${descr:="$descr_dflt"}
: ${home:="@PKG_USER_HOME@"}
: ${shell:="@PKG_USER_SHELL@"}
if ${TEST} -n "${USERADD}" -a -x "${USERADD}"; then
${ECHO} "${PKGNAME}: Creating user \`\`$user''"
if grep -i -- "^CREATE_HOME.*yes" /etc/login.defs > /dev/null; then
call_useradd -M
else
call_useradd
fi
fi
return 0
}
# adduser group [groupid]
addgroup()
{
group="$1"; groupid="$2"
${TEST} $# -eq 2 || return 1
${TEST} -n "$group" || return 2
GROUPADD="@GROUPADD@"
if ${TEST} -n "${GROUPADD}" -a -x "${GROUPADD}"; then
${ECHO} "${PKGNAME}: Creating group \`\`$group''"
case $groupid in
"") ${GROUPADD} -r $group ;;
*) ${GROUPADD} -g $groupid $group ;;
esac
fi
return 0
}