| 1 | #!/bin/bash |
|---|
| 2 | set -e |
|---|
| 3 | |
|---|
| 4 | err() { |
|---|
| 5 | echo "$@" |
|---|
| 6 | } |
|---|
| 7 | |
|---|
| 8 | if [ -z "$1" ]; then |
|---|
| 9 | filter="objectClass=posixAccount" |
|---|
| 10 | else |
|---|
| 11 | filter= |
|---|
| 12 | for user; do |
|---|
| 13 | filter="$filter(uid=$user)" |
|---|
| 14 | done |
|---|
| 15 | filter="(&(objectClass=posixAccount)(|$filter))" |
|---|
| 16 | fi |
|---|
| 17 | |
|---|
| 18 | unset "${!l_@}" |
|---|
| 19 | while read attr value; do |
|---|
| 20 | if [ -n "$attr" ]; then |
|---|
| 21 | declare "l_${attr%:}=$value" |
|---|
| 22 | continue |
|---|
| 23 | fi |
|---|
| 24 | |
|---|
| 25 | read f_type f_data < <(hesinfo "$l_uid" filsys) || : |
|---|
| 26 | if [ -z "$f_type" ]; then |
|---|
| 27 | err "$l_uid" "no_hesiod" |
|---|
| 28 | elif [ "$f_type" = "ERR" ]; then |
|---|
| 29 | err "$l_uid" "hesiod_err ERR $f_data" |
|---|
| 30 | elif [ "$f_type" = "AFS" ]; then |
|---|
| 31 | read f_path f_perm f_link z \ |
|---|
| 32 | < <(echo "$f_data") |
|---|
| 33 | [ "$l_homeDirectory" = "$f_path" ] || \ |
|---|
| 34 | err "$l_uid" "hesiod_path $f_path" |
|---|
| 35 | else |
|---|
| 36 | err "$l_uid" "wrong_hesiod $f_type" |
|---|
| 37 | fi |
|---|
| 38 | |
|---|
| 39 | IFS=/ read p_empty p_top p_cell p \ |
|---|
| 40 | < <(echo "$l_homeDirectory") |
|---|
| 41 | [ -z "${p_empty}" ] || \ |
|---|
| 42 | err "$l_uid" "relative_home $l_homeDirectory" |
|---|
| 43 | [ "${p_top}" = "afs" ] || \ |
|---|
| 44 | err "$l_uid" "not_afs $l_homeDirectory" |
|---|
| 45 | |
|---|
| 46 | read v_vname v_vol v \ |
|---|
| 47 | < <(vos exa -noauth "$l_uidNumber" -cell "$p_cell" 2>/dev/null) || : |
|---|
| 48 | [ "$v_vol" = "$l_uidNumber" ] || |
|---|
| 49 | err "$l_uid" "no_vol $l_uidNumber" |
|---|
| 50 | |
|---|
| 51 | if ! [ -d "$l_homeDirectory" ]; then |
|---|
| 52 | if ! [ -e "$l_homeDirectory" ]; then |
|---|
| 53 | err "$l_uid" "deleted $l_homeDirectory" |
|---|
| 54 | else |
|---|
| 55 | err "$l_uid" "not_dir $l_homeDirectory" |
|---|
| 56 | fi |
|---|
| 57 | else |
|---|
| 58 | read c c_path c c c c_cell \ |
|---|
| 59 | < <(fs whichcell "$l_homeDirectory" 2>/dev/null) || : |
|---|
| 60 | [ "$c_path" = "$l_homeDirectory" ] || \ |
|---|
| 61 | err "$l_uid" "no_cell $l_homeDirectory" |
|---|
| 62 | [ "$c_cell" = "'$p_cell'" ] || \ |
|---|
| 63 | err "$l_uid" "wrong_cell $l_homeDirectory" |
|---|
| 64 | |
|---|
| 65 | read m_path m m m m m m m_vname \ |
|---|
| 66 | < <(fs lsmount "$l_homeDirectory" 2>/dev/null) || : |
|---|
| 67 | [ "$m_path" = "'$l_homeDirectory'" ] || \ |
|---|
| 68 | err "$l_uid" "no_mount $l_homeDirectory" |
|---|
| 69 | [ "$m_vname" = "'#$v_vname'" ] || [ "$m_vname" = "'%$v_vname'" ] || \ |
|---|
| 70 | err "$l_uid" "wrong_mount $m_vname ($l_uidNumber = $v_vname)" |
|---|
| 71 | fi |
|---|
| 72 | |
|---|
| 73 | unset "${!l_@}" |
|---|
| 74 | done < <( |
|---|
| 75 | ldapsearch -LLL -x -D 'cn=Directory Manager' -y /etc/signup-ldap-pw \ |
|---|
| 76 | -b ou=People,dc=scripts,dc=mit,dc=edu "$filter" \ |
|---|
| 77 | uid uidNumber homeDirectory loginShell | \ |
|---|
| 78 | perl -0pe 's/\n //g;' |
|---|
| 79 | ) |
|---|