#!/bin/sh DIR=/etc/remctl/sipb-xen-auto TEMPLATE=$DIR/conf.template MACHINEDIR=$DIR/machine.d MOIRADIR=$DIR/moira-acl MOIRATMP=$DIR/moira-tmp MACHINETMP=$DIR/machine-list-tmp AUTOMACHINELIST=$DIR/auto-machine-list AUTOMOIRALIST=$DIR/auto-moira-list BINDIR=/usr/sbin ACLDIR=$DIR/acl update_machine() { machine="$1" sed "s/#MACHINENAME#/$machine/g" "$TEMPLATE" | \ sed "s,#BINDIR#,$BINDIR,g" >| "$MACHINETMP" if ! cmp -s "$MACHINEDIR/$machine" "$MACHINETMP"; then mv "$MACHINETMP" "$MACHINEDIR/$machine" else rm -f "$MACHINETMP" fi } update_moiragroup() { group="$1" # Should perhaps replace with LDAP, but fine for now. # We should do more careful error checking so we don't take away # all bits and delete the moira-acl files whenever there's an AFS # outage. pts membership system:"$group" -noauth | tail -n+2 | \ sed 's/\./\//' | \ sed 's/^ //' | \ sed 's/$/@ATHENA.MIT.EDU/g' >| "$MOIRATMP" if test -s "$MOIRATMP"; then if ! cmp -s "$MOIRADIR/$group" "$MOIRATMP"; then mv "$MOIRATMP" "$MOIRADIR/$group" fi else if test -e "$MOIRADIR/$group"; then rm "$MOIRADIR/$group" fi fi rm -f "$MOIRATMP" } check_machine_name() { machinename="$1" if ! perl -0e 'exit($ARGV[0] !~ /^[A-Za-z0-9][A-Za-z0-9._-]*$/)' -- "$machinename"; then echo "Bad machine name" exit 1 fi } case "$1" in moiragroup) update_moiragroup "$2" ;; all_machines) # update the remctl.conf definitions for machine in `cat "$AUTOMACHINELIST"`; do update_machine "$machine" done ;; all_moira) # update our moira ACL lists for group in `cat "$AUTOMOIRALIST"`; do update_moiragroup "$group" done ;; auto_machine_list) # update the list of maintained machines /bin/ls "$ACLDIR" >| "$AUTOMACHINELIST" ;; auto_moira_list) # update the moira list-of-lists # /bin/ls "$MOIRADIR" >| "$AUTOMOIRALIST" # BAD IDEA in case of outage # This extracts the list of all moira lists we care about, and updates those. grep -R moira "$ACLDIR/" /etc/remctl/acl/ | perl -pe 's/.*moira-acl\/(.*)/$1/g' >| "$AUTOMOIRALIST" ;; unregister) machine="$2" check_machine_name "$machine" rm -f "$ACLDIR"/"$machine" rm -f "$MACHINEDIR"/"$machine" "$0" web ;; moveregister) oldmachine="$2" newmachine="$3" check_machine_name "$oldmachine" check_machine_name "$newmachine" mv "$ACLDIR"/"$oldmachine" "$ACLDIR"/"$newmachine" rm -f "$MACHINEDIR"/"$oldmachine" "$0" web ;; register) machine="$2" check_machine_name "$machine" if [ -e "$ACLDIR"/"$machine" ]; then echo "Machine already registered" exit 1 fi echo "include /etc/remctl/acl/web" > "$ACLDIR/$machine" "$0" web ;; web) "$0" auto_machine_list "$0" all_machines ;; remctl-moira-update|all) "$0" auto_machine_list "$0" all_machines "$0" auto_moira_list "$0" all_moira ;; esac exit 0