#! /bin/sh
#------------------------------------------------------------------------------
# /var/install/bin/ldapserver-restore-database - import LDAP database
#
# Copyright (c) 2009-2023  The Eisfair Team, team(at)eisfair(dot)org
#
# Creation   : 2009-11-17 jed
# Last Update: $Id: ldapserver-export-database 29883 2012-02-19 19:28:17Z jed $
#
# 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; either version 2 of the License, or
# (at your option) any later version.
#------------------------------------------------------------------------------

# read eislib
. /var/install/include/eislib

#exec 2>/tmp/ldapserver-ldap-restore-trace-$$.log
#set -x

# command line parameter
batch=0
quiet=0
if [ $# -gt 0 ]
then
    # read parameter(s)
    while [ $# -gt 0 ]
    do
        case $1 in
            -importfile|--importfile )
                batch=1
                ldap_import_file="$2"
                shift; shift
                ;;
            -importpath|--importpath )
                batch=1
                ldap_backup_path="`echo "$2" | sed 's#/$##'`"
                shift; shift
                ;;
            -help|--help|-?|/? )
                echo
                echo "Usage:"
                echo "  ldapserver-restore-database         - run in interactive mode"
                echo
                echo "  ldapserver-restore-database --help  - show this help"
                echo
                echo "  ldapserver-restore-database -importfile <ldif-import-file>"
                echo "                                      - import ldif file in batch mode"
                echo
                echo "  ldapserver-restore-database -importpath <ldif-import-path>"
                echo "                                      - import default ldif file in batch mode"
                exit 1
                ;;
            * )
                break
                ;;
        esac
    done
fi

ldap_confpath=/etc/openldap
ldap_datapath=/var/lib/openldap
tmppath='/tmp'

user='ldap'
group='ldap'

configfile=/etc/config.d/ldapserver
ldapserver_logfile=${ldap_datapath}/ldapserver-ldap-restore.log

exit_code=0
if [ -f ${configfile} ]
then
    . ${configfile}

    if [ -z "${ldap_import_file}" ]
    then
        if [ -z "${ldap_backup_path}" ]
        then
            if [ "${LDAPSERVER_BACKUP}" = 'yes' ]
            then
                ldap_backup_path="${LDAPSERVER_BACKUP_PATH}"
            else
                ldap_backup_path="${tmppath}"
            fi
        fi

        ldap_import_file=${ldap_backup_path}/`echo ${LDAPSERVER_LDAP_BASEDN} | sed -e 's/dc= *//g' -e 's/[ ,]*//g'`.ldif
    fi

    if [ ${batch} -eq 0 ]
    then
        # interactive mode
        clrhome
        mecho --info "Restore LDAP database"
        mecho

        ldap_import_file=$(/var/install/bin/ask "Please enter the file name to restore (full path) [q]" "${ldap_import_file}" "+")
        if [ "${ldap_import_file}" = "q" -o "${ldap_import_file}" = "Q" ]
        then
            exit 0
        fi
    fi

    destpath="`dirname ${ldap_import_file}`"

    if [ -d "${destpath}" ]
    then
        if [ -f "${ldap_import_file}" ]
        then
            # file exists, go on ...
            count_bdb=`find ${ldap_datapath} -maxdepth 1 -name "*.bdb" -printf '.' | wc -m`
            count_mdb=`find ${ldap_datapath} -maxdepth 1 -name "*.mdb" -printf '.' | wc -m`

            if [ ${count_bdb} -gt 0 -o ${count_mdb} -gt 0 ]
            then
                # files exist, delete it?
                if [ ${batch} -eq 0 ]
                then
                    mecho --warn "A LDAP database already exists!"
                    mecho

                    if /var/install/bin/ask "Do you want to delete it" "no"
                    then
                        # go on ...
                        if [ ${count_bdb} -gt 0 ]
                        then
                            rm -f ${ldap_datapath}/*.bdb ${ldap_datapath}/__db.* ${ldap_datapath}/log.* ${ldap_datapath}/alock
                        fi

                        if [ ${count_mdb} -gt 0 ]
                        then
                            rm -f ${ldap_datapath}/*.mdb ${ldap_datapath}/__db.* ${ldap_datapath}/log.* ${ldap_datapath}/alock
                        fi
                    else
                        # abort restore operation
                        exit 1
                    fi
                else
                    # batch mode
                    # check if directory path is accessible and writeble
                    touch ${ldap_import_file}.TEST 2>/dev/null

                    if [ $? -eq 0 ]
                    then
                        # directory path is accessible and writeble, go on ...
                        rm -f ${ldap_import_file}.TEST

                        if [ ${count_bdb} -gt 0 ]
                        then
                            # backup bdb files and remove it afterwards
                            tar czf ${destpath}/${EISDATE}_${EISTIME}_ldapserver_bdb_backup.tgz ${ldap_datapath}/*.bdb ${ldap_datapath}/log* \
                                    ${ldap_datapath}/__db.* ${ldap_datapath}/alock ${ldap_datapath}/ldap.base ${ldap_datapath}/DB_CONFIG \
                                    ${ldap_datapath}/*.log ${ldap_import_file}

                            if [ $? -eq 0 ]
                            then
                                rm -f ${ldap_datapath}/*.bdb ${ldap_datapath}/__db.* ${ldap_datapath}/log* ${ldap_datapath}/alock ${ldap_datapath}/*.log
                            fi
                        else
                            if [ ${count_mdb} -gt 0 ]
                            then
                                # backup mdb files and remove it afterwards
                                tar czf ${destpath}/${EISDATE}_${EISTIME}_ldapserver_mdb_backup.tgz ${ldap_datapath}/*.mdb ${ldap_datapath}/log* \
                                        ${ldap_datapath}/ldap.base ${ldap_datapath}/DB_CONFIG ${ldap_datapath}/*.log ${ldap_import_file}

                                if [ $? -eq 0 ]
                                then
                                    rm -f ${ldap_datapath}/*.mdb ${ldap_datapath}/log* ${ldap_datapath}/*.log
                                fi
                            fi
                        fi    # backup database files
                    fi    # directory path is accessible and writeble, go on ...
                fi    # interactive or batch mode
            fi    # files exist
        fi    # import file exists

        rm -f ${ldapserver_logfile}

        echo "date: ${EISDATE} ${EISTIME}" > ${ldapserver_logfile}

        # shutdown server
        /usr/sbin/service stop ldapserver 2>&1 | /usr/bin/ansifilter >> ${ldapserver_logfile}
        echo >> ${ldapserver_logfile} 2>> ${ldapserver_logfile}

        # restore LDAP database
        /usr/sbin/slapadd -v -c -f ${ldap_confpath}/slapd.conf -l ${ldap_import_file} >> ${ldapserver_logfile} 2>> ${ldapserver_logfile}

        if [ $? -eq 0 ]
        then
            mecho "LDAP directory successfully restore from file '${ldap_import_file}."

            rm -f ${ldap_import_file}
        else
            mecho --error "Error during restore of LDAP directory tree. Please try again!"
        fi

        echo >> ${ldapserver_logfile} 2>> ${ldapserver_logfile}

        # set file ownership
        chown -R ${user}  ${ldap_datapath}
        chgrp -R ${group} ${ldap_datapath}

        # update index
        /usr/sbin/slapindex >> ${ldapserver_logfile} 2>> ${ldapserver_logfile}
        echo >> ${ldapserver_logfile} 2>> ${ldapserver_logfile}

        # start server
        /usr/sbin/service start ldapserver 2>&1 | /usr/bin/ansifilter >> ${ldapserver_logfile}

        if [ ${batch} -eq 0 ]
        then
            # check if show-doc.cui supports colors
            color=''
            frame=''
            if $(grep -qE "^MENU=['\"]/var/install/bin/show-menu['\"]"  /etc/config.d/setup)
            then
                color='--nocolor'
                frame='--noframe'
            fi

            sleep 3
            /var/install/bin/show-doc.cui ${color} ${frame} --follow --title ${ldapserver_logfile} ${ldapserver_logfile}
        fi
    else
        mecho --error "Source file '${ldap_import_file}' doesn't exist!"
    fi
else
    mecho --error "Configuration file '${configfile}' doesn't exist!"
fi

exit 0