#!/bin/ksh
##
## Backup OpenLDAP slapd databases
## Copyright (c) 2012 SATOH Fumiyasu @ OSS Technology, Inc.
##               <http://www.osstech.co.jp/>
##               <https://github.com/fumiyas/>
##
## License: GNU General Public License version 2 or later
## Date: 2012-03-11, since 2012-03-11
##

set -u
umask 0027
renice 1 "$$" >/dev/null 2>&1 || :
ionice -c 3 -p "$$" >/dev/null 2>&1 || :

pdie()
{
  echo "$0: ERROR: $1" 1>&2
  exit 1
}

## Options
## ======================================================================

slapcat_cmd="${SLAPDBBACKUP_SLAPCAT_COMMAND:-/opt/osstech/sbin/slapcat}"
slapd_conf="${SLAPDBBACKUP_SLAPD_CONF:-/opt/osstech/etc/openldap/slapd.conf}"
backup_dir="${SLAPDBBACKUP_BACKUP_DIR:-/opt/osstech/var/backup/ldap}"
backup_maxage="${SLAPDBBACKUP_BACKUP_MAXAGE:-30}"

## ======================================================================

set -A suffixes

sed 's/"//g;s/ *, */,/g' "$slapd_conf" \
|while read -r param value; do
  case "$param" in
  database)
    db_type="$value"
    ;;
  suffix)
    if [ -z "${db_type#[bh]db}" ]; then
      suffixes[${#suffixes[@]}]="$value"
    fi
    ;;
  esac
done

for suffix in "${suffixes[@]}"; do
  ldif="$backup_dir/$suffix.ldif.gz"
  ldif_new="$ldif.$$.tmp"
  ldif_failed="$ldif.$$.failed"

  ("$slapcat_cmd" -b "$suffix" || touch "$ldif_failed") |gzip -1 >"$ldif_new"
  if [[ $? -ne 0 ]] || [[ -f "$ldif_failed" ]]; then
    wait
    rm -f "$ldif_new" "$ldif_failed"
    exit 1
  fi

  if [[ -f "$ldif" ]]; then
    backup_age="$backup_maxage"
    if [[ -f "$ldif.$backup_age" ]]; then
      rm -f "$ldif.$backup_age" || exit 1
    fi
    while [[ "$backup_age" -gt 0 ]]; do
      backup_age_prev=$((backup_age - 1))
      if [[ -f "$ldif.$backup_age_prev" ]]; then
	mv "$ldif.$backup_age_prev" "$ldif.$backup_age" || exit 1
      fi
      backup_age="$backup_age_prev"
    done

    mv "$ldif" "$ldif.1" || exit 1
  fi

  mv "$ldif_new" "$ldif" || exit 1
done

exit 0

