#!/bin/bash # $HeadURL$ $LastChangedRevision$ set -e PROGNAME=$(basename $0) # Load support functions . $(pcms-config PCMS_SHARE_PREFIX)/scripts/support.sh main() { # Defaults for options VERBOSELEVEL=2 debug 10 "main: sof" # Process options while [ $# -ge 1 ]; do case $1 in -d) VERBOSELEVEL=$2; shift ;; --debug=*) VERBOSELEVEL=${1#*=} ;; -v|--verbose) VERBOSELEVEL=3 ;; --) shift; break ;; -*) error "main: $1: bad option" ;; *) break ;; esac shift done # Process arguments [ $# = 1 ] || usage debug 10 "main: calling [encode --decode \"$1\"] ..." eval set -- $(encode --decode "$1") debug 10 "main: \$#=$#" [ $# -ge 2 ] || usage LOGIN="$1"; shift CREATE_PASSWD_ENTRY_FLAG="$1"; shift debug 10 "main: LOGIN=$LOGIN, CREATE_PASSWD_ENTRY_FLAG=$CREATE_PASSWD_ENTRY_FLAG" [[ $CREATE_PASSWD_ENTRY_FLAG =~ ^(true|false)$ ]] || error "$CREATE_PASSWD_ENTRY_FLAG: invalid flag" if $CREATE_PASSWD_ENTRY_FLAG; then IS_SYSTEM_USER_FLAG="$1" FULL_NAME="$2" HOME_DIR="$3" shift 3 debug 10 "main: IS_SYSTEM_USER_FLAG=$IS_SYSTEM_USER_FLAG, FULL_NAME=\"$FULL_NAME\", HOME_DIR=$HOME_DIR" # Sanity checks and derivations [[ $IS_SYSTEM_USER_FLAG =~ ^(true|false)$ ]] || error "$IS_SYSTEM_USER_FLAG: invalid flag" if $IS_SYSTEM_USER_FLAG; then GROUPADD_OPTS="--system" USERADD_OPTS="--system --password '*'" else GROUPADD_OPTS= USERADD_OPTS="--password ''" fi # Guts getent group $LOGIN > /dev/null || groupadd $GROUPADD_OPTS $LOGIN getent passwd $LOGIN > /dev/null || { # In order to make code path simpler, don't create user's home yet; leave that # to code further down. eval "useradd $USERADD_OPTS -g $LOGIN -s /bin/bash -M $LOGIN" if ! $IS_SYSTEM_USER_FLAG; then chage -d 0 $LOGIN fi } [ "X$(getent passwd $LOGIN | cut -d: -f5 | cut -d, -f1)" = "X$FULL_NAME" ] || chfn -f "$FULL_NAME" $LOGIN; \ [ "X$(getent passwd $LOGIN | cut -d: -f6)" = "X$HOME_DIR" ] || usermod -d $HOME_DIR $LOGIN 2>/dev/null || { echo "usermod failed for user $LOGIN" >&2; exit 1; } fi CREATE_HOME_DIR_FLAG="$1"; shift debug 10 "main: CREATE_HOME_DIR_FLAG=$CREATE_HOME_DIR_FLAG" [[ $CREATE_HOME_DIR_FLAG =~ ^(true|false)$ ]] || error "$CREATE_HOME_DIR_FLAG: invalid flag" if $CREATE_HOME_DIR_FLAG; then GET_HOME_FROM_PASSWD_FLAG="$1"; shift debug 10 "main: GET_HOME_FROM_PASSWD_FLAG=$GET_HOME_FROM_PASSWD_FLAG" if $GET_HOME_FROM_PASSWD_FLAG; then HOME_DIR=$(getent passwd $LOGIN | cut -d: -f6) else HOME_DIR="$1"; shift fi debug 10 "main: HOME_DIR=$HOME_DIR" mkdir -p $HOME_DIR chown $LOGIN:$LOGIN $HOME_DIR fi } usage() { echo "Usage: $PROGNAME @[@...]@[@...]" >&2; exit 1; } main "$@"