#!/bin/bash -e
#
# Univention Directory Notifier
# Replicate many DN
#
# Copyright 2012-2016 Univention GmbH
#
# http://www.univention.de/
#
# All rights reserved.
#
# The source code of this program is made available
# under the terms of the GNU Affero General Public License version 3
# (GNU AGPL V3) as published by the Free Software Foundation.
#
# Binary versions of this program provided by Univention to you as
# well as other copyrighted, protected or trademarked materials like
# Logos, graphics, fonts, specific documentations and configurations,
# cryptographic keys etc. are subject to a license agreement between
# you and Univention and not subject to the GNU AGPL V3.
#
# In the case you use this program under the terms of the GNU AGPL V3,
# the program is provided 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public
# License with the Debian GNU/Linux or Univention distribution in file
# /usr/share/common-licenses/AGPL-3; if not, see
# .
eval "$(ucr shell)"
usage()
{
echo "Usage: $0 --dn-file "
echo
echo "The DNs in the given file will be re-replicated by the Univention Directory Notifier to all UCS systems in this UCS domain. This tool must be run on the domain controller master."
echo
echo "Warning: This tool will stop the OpenLDAP and the Notifier daemon."
echo
}
if [ "$server_role" != "domaincontroller_master" ]; then
echo "Abort: This tool must be run on the domain controller Master!" >&2
exit 1
fi
if [ ! -e /var/lib/univention-ldap/notify/transaction ]; then
echo "Abort: /var/lib/univention-ldap/notify/transaction was not found." >&2
exit 1
fi
if [ "$#" != 2 ] || [ "$1" != "--dn-file" ]; then
usage >&2
exit 1
fi
dnfile="$2"
if [ ! -r "${dnfile}" ]; then
echo "${dnfile} is not readable" >&2
exit 1
fi
RESTART_NOTIFIER=0
if pidof univention-directory-notifier >/dev/null ; then
echo -n "Stopping notifier: "
RESTART_NOTIFIER=1
/etc/init.d/univention-directory-notifier stop >/dev/null
sleep 1
if pidof univention-directory-notifier >/dev/null ; then
echo "failed"
echo "Abort: Failed to stop the notifier daemon. Please check stop the daemon manually and try again." >&2
exit 1
fi
echo "done"
fi
RESTART_SLAPD=0
if pidof slapd >/dev/null ; then
echo -n "Stopping slapd: "
RESTART_SLAPD=1
/etc/init.d/slapd stop >/dev/null
sleep 1
if pidof slapd >/dev/null ; then
echo "failed"
echo "Abort: Failed to stop the OpenLDAP daemon. Please check stop the daemon manually and try again." >&2
exit 1
fi
echo "done"
fi
echo -n "Write $(wc -l "${dnfile}" | awk '{print $1}') DNs to listener file: "
id="$(tail -n 1 /var/lib/univention-ldap/notify/transaction | awk '{print $1}')"
last_line="$(tail -n 1 /var/lib/univention-ldap/listener/listener)"
if [ -n "$last_line" ]; then
id_listener="$(tail -n 1 /var/lib/univention-ldap/listener/listener | awk '{print $1}')"
fi
if [ -n "$id_listener" ] && [ "$id_listener" -gt "$id" ]; then
nextid=$((id_listener+1))
else
nextid=$((id+1))
fi
skip=
while read -r dn; do
if [ -n "$dn" ] && slapdn "$dn" > /dev/null 2>&1; then
echo "$nextid $dn m" >>/var/lib/univention-ldap/listener/listener
echo -n "$nextid" >/var/lib/univention-ldap/last_id
nextid=$((nextid+1))
else
# shellcheck disable=SC2206,SC1117
test -n "$dn" && skip=($skip"Info: Skipped invalid dn $dn\n")
fi
done < "${dnfile}"
echo "done"
echo -ne "${skip[*]}"
rc=0
if [ "$RESTART_NOTIFIER" = 1 ]; then
echo -n "Starting notifier: "
/etc/init.d/univention-directory-notifier start >/dev/null || rc=1
echo "done"
fi
if [ "$RESTART_SLAPD" = 1 ]; then
echo -n "Starting slapd: "
/etc/init.d/slapd start >/dev/null || rc=1
echo "done"
fi
exit $rc