##@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 '/(^|,)dc=[^,]+/ { 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 '/(^|,)dc=[^,]+/ { print }')" [ -n "$suffix" ] || suffix="$suffixes" <<<"$suffix" head -n1 } function reldn() { local suffix="${2:-$SUFFIX}" # exprimer le dn $1 relativement au suffixe $2(=$SUFFIX) if [ -z "$suffix" ]; then echo "$1" elif [ -z "$1" -o "$1" == "$suffix" ]; then echo "" elif [ "${1%,$suffix}" != "$1" ]; then # absolu, enlever $suffix echo "${1%,$suffix}" else # relatif echo "$1" fi } function _absdn() { local suffix="$2" # obtenir le dn absolu correspondant au dn $1, le dn de base étant $2 if [ -z "$suffix" ]; then echo "$1" elif [ -z "$1" -o "$1" == "$suffix" ]; then echo "$suffix" elif [ "${1%,$suffix}" != "$1" ]; then # absolu echo "$1" else # relatif, ajouter $suffix echo "$1,$suffix" 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 [ "$1" == "$2" -o "${1%,$2}" != "$1" ] } 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.: # 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; } ' }