250 lines
7.4 KiB
Bash
250 lines
7.4 KiB
Bash
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
|
## Gestion du service slapd (démarrage/arrêt), et de sa configuration
|
|
##@cooked nocomments
|
|
##@require base
|
|
##@require sysinfos
|
|
uprovide ldap
|
|
urequire base sysinfos
|
|
|
|
function get_default_ldapconfdir_prefix() {
|
|
# Calculer et afficher la valeur par défaut de LDAPCONFDIR, ou une chaine
|
|
# vide si l'on n'a pas pu le détecter automatiquement.
|
|
if check_sysinfos -s linux; then
|
|
if check_sysinfos -d debianlike; then
|
|
[ -d /etc/ldap ] && echo /etc/ldap
|
|
elif check_sysinfos -d redhatlike; then
|
|
[ -d /etc/openldap ] && echo /etc/openldap
|
|
elif check_sysinfos -d gentoo; then
|
|
[ -d /etc/openldap ] && echo /etc/openldap
|
|
fi
|
|
elif check_sysinfos -s darwin; then
|
|
[ -d /etc/openldap ] && echo /etc/openldap
|
|
fi
|
|
}
|
|
|
|
function get_default_ldapowner_prefix() {
|
|
# Calculer et afficher la valeur par défaut de LDAPOWNER, ou une chaine
|
|
# vide si l'on n'a pas pu le détecter automatiquement.
|
|
if check_sysinfos -s linux; then
|
|
if check_sysinfos -d debianlike; then
|
|
echo openldap:openldap
|
|
elif check_sysinfos -d redhatlike; then
|
|
echo ldap:ldap
|
|
elif check_sysinfos -d gentoo; then
|
|
echo ldap:ldap
|
|
fi
|
|
elif check_sysinfos -s darwin; then
|
|
echo root:wheel
|
|
fi
|
|
}
|
|
|
|
__ldap_prefixes=
|
|
function __compute_ldap_prefixes() {
|
|
[ -n "$__ldap_prefixes" ] && return
|
|
LDAPCONFDIR="${LDAPCONFDIR:-$(get_default_ldapconfdir_prefix)}"
|
|
LDAPOWNER="${LDAPOWNER:-$(get_default_ldapowner_prefix)}"
|
|
__ldap_prefixes=1
|
|
}
|
|
|
|
LDAP_PREFIXES=(LDAPCONFDIR LDAPOWNER)
|
|
UTOOLS_PREFIXES=("${UTOOLS_PREFIXES[@]}" "${LDAP_PREFIXES[@]}")
|
|
|
|
function compute_ldap_prefixes() {
|
|
__compute_ldap_prefixes
|
|
}
|
|
|
|
function recompute_ldap_prefixes() {
|
|
local v
|
|
for v in "${LDAP_PREFIXES[@]}"; do
|
|
eval "$v="
|
|
done
|
|
__ldap_prefixes=
|
|
__compute_ldap_prefixes
|
|
}
|
|
|
|
function get_LDAPCONFDIR_prefix() {
|
|
__compute_ldap_prefixes
|
|
echo "$LDAPCONFDIR"
|
|
}
|
|
|
|
function get_LDAPOWNER_prefix() {
|
|
__compute_ldap_prefixes
|
|
echo "$LDAPOWNER"
|
|
}
|
|
|
|
function split_ldapuri() {
|
|
# spliter le ldapuri $1 en $2(=proto), $3(=host) et $4(=port)
|
|
local ldapuri="$1" protoname="${2:-proto}" hostname="${3:-host}" portname="${4:-port}"
|
|
local tmp
|
|
if [ -z "$ldapuri" ]; then
|
|
set_var "$protoname" ""
|
|
set_var "$hostname" ""
|
|
set_var "$portname" ""
|
|
return 0
|
|
fi
|
|
tmp="$ldapuri"
|
|
if [ "${tmp#ldap://}" != "$tmp" ]; then
|
|
set_var "$protoname" ldap
|
|
tmp="${tmp#ldap://}"
|
|
elif [ "${tmp#ldaps://}" != "$tmp" ]; then
|
|
set_var "$protoname" ldaps
|
|
tmp="${tmp#ldaps://}"
|
|
elif [ "${tmp#ldapi://}" != "$tmp" ]; then
|
|
set_var "$protoname" ldapi
|
|
tmp="${tmp#ldapi://}"
|
|
else
|
|
set_var "$protoname" ""
|
|
set_var "$hostname" ""
|
|
set_var "$portname" ""
|
|
eerror "invalid ldapuri: $ldapuri"
|
|
return 1
|
|
fi
|
|
tmp="${tmp%%/*}"
|
|
local tmphost="${tmp%%:*}"
|
|
set_var "$hostname" "$tmphost"
|
|
tmp="${tmp#$tmphost}"
|
|
set_var "$portname" "${tmp#:}"
|
|
return 0
|
|
}
|
|
|
|
function get_suffixes() {
|
|
# obtenir les suffixes de connexion du serveur avec l'uri $1, un par ligne
|
|
# retourner 1 si la valeur n'a pas pu être obtenue
|
|
local ncs
|
|
ncs="$(ldapsearch -x ${1:+-H "$1"} -b "" -LLL -s base namingContexts)" || return 1
|
|
<<<"$ncs" grep namingContexts: | sed 's/namingContexts: //'
|
|
}
|
|
|
|
function get_anysuffix() {
|
|
# obtenir le *premier* suffixe du serveur avec l'uri $1
|
|
# retourner 1 si la valeur n'a pas pu être obtenue
|
|
local suffix
|
|
suffix="$(get_suffixes "$1")" || return 1
|
|
<<<"$suffix" head -n1
|
|
}
|
|
|
|
function get_dcsuffix() {
|
|
# obtenir le *premier* suffixe du serveur avec l'uri $1 qui se termine par
|
|
# dc=TLD où TLD est une valeur quelconque. A priori, c'est un suffixe d'une
|
|
# base de donnée non administrative.
|
|
# retourner 1 si la valeur n'a pas pu être obtenue
|
|
local suffix
|
|
suffix="$(get_suffixes "$1" | awk '/(^|,)[dD][cC]=[^,]+/ { print }')" || return 1
|
|
<<<"$suffix" head -n1
|
|
}
|
|
|
|
function get_suffix() {
|
|
# obtenir le *premier* suffixe du serveur avec l'uri $1 qui se termine si
|
|
# possible par dc=TLD où TLD est une valeur quelconque. Dans le cas normal,
|
|
# le suffixe affiché est celui d'une base non administrative.
|
|
# retourner 1 si la valeur n'a pas pu être obtenue
|
|
local suffixes suffix
|
|
suffixes="$(get_suffixes "$1")" || return 1
|
|
suffix="$(<<<"$suffixes" awk '/(^|,)[dD][cC]=[^,]+/ { print }')"
|
|
[ -n "$suffix" ] || suffix="$suffixes"
|
|
<<<"$suffix" head -n1
|
|
}
|
|
|
|
function reldn() {
|
|
local dn="$(strlower "$1")"
|
|
local suffix="$(strlower "${2:-$SUFFIX}")"
|
|
|
|
# exprimer le dn $1 relativement au suffixe $2(=$SUFFIX)
|
|
if [ -z "$suffix" ]; then
|
|
echo "$1"
|
|
elif [ -z "$dn" -o "$dn" == "$suffix" ]; then
|
|
echo ""
|
|
elif [ "${dn%,$suffix}" != "$dn" ]; then
|
|
# absolu, enlever $suffix
|
|
echo "${1:$((${#dn} - ${#suffix}))}"
|
|
else
|
|
# relatif
|
|
echo "$1"
|
|
fi
|
|
}
|
|
|
|
function _absdn() {
|
|
local dn="$(strlower "$1")"
|
|
local suffix="$(strlower "$2")"
|
|
|
|
# obtenir le dn absolu correspondant au dn $1, le dn de base étant $2
|
|
if [ -z "$suffix" ]; then
|
|
echo "$1"
|
|
elif [ -z "$dn" -o "$dn" == "$suffix" ]; then
|
|
echo "$2"
|
|
elif [ "${dn%,$suffix}" != "$dn" ]; then
|
|
# absolu
|
|
echo "$1"
|
|
else
|
|
# relatif, ajouter $suffix
|
|
echo "$1,$2"
|
|
fi
|
|
}
|
|
|
|
function absdn() {
|
|
# obtenir le dn absolu correspondant au dn $1, le dn de base étant
|
|
# $2(=$SUFFIX)
|
|
_absdn "$1" "${2:-$SUFFIX}"
|
|
}
|
|
|
|
function subof() {
|
|
# tester si le dn absolu $1 est $2 ou un enfant de $2
|
|
local dn="$(strlower "$1")"
|
|
local par="$(strlower "$2")"
|
|
[ "$dn" == "$par" -o "${dn%,$par}" != "$dn" ]
|
|
}
|
|
|
|
function rabsdn() {
|
|
# comme absdn, mais tient compte de la valeur de $3(=$SEARCHBASE)
|
|
# Si le dn commence par "~/", le dn est relatif à $2(=$SUFFIX)
|
|
# Si le dn commence par "/", le dn est absolu
|
|
# Sinon, le dn est relatif à $3
|
|
local dn="$1" suffix="${2:-$SUFFIX}" searchbase="${3:-$SEARCHBASE}"
|
|
|
|
# corriger les expansions éventuelles du shell
|
|
if [ "$dn" == "$HOME" ]; then
|
|
dn="~"
|
|
elif [ "${dn#$HOME}" != "$dn" ]; then
|
|
dn="~${dn#$HOME}"
|
|
fi
|
|
# calculer le dn absolu
|
|
if [ "${dn#/}" != "$dn" ]; then
|
|
echo "${dn#/}"
|
|
elif [ "$dn" == "~" ]; then
|
|
echo "$suffix"
|
|
elif [ "${dn#\~/}" != "$dn" ]; then
|
|
_absdn "${dn#\~/}" "$suffix"
|
|
else
|
|
_absdn "$dn" "$searchbase"
|
|
fi
|
|
}
|
|
|
|
function pdn() {
|
|
# corriger pour *affichage* un dn *absolu*. pour la racine "", afficher
|
|
# '/'. pour $2(=$SUFFIX), afficher '~'. sinon, afficher le dn relativement à
|
|
# $2
|
|
local suffix="${2:-$SUFFIX}"
|
|
if [ -z "$1" ]; then
|
|
echo "/"
|
|
elif [ "$1" == "$suffix" ]; then
|
|
echo "~"
|
|
elif [ "${1%,$suffix}" != "$1" ]; then
|
|
echo "$(reldn "$1")"
|
|
else
|
|
echo "/$1"
|
|
fi
|
|
}
|
|
|
|
function filter_slapdconf() {
|
|
# Traiter un fichier de configuration slapd.conf en fusionnant les lignes
|
|
# qui sont découpées. Ceci permet de faire des traitements sur le contenu.
|
|
# Ce filtre s'utilisera normalement avec filter_conf, e.g.:
|
|
# <slapd.conf filter_slapdconf | filter_conf >result.conf
|
|
awk '
|
|
BEGIN { line = ""; valid = 0; }
|
|
/^[ \t]/ { line = line $0; next; }
|
|
{ if (valid) print line; line = $0; valid = 1; }
|
|
END { if (valid) print line; }
|
|
'
|
|
}
|