#! /usr/bin/perl -w
use strict;

# les inn nettnavn
my %netnames = ();
my %netmasks = ();
my @nets = ();
open NAMES, "switches.txt"
	or die "switches.txt: $!";
while (<NAMES>) {
	chomp;
	/194\.0\.(\d+\.\d+)\s+(\d+)\s+(\S+)/ or next;
	$netmasks{$1} = $2;
	$netnames{$1} = $3;
	push @nets, $1;
}	

print <<"EOF";
# Autogenerated by make-dhcpd.pl. Do not edit manually!

option domain-name "tg06.gathering.org";
option domain-name-servers 194.0.254.2;

# ddns-update-style none;
ddns-update-style interim;

# extra logging for option 82
if exists agent.circuit-id
{
	log (
		info,
		concat (
			"option-82 info for ", binary-to-ascii (16, 8, ":", hardware),
			": interface ", binary-to-ascii (10, 8, "/", suffix ( option agent.circuit-id, 2)),
			", VLAN ", binary-to-ascii (10, 16, "", substring( option agent.circuit-id, 2, 2)),
			", switch '", substring( option agent.remote-id, 2, 6),
			"', port-name '", substring ( option agent.circuit-id, 2, extract-int ( substring ( option agent.circuit-id, 3, 1 ), 8 ) ),
			"'"
	       )
	);
}

# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST DHCP_UPDATER
key DHCP_UPDATER {
        algorithm HMAC-MD5.SIG-ALG.REG.INT;
	secret 5Yz1azvh7mE0IRGffTvtKg==;
}

default-lease-time 14400;
max-lease-time 28800;

# Tele-nett
subnet 194.0.254.0 netmask 255.255.255.0 {
}

# Server-nett
subnet 194.0.255.0 netmask 255.255.255.0 {
}

zone 0.194.in-addr.arpa. {
	primary 127.0.0.1;
	key DHCP_UPDATER;
}

EOF

for my $net (@nets) {
	my $domain = $netnames{$net};

	my ($netmask, $numpc);
	if ($netmasks{$net} == 24) {
		$netmask = "255.255.255.0";
		$numpc = 256;
	} elsif ($netmasks{$net} == 25) {
		$netmask = "255.255.255.128";
		$numpc = 128;
	} elsif ($netmasks{$net} == 26) {
		$netmask = "255.255.255.192";
		$numpc = 64;
	} else {
		die "Unknown netmask /$netmasks{$net}";
	}

	$net =~ /(\d+)\.(\d+)/ or die "Unknown net $net";
	my ($majorsubnet,$minorsubnet) = ($1,$2);
	
	my $gw = "194.0.$majorsubnet." . ($minorsubnet + 1);
	my $rangestart = "194.0.$majorsubnet." . ($minorsubnet + 10);
	my $rangeend = "194.0.$majorsubnet." . ($minorsubnet + $numpc - 2);

	if ($domain =~ /^split:(.*)/) {
		my @domains = split /,/, $1;
		for my $d (@domains) {
			print <<"EOF";
zone $d.tg06.gathering.org. {
	primary 127.0.0.1;
	key DHCP_UPDATER;
}
EOF
		}
		print <<"EOF";
subnet 194.0.$net netmask $netmask {
	authoritative;
	option routers $gw;

EOF
		my $numpc_sub = int($numpc / scalar(@domains));
		for my $d (@domains) {
			print <<"EOF";
	class "$d" {
		match if substring ( option agent.circuit-id, 2, extract-int ( substring ( option agent.circuit-id, 3, 1 ), 8 ) ) = "$d";
	}
EOF
		}

		my $i = 0;
		for my $d (@domains) {
			my $rangestart = "194.0.$majorsubnet." . ($minorsubnet + $i * $numpc_sub + 10);
			my $rangeend = "194.0.$majorsubnet." . ($minorsubnet + $i * $numpc_sub + $numpc_sub - 2);
			
			print <<"EOF";
	pool {
		allow members of "$d";
		range $rangestart $rangeend;
		option domain-name "$d.tg06.gathering.org";
		ddns-domainname "$d.tg06.gathering.org";
		ignore client-updates;
	}
EOF
			++$i;
		}
	} else {
		print <<"EOF";
zone $domain.tg06.gathering.org. {
	primary 127.0.0.1;
	key DHCP_UPDATER;
}
subnet 194.0.$net netmask $netmask {
	authoritative;
	option routers $gw;

	range $rangestart $rangeend;
	option domain-name "$domain.tg06.gathering.org";
	ddns-domainname "$domain.tg06.gathering.org";
	ignore client-updates;
EOF

	# hack for sesse =)
#	if ($net eq '250.0') {
#		print <<"EOF";
#	host trofast {
#		hardware ethernet 00:0e:0c:36:a7:66;
#		filename "/pxelinux.0";
#		next-server 194.0.254.89;
#	}
#EOF
	}
	
	print "}\n";
}
