You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/eclass/user-info.eclass

159 lines
3.1 KiB

# Copyright 1999-2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
# @ECLASS: user-info.eclass
# @MAINTAINER:
# base-system@gentoo.org (Linux)
# Michał Górny <mgorny@gentoo.org> (NetBSD)
# @BLURB: Read-only access to user and group information
if [[ -z ${_USER_INFO_ECLASS} ]]; then
_USER_INFO_ECLASS=1
# @FUNCTION: egetent
# @USAGE: <database> <key>
# @DESCRIPTION:
# Small wrapper for getent (Linux), nidump (< Mac OS X 10.5),
# dscl (Mac OS X 10.5), and pw (FreeBSD) used in enewuser()/enewgroup().
#
# Supported databases: group passwd
egetent() {
local db=$1 key=$2
[[ $# -ge 3 ]] && die "usage: egetent <database> <key>"
case ${db} in
passwd|group) ;;
*) die "sorry, database '${db}' not yet supported; file a bug" ;;
esac
case ${CHOST} in
*-freebsd*|*-dragonfly*)
case ${db} in
passwd) db="user" ;;
*) ;;
esac
# lookup by uid/gid
local opts
if [[ ${key} == [[:digit:]]* ]] ; then
[[ ${db} == "user" ]] && opts="-u" || opts="-g"
fi
pw show ${db} ${opts} "${key}" -q
;;
*-openbsd*)
grep "${key}:\*:" /etc/${db}
;;
*)
# ignore nscd output if we're not running as root
type -p nscd >/dev/null && nscd -i "${db}" 2>/dev/null
getent "${db}" "${key}"
;;
esac
}
# @FUNCTION: egetusername
# @USAGE: <uid>
# @DESCRIPTION:
# Gets the username for given UID.
egetusername() {
[[ $# -eq 1 ]] || die "usage: egetusername <uid>"
egetent passwd "$1" | cut -d: -f1
}
# @FUNCTION: egetgroupname
# @USAGE: <gid>
# @DESCRIPTION:
# Gets the group name for given GID.
egetgroupname() {
[[ $# -eq 1 ]] || die "usage: egetgroupname <gid>"
egetent group "$1" | cut -d: -f1
}
# @FUNCTION: egethome
# @USAGE: <user>
# @DESCRIPTION:
# Gets the home directory for the specified user.
egethome() {
local pos
[[ $# -eq 1 ]] || die "usage: egethome <user>"
case ${CHOST} in
*-freebsd*|*-dragonfly*)
pos=9
;;
*) # Linux, NetBSD, OpenBSD, etc...
pos=6
;;
esac
egetent passwd "$1" | cut -d: -f${pos}
}
# @FUNCTION: egetshell
# @USAGE: <user>
# @DESCRIPTION:
# Gets the shell for the specified user.
egetshell() {
local pos
[[ $# -eq 1 ]] || die "usage: egetshell <user>"
case ${CHOST} in
*-freebsd*|*-dragonfly*)
pos=10
;;
*) # Linux, NetBSD, OpenBSD, etc...
pos=7
;;
esac
egetent passwd "$1" | cut -d: -f${pos}
}
# @FUNCTION: egetcomment
# @USAGE: <user>
# @DESCRIPTION:
# Gets the comment field for the specified user.
egetcomment() {
local pos
[[ $# -eq 1 ]] || die "usage: egetcomment <user>"
case ${CHOST} in
*-freebsd*|*-dragonfly*)
pos=8
;;
*) # Linux, NetBSD, OpenBSD, etc...
pos=5
;;
esac
egetent passwd "$1" | cut -d: -f${pos}
}
# @FUNCTION: egetgroups
# @USAGE: <user>
# @DESCRIPTION:
# Gets all the groups user belongs to. The primary group is returned
# first, then all supplementary groups. Groups are ','-separated.
egetgroups() {
[[ $# -eq 1 ]] || die "usage: egetgroups <user>"
local egroups_arr
read -r -a egroups_arr < <(id -G -n "$1")
local g groups=${egroups_arr[0]}
# sort supplementary groups to make comparison possible
while read -r g; do
[[ -n ${g} ]] && groups+=",${g}"
done < <(printf '%s\n' "${egroups_arr[@]:1}" | sort)
echo "${groups}"
}
fi