]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - adduser/rmuser.sh
Use arc4random_uniform() to avoid "modulo bias"
[pw-darwin.git] / adduser / rmuser.sh
index 445b9747f1744f5d47364ab30535c82af24ea60c..6b092253b70918e65c4292dd3573559aa9bf9379 100644 (file)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright (c) 2002 Michael Telahun Makonnen. All rights reserved.
+# Copyright (c) 2002, 2003 Michael Telahun Makonnen. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -10,8 +10,6 @@
 # 2. Redistributions in binary form must reproduce the above copyright
 #    notice, this list of conditions and the following disclaimer in the
 #    documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-#    derived from this software without specific prior written permission.
 #
 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
@@ -24,7 +22,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
-#      Email: Mike Makonnen <mtm@identd.net>
+#      Email: Mike Makonnen <mtm@FreeBSD.Org>
 #
 # $FreeBSD$
 #
@@ -35,6 +33,7 @@ MAILSPOOL="/var/mail"
 SIGKILL="-KILL"
 TEMPDIRS="/tmp /var/tmp"
 THISCMD=`/usr/bin/basename $0`
+PWCMD="${PWCMD:-/usr/sbin/pw}"
 
 # err msg
 #      Display $msg on stderr.
@@ -43,6 +42,13 @@ err() {
        echo 1>&2 ${THISCMD}: $*
 }
 
+# verbose
+#      Returns 0 if verbose mode is set, 1 if it is not.
+#
+verbose() {
+       [ -n "$vflag" ] && return 0 || return 1
+}
+
 # rm_files login
 #      Removes files or empty directories belonging to $login from various
 #      temporary directories.
@@ -50,17 +56,21 @@ err() {
 rm_files() {
        # The argument is required
        [ -n $1 ] && login=$1 || return
-       
+
+       totalcount=0
        for _dir in ${TEMPDIRS} ; do
+               filecount=0
                if [ ! -d $_dir ]; then
                        err "$_dir is not a valid directory."
                        continue
                fi
-               echo -n "Removing files owned by ($login) in $_dir:"
-               filecount=`find 2>/dev/null "$_dir" -user "$login" -delete -print | \
+               verbose && echo -n "Removing files owned by ($login) in $_dir:"
+               filecount=`find 2>/dev/null "$_dir" -user "$login" -delete -print |
                    wc -l | sed 's/ *//'`
-               echo " $filecount removed."
+               verbose && echo " $filecount removed."
+               totalcount=$(($totalcount + $filecount))
        done
+       ! verbose && [ $totalcount -ne 0 ] && echo -n " files($totalcount)"
 }
 
 # rm_mail login
@@ -71,16 +81,18 @@ rm_mail() {
        # The argument is required
        [ -n $1 ] && login=$1 || return
 
-       echo -n "Removing mail spool(s) for ($login):"
+       verbose && echo -n "Removing mail spool(s) for ($login):"
        if [ -f ${MAILSPOOL}/$login ]; then
-               echo -n " ${MAILSPOOL}/$login"
+               verbose && echo -n " ${MAILSPOOL}/$login" ||
+                   echo -n " mailspool"
                rm ${MAILSPOOL}/$login
        fi
-       if [ -f ${MAILSPOOL}/${login}.pop ]; then
-               echo -n " ${MAILSPOOL}/${login}.pop"
-               rm ${MAILSPOOL}/${login}.pop
+       if [ -f ${MAILSPOOL}/.${login}.pop ]; then
+               verbose && echo -n " ${MAILSPOOL}/.${login}.pop" ||
+                   echo -n " pop3"
+               rm ${MAILSPOOL}/.${login}.pop
        fi
-       echo '.'
+       verbose && echo '.'
 }
 
 # kill_procs login
@@ -90,14 +102,15 @@ kill_procs() {
        # The argument is required
        [ -n $1 ] && login=$1 || return
 
-       echo -n "Terminating all processes owned by ($login):"
+       verbose && echo -n "Terminating all processes owned by ($login):"
        killcount=0
        proclist=`ps 2>/dev/null -U $login | grep -v '^\ *PID' | awk '{print $1}'`
        for _pid in $proclist ; do
                kill 2>/dev/null ${SIGKILL} $_pid
-               killcount=`expr $killcount + 1`
+               killcount=$(($killcount + 1))
        done
-       echo " ${SIGKILL} signal sent to $killcount processes."
+       verbose && echo " ${SIGKILL} signal sent to $killcount processes."
+       ! verbose && [ $killcount -ne 0 ] && echo -n " processes(${killcount})"
 }
 
 # rm_at_jobs login
@@ -109,12 +122,13 @@ rm_at_jobs() {
 
        atjoblist=`find 2>/dev/null ${ATJOBDIR} -maxdepth 1 -user $login -print`
        jobcount=0
-       echo -n "Removing at(1) jobs owned by ($login):"
+       verbose && echo -n "Removing at(1) jobs owned by ($login):"
        for _atjob in $atjoblist ; do
                rm -f $_atjob
-               jobcount=`expr $jobcount + 1`
+               jobcount=$(($jobcount + 1))
        done
-       echo " $jobcount removed."
+       verbose && echo " $jobcount removed."
+       ! verbose && [ $jobcount -ne 0 ] && echo -n " at($jobcount)"
 }
 
 # rm_crontab login
@@ -124,12 +138,25 @@ rm_crontab() {
        # The argument is required
        [ -n $1 ] && login=$1 || return
 
-       echo -n "Removing crontab for ($login):"
+       verbose && echo -n "Removing crontab for ($login):"
        if [ -f ${CRONJOBDIR}/$login ]; then
-               echo -n " ${CRONJOBDIR}/$login"
+               verbose && echo -n " ${CRONJOBDIR}/$login" || echo -n " crontab"
                rm -f ${CRONJOBDIR}/$login
        fi
-       echo '.'
+       verbose && echo '.'
+}
+
+# rm_ipc login
+#      Remove all IPC mechanisms which are owned by $login.
+#
+rm_ipc() {
+       verbose && echo -n "Removing IPC mechanisms"
+       for i in s m q; do
+               ipcs -$i |
+               awk -v i=$i -v login=$1 '$1 == i && $5 == login { print $2 }' |
+               xargs -n 1 ipcrm -$i
+       done
+       verbose && echo '.'
 }
 
 # rm_user login
@@ -145,11 +172,15 @@ rm_user() {
        # The argument is required
        [ -n $1 ] && login=$1 || return
 
-       echo -n "Removing user ($login)"
-       [ -n "$pw_rswitch" ] && echo -n " (including home directory)"
-       echo -n " from the system:"
-       pw userdel -n $login $pw_rswitch
-       echo ' Done.'
+       verbose && echo -n "Removing user ($login)"
+       [ -n "$pw_rswitch" ] && {
+               verbose && echo -n " (including home directory)"
+               ! verbose && echo -n " home"
+       }
+       ! verbose && echo -n " passwd"
+       verbose && echo -n " from the system:"
+       ${PWCMD} userdel -n $login $pw_rswitch
+       verbose && echo ' Done.'
 }
 
 # prompt_yesno msg
@@ -182,7 +213,7 @@ prompt_yesno() {
 #      Display usage message.
 #
 show_usage() {
-       echo "usage: ${THISCMD} [-y] [-f file] [user ...]"
+       echo "usage: ${THISCMD} [-yv] [-f file] [user ...]"
        echo "       if the -y switch is used, either the -f switch or"
        echo "       one or more user names must be given"
 }
@@ -195,6 +226,7 @@ procowner=
 pw_rswitch=
 userlist=
 yflag=
+vflag=
 
 procowner=`/usr/bin/id -u`
 if [ "$procowner" != "0" ]; then
@@ -202,7 +234,7 @@ if [ "$procowner" != "0" ]; then
        exit 1
 fi
 
-args=`getopt 2>/dev/null yf: $*`
+args=`getopt 2>/dev/null yvf: $*`
 if [ "$?" != "0" ]; then
        show_usage
        exit 1
@@ -214,6 +246,10 @@ for _switch ; do
                yflag=1
                shift
                ;;
+       -v)
+               vflag=1
+               shift
+               ;;
        -f)
                fflag=1
                ffile="$2"
@@ -266,7 +302,7 @@ if [ ! "$userlist" ]; then
                show_usage
                exit 1
        else
-               echo -n "Please enter one or more user name's: "
+               echo -n "Please enter one or more usernames: "
                read userlist
        fi
 fi
@@ -308,14 +344,18 @@ for _user in $userlist ; do
        fi
 
        # Disable any further attempts to log into this account
-       pw 2>/dev/null lock $_user
+       ${PWCMD} 2>/dev/null lock $_user
 
        # Remove crontab, mail spool, etc. Then obliterate the user from
        # the passwd and group database.
+       #
+       ! verbose && echo -n "Removing user ($_user):"
        rm_crontab $_user
        rm_at_jobs $_user
+       rm_ipc $_user
        kill_procs $_user
-       rm_mail $_user
        rm_files $_user
+       rm_mail $_user
        rm_user $_user
+       ! verbose && echo "."
 done