X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=rpm-user_group.sh;h=63806575de44a8c449d514e068dfa929426a72ed;hb=53b2c59109f8628e5b67b7d6f144a7624aa9a1a9;hp=d69479a558379471aa42873759db273a0d5100d1;hpb=27f1752fa2d3f4db7ddb39689e46fb93d6b750df;p=packages%2Frpm.git diff --git a/rpm-user_group.sh b/rpm-user_group.sh index d69479a..6380657 100644 --- a/rpm-user_group.sh +++ b/rpm-user_group.sh @@ -3,25 +3,19 @@ [ -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 | $BANNERCMD $BANNERPARA - 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() -{ - if [ "$BANNERCMD" == cat ]; then +bannercmd() { + if [ "$BANNERCMD" = cat ]; then echo cat else if [ "$RPM_SCRIPTVERBOSITY" -lt 2 ]; then @@ -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 | sed -e's/^[^ ]* //;s/ /,/g'` - if ! echo ",$CGROUPS," | grep -q ",$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