| 1 | #!/bin/sh |
|---|
| 2 | DIR=/etc/remctl/sipb-xen-auto |
|---|
| 3 | TEMPLATE=$DIR/conf.template |
|---|
| 4 | MACHINEDIR=$DIR/machine.d |
|---|
| 5 | MOIRADIR=$DIR/moira-acl |
|---|
| 6 | MOIRATMP=$DIR/moira-tmp |
|---|
| 7 | MACHINETMP=$DIR/machine-list-tmp |
|---|
| 8 | AUTOMACHINELIST=$DIR/auto-machine-list |
|---|
| 9 | AUTOMOIRALIST=$DIR/auto-moira-list |
|---|
| 10 | BINDIR=/usr/sbin |
|---|
| 11 | ACLDIR=$DIR/acl |
|---|
| 12 | |
|---|
| 13 | update_machine() |
|---|
| 14 | { |
|---|
| 15 | machine="$1" |
|---|
| 16 | sed "s/#MACHINENAME#/$machine/g" "$TEMPLATE" | \ |
|---|
| 17 | sed "s,#BINDIR#,$BINDIR,g" >| "$MACHINETMP" |
|---|
| 18 | if ! cmp -s "$MACHINEDIR/$machine" "$MACHINETMP"; then |
|---|
| 19 | mv "$MACHINETMP" "$MACHINEDIR/$machine" |
|---|
| 20 | else |
|---|
| 21 | rm -f "$MACHINETMP" |
|---|
| 22 | fi |
|---|
| 23 | } |
|---|
| 24 | |
|---|
| 25 | update_moiragroup() |
|---|
| 26 | { |
|---|
| 27 | group="$1" |
|---|
| 28 | # Should perhaps replace with LDAP, but fine for now. |
|---|
| 29 | |
|---|
| 30 | # We should do more careful error checking so we don't take away |
|---|
| 31 | # all bits and delete the moira-acl files whenever there's an AFS |
|---|
| 32 | # outage. |
|---|
| 33 | pts membership system:"$group" -noauth | tail -n+2 | \ |
|---|
| 34 | sed 's/\./\//' | \ |
|---|
| 35 | sed 's/^ //' | \ |
|---|
| 36 | sed 's/$/@ATHENA.MIT.EDU/g' >| "$MOIRATMP" |
|---|
| 37 | if test -s "$MOIRATMP"; then |
|---|
| 38 | if ! cmp -s "$MOIRADIR/$group" "$MOIRATMP"; then |
|---|
| 39 | mv "$MOIRATMP" "$MOIRADIR/$group" |
|---|
| 40 | fi |
|---|
| 41 | else |
|---|
| 42 | if test -e "$MOIRADIR/$group"; then |
|---|
| 43 | rm "$MOIRADIR/$group" |
|---|
| 44 | fi |
|---|
| 45 | fi |
|---|
| 46 | rm -f "$MOIRATMP" |
|---|
| 47 | } |
|---|
| 48 | |
|---|
| 49 | check_machine_name() |
|---|
| 50 | { |
|---|
| 51 | machinename="$1" |
|---|
| 52 | if ! perl -0e 'exit($ARGV[0] !~ /^[A-Za-z0-9][A-Za-z0-9._-]*$/)' -- "$machinename"; then |
|---|
| 53 | echo "Bad machine name" |
|---|
| 54 | exit 1 |
|---|
| 55 | fi |
|---|
| 56 | } |
|---|
| 57 | |
|---|
| 58 | case "$1" in |
|---|
| 59 | moiragroup) |
|---|
| 60 | update_moiragroup "$2" |
|---|
| 61 | ;; |
|---|
| 62 | |
|---|
| 63 | all_machines) |
|---|
| 64 | # update the remctl.conf definitions |
|---|
| 65 | for machine in `cat "$AUTOMACHINELIST"`; do |
|---|
| 66 | update_machine "$machine" |
|---|
| 67 | done |
|---|
| 68 | ;; |
|---|
| 69 | all_moira) |
|---|
| 70 | # update our moira ACL lists |
|---|
| 71 | for group in `cat "$AUTOMOIRALIST"`; do |
|---|
| 72 | update_moiragroup "$group" |
|---|
| 73 | done |
|---|
| 74 | ;; |
|---|
| 75 | auto_machine_list) |
|---|
| 76 | # update the list of maintained machines |
|---|
| 77 | /bin/ls "$ACLDIR" >| "$AUTOMACHINELIST" |
|---|
| 78 | ;; |
|---|
| 79 | auto_moira_list) |
|---|
| 80 | # update the moira list-of-lists |
|---|
| 81 | # /bin/ls "$MOIRADIR" >| "$AUTOMOIRALIST" # BAD IDEA in case of outage |
|---|
| 82 | |
|---|
| 83 | # This extracts the list of all moira lists we care about, and updates those. |
|---|
| 84 | grep -R moira "$ACLDIR/" /etc/remctl/acl/ | perl -pe 's/.*moira-acl\/(.*)/$1/g' >| "$AUTOMOIRALIST" |
|---|
| 85 | ;; |
|---|
| 86 | unregister) |
|---|
| 87 | machine="$2" |
|---|
| 88 | check_machine_name "$machine" |
|---|
| 89 | rm -f "$ACLDIR"/"$machine" |
|---|
| 90 | rm -f "$MACHINEDIR"/"$machine" |
|---|
| 91 | "$0" web |
|---|
| 92 | ;; |
|---|
| 93 | moveregister) |
|---|
| 94 | oldmachine="$2" |
|---|
| 95 | newmachine="$3" |
|---|
| 96 | check_machine_name "$oldmachine" |
|---|
| 97 | check_machine_name "$newmachine" |
|---|
| 98 | mv "$ACLDIR"/"$oldmachine" "$ACLDIR"/"$newmachine" |
|---|
| 99 | rm -f "$MACHINEDIR"/"$oldmachine" |
|---|
| 100 | "$0" web |
|---|
| 101 | ;; |
|---|
| 102 | register) |
|---|
| 103 | machine="$2" |
|---|
| 104 | check_machine_name "$machine" |
|---|
| 105 | if [ -e "$ACLDIR"/"$machine" ]; then |
|---|
| 106 | echo "Machine already registered" |
|---|
| 107 | exit 1 |
|---|
| 108 | fi |
|---|
| 109 | echo "include /etc/remctl/acl/web" > "$ACLDIR/$machine" |
|---|
| 110 | "$0" web |
|---|
| 111 | ;; |
|---|
| 112 | web) |
|---|
| 113 | "$0" auto_machine_list |
|---|
| 114 | "$0" all_machines |
|---|
| 115 | ;; |
|---|
| 116 | remctl-moira-update|all) |
|---|
| 117 | "$0" auto_machine_list |
|---|
| 118 | "$0" all_machines |
|---|
| 119 | "$0" auto_moira_list |
|---|
| 120 | "$0" all_moira |
|---|
| 121 | ;; |
|---|
| 122 | esac |
|---|
| 123 | |
|---|
| 124 | exit 0 |
|---|