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 | machine="$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 |
---|