mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
126 lines
3.3 KiB
Bash
Executable file
126 lines
3.3 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
tmp_backup_dir_file="/tmp/slapd-backup-dir.txt"
|
|
|
|
do_init_regen() {
|
|
if [[ $EUID -ne 0 ]]; then
|
|
echo "You must be root to run this script" 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
do_pre_regen ""
|
|
|
|
# fix some permissions
|
|
chown root:openldap /etc/ldap/slapd.conf
|
|
chown -R openldap:openldap /etc/ldap/schema/
|
|
|
|
# check the slapd config file at first
|
|
slaptest -Q -u -f /etc/ldap/slapd.conf
|
|
|
|
# regenerate LDAP config directory from slapd.conf
|
|
rm -Rf /etc/ldap/slapd.d
|
|
mkdir /etc/ldap/slapd.d
|
|
slaptest -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d/ 2>&1
|
|
chown -R openldap:openldap /etc/ldap/slapd.d/
|
|
|
|
service slapd restart
|
|
}
|
|
|
|
do_pre_regen() {
|
|
pending_dir=$1
|
|
|
|
cd /usr/share/yunohost/templates/slapd
|
|
|
|
# create needed directories
|
|
ldap_dir="${pending_dir}/etc/ldap"
|
|
schema_dir="${ldap_dir}/schema"
|
|
mkdir -p "$ldap_dir" "$schema_dir"
|
|
|
|
# remove legacy configuration file
|
|
[ ! -f /etc/ldap/slapd-yuno.conf ] \
|
|
|| touch "${pending_dir}/etc/ldap/slapd-yuno.conf"
|
|
|
|
# remove temporary backup file
|
|
sudo rm -f "$tmp_backup_dir_file"
|
|
|
|
# retrieve current and new backends
|
|
curr_backend=$(grep '^database' /etc/ldap/slapd.conf | awk '{print $2}')
|
|
new_backend=$(grep '^database' slapd.conf | awk '{print $2}')
|
|
|
|
# save current database before any conf changes
|
|
if [[ -n "$curr_backend" && "$curr_backend" != "$new_backend" ]]; then
|
|
backup_dir="/var/backups/dc=yunohost,dc=org-${curr_backend}-$(date +%s)"
|
|
sudo mkdir -p "$backup_dir"
|
|
sudo slapcat -b dc=yunohost,dc=org \
|
|
-l "${backup_dir}/dc=yunohost-dc=org.ldif"
|
|
echo "$backup_dir" > "$tmp_backup_dir_file"
|
|
fi
|
|
|
|
# copy configuration files
|
|
cp -a ldap.conf slapd.conf "$ldap_dir"
|
|
cp -a sudo.schema mailserver.schema "$schema_dir"
|
|
|
|
install -D -m 644 slapd.default "${pending_dir}/etc/default/slapd"
|
|
}
|
|
|
|
do_post_regen() {
|
|
regen_conf_files=$1
|
|
|
|
# ensure that slapd.d exists
|
|
sudo mkdir -p /etc/ldap/slapd.d
|
|
|
|
# fix some permissions
|
|
sudo chown root:openldap /etc/ldap/slapd.conf
|
|
sudo chown -R openldap:openldap /etc/ldap/schema/
|
|
sudo chown -R openldap:openldap /etc/ldap/slapd.d/
|
|
|
|
[ -z "$regen_conf_files" ] && exit 0
|
|
|
|
# check the slapd config file at first
|
|
sudo slaptest -Q -u -f /etc/ldap/slapd.conf
|
|
|
|
# check if a backup should be restored
|
|
backup_dir=$(cat "$tmp_backup_dir_file" 2>/dev/null || true)
|
|
if [[ -n "$backup_dir" && -f "${backup_dir}/dc=yunohost-dc=org.ldif" ]]; then
|
|
# regenerate LDAP config directory and import database as root
|
|
# since the admin user may be unavailable
|
|
sudo sh -c "rm -Rf /etc/ldap/slapd.d;
|
|
mkdir /etc/ldap/slapd.d;
|
|
slaptest -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d;
|
|
chown -R openldap:openldap /etc/ldap/slapd.d;
|
|
slapadd -F /etc/ldap/slapd.d -b dc=yunohost,dc=org \
|
|
-l '${backup_dir}/dc=yunohost-dc=org.ldif';
|
|
chown -R openldap:openldap /var/lib/ldap" 2>&1
|
|
else
|
|
# regenerate LDAP config directory from slapd.conf
|
|
sudo rm -Rf /etc/ldap/slapd.d
|
|
sudo mkdir /etc/ldap/slapd.d
|
|
sudo slaptest -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d/ 2>&1
|
|
sudo chown -R openldap:openldap /etc/ldap/slapd.d/
|
|
fi
|
|
|
|
sudo service slapd force-reload
|
|
}
|
|
|
|
FORCE=${2:-0}
|
|
DRY_RUN=${3:-0}
|
|
|
|
case "$1" in
|
|
pre)
|
|
do_pre_regen $4
|
|
;;
|
|
post)
|
|
do_post_regen $4
|
|
;;
|
|
init)
|
|
do_init_regen
|
|
;;
|
|
*)
|
|
echo "hook called with unknown argument \`$1'" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
exit 0
|