Gentoo Archives: gentoo-dev

From: "Michał Górny" <mgorny@g.o>
To: gentoo-dev@l.g.o
Cc: "Michał Górny" <mgorny@g.o>
Subject: [gentoo-dev] [PATCH 1/2] acct-user.eclass: Support ACCT_USER_ID override
Date: Tue, 05 Jan 2021 18:39:36
Message-Id: 20210105183926.870550-1-mgorny@gentoo.org
1 Signed-off-by: Michał Górny <mgorny@g.o>
2 ---
3 eclass/acct-user.eclass | 31 ++++++++++++++++++++-----------
4 1 file changed, 20 insertions(+), 11 deletions(-)
5
6 diff --git a/eclass/acct-user.eclass b/eclass/acct-user.eclass
7 index 5c55b8092c69..ca5a0b2e6b23 100644
8 --- a/eclass/acct-user.eclass
9 +++ b/eclass/acct-user.eclass
10 @@ -67,7 +67,8 @@ readonly ACCT_USER_NAME
11 # @REQUIRED
12 # @DESCRIPTION:
13 # Preferred UID for the new user. This variable is obligatory, and its
14 -# value must be unique across all user packages.
15 +# value must be unique across all user packages. This can be overriden
16 +# in make.conf through ACCT_USER_<UPPERCASE_USERNAME>_ID variable.
17 #
18 # Overlays should set this to -1 to dynamically allocate UID. Using -1
19 # in ::gentoo is prohibited by policy.
20 @@ -296,25 +297,33 @@ acct-user_pkg_pretend() {
21
22 # verify ACCT_USER_ID
23 [[ -n ${ACCT_USER_ID} ]] || die "Ebuild error: ACCT_USER_ID must be set!"
24 - [[ ${ACCT_USER_ID} -eq -1 ]] && return
25 - [[ ${ACCT_USER_ID} -ge 0 ]] || die "Ebuild errors: ACCT_USER_ID=${ACCT_USER_ID} invalid!"
26 + [[ ${ACCT_USER_ID} -ge -1 ]] || die "Ebuild error: ACCT_USER_ID=${ACCT_USER_ID} invalid!"
27 + local user_id=${ACCT_USER_ID}
28 +
29 + # check for the override
30 + local override_name=${ACCT_USER_NAME^^}
31 + local override_var=ACCT_USER_${override_name//-/_}_ID
32 + if [[ -n ${!override_var} ]]; then
33 + user_id=${!override_var}
34 + [[ ${user_id} -ge -1 ]] || die "${override_var}=${user_id} invalid!"
35 + fi
36
37 # check for ACCT_USER_ID collisions early
38 - if [[ -n ${ACCT_USER_ENFORCE_ID} ]]; then
39 - local user_by_id=$(egetusername "${ACCT_USER_ID}")
40 + if [[ ${user_id} -ne -1 && -n ${ACCT_USER_ENFORCE_ID} ]]; then
41 + local user_by_id=$(egetusername "${user_id}")
42 local user_by_name=$(egetent passwd "${ACCT_USER_NAME}")
43 if [[ -n ${user_by_id} ]]; then
44 if [[ ${user_by_id} != ${ACCT_USER_NAME} ]]; then
45 eerror "The required UID is already taken by another user."
46 - eerror " UID: ${ACCT_USER_ID}"
47 + eerror " UID: ${user_id}"
48 eerror " needed for: ${ACCT_USER_NAME}"
49 eerror " current user: ${user_by_id}"
50 - die "UID ${ACCT_USER_ID} taken already"
51 + die "UID ${user_id} taken already"
52 fi
53 elif [[ -n ${user_by_name} ]]; then
54 eerror "The requested user exists already with wrong UID."
55 eerror " username: ${ACCT_USER_NAME}"
56 - eerror " requested UID: ${ACCT_USER_ID}"
57 + eerror " requested UID: ${user_id}"
58 eerror " current entry: ${user_by_name}"
59 die "Username ${ACCT_USER_NAME} exists with wrong UID"
60 fi
61 @@ -335,7 +344,7 @@ acct-user_src_install() {
62 local override_name=${ACCT_USER_NAME^^}
63 override_name=${override_name//-/_}
64 local var
65 - for var in ACCT_USER_{SHELL,HOME{,_OWNER,_PERMS},GROUPS}; do
66 + for var in ACCT_USER_{ID,SHELL,HOME{,_OWNER,_PERMS},GROUPS}; do
67 local var_name=ACCT_USER_${override_name}_${var#ACCT_USER_}
68 if [[ -n ${!var_name} ]]; then
69 ewarn "${var_name}=${!var_name} override in effect, support will not be provided."
70 @@ -363,7 +372,7 @@ acct-user_src_install() {
71 newins - ${CATEGORY}-${ACCT_USER_NAME}.conf < <(
72 printf "u\t%q\t%q\t%q\t%q\t%q\n" \
73 "${ACCT_USER_NAME}" \
74 - "${ACCT_USER_ID/#-*/-}:${groups[0]}" \
75 + "${_ACCT_USER_ID/#-*/-}:${groups[0]}" \
76 "${DESCRIPTION//[:,=]/;}" \
77 "${_ACCT_USER_HOME}" \
78 "${_ACCT_USER_SHELL/#-*/-}"
79 @@ -382,7 +391,7 @@ acct-user_pkg_preinst() {
80 debug-print-function ${FUNCNAME} "${@}"
81
82 enewuser ${ACCT_USER_ENFORCE_ID:+-F} -M "${ACCT_USER_NAME}" \
83 - "${ACCT_USER_ID}" "${_ACCT_USER_SHELL}" "${_ACCT_USER_HOME}" \
84 + "${_ACCT_USER_ID}" "${_ACCT_USER_SHELL}" "${_ACCT_USER_HOME}" \
85 "${_ACCT_USER_GROUPS// /,}"
86
87 if [[ ${_ACCT_USER_HOME} != /dev/null ]]; then
88 --
89 2.30.0

Replies