#!/usr/bin/perl

use Getopt::Std;

$delim_start = " -- added by totd DON'T MODIFY THIS LINE --";
$delim_end = " -- end --";
#$etcdir = "/home/omote/lab/totd";
$etcdir = "/etc";
$dhcp_script = "$etcdir/dhclient-enter-hooks";
$resolv_conf = "$etcdir/resolv.conf";
$totd_conf = "$etcdir/totd.conf";
$USERID = $<;

$hook_script=<<'__EOF__';
make_resolv_conf() {
    if [ "$new_domain_name_servers" != "$old_domain_name_servers" ]; then
	totdconfig -a -d "$new_domain_name_servers"
    fi

    /etc/init.d/totd restart
}
__EOF__


sub removedelim(@) {
    my($HEAD, $FOOT, $MODE, @TEXT, $i);

    @TEXT = @_;
    $HEAD = ""; $FOOT = ""; $MODE = 0;

    foreach(@TEXT) {
	$i = substr($_, 1);
	chomp($i);
	$MODE = 1 if ($MODE == 0 && ($i eq $delim_start));
	$HEAD .= $_ if ($MODE == 0);
	$FOOT .= $_ if ($MODE == 2);
	$MODE = 2 if ($MODE == 1 && ($a eq $delim_end));
    }
    return ($HEAD, $FOOT);
}

sub usage {
    $usage=<<"__EOF__";
Usage: $0 [-a [-d DNS Servers] [-D] -l] [-r all|dhcp|resolv|totd] [-h]
    -a: Add totd specific configration.
    -d: Add/change totd DNS server to forward its query.
    -D: Configure /etc/dhclient-enter-hooks.
    -h: Show this help.
    -l: Configure /etc/resolv.conf
    -r: Remove totd specific configuration.
	(all: all configuration, dhcp: /etc/dhclient-enter-hooks,
         resolv: /etc/resolv.conf, totd: /etc/totd.conf)
__EOF__
    print STDERR $usage;
    exit(0);
}

sub add_conf_file($$$) {
    my($FILENAME);
    my($DELIM1, $DELIM2, $HEAD, $FOOT, $ADDCONF, $OUT, @FILE);

    $FILENAME = $_[0];
    $DELIM1 = "$_[1]$delim_start";
    $DELIM2 = "$_[1]$delim_end";
    $ADDCONF = $_[2];

    open(FH, "+<$FILENAME") || die "Cannot read \"$FILENAME\".\n";
    flock(FH, 2) || die "Cannot lock \"$FILENAME\".\n";

    @FILE=<FH>;
    ($HEAD, $FOOT) = removedelim(@FILE);
    $OUT = "$HEAD$DELIM1\n$ADDCONF$DELIM2\n$FOOT";

    seek(FH, 0, 0);
    print FH $OUT;
    truncate(FH, length($OUT));

    close(FH) || die "Cannot close \"$FILENAME\".\n";
}

sub remove_conf_file($) {
    my($FILENAME);
    my($OUT, $HEAD, $FOOT, @FILE, $FULLTEXT);

    $FILENAME = $_[0];

    open(FH, "+<$FILENAME") || die "Cannot read \"$FILENAME\".\n";
    flock(FH, 2) || die "Cannot lock \"$FILENAME\".\n";

    @FILE=<FH>;

    $FULLTEXT = join("", @FILE);
    if((index($FULLTEXT, $delim_start) == -1) ||
       (index($FULLTEXT, $delim_end) == -1)) { # no delimitor found
	close(FH);
	return;
    }
    ($HEAD, $FOOT) = removedelim(@FILE);

    $OUT = $HEAD . $FOOT;
    seek(FH, 0, 0);
    print FH $OUT;
    truncate(FH, length($OUT));

    close(FH) || die "Cannot close \"$FILENAME\".\n";
    
    if (length($OUT) == 0) {
	unlink("$FILENAME");
    }
}

getopts("d:r:ahD");
if("$USERID" ne "0") {print STDERR "$0: permission denied.\n";exit(1);}

if(length($opt_r)) {
    remove_conf_file($dhcp_script) if($opt_r =~ /^dhcp$/ || $opt_r =~ /^all$/);
#    remove_conf_file($resolv_conf) if($opt_r =~ /^resolv$/ || $opt_r =~ /^all$/);
    remove_conf_file($totd_conf) if($opt_r =~ /^totd$/ || $opt_r =~ /^all$/);
    exit(0);
}

if($opt_a) {
    $done = 0;
    if(length($opt_d)) {
	$dns = "retry 5\n";
	$dns .= "pidfile /var/run/totd/totd.pid\n";
	@dns_list = split(" ", $opt_d);
	foreach(@dns_list) {
	    $dns .= "forwarder $_\n";
	}
	add_conf_file($totd_conf, ";", $dns);
	$done = 1;
    }

    if($opt_D) {
	add_conf_file($dhcp_script, "#", $hook_script);
	$done = 1;
    }
    if($done != 0) {exit(0);}
}

usage();
