#!/usr/bin/env perl
#
# BEGIN COPYRIGHT BLOCK
# This Program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; version 2 of the License.
# 
# This Program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License along with
# this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA 02111-1307 USA.
# 
# In addition, as a special exception, Red Hat, Inc. gives You the additional
# right to link the code of this Program with code not covered under the GNU
# General Public License ("Non-GPL Code") and to distribute linked combinations
# including the two, subject to the limitations in this paragraph. Non-GPL Code
# permitted under this exception must only link to the code of this Program
# through those well defined interfaces identified in the file named EXCEPTION
# found in the source code files (the "Approved Interfaces"). The files of
# Non-GPL Code may instantiate templates or use macros or inline functions from
# the Approved Interfaces without causing the resulting work to be covered by
# the GNU General Public License. Only Red Hat, Inc. may make changes or
# additions to the list of Approved Interfaces. You must obey the GNU General
# Public License in all respects for all of the Program code and other code used
# in conjunction with the Program except the Non-GPL Code covered by this
# exception. If you modify this file, you may extend this exception to your
# version of the file, but you are not obligated to do so. If you do not wish to
# provide this exception without modification, you must delete this exception
# statement from your version and license this file solely under the GPL without
# exception. 
# 
# 
# Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
# Copyright (C) 2013 Red Hat, Inc.
# All rights reserved.
# END COPYRIGHT BLOCK
#

use lib qw(/usr/lib/aarch64-linux-gnu/dirsrv/perl);
use File::Spec;
use DSUtil;

DSUtil::libpath_add("");
DSUtil::libpath_add("/usr/lib");
DSUtil::libpath_add("/usr/lib64");
$ENV{'PATH'} = ":/usr/bin:/usr/lib64/mozldap/";
$ENV{'SHLIB_PATH'} = "$ENV{'LD_LIBRARY_PATH'}";

$dbtype = "ldbm database";
$i = 0;

sub usage {
    print(STDERR "Usage: bak2db.pl [-Z serverID] [-D rootdn] { -w password | -w - | -j filename } -a dirname [-t dbtype]\n");
    print(STDERR "                 [-n backendname] [-P protocol] [-v] [-h]\n");
    print(STDERR "Options:\n");
    print(STDERR "        -D rootdn    - Directory Manager\n");
    print(STDERR "        -w password  - Directory Manager's password\n");
    print(STDERR "        -w -         - Prompt for Directory Manager's password\n");
    print(STDERR "        -Z serverID  - Server instance identifier\n");
    print(STDERR "        -j filename  - Read Directory Manager's password from file\n");
    print(STDERR "        -a dirname   - Backup directory\n");
    print(STDERR "        -t dbtype    - Database type (default: ldbm database)\n");
    print(STDERR "        -n backend   - Backend database name.  Example: userRoot\n");
    print(STDERR "        -P protocol  - STARTTLS, LDAPS, LDAPI, LDAP (default: uses most secure protocol available)\n");
    print(STDERR "        -v           - Verbose output\n");
    print(STDERR "        -h           - Display usage\n");
}

while ($i <= $#ARGV) {
    if ("$ARGV[$i]" eq "-a") {    # backup directory
        $i++; $archivedir = $ARGV[$i];
    } elsif ("$ARGV[$i]" eq "-D") {    # Directory Manager
        $i++; $rootdn = $ARGV[$i];
    } elsif ("$ARGV[$i]" eq "-w") {    # Directory Manager's password
        $i++; $passwd = $ARGV[$i];
    } elsif ("$ARGV[$i]" eq "-j") { # Read Directory Manager's password from a file
        $i++; $passwdfile = $ARGV[$i];
    } elsif ("$ARGV[$i]" eq "-t") {    # database type
        $i++; $dbtype = $ARGV[$i];
    } elsif ("$ARGV[$i]" eq "-n") {    # backend instance name
        $i++; $instance = $ARGV[$i];
    } elsif ("$ARGV[$i]" eq "-Z") { # server instance name
        $i++; $servid = $ARGV[$i];
    } elsif ("$ARGV[$i]" eq "-P") { # protocol preference
        $i++; $protocol = $ARGV[$i];
    } elsif ("$ARGV[$i]" eq "-h") { # help
        &usage; exit(0);
    } elsif ("$ARGV[$i]" eq "-v") {    # verbose
        $verbose = 1;
    } else {
        &usage; exit(1);
    }
    $i++;
}

# 
# Gather all our config settings
#
($servid, $confdir) = DSUtil::get_server_id($servid, "/etc/default");
%info = DSUtil::get_info($confdir, $host, $port, $rootdn);
$info{rootdnpw} = DSUtil::get_password_from_file($passwd, $passwdfile);
$info{protocol} = $protocol;
if ($verbose == 1){
    $info{args} = "-v -a";
} else {
    $info{args} = "-a";
}
if ($archivedir eq ""){
    &usage;
    exit(1);
}
if ((-e $archivedir) && (-l $archivedir)) { # symlink
    $archivedir = readlink($archivedir);
}

#
# Contruct the task entry
#
($s, $m, $h, $dy, $mn, $yr, $wdy, $ydy, $r) = localtime(time);
$mn++; $yr += 1900;
$taskname = "restore_${yr}_${mn}_${dy}_${h}_${m}_${s}";
$isabs = File::Spec->file_name_is_absolute( $archivedir );
if (!$isabs) {
    $archivedir = File::Spec->rel2abs( $archivedir );
}
$dn = "dn: cn=$taskname, cn=restore, cn=tasks, cn=config\n";
$misc = "objectclass: top\nobjectclass: extensibleObject\n";
$cn = "cn: $taskname\n";
if ($instance ne "") {
    $nsinstance = "nsInstance: ${instance}\n";
}
$nsarchivedir = "nsArchiveDir: $archivedir\n";
$nsdbtype = "nsDatabaseType: $dbtype\n";
$entry = "${dn}${misc}${cn}${nsinstance}${nsarchivedir}${nsdbtype}";

$rc = DSUtil::ldapmod($entry, %info);

$dn =~ s/^dn: //;
$dn =~ s/\n//;
if($rc == 0){
    print "Successfully added task entry \"$dn\"\n";
} else {
    print "Failed to add task entry \"$dn\" error ($rc)\n";
}

exit($rc);
