#!/usr/bin/perl -w

use strict;
use Errno;
use esmith::ConfigDB;
use esmith::AccountsDB;
use esmith::util;
use Net::LDAP;

my $c = esmith::ConfigDB->open_ro;
my $a = esmith::AccountsDB->open_ro;

my $x = 0; # exit value

my $l = $c->get('ldap');
my $status = $l->prop('status') || "disabled";
unless ($status eq "enabled"){
    warn "Not running action script $0, LDAP service not enabled!\n";
    exit(0);
}

my $domain = $c->get('DomainName')
    || die("Couldn't determine domain name");
$domain = $domain->value;

my @accounts;
my $account;
my $event = shift || die "Event name is missing\n";
if ($event eq 'ldap-update' or
    $event eq 'bootstrap-ldap-save'){
    @accounts = ($a->users);
    push(@accounts, $a->get('admin'));
}
else{
    my @name = @ARGV;
    die "Account name argument missing." unless scalar (@name) >= 1;

    foreach my $name (@name){
        $account = $a->get($name);
        die "Account $name not found.\n" unless defined $account;

        push @accounts, $account;
    }
}

my $base = esmith::util::ldapBase ($domain);
my $pw = esmith::util::LdapPassword();

my $ldap = Net::LDAP->new('localhost')
    or die "$@";

$ldap->bind(
    dn => "cn=root,$base",
    password => $pw
);

my $result;

foreach my $acc (@accounts){
    my $user = $acc->key;
    my $postalcode = $acc->prop('PostalCode') || '';
    my $mobile = $acc->prop('Mobile') || '';
    my $extension = $acc->prop('Extension') || '';
    my $fax = $acc->prop('Fax') || '';
    my $function1 = $acc->prop('Function1') || '';
    my $function2 = $acc->prop('Function2') || '';
    my $function3 = $acc->prop('Function3') || '';
    my $function4 = $acc->prop('Function4') || '';
    my $initials = $acc->prop('Initials') || '';
    my $dshell = $acc->prop('DesktopShell') || '';
    my $preferredemail = $acc->prop('PreferredEmail') || '';
    my $category = $acc->prop('Category') || '';
    $preferredemail = "$user\@$domain" if ($preferredemail eq '');
    my $web = $acc->prop('Url') || '';

    my (@postalcode,@mobile,@extension,@fax,@titles,@initials,@dshell,@preferredemail,@category,@web) = ();
    @postalcode = ($postalcode) unless ($postalcode eq '');
    @mobile = ($mobile) unless ($mobile eq '');
    @extension = ($extension) unless ($extension eq '');
    @fax = ($fax) unless ($fax eq '');
    @category = ($category) unless ($category eq '');
    foreach ($function1, $function2, $function3, $function4){
        push @titles, $_ if ($_ ne '');
    }
    @dshell = ($dshell) unless ($dshell eq '');
    @preferredemail = ($preferredemail) unless ($preferredemail eq '');
    @web = ($web) unless ($web eq '');
    $result = $ldap->modify(
                     "uid=$user,ou=Users,$base",
                         replace => {
                            postalCode => \@postalcode,
                            mobile => \@mobile,
                            extensionNumber => \@extension,
                            facsimileTelephoneNumber => \@fax,
                            title => \@titles,
                            initials => \@initials,
                            desktopLoginShell => \@dshell,
                            preferredMail => \@preferredemail,
                            businessCategory => \@category,
                            labeledURI => \@web
                         }
              );
    $result->code && ($x = 255, warn "failed to modify entry uid=$user,ou=Users,$base: ", $result->error);
}

$ldap->unbind;

exit ($x);
