slitaz-dev-tools annotate tazu/tazu @ rev 269

Delete all corrupted account at once, search for user and fixes
author Christophe Lincoln <pankso@slitaz.org>
date Mon Feb 20 17:50:15 2017 +0100 (2017-02-20)
parents 03310414b391
children 93e083231066
rev   line source
pankso@214 1 #!/bin/sh
pankso@214 2 #
pankso@214 3 # TazU - SliTaz Users account utility
pankso@214 4 #
pankso@259 5 # This tool is used to mange SliTaz users accounts on bugs.slitaz.org
pankso@259 6 # and scn.slitaz.org. It can also be used to admin TinyCM users DB.
pankso@259 7 #
pankso@267 8 # Copyright 2017 (C) SliTaz GNU/Linux - BSD License
pankso@214 9 # Author: Christophe Lincoln <pankso@slitaz.org>
pankso@214 10 #
pankso@214 11 . /lib/libtaz.sh
pankso@214 12 check_root
pankso@267 13 user="$1"
pankso@214 14
pankso@269 15 people="/home/pankso/tazu/db/people"
pankso@269 16 authfile="/home/pankso/tazu/db/auth/people"
pankso@269 17 admin="/home/pankso/tazu/db/auth/admin"
pankso@269 18
pankso@269 19 #people="/var/lib/slitaz/people"
pankso@269 20 #authfile="/var/lib/slitaz/auth/people"
pankso@269 21 #admin="/var/lib/slitaz/auth/admin"
pankso@267 22
pankso@267 23 # Sanity check
pankso@267 24 for file in ${authfile} ${admin}; do
pankso@267 25 if ! [ -f "$file" ]; then
pankso@267 26 echo check $file
pankso@267 27 install -d -m 0700 -o www -g www $(dirname $file)
pankso@267 28 touch ${file} && chown www.www ${file} && chmod 0600 ${file}
pankso@267 29 fi
pankso@267 30 done
pankso@214 31
pankso@214 32 #
pankso@214 33 # Functions
pankso@214 34 #
pankso@214 35
pankso@214 36 usage() {
pankso@214 37 cat << EOT
pankso@214 38
pankso@268 39 $(boldify "Usage:") $(basename $0) [user|command] [--option]
pankso@214 40
pankso@214 41 Commands:
pankso@268 42 stats SliTaz users DB stats
pankso@268 43 list List all users accounts
pankso@268 44 last List last active users
pankso@269 45 check Check for corrupted accounts
pankso@214 46
pankso@214 47 Options:
pankso@267 48 --admin Make user admin
pankso@267 49 --edit Edit user account.conf
pankso@269 50 --search Search for users using patterns
pankso@268 51 --del Delete a user account (or all corrupted)
pankso@267 52
pankso@267 53 Examples:
pankso@267 54 tazu username --admin
pankso@269 55 tazu "user name" --search
pankso@214 56
pankso@214 57 EOT
pankso@214 58 }
pankso@214 59
pankso@214 60 no_account() {
pankso@214 61 echo "No user account for: $user"
pankso@214 62 }
pankso@214 63
pankso@269 64 md5crypt() {
pankso@269 65 echo -n "$1" | md5sum | awk '{print $1}'
pankso@269 66 }
pankso@269 67
pankso@267 68 # Delete a user (we may have corrupted accounts: check twice)
pankso@267 69 # Usage: deluser "username"
pankso@262 70 deluser() {
pankso@267 71 if [ -d "${people}/${1}" ] || grep -q "^$1:" ${authfile}; then
pankso@267 72 if [ -d "${people}/${1}" ]; then
pankso@267 73 echo -n "Deleting account: $(colorize 34 "$1")"
pankso@267 74 rm -rf "${people}/${1}" && status
pankso@267 75 fi
pankso@267 76 if grep -q "^$user:" ${authfile}; then
pankso@267 77 echo -n "Removing '$1' from authfile..."
pankso@267 78 sed -i "/^${1}:/"d ${authfile} && status
pankso@267 79 fi
pankso@267 80 else
pankso@267 81 no_account
pankso@263 82 fi
pankso@262 83 }
pankso@262 84
pankso@214 85 #
pankso@214 86 # Commands
pankso@214 87 #
pankso@214 88
pankso@214 89 case "$1" in
pankso@214 90 "") usage ;;
pankso@267 91
pankso@267 92 stats)
pankso@267 93 newline
pankso@267 94 boldify "SliTaz users stats"
pankso@267 95 separator
pankso@267 96 cat << EOT
pankso@267 97 People DB : $people
pankso@267 98 Authfie path : $authfile
pankso@267 99 Admin users : $admin
pankso@267 100 User accounts : $(ls $people | wc -l)
pankso@267 101 Authfile users : $(cat $authfile | wc -l)
pankso@267 102 Admin users : $(cat $admin | wc -l)
pankso@267 103 EOT
pankso@267 104 separator && newline ;;
pankso@267 105
pankso@267 106 last)
pankso@268 107 [ ! "$count" ] && count=15
pankso@268 108 newline
pankso@268 109 boldify "Last active users"
pankso@268 110 separator
pankso@268 111 find ${people} -name "last" | xargs ls -1t | head -n ${count} | while read last;
pankso@267 112 do
pankso@267 113 dir="$(dirname $last)"
pankso@267 114 echo -n "$(basename $dir)"
pankso@267 115 indent 26 "$(cat $last)"
pankso@268 116 done
pankso@268 117 separator && newline ;;
pankso@267 118
pankso@214 119 list)
pankso@214 120 # List all users
pankso@214 121 newline
pankso@214 122 boldify "SliTaz users list"
pankso@214 123 separator
pankso@214 124 for user in $(ls $people)
pankso@214 125 do
pankso@259 126 if ! [ -f "$people/$user/account.conf" ]; then
pankso@259 127 echo -n "$(colorize 31 "$user")"
pankso@269 128 indent 20 "CORRUPTED" && continue
pankso@259 129 fi
pankso@214 130 echo -n "$(colorize 34 "$user")"
pankso@269 131 indent 20 "${NAME}"
pankso@214 132 done
pankso@269 133 separator
pankso@269 134 echo "$(boldify "Users:") $(ls $people | wc -l)"
pankso@269 135 echo -n "$(boldify "Admin users:") "
pankso@269 136 for u in $(cat $admin); do
pankso@269 137 echo -n "$u "
pankso@269 138 done && newline
pankso@214 139 separator && newline ;;
pankso@267 140
pankso@259 141 check)
pankso@259 142 # Check accounts and auth file
pankso@269 143 tmp=/tmp/tazu_corrupted
pankso@259 144 newline
pankso@259 145 boldify "SliTaz accounts integrity"
pankso@259 146 separator
pankso@267 147 echo "$(colorize 33 "Checking users: account.conf")"
pankso@259 148 for user in $(ls $people)
pankso@259 149 do
pankso@259 150 if ! [ -f "$people/$user/account.conf" ]; then
pankso@269 151 echo -n "$(colorize 31 "$user")"
pankso@267 152 indent 26 "Missing account.conf"
pankso@269 153 else # Check empty VALUES
pankso@262 154 . "$people/$user/account.conf"
pankso@262 155 if [ -z "$NAME" ]; then
pankso@269 156 echo -n "$(colorize 31 "$user")"
pankso@267 157 indent 26 "Missing NAME"
pankso@259 158 fi
pankso@262 159 if [ -z "$MAIL" ]; then
pankso@269 160 echo -n $(colorize 31 "$user")
pankso@267 161 indent 26 "Missing MAIL"
pankso@262 162 fi
pankso@269 163 # Invalide mail
pankso@269 164 if ! echo "$MAIL" | grep -q "@"; then
pankso@269 165 echo -n $(colorize 31 "$user")
pankso@269 166 indent 26 "Invalid MAIL: $MAIL"
pankso@269 167 echo "$user" >> ${tmp}
pankso@269 168 fi
pankso@267 169 # account.conf but not in authfile ?
pankso@267 170 if ! grep -q "^${user}:" ${authfile}; then
pankso@267 171 echo -n $(colorize 31 "$user")
pankso@267 172 indent 26 "Missing in authfile"
pankso@269 173 echo "$user" >> ${tmp}
pankso@262 174 fi
pankso@267 175 unset NAME MAIL
pankso@259 176 fi
pankso@260 177 done
pankso@267 178 # Check authfile
pankso@267 179 echo "$(colorize 33 "Checking users in authfile...")"
pankso@267 180 IFS=":"
pankso@267 181 cat ${authfile} | while read user passwd;
pankso@260 182 do
pankso@260 183 if ! [ -d "$people/$user" ]; then
pankso@269 184 echo -n $(colorize 31 "$user")
pankso@267 185 indent 26 "Missing in DB"
pankso@269 186 echo "$user" >> ${tmp}
pankso@260 187 fi
pankso@260 188 done
pankso@267 189 unset IFS
pankso@267 190 separator
pankso@269 191 # Handle --del option
pankso@269 192 if [ "$del" ] && [ -f "$tmp" ]; then
pankso@269 193 boldify "Deleting accounts..."
pankso@269 194 cat $tmp | uniq | while read u;
pankso@269 195 do
pankso@269 196 deluser "$u"
pankso@269 197 done && separator
pankso@269 198 else
pankso@269 199 echo "To remove a single corrupted account you can use: tazu 'user' --del"
pankso@269 200 fi
pankso@269 201 newline && rm -f ${tmp} ;;
pankso@267 202
pankso@214 203 *)
pankso@214 204 # Handle general: --options
pankso@214 205 case " $@ " in
pankso@214 206 *\ --admin\ *)
pankso@214 207 # Admin user
pankso@267 208 if fgrep -q ${user} ${admin}; then
pankso@214 209 echo -n "User is already admin: " && colorize 34 "$user"
pankso@214 210 else
pankso@214 211 echo -n "Adding $user to admin users..."
pankso@267 212 echo "$user" >> ${admin} && status
pankso@214 213 fi ;;
pankso@214 214
pankso@264 215 *\ --edit\ *)
pankso@264 216 # Edit a user account
pankso@264 217 if [ -f "${people}/${user}/account.conf" ]; then
pankso@264 218 nano ${people}/${user}/account.conf
pankso@264 219 else
pankso@264 220 no_account
pankso@264 221 fi ;;
pankso@264 222
pankso@269 223 *\ --search\ *)
pankso@269 224 # Search for a user
pankso@269 225 newline
pankso@269 226 echo -n "Searching for: "; colorize 34 "$1"
pankso@269 227 separator
pankso@269 228 IFS=":"
pankso@269 229 grep -i "$1" ${people}/*/account.conf | while read path patterm;
pankso@269 230 do
pankso@269 231 . ${path}
pankso@269 232 if ! echo "$found" | grep -w -q "$USER"; then
pankso@269 233 found="$found $USER"
pankso@269 234 echo "$(colorize 34 $USER) $(indent 20 $NAME) $(indent 46 $MAIL)"
pankso@269 235 fi
pankso@269 236 done
pankso@269 237 unset IFS && separator && newline ;;
pankso@269 238
pankso@269 239 *\ --passwd\ *)
pankso@269 240 echo -n "New password for $1: "; read pass
pankso@269 241 echo "TODO" ;;
pankso@269 242
pankso@214 243 *\ --del\ *)
pankso@267 244 deluser "$user" ;;
pankso@214 245
pankso@214 246 *)
pankso@214 247 # Show user info
pankso@267 248 if [ -d "${people}/${user}" ]; then
pankso@214 249 newline
pankso@269 250 if fgrep -w -q "$user" ${admin}; then
pankso@267 251 echo "$(colorize 35 "Admin user:") $(colorize 34 "$user")"
pankso@267 252 else
pankso@267 253 echo "$(boldify "User:") $(colorize 34 "$user")"
pankso@267 254 fi
pankso@214 255 separator
pankso@214 256 cat $people/$user/account.conf | grep "="
pankso@267 257 separator
pankso@267 258
pankso@267 259 newline
pankso@214 260 else
pankso@214 261 no_account
pankso@214 262 fi ;;
pankso@214 263 esac ;;
pankso@214 264 esac
pankso@214 265
pankso@214 266 exit 0