summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał Górny <mgorny@gentoo.org>2021-01-04 17:46:16 +0100
committerMichał Górny <mgorny@gentoo.org>2021-01-09 19:02:23 +0100
commit945ca02e98edb25fd6e4cecb7d788b598de1fcef (patch)
tree6818894d6a7a7ee146773a2bb4612e0dc09ba96c /eclass/acct-user.eclass
parentdev-python/reportlab: Remove old (diff)
downloadgentoo-945ca02e98edb25fd6e4cecb7d788b598de1fcef.tar.gz
gentoo-945ca02e98edb25fd6e4cecb7d788b598de1fcef.tar.bz2
gentoo-945ca02e98edb25fd6e4cecb7d788b598de1fcef.zip
acct-user.eclass: Support var overrides for user properties
Introduce a few variables to allow easy overrides of common user account proprerties, that is: - ACCT_USER_<username>_SHELL - ACCT_USER_<username>_HOME - ACCT_USER_<username>_HOME_OWNER - ACCT_USER_<username>_HOME_PERMS - ACCT_USER_<username>_GROUPS - ACCT_USER_<username>_GROUPS_ADD The first five variables override the respective ACCT_USER_* variables, with ACCT_USER_*_GROUPS being a space-separated list. The *_GROUPS_ADD variable appends to groups present in the ebuild, as this seems a common necessity. We do realize that the original requirement of overriding ebuilds in a local repository was inconvenient. This new logic should permit easy updates via make.conf. Additionally, it has the advantage of clearly reporting the changes made in the build logs. This does not preclude other solutions to the problem. However, this is probably the best one and it should become the current recommendation. Signed-off-by: Michał Górny <mgorny@gentoo.org>
Diffstat (limited to 'eclass/acct-user.eclass')
-rw-r--r--eclass/acct-user.eclass84
1 files changed, 60 insertions, 24 deletions
diff --git a/eclass/acct-user.eclass b/eclass/acct-user.eclass
index 47890e48409a..a2d92605523a 100644
--- a/eclass/acct-user.eclass
+++ b/eclass/acct-user.eclass
@@ -82,7 +82,8 @@ readonly ACCT_USER_NAME
# @ECLASS-VARIABLE: ACCT_USER_SHELL
# @DESCRIPTION:
# The shell to use for the user. If not specified, a 'nologin' variant
-# for the system is used.
+# for the system is used. This can be overriden in make.conf through
+# ACCT_USER_<UPPERCASE_USERNAME>_SHELL variable.
: ${ACCT_USER_SHELL:=-1}
# @ECLASS-VARIABLE: ACCT_USER_HOME
@@ -90,6 +91,8 @@ readonly ACCT_USER_NAME
# The home directory for the user. If not specified, /dev/null is used.
# The directory will be created with appropriate permissions if it does
# not exist. When updating, existing home directory will not be moved.
+# This can be overriden in make.conf through
+# ACCT_USER_<UPPERCASE_USERNAME>_HOME variable.
: ${ACCT_USER_HOME:=/dev/null}
# @ECLASS-VARIABLE: ACCT_USER_HOME_OWNER
@@ -97,11 +100,14 @@ readonly ACCT_USER_NAME
# @DESCRIPTION:
# The ownership to use for the home directory, in chown ([user][:group])
# syntax. Defaults to the newly created user, and its primary group.
+# This can be overriden in make.conf through
+# ACCT_USER_<UPPERCASE_USERNAME>_HOME_OWNER variable.
# @ECLASS-VARIABLE: ACCT_USER_HOME_PERMS
# @DESCRIPTION:
# The permissions to use for the home directory, in chmod (octal
-# or verbose) form.
+# or verbose) form. This can be overriden in make.conf through
+# ACCT_USER_<UPPERCASE_USERNAME>_HOME_PERMS variable.
: ${ACCT_USER_HOME_PERMS:=0755}
# @ECLASS-VARIABLE: ACCT_USER_GROUPS
@@ -110,6 +116,12 @@ readonly ACCT_USER_NAME
# List of groups the user should belong to. This must be a bash
# array. The first group specified is the user's primary group, while
# the remaining groups (if any) become supplementary groups.
+#
+# This can be overriden in make.conf through
+# ACCT_USER_<UPPERCASE_USERNAME>_GROUPS variable, or appended to
+# via ACCT_USER_<UPPERCASE_USERNAME>_GROUPS_ADD. Please note that
+# due to technical limitations, the override variables are not arrays
+# but space-separated lists.
# << Boilerplate ebuild variables >>
@@ -316,23 +328,48 @@ acct-user_pkg_pretend() {
acct-user_src_install() {
debug-print-function ${FUNCNAME} "${@}"
- if [[ ${ACCT_USER_HOME} != /dev/null ]]; then
+ # serialize for override support
+ local ACCT_USER_GROUPS=${ACCT_USER_GROUPS[*]}
+
+ # support make.conf overrides
+ local override_name=${ACCT_USER_NAME^^}
+ override_name=${override_name//-/_}
+ local var
+ for var in ACCT_USER_{SHELL,HOME{,_OWNER,_PERMS},GROUPS}; do
+ local var_name=ACCT_USER_${override_name}_${var#ACCT_USER_}
+ if [[ -n ${!var_name} ]]; then
+ ewarn "${var_name}=${!var_name} override in effect, support will not be provided."
+ else
+ var_name=${var}
+ fi
+ declare -g "_${var}=${!var_name}"
+ done
+ var_name=ACCT_USER_${override_name}_GROUPS_ADD
+ if [[ -n ${!var_name} ]]; then
+ ewarn "${var_name}=${!var_name} override in effect, support will not be provided."
+ _ACCT_USER_GROUPS+=" ${!var_name}"
+ fi
+
+ # deserialize into an array
+ local groups=( ${_ACCT_USER_GROUPS} )
+
+ if [[ ${_ACCT_USER_HOME} != /dev/null ]]; then
# note: we can't set permissions here since the user isn't
# created yet
- keepdir "${ACCT_USER_HOME}"
+ keepdir "${_ACCT_USER_HOME}"
fi
insinto /usr/lib/sysusers.d
newins - ${CATEGORY}-${ACCT_USER_NAME}.conf < <(
printf "u\t%q\t%q\t%q\t%q\t%q\n" \
"${ACCT_USER_NAME}" \
- "${ACCT_USER_ID/#-*/-}:${ACCT_USER_GROUPS[0]}" \
+ "${ACCT_USER_ID/#-*/-}:${groups[0]}" \
"${DESCRIPTION//[:,=]/;}" \
- "${ACCT_USER_HOME}" \
- "${ACCT_USER_SHELL/#-*/-}"
- if [[ ${#ACCT_USER_GROUPS[@]} -gt 1 ]]; then
+ "${_ACCT_USER_HOME}" \
+ "${_ACCT_USER_SHELL/#-*/-}"
+ if [[ ${#groups[@]} -gt 1 ]]; then
printf "m\t${ACCT_USER_NAME}\t%q\n" \
- "${ACCT_USER_GROUPS[@]:1}"
+ "${groups[@]:1}"
fi
)
}
@@ -344,26 +381,26 @@ acct-user_src_install() {
acct-user_pkg_preinst() {
debug-print-function ${FUNCNAME} "${@}"
- local groups=${ACCT_USER_GROUPS[*]}
enewuser ${ACCT_USER_ENFORCE_ID:+-F} -M "${ACCT_USER_NAME}" \
- "${ACCT_USER_ID}" "${ACCT_USER_SHELL}" "${ACCT_USER_HOME}" \
- "${groups// /,}"
+ "${ACCT_USER_ID}" "${_ACCT_USER_SHELL}" "${_ACCT_USER_HOME}" \
+ "${_ACCT_USER_GROUPS// /,}"
- if [[ ${ACCT_USER_HOME} != /dev/null ]]; then
+ if [[ ${_ACCT_USER_HOME} != /dev/null ]]; then
# default ownership to user:group
- if [[ -z ${ACCT_USER_HOME_OWNER} ]]; then
- ACCT_USER_HOME_OWNER=${ACCT_USER_NAME}:${ACCT_USER_GROUPS[0]}
+ if [[ -z ${_ACCT_USER_HOME_OWNER} ]]; then
+ local group_array=( ${_ACCT_USER_GROUPS} )
+ _ACCT_USER_HOME_OWNER=${ACCT_USER_NAME}:${group_array[0]}
fi
# Path might be missing due to INSTALL_MASK, etc.
# https://bugs.gentoo.org/691478
- if [[ ! -e "${ED}/${ACCT_USER_HOME#/}" ]]; then
+ if [[ ! -e "${ED}/${_ACCT_USER_HOME#/}" ]]; then
eerror "Home directory is missing from the installation image:"
- eerror " ${ACCT_USER_HOME}"
+ eerror " ${_ACCT_USER_HOME}"
eerror "Check INSTALL_MASK for entries that would cause this."
- die "${ACCT_USER_HOME} does not exist"
+ die "${_ACCT_USER_HOME} does not exist"
fi
- fowners "${ACCT_USER_HOME_OWNER}" "${ACCT_USER_HOME}"
- fperms "${ACCT_USER_HOME_PERMS}" "${ACCT_USER_HOME}"
+ fowners "${_ACCT_USER_HOME_OWNER}" "${_ACCT_USER_HOME}"
+ fperms "${_ACCT_USER_HOME_PERMS}" "${_ACCT_USER_HOME}"
fi
}
@@ -380,10 +417,9 @@ acct-user_pkg_postinst() {
fi
# NB: eset* functions check current value
- esethome "${ACCT_USER_NAME}" "${ACCT_USER_HOME}"
- esetshell "${ACCT_USER_NAME}" "${ACCT_USER_SHELL}"
- local groups=${ACCT_USER_GROUPS[*]}
- esetgroups "${ACCT_USER_NAME}" "${groups// /,}"
+ esethome "${ACCT_USER_NAME}" "${_ACCT_USER_HOME}"
+ esetshell "${ACCT_USER_NAME}" "${_ACCT_USER_SHELL}"
+ esetgroups "${ACCT_USER_NAME}" "${_ACCT_USER_GROUPS// /,}"
# comment field can not contain colons
esetcomment "${ACCT_USER_NAME}" "${DESCRIPTION//[:,=]/;}"
eunlockuser "${ACCT_USER_NAME}"