user.eclass: Support getting & setting comment field
authorMichał Górny <mgorny@gentoo.org>
Sun, 9 Jun 2019 06:19:48 +0000 (08:19 +0200)
committerMichał Górny <mgorny@gentoo.org>
Thu, 20 Jun 2019 08:16:48 +0000 (10:16 +0200)
Signed-off-by: Michał Górny <mgorny@gentoo.org>
eclass/user.eclass

index fc883c965352dda6c69722e2fc671f2c275843fe..0e7aa43d89329c45a972bbcee63484a5745255fc 100644 (file)
@@ -413,6 +413,27 @@ egetshell() {
        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: egetshell <user>"
+
+       case ${CHOST} in
+       *-freebsd*|*-dragonfly*)
+               pos=8
+               ;;
+       *)      # Linux, NetBSD, OpenBSD, etc...
+               pos=5
+               ;;
+       esac
+
+       egetent passwd "$1" | cut -d: -f${pos}
+}
+
 # @FUNCTION: esethome
 # @USAGE: <user> <homedir>
 # @DESCRIPTION:
@@ -546,4 +567,60 @@ esetshell() {
        esac
 }
 
+# @FUNCTION: esetcomment
+# @USAGE: <user> <comment>
+# @DESCRIPTION:
+# Update the comment field in a platform-agnostic way.
+# Required parameters is the username and the new comment.
+esetcomment() {
+       _assert_pkg_ebuild_phase ${FUNCNAME}
+
+       # get the username
+       local euser=$1; shift
+       if [[ -z ${euser} ]] ; then
+               eerror "No username specified !"
+               die "Cannot call esetcomment without a username"
+       fi
+
+       # lets see if the username already exists
+       if [[ -z $(egetent passwd "${euser}") ]] ; then
+               ewarn "User does not exist, cannot set comment -- skipping."
+               return 1
+       fi
+
+       # handle comment
+       local ecomment=$1; shift
+       if [[ -z ${ecomment} ]] ; then
+               eerror "No comment specified !"
+               die "Cannot call esetcomment without a comment"
+       fi
+
+       # exit with no message if comment is up to date
+       if [[ $(egetcomment "${euser}") == ${ecomment} ]]; then
+               return 0
+       fi
+
+       einfo "Updating comment for user '${euser}' ..."
+       einfo " - Comment: ${ecomment}"
+
+       # update the comment
+       case ${CHOST} in
+       *-freebsd*|*-dragonfly*)
+               pw usermod "${euser}" -c "${ecomment}" && return 0
+               [[ $? == 8 ]] && eerror "${euser} is in use, cannot update comment"
+               eerror "There was an error when attempting to update the comment for ${euser}"
+               eerror "Please update it manually on your system:"
+               eerror "\t pw usermod \"${euser}\" -c \"${ecomment}\""
+               ;;
+
+       *)
+               usermod -c "${ecomment}" "${euser}" && return 0
+               [[ $? == 8 ]] && eerror "${euser} is in use, cannot update comment"
+               eerror "There was an error when attempting to update the comment for ${euser}"
+               eerror "Please update it manually on your system (as root):"
+               eerror "\t usermod -c \"${ecomment}\" \"${euser}\""
+               ;;
+       esac
+}
+
 fi