From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 9BB72138334 for ; Wed, 5 Jun 2019 09:14:48 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id A93CDE0992; Wed, 5 Jun 2019 09:13:11 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 423F6E098F for ; Wed, 5 Jun 2019 09:13:11 +0000 (UTC) Received: from localhost.localdomain (d202-252.icpnet.pl [109.173.202.252]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: mgorny) by smtp.gentoo.org (Postfix) with ESMTPSA id 91FCB345760; Wed, 5 Jun 2019 09:13:08 +0000 (UTC) From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= To: gentoo-dev@lists.gentoo.org Cc: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Subject: [gentoo-dev] [PATCH v2 4/9] user.eclass: Support forcing specified UID/GID Date: Wed, 5 Jun 2019 11:12:52 +0200 Message-Id: <20190605091257.12127-5-mgorny@gentoo.org> X-Mailer: git-send-email 2.22.0.rc3 In-Reply-To: <20190605091257.12127-1-mgorny@gentoo.org> References: <20190605091257.12127-1-mgorny@gentoo.org> Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-dev@lists.gentoo.org Reply-to: gentoo-dev@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Archives-Salt: 634d4c76-b038-4e49-92af-2a2535aecb4e X-Archives-Hash: 9aa5d25e25830b948151a0fce432f642 Signed-off-by: Michał Górny --- eclass/user.eclass | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/eclass/user.eclass b/eclass/user.eclass index 7eda668974f0..1ffeaae29569 100644 --- a/eclass/user.eclass +++ b/eclass/user.eclass @@ -96,13 +96,15 @@ egetent() { } # @FUNCTION: enewuser -# @USAGE: [-M] [uid] [shell] [homedir] [groups] +# @USAGE: [-F] [-M] [uid] [shell] [homedir] [groups] # @DESCRIPTION: # Same as enewgroup, you are not required to understand how to properly add # a user to the system. The only required parameter is the username. # Default uid is (pass -1 for this) next available, default shell is # /bin/false, default homedir is /dev/null, and there are no default groups. # +# If -F is passed, enewuser will always enforce specified UID and fail if it +# can not be assigned. # If -M is passed, enewuser does not create the home directory if it does not # exist. enewuser() { @@ -112,9 +114,10 @@ enewuser() { fi _assert_pkg_ebuild_phase ${FUNCNAME} - local create_home=1 + local create_home=1 force_uid= while [[ $1 == -* ]]; do case $1 in + -F) force_uid=1;; -M) create_home=;; *) die "${FUNCNAME}: invalid option ${1}";; esac @@ -142,6 +145,7 @@ enewuser() { if [[ -n ${euid} && ${euid} != -1 ]] ; then if [[ ${euid} -gt 0 ]] ; then if [[ -n $(egetent passwd ${euid}) ]] ; then + [[ -n ${force_uid} ]] && die "${FUNCNAME}: UID ${euid} already taken" euid="next" fi else @@ -149,6 +153,7 @@ enewuser() { die "${euid} is not a valid UID" fi else + [[ -n ${force_uid} ]] && die "${FUNCNAME}: -F with uid==-1 makes no sense" euid="next" fi if [[ ${euid} == "next" ]] ; then @@ -277,6 +282,9 @@ enewuser() { # group to the system. Just give it a group name to add and enewgroup will # do the rest. You may specify the gid for the group or allow the group to # allocate the next available one. +# +# If -F is passed, enewgroup will always enforce specified GID and fail if it +# can not be assigned. enewgroup() { if [[ ${EUID} != 0 ]] ; then einfo "Insufficient privileges to execute ${FUNCNAME[0]}" @@ -284,6 +292,15 @@ enewgroup() { fi _assert_pkg_ebuild_phase ${FUNCNAME} + local force_gid= + while [[ $1 == -* ]]; do + case $1 in + -F) force_gid=1;; + *) die "${FUNCNAME}: invalid option ${1}";; + esac + shift + done + # get the group local egroup=$1; shift if [[ -z ${egroup} ]] ; then @@ -302,6 +319,7 @@ enewgroup() { if [[ ! -z ${egid} ]] ; then if [[ ${egid} -gt 0 ]] ; then if [[ -n $(egetent group ${egid}) ]] ; then + [[ -n ${force_gid} ]] && die "${FUNCNAME}: GID ${egid} already taken" egid="next available; requested gid taken" fi else @@ -309,6 +327,7 @@ enewgroup() { die "${egid} is not a valid GID" fi else + [[ -n ${force_gid} ]] && die "${FUNCNAME}: -F with gid==-1 makes no sense" egid="next available" fi einfo " - Groupid: ${egid}" -- 2.22.0.rc3