X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=rpm-user_group.sh;h=63806575de44a8c449d514e068dfa929426a72ed;hb=7ef0925fefbdd62823a587f203a110cb0d42959e;hp=921bdc2259bd2a27f0aee15b56ff082ecb0e49b3;hpb=7c689a4574b64330d15583d0743316f582ccb646;p=packages%2Frpm.git diff --git a/rpm-user_group.sh b/rpm-user_group.sh index 921bdc2..6380657 100644 --- a/rpm-user_group.sh +++ b/rpm-user_group.sh @@ -3,35 +3,143 @@ [ -f /etc/sysconfig/rpm ] && . /etc/sysconfig/rpm [ -z "$RPM_SCRIPTVERBOSITY" ] && RPM_SCRIPTVERBOSITY=5 -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 +} -testrm() -{ - [ "$RPM_USERDEL" != yes ] && return 1 - [ -z "$1" ] && return 2 - rpm -q --whatprovides "${MODE}($1)" >/dev/null 2>&1 +bannercmd() { + if [ "$BANNERCMD" = cat ]; then + echo cat + else + if [ "$RPM_SCRIPTVERBOSITY" -lt 2 ]; then + echo "$BANNERCMD -M $1" + else + echo "$BANNERCMD -s -M $1" + fi + fi +} + +testrm() { + local mode=$1 + local name=$2 + + [ "$RPM_USERDEL" != yes ] || [ ! -x /bin/rpm ] && return 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 - [ "$RPM_SCRIPTVERBOSITY" -lt 2 ] || echo "Removing $MODE $2" - /usr/sbin/${MODE}del $2 || : +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 + + 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 - echo ERROR - exit 2 + BANNERCMD="cat" + BANNERPARA="" fi + +if [ "$1" = user -o "$1" = group ]; then + MODE=$1 + shift +else + 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