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 |