246 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			246 lines
		
	
	
		
			7.2 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 '/(^|,)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.:
 | 
						|
    #     <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; }
 | 
						|
'
 | 
						|
}
 |