#!/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
