# $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 }