X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=rpm-user_group.sh;h=63806575de44a8c449d514e068dfa929426a72ed;hb=a5a68e9c69a12114a67910933fa4f2aac9d7bf91;hp=39b5c67b7a0d964b45cef9614839e3884993903d;hpb=e88c759f8d4c417239f451ed1ad5b23dd7620248;p=packages%2Frpm.git diff --git a/rpm-user_group.sh b/rpm-user_group.sh index 39b5c67..6380657 100644 --- a/rpm-user_group.sh +++ b/rpm-user_group.sh @@ -3,24 +3,18 @@ [ -f /etc/sysconfig/rpm ] && . /etc/sysconfig/rpm [ -z "$RPM_SCRIPTVERBOSITY" ] && RPM_SCRIPTVERBOSITY=5 -if [ -x /usr/bin/banner.sh ]; then - BANNERCMD="/usr/bin/banner.sh " - BANNERPARA="-s -M user-group.error" -else - BANNERCMD="cat" - BANNERPARA="" -fi - -if [ "$1" = user -o "$1" = group ]; then - MODE=$1 -else - echo ERROR - exit 2 -fi -shift +# aborts program abnormally +die() { + local rc=${2:-1} + if [ "$1" ]; then + echo >&2 "ERROR: $1" + else + echo >&2 "ERROR" + fi + exit $rc +} -bannercmd() -{ +bannercmd() { if [ "$BANNERCMD" = cat ]; then echo cat else @@ -32,45 +26,120 @@ bannercmd() fi } -testrm() -{ +testrm() { + local mode=$1 + local name=$2 + [ "$RPM_USERDEL" != yes ] || [ ! -x /bin/rpm ] && return 1 - [ -z "$1" ] && return 2 - rpm -q --whatprovides "${MODE}($1)" >/dev/null 2>&1 + [ -z "$name" ] && return 2 + rpm -q --whatprovides "$mode($name)" >/dev/null 2>&1 # no package Provides it (strange) [ $? -ne 0 ] && return 0 # only current package Provides it - [ `rpm -q --whatprovides "${MODE}($1)" | wc -l` -lt 2 ] && return 0 + [ $(rpm -q --whatprovides "$mode($name)" | wc -l) -lt 2 ] && return 0 return 1 } -if [ "$1" = "testrm" ]; then - testrm $2 - exit $? -elif [ "$1" = del ]; then - if testrm $2; then - echo "Removing $MODE $2" | `bannercmd "${MODE}del-$2"` - /usr/sbin/${MODE}del $2 || : - if [ -x /usr/sbin/nscd ]; then - case "${MODE}" in - user) - /usr/sbin/nscd -i passwd - ;; - group) - /usr/sbin/nscd -i group - ;; - esac +groupremove() { + local name="$1" + local gid=$(getgid "$name" 2>/dev/null) + + echo "Removing group $name" | $(bannercmd "groupdel-$name") + /usr/sbin/groupdel $name || : + + # flush nscd cache + [ ! -x /usr/sbin/nscd ] || /usr/sbin/nscd -i group +} + +userremove() { + local uid=$(id -un "$name" 2>/dev/null) + + echo "Removing user $name" | $(bannercmd "userdel-$name") + /usr/sbin/userdel $name || : + + # flush nscd cache + [ ! -x /usr/sbin/nscd ] || /usr/sbin/nscd -i passwd +} + +remove() { + local mode=$1 + local name=$2 + if ! testrm $mode $name; then + return + fi + + ${mode}remove $name +} + +addtogroup() { + local user="$1" + local group="$2" + local uid=$(id -un "$user" 2>/dev/null) + local gid=$(getgid "$group" 2>/dev/null) + + if [ -z "$gid" ]; then + if [ "$quiet" ]; then + return + else + die "group $group does not exist" + fi + fi + + if [ -z "$uid" ]; then + if [ "$quiet" ]; then + return + else + die "user $user does not exist" fi fi -elif [ "$MODE" = "user" -a "$1" = "addtogroup" ]; then - CUSER="$2" - CGROUP="$3" - CGROUPS=$(id -n -G $CUSER) - if [[ " $CGROUPS " != *\ $CGROUP\ * ]]; then - echo "Adding user $CUSER to group $CGROUP" | `bannercmd "${MODE}mod-$CUSER"` - usermod -G "$CGROUPS,$CGROUP" $CUSER + + groups=$(id -n -G $user) + if [[ " $groups " != *\ $group\ * ]]; then + echo "Adding user $user to group $group" | $(bannercmd "${MODE}mod-$user") + for grp in $groups $group; do + new="$new${new:+,}$grp" + done + usermod -G "$new" $user fi +} + +if [ -x /usr/bin/banner.sh ]; then + BANNERCMD="/usr/bin/banner.sh " + BANNERPARA="-s -M user-group.error" +else + BANNERCMD="cat" + BANNERPARA="" +fi + +if [ "$1" = user -o "$1" = group ]; then + MODE=$1 + shift else - echo ERROR - exit 2 + die "Invalid usage" fi + +# quiet mode cames from $ENV +quiet=$quiet + +case "$1" in +testrm) + testrm $MODE $2 + exit $? + ;; + +del) + remove $MODE $2 + exit $? + ;; + +addtogroup) + if [ "$MODE" = "user" ]; then + if [ -z "$2" -o -z "$3" ]; then + die "Invalid usage" + fi + addtogroup $2 $3 + fi + ;; +*) + die "Invalid usage" 2 +esac