diff --git a/eclass/user.eclass b/eclass/user.eclass index 29910b5..9ee88fe 100644 --- a/eclass/user.eclass +++ b/eclass/user.eclass @@ -94,7 +94,11 @@ egetent() { *) # ignore output if nscd doesn't exist, or we're not running as root nscd -i "${db}" 2>/dev/null - getent "${db}" "${key}" + if [[ "${ROOT}" == "/" ]] ; then + getent "${db}" "${key}" + else + grep --color=never "^${key}" ${ROOT}/etc/${db} + fi ;; esac } @@ -120,7 +124,11 @@ enewuser() { if [[ -n $(egetent passwd "${euser}") ]] ; then return 0 fi - einfo "Adding user '${euser}' to your system ..." + if [[ "${ROOT}" == "/" ]] ; then + einfo "Adding user '${euser}' to your system ..." + else + einfo "Adding user '${euser}' to ${ROOT} ..." + fi # options to pass to useradd local opts=() @@ -247,14 +255,18 @@ enewuser() { ;; *) - useradd -r "${opts[@]}" "${euser}" || die + if [[ "${ROOT}" != "/" ]] ; then + opts+=( --prefix "${ROOT}" ) + fi + einfo useradd -r "${opts[@]}" "${euser}" + useradd -r "${opts[@]}" "${euser}" || die ;; esac if [[ ! -e ${ROOT}/${ehome} ]] ; then einfo " - Creating ${ehome} in ${ROOT}" mkdir -p "${ROOT}/${ehome}" - chown "${euser}" "${ROOT}/${ehome}" + chown "${euid}" "${ROOT}/${ehome}" chmod 755 "${ROOT}/${ehome}" fi } @@ -280,7 +292,11 @@ enewgroup() { if [[ -n $(egetent group "${egroup}") ]] ; then return 0 fi - einfo "Adding group '${egroup}' to your system ..." + if [[ "${ROOT}" == "/" ]] ; then + einfo "Adding group '${egroup}' to your system ..." + else + einfo "Adding group '${egroup}' to ${ROOT} ..." + fi # handle gid local egid=$1; shift @@ -339,8 +355,13 @@ enewgroup() { else opts="-g ${egid}" fi - # We specify -r so that we get a GID in the system range from login.defs - groupadd -r ${opts} "${egroup}" || die + if [[ "${ROOT}" == "/" ]] ; then + # We specify -r so that we get a GID in the system range from login.defs + groupadd -r ${opts} "${egroup}" || die + else + einfo groupadd --prefix ${ROOT} -r ${opts} "${egroup}" + groupadd --prefix ${ROOT} -r ${opts} "${egroup}" || die + fi ;; esac } @@ -454,7 +475,11 @@ esethome() { ;; *) - usermod -d "${ehome}" "${euser}" && return 0 + if [[ "${ROOT}" == "/" ]] ; then + usermod -d "${ehome}" "${euser}" && return 0 + else + usermod --prefix ${ROOT} -d "${ehome}" "${euser}" && return 0 + fi [[ $? == 8 ]] && eerror "${euser} is in use, cannot update home" eerror "There was an error when attempting to update the home directory for ${euser}" eerror "Please update it manually on your system (as root):" @@ -463,4 +488,78 @@ esethome() { esac } +# @USAGE: +# @DESCRIPTION: +# Gets the uid for the specified user. +egetuid() { + [[ $# -eq 1 ]] || die "usage: egetuid " + + egetent passwd "$1" | cut -d: -f3 || die +} + +# @USAGE: +# @DESCRIPTION: +# Gets the gid for the specified group. +egetgid() { + [[ $# -eq 1 ]] || die "usage: egetuid " + + egetent passwd "$1" | cut -d: -f3 || die +} + +# @USAGE: +# @DESCRIPTION: +# Gets the gid for the specified group. +egetgid() { + [[ $# -eq 1 ]] || die "usage: egetgid " + + egetent group "$1" | cut -d: -f3 || die +} + + +# @USAGE: +# @DESCRIPTION: +# chown portage equivalent, honoring the ${ROOT} variable. +echown() { + # get the user + local euser=$1; shift + if [[ -z ${euser} ]] ; then + eerror "No user specified !" + die "Cannot call echown without a user" + fi + + # get the group + local egroup=$1; shift + if [[ -z ${egroup} ]] ; then + eerror "No group specified !" + die "Cannot call echown without a group" + fi + + local euid + local egid + euid=$(egetuid "${euser}") + egid=$(egetgid "${egroup}") + + einfo chown ${euid}:${egid} $@ + + chown ${euid}:${egid} $@ || die +} + +# @DESCRIPTION: +# fowners honoring the ${ROOT} variable. +efowners() { + # get the user + local euser=$1; shift + if [[ -z ${euser} ]] ; then + eerror "No user specified !" + die "Cannot call echown without a user" + fi + + # get the group + local egroup=$1; shift + if [[ -z ${egroup} ]] ; then + eerror "No group specified !" + die "Cannot call echown without a group" + fi + + local euid + local egid + euid=$(egetuid "${euser}") + egid=$(egetgid "${egroup}") + + einfo fowners ${euid}:${egid} $@ + + fowners ${euid}:${egid} $@ || die +} + fi