#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8

function die() { [ -n "$*" ] && echo "error: $*"; exit 1; }

[ `id -u` -eq 0 ] || die "this script must be run as root"

# create /jclain-slapd-tests, in order to have predictable paths
mkdir -p /jclain-slapd-tests || die
cd /jclain-slapd-tests

################################################################################
# Create env for master and slave

# create dirs
# - master.data is the actual data dir for master data
# - master.chroot is the chroot for the master
# - slave.data is the actual data dir for slave data
# - slave.chroot is the chroot for the slave
# - basedir is the "virtual" path from within the chroot
mkdir -p master.data || die
mkdir -p master.data/slapd.d || die
mkdir -p master.data/data || die
mkdir -p master.chroot || die
mkdir -p slave.data || die
mkdir -p slave.data/slapd.d || die
mkdir -p slave.data/data || die
mkdir -p slave.chroot || die
mkdir -p basedir || die

################################################################################
# setup master

# start chroot
mount -o rbind / master.chroot || die
mount -o bind master.data master.chroot/jclain-slapd-tests/basedir || die

# load initial data
chroot master.chroot slapadd -F /jclain-slapd-tests/basedir/slapd.d -n 0 <<<'
dn: cn=config
objectClass: olcGlobal
cn: config
olcPidFile: /jclain-slapd-tests/basedir/slapd.pid
olcArgsFile: /jclain-slapd-tests/basedir/slapd.args
olcLogLevel: 256
olcToolThreads: 1
olcAuthzRegexp: uid=_config,cn=digest-md5,cn=auth cn=config

dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
olcSizeLimit: 500
olcPasswordHash: {CLEARTEXT}
olcAccess: to *
  by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
  by * break
olcAccess: to dn.exact=""
  by * read
olcAccess: to dn.base="cn=Subschema"
  by * read

dn: olcDatabase=config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: config
olcAccess: to dn.subtree="cn=config"
  by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
  by dn.exact="cn=config" manage
  by * break
olcAccess: to dn.subtree="cn=config"
  by * none
olcRootDN: cn=config
olcRootPW: admin
olcLimits: dn.exact="cn=config" time=unlimited size=unlimited
olcSyncrepl: rid=0 provider="ldap://localhost:3890" bindmethod=simple binddn="cn=config" credentials=admin searchbase=cn=config type=refreshAndPersist retry="60 10 300 +" schemachecking=off
olcUpdateRef: ldap://localhost:3890

dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema

include: file:///etc/ldap/schema/core.ldif
include: file:///etc/ldap/schema/cosine.ldif
include: file:///etc/ldap/schema/nis.ldif
include: file:///etc/ldap/schema/inetorgperson.ldif

dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: back_hdb
olcModuleLoad: back_monitor
olcModuleLoad: syncprov.la
olcModuleLoad: accesslog.la

dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpcheckpoint: 128 10
olcSpsessionlog: 256

dn: olcBackend=hdb,cn=config
objectClass: olcBackendConfig
olcBackend: hdb

dn: olcBackend=monitor,cn=config
objectClass: olcBackendConfig
olcBackend: monitor

dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: hdb
olcDbCheckpoint: 1024 10
olcDbConfig: set_cachesize 0 268435456 0
olcDbConfig: set_lk_max_objects 32768
olcDbConfig: set_lk_max_locks 32768
olcDbConfig: set_lk_max_lockers 1500
olcDbConfig: set_lg_dir /jclain-slapd-tests/basedir/data
olcDbConfig: set_lg_regionmax 262144
olcDbConfig: set_lg_bsize 524288
olcLastMod: TRUE
olcSuffix: dc=univ-reunion,dc=fr
olcDbDirectory: /jclain-slapd-tests/basedir/data
olcRootDN: cn=admin,dc=univ-reunion,dc=fr
olcRootPW: admin
olcDbCacheSize: 1024
olcDbIDLcacheSize: 3072
olcDbIndex: objectClass,uid eq
olcDbIndex: entryCSN,entryUUID eq
olcAccess: to dn.subtree="dc=univ-reunion,dc=fr"
  by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
  by dn.exact="cn=admin,dc=univ-reunion,dc=fr" manage
  by dn.exact="cn=syncrepl,dc=univ-reunion,dc=fr" read
  by self write
  by * break
olcLimits: dn.exact="cn=admin,dc=univ-reunion,dc=fr" time=unlimited size=unlimited
olcLimits: dn.exact="cn=syncrepl,dc=univ-reunion,dc=fr" time=unlimited size=unlimited
olcSyncrepl: bindmethod=simple binddn="cn=admin,dc=univ-reunion,dc=fr" credentials=admin rid=1 provider="ldap://localhost:3890" searchbase=dc=univ-reunion,dc=fr type=refreshAndPersist retry="60 10 300 +" schemachecking=off
olcUpdateRef: ldap://localhost:3890

dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpcheckpoint: 128 10
olcSpsessionlog: 256

dn: olcDatabase=monitor,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMonitorConfig
olcDatabase: monitor
olcAccess: to dn.subtree="cn=monitor"
  by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
  by dn.exact="cn=admin,dc=univ-reunion,dc=fr" manage
  by * break
olcAccess: to dn.subtree="cn=monitor"
  by * none
olcRootDN: cn=monitor
olcRootPW: admin
' || die "unable to load master data"

chroot master.chroot slapadd -F /jclain-slapd-tests/basedir/slapd.d -n 1 -w <<<'
dn: dc=univ-reunion,dc=fr
objectClass: top
objectClass: dcObject
objectClass: organization
dc: univ-reunion
o: univ-reunion.fr
' || die "unable to load master data"

# start server
echo ============== starting master
/usr/sbin/slapd -h ldap://localhost:3890 -d 16640 \
    -F /jclain-slapd-tests/basedir/slapd.d \
    -r /jclain-slapd-tests/master.chroot \
    >&master.data/slapd.log &
disown -h $!
sleep 2

################################################################################
# setup slave

# start chroot
mount -o rbind / slave.chroot || die
mount -o bind slave.data slave.chroot/jclain-slapd-tests/basedir || die

# load initial data
chroot slave.chroot slapadd -F /jclain-slapd-tests/basedir/slapd.d -n 0 <<<'
dn: cn=config
objectClass: olcGlobal
cn: config
olcPidFile: /jclain-slapd-tests/basedir/slapd.pid
olcArgsFile: /jclain-slapd-tests/basedir/slapd.args

dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcSyncrepl: rid=0 provider="ldap://localhost:3890" bindmethod=simple binddn="cn=config" credentials=admin searchbase=cn=config type=refreshAndPersist retry="60 10 300 +" schemachecking=off
olcUpdateRef: ldap://localhost:3890
' || die "unable to load slave data"

# start server
echo ============== starting slave
/usr/sbin/slapd -h ldap://localhost:3891 -d 16640 \
    -F /jclain-slapd-tests/basedir/slapd.d \
    -r /jclain-slapd-tests/slave.chroot \
    -c rid=0 \
    >&slave.data/slapd.log &
disown -h $!
sleep 2

################################################################################
# done!

echo "Setup done. Servers started

Logs are in
    /jclain-slapd-tests/master.data/slapd.log
    /jclain-slapd-tests/slave.data/slapd.log"
