#! /usr/bin/perl

# $Id: export 37864 2012-09-25 07:57:10Z wsl $
# $URL: https://svn.uvt.nl/its-id/trunk/sources/kiki/bin/export $

use strict;
use warnings FATAL => 'all';
use autodie;

use DBI;
use Encode;
use IO::File;

my $dsn = $ENV{DSN} // 'dbi:Pg:dbname=kiki';
my $user = $ENV{DBUSER} // 'kiki';
my $pass = $ENV{DBPASS};
my $options = {
	PrintError => 0,
	RaiseError => 1,
	AutoCommit => 0,
	ShowErrorStatement => 1,
	pg_enable_utf8 => 1
};

my $db = DBI->connect($dsn, $user, $pass, $options);

my $q = $db->prepare_cached('SELECT canon_from, canon_dest FROM export_canonical()');
$q->execute;
my $res = $q->fetchall_arrayref;
$q->finish;

my %canonical;
foreach my $r (@$res) {
	my ($a, $d) = @$r;
	$a =~ s/\@uvt\.nl$//;
	$canonical{$a} = $d;
}

$q = $db->prepare_cached('SELECT virt_from, virt_dest FROM export_virtual()');
$q->execute;
$res = $q->fetchall_arrayref;
$q->finish;

my %virtual;
foreach my $r (@$res) {
	my ($a, $d) = @$r;
	$a =~ s/\@uvt\.nl$//;
	next if exists $canonical{$a};
	push @{$virtual{$a}}, $d;
}

$q = $db->prepare_cached("SELECT n.name FROM domainnames n WHERE n.domain <> 1000000");
$q->execute;
$res = $q->fetchall_arrayref;
$q->finish;

my %domains;
foreach my $r (@$res) {
	my ($d) = @$r;
	undef $domains{$d};
}

$q = $db->prepare_cached("SELECT mailaddress FROM persons");
$q->execute;
$res = $q->fetchall_arrayref;
$q->finish;

my %relays;
foreach my $r (@$res) {
	my ($d) = @$r;
	$d =~ s/.*\@//;
	undef $relays{lc($d)};
}

$q = $db->prepare_cached("SELECT m.address FROM mail_addresses m JOIN mail_aliases a USING (mail_alias) WHERE a.addressbook");
$q->execute;
$res = $q->fetchall_arrayref;
$q->finish;

my %addressbook;
foreach my $r (@$res) {
	my ($a) = @$r;
	my $d = $a;
	$d =~ s/\@(?:tilburguniversity\.edu|uvt\.nl)$//i;
	$addressbook{$a} = $d;
}

my $fh = new IO::File('ldif', '>')
	or die "ldif: $!\n";

$fh->write("dn: lookupTable=domains,o=Universiteit van Tilburg,c=NL
objectClass: top
objectClass: lookupTable
lookupTable: domains\n\n")
	or die "ldif: $!\n";

while(my ($d) = each(%domains)) {
	$fh->write("dn: lookupKey=$d,lookupTable=domains,o=Universiteit van Tilburg,c=NL
objectClass: top
objectClass: lookupTable
objectClass: lookupEntry
lookupTable: domains
lookupKey: $d\n\n")
		or die "ldif: $!\n";
}

$fh->write("dn: lookupTable=relays,o=Universiteit van Tilburg,c=NL
objectClass: top
objectClass: lookupTable
lookupTable: relays\n\n")
	or die "ldif: $!\n";

while(my ($d) = each(%relays)) {
	$fh->write("dn: lookupKey=$d,lookupTable=relays,o=Universiteit van Tilburg,c=NL
objectClass: top
objectClass: lookupTable
objectClass: lookupEntry
lookupTable: relays
lookupKey: $d\n\n")
		or die "ldif: $!\n";
}

$fh->write("dn: lookupTable=canonical,o=Universiteit van Tilburg,c=NL
objectClass: top
objectClass: lookupTable
lookupTable: canonical\n\n")
	or die "ldif: $!\n";

while(my ($a, $d) = each(%canonical)) {
	$fh->write("dn: lookupKey=$a,lookupTable=canonical,o=Universiteit van Tilburg,c=NL
objectClass: top
objectClass: lookupTable
objectClass: lookupEntry
lookupTable: canonical
lookupKey: $a
lookupValue: $d\n\n")
		or die "ldif: $!\n";
}

$fh->write("dn: lookupTable=virtual,o=Universiteit van Tilburg,c=NL
objectClass: top
objectClass: lookupTable
lookupTable: virtual\n\n")
	or die "ldif: $!\n";

while(my ($a, $ds) = each(%virtual)) {
	unless(@$ds) {
		warn "$a has no destinations!\n";
		next;
	}
	$fh->write("dn: lookupKey=$a,lookupTable=virtual,o=Universiteit van Tilburg,c=NL
objectClass: top
objectClass: lookupTable
objectClass: lookupEntry
lookupTable: virtual
lookupKey: $a\n")
		or die "ldif: $!\n";
	foreach my $d (@$ds) {
		$fh->write("lookupValue: $d\n")
			or die "ldif: $!\n";
	}
	$fh->write("\n")
		or die "ldif: $!\n";
}

while(my ($a, $d) = each(%addressbook)) {
	$fh->write("dn: mail=$a,o=Universiteit van Tilburg,c=NL
objectClass: top
objectClass: inetOrgPerson
cn: $d (mail alias)
sn: $d
mail: $a\n\n")
		or die "ldif: $!\n";
}

$fh->flush or die "ldif: $!\n";
$fh->sync or die "ldif: $!\n";
$fh->close or die "ldif: $!\n";
undef $fh;

$db->rollback;
