#!/usr/bin/perl 
# $Id$
# This script (sophomorix-dump-pg2ldap) is maintained by Rüdiger Beck
# It is Free Software (License GPLv3)
# If you find errors, contact the author
# jeffbeck@web.de  or  jeffbeck@gmx.de


use strict;
use Getopt::Long;
Getopt::Long::Configure ("bundling");


# Todo replace debconf calls with thomas values

use Sophomorix::SophomorixConfig; 
use Sophomorix::SophomorixBase; 
#use Sophomorix::SophomorixPgLdap qw(
#                                   );

my @arguments = @ARGV;

my $help=0;
my $info=0;
$Conf::log_level=1;
my $dump=0;
my $new_dump=0;
my $load_dump=0;
my $domainname="";
my $skiplock=0;


# Parsen der Optionen
my $testopt=GetOptions(
           "verbose|v+" => \$Conf::log_level,
           "help|h" => \$help,
           "info|i" => \$info,
           "dump" => \$dump,
           "new-dump" => \$new_dump,
           "load-dump" => \$load_dump,
           "skiplock" => \$skiplock,
          );

# Prüfen, ob Optionen erkannt wurden
&check_options($testopt);


############################################################
# read the values from the config file
############################################################
my $config_file="/etc/sophomorix/pgldap/pgldap.conf";
if (-e $config_file) { 
   { package PgLdapConf ; do "$config_file"}
   $domainname=$PgLdapConf::domainname;
}

# domainname
#------------------------------------------------------------

my $domainname_debconf=
    &get_debconf_value("linuxmuster-base", "domainname",0);
# process debconf data
if ($domainname_debconf ne 0){
    # from debconf
    $domainname=$domainname_debconf;
    if($Conf::log_level>=2){
       print "   Domainname from debconf              : $domainname \n";
    }
} else {
    # from config file
    if($Conf::log_level>=2){
       print "   Domainname from pgldap.conf          : $domainname \n";
    }
}


my ($basedn,$dc)=&basedn_from_domainname($domainname);
my $timestamp=&zeit_stempel();


my $dump_dir=${DevelConf::log_pfad_pg2ldif};
my $ldif_file="slapd.ldif";


# --help
if ($help==1) {
   # Scriptname ermitteln
   my @list = split(/\//,$0);
   my $scriptname = pop @list;
   # Befehlbeschreibung
   print "\n$scriptname dumps the postgres database to a ldif file\n",
         "and loads it into slapd:\n";
   print('
Options

  without option: --dump and --load-dump

  -h  / --help
  -v  / --verbose
  -vv / --verbose --verbose
  --dump
  --load-dump
  --skiplock
');
   print "\n";
   exit;
}

# --info
if ($info==1) {
   print "\nThe option --info does nothing at the moment\n\n";
   exit;
}


&log_script_start(@arguments);



# without options:
# dump and load
if ($dump==0 and $load_dump==0){
    $dump=1;
    $load_dump=1;
}




# --dump
if ($dump==1){
    # dumping
    system("mkdir -p $dump_dir");
    print "Dumping to $dump_dir...\n";
    system("dump-postgres-for-ldap.sh $dump_dir");
    # convertting to ldif
    print "Converting to $ldif_file with $basedn ...\n";
    system("gen-ldif-from-sql.perl $dump_dir $basedn > $dump_dir/$ldif_file");
} else {
    print "NOT dumping pg to ldif\n";
}



# --load
if ($load_dump==1){
    my $ldap_dir="/var/lib/ldap";
    my $db_config="/var/lib/ldap/DB_CONFIG";
    my $template=${DevelConf::config_template_pfad};
    my $ldif_local="/usr/share/sophomorix/config-templates/ldap/local-gen.ldif";

    print "Loading ldif file $dump_dir/$ldif_file\n";
    system("/etc/init.d/slapd stop");
    sleep 2;
    system("killall slapd");

    # remove bdb files from slapd
    print "throwing away old ldap tree and creating a new...\n";
    system("rm -rf /var/lib/ldap/*");
    system("cp ${template}/bdb/slapd-standalone.DB_CONFIG $db_config"); 
    system("chown openldap.openldap $ldap_dir/*"); 


    if ($new_dump==1){
        # load structure
        my $ldif_structure=${DevelConf::config_template_pfad}.
                           "/pg2ldap/structure.ldif.template";
        my $ldif_structure_target=$dump_dir."/structure.ldif";

        print "cp $ldif_structure $ldif_structure_target \n";
        system ("cp $ldif_structure $ldif_structure_target");

        print "Populating ldap with $ldif_structure_target\n";
        system("slapadd -c -l $ldif_structure_target -f $DevelConf::slapd_conf");
    } else {
        # start and stop slapd to recreate files in /var/lib/ldap
        system("/etc/init.d/slapd start");
        system("/etc/init.d/slapd stop");
    }

    # slapd must be stopped again
    # populate ldap (no users)
    my $command="slapadd -c -l $ldif_local -f $DevelConf::slapd_conf";
    print "Populating ldap with $ldif_local using the following command:\n";
    print "$command\n";
    system("slapadd -c -l $ldif_local -f $DevelConf::slapd_conf");
    system("chown openldap.openldap $ldap_dir/*"); 

    $command="slapadd -c -l $dump_dir/$ldif_file -f $DevelConf::slapd_conf";
    print "Loading dump: $command\n";
    system("slapadd -c -l $dump_dir/$ldif_file -f $DevelConf::slapd_conf");
    system("chown openldap.openldap $ldap_dir/*"); 
    system("/etc/init.d/slapd start");
} else {
    print "NOT loading ldif into ldap\n";
}



&log_script_end(@arguments);



