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

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