#! /usr/bin/perl

# $Id: export 46816 2017-07-31 11:43:39Z wsl $
# $URL: https://svn.uvt.nl/its-id/trunk/sources/kiki/bin/export $

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

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 p.name, n.name FROM domainnames n
	JOIN domains d ON n.domain = d.domain
	JOIN domainnames p ON d.main = p.domainname");
$q->execute;
my $res = $q->fetchall_arrayref;
$q->finish;

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

$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;
	push @{$virtual{$a}}, $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;
	$addressbook{$a} = $a =~ s/\@(?:uvt\.nl|tilburguniversity\.edu)$//r;
}

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

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

$fh->write("dn: lookupTable=newdomains,o=Universiteit van Tilburg,c=NL
objectClass: top
objectClass: lookupTable
lookupTable: newdomains\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: lookupEntry
#lookupKey: $d\n\n")
#		or die "ldif: $!\n";

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

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

$fh->write("dn: lookupTable=newvirtual,o=Universiteit van Tilburg,c=NL
objectClass: top
objectClass: lookupTable
lookupTable: newvirtual\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: lookupEntry
#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";

	$fh->write("dn: lookupKey=$a,lookupTable=newvirtual,o=Universiteit van Tilburg,c=NL
objectClass: top
objectClass: lookupTable
objectClass: lookupEntry
lookupTable: newvirtual
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: 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;
