ldif et ldap: match des suffixes sans tenir compte de la casse. modrdn prend un nouvel argument SUFFIX

This commit is contained in:
Jephté Clain 2016-09-28 23:28:27 +04:00
parent 9eb566acf5
commit 5c466d8c2c
2 changed files with 48 additions and 21 deletions

View File

@ -129,7 +129,7 @@ function get_dcsuffix() {
# base de donnée non administrative. # base de donnée non administrative.
# retourner 1 si la valeur n'a pas pu être obtenue # retourner 1 si la valeur n'a pas pu être obtenue
local suffix local suffix
suffix="$(get_suffixes "$1" | awk '/(^|,)dc=[^,]+/ { print }')" || return 1 suffix="$(get_suffixes "$1" | awk '/(^|,)[dD][cC]=[^,]+/ { print }')" || return 1
<<<"$suffix" head -n1 <<<"$suffix" head -n1
} }
@ -140,22 +140,23 @@ function get_suffix() {
# retourner 1 si la valeur n'a pas pu être obtenue # retourner 1 si la valeur n'a pas pu être obtenue
local suffixes suffix local suffixes suffix
suffixes="$(get_suffixes "$1")" || return 1 suffixes="$(get_suffixes "$1")" || return 1
suffix="$(<<<"$suffixes" awk '/(^|,)dc=[^,]+/ { print }')" suffix="$(<<<"$suffixes" awk '/(^|,)[dD][cC]=[^,]+/ { print }')"
[ -n "$suffix" ] || suffix="$suffixes" [ -n "$suffix" ] || suffix="$suffixes"
<<<"$suffix" head -n1 <<<"$suffix" head -n1
} }
function reldn() { function reldn() {
local suffix="${2:-$SUFFIX}" local dn="$(strlower "$1")"
local suffix="$(strlower "${2:-$SUFFIX}")"
# exprimer le dn $1 relativement au suffixe $2(=$SUFFIX) # exprimer le dn $1 relativement au suffixe $2(=$SUFFIX)
if [ -z "$suffix" ]; then if [ -z "$suffix" ]; then
echo "$1" echo "$1"
elif [ -z "$1" -o "$1" == "$suffix" ]; then elif [ -z "$dn" -o "$dn" == "$suffix" ]; then
echo "" echo ""
elif [ "${1%,$suffix}" != "$1" ]; then elif [ "${dn%,$suffix}" != "$dn" ]; then
# absolu, enlever $suffix # absolu, enlever $suffix
echo "${1%,$suffix}" echo "${1:$((${#dn} - ${#suffix}))}"
else else
# relatif # relatif
echo "$1" echo "$1"
@ -163,19 +164,20 @@ function reldn() {
} }
function _absdn() { function _absdn() {
local suffix="$2" local dn="$(strlower "$1")"
local suffix="$(strlower "$2")"
# obtenir le dn absolu correspondant au dn $1, le dn de base étant $2 # obtenir le dn absolu correspondant au dn $1, le dn de base étant $2
if [ -z "$suffix" ]; then if [ -z "$suffix" ]; then
echo "$1" echo "$1"
elif [ -z "$1" -o "$1" == "$suffix" ]; then elif [ -z "$dn" -o "$dn" == "$suffix" ]; then
echo "$suffix" echo "$2"
elif [ "${1%,$suffix}" != "$1" ]; then elif [ "${dn%,$suffix}" != "$dn" ]; then
# absolu # absolu
echo "$1" echo "$1"
else else
# relatif, ajouter $suffix # relatif, ajouter $suffix
echo "$1,$suffix" echo "$1,$2"
fi fi
} }
@ -187,7 +189,9 @@ function absdn() {
function subof() { function subof() {
# tester si le dn absolu $1 est $2 ou un enfant de $2 # tester si le dn absolu $1 est $2 ou un enfant de $2
[ "$1" == "$2" -o "${1%,$2}" != "$1" ] local dn="$(strlower "$1")"
local par="$(strlower "$2")"
[ "$dn" == "$par" -o "${dn%,$par}" != "$dn" ]
} }
function rabsdn() { function rabsdn() {
@ -207,7 +211,7 @@ function rabsdn() {
if [ "${dn#/}" != "$dn" ]; then if [ "${dn#/}" != "$dn" ]; then
echo "${dn#/}" echo "${dn#/}"
elif [ "$dn" == "~" ]; then elif [ "$dn" == "~" ]; then
echo "$SUFFIX" echo "$suffix"
elif [ "${dn#\~/}" != "$dn" ]; then elif [ "${dn#\~/}" != "$dn" ]; then
_absdn "${dn#\~/}" "$suffix" _absdn "${dn#\~/}" "$suffix"
else else

View File

@ -274,16 +274,27 @@ function tl_deleteentry() {
function tl_modrdn() { function tl_modrdn() {
local newrdn newsup keep local newrdn newsup keep
local suffix="$(strlower "$3")"
local dn="$(strlower "$1")"
if [ "${1%,}" != "$1" ]; then
# ignorer le suffixe éventuellement fourni
set -- "${1%,}" "$2"
elif [ -n "$suffix" -a "${dn%,$suffix}" == "$dn" ]; then
# rajouter le suffixe
set -- "$1,$3" "$2"
fi
splitfsep "$1" , newrdn newsup splitfsep "$1" , newrdn newsup
case "$2" in case "$2" in k|keep|keepold|keepoldrdn) keep=1;; esac
k|keep|keepold|keepoldrdn) keep=1;;
esac
awkrun newrdn:str="$newrdn" newsup:str="$newsup" keep:int="$keep" ' awkrun newrdn:str="$newrdn" newsup:str="$newsup" keep:int="$keep" '
/^dn:/ { /^dn:/ {
dn = $0 actual_newrdn = newrdn
print dn if (actual_newrdn == "") {
actual_newrdn = $2
gsub(/,.*$/, "", actual_newrdn)
}
print
print "changetype: modrdn" print "changetype: modrdn"
print "newrdn: " newrdn print "newrdn: " actual_newrdn
if (keep) print "deleteoldrdn: 0" if (keep) print "deleteoldrdn: 0"
else print "deleteoldrdn: 1" else print "deleteoldrdn: 1"
if (newsup != "") print "newsuperior: " newsup if (newsup != "") print "newsuperior: " newsup
@ -1274,9 +1285,18 @@ D, moddelattr
Supprimer l'attribut Supprimer l'attribut
delentry delentry
Supprimer l'objet Supprimer l'objet
rename, modrdn NEWRDN[,NEWSUPERIOR] [keep[oldrdn]] rename, modrdn NEWRDN[,NEWSUPERIOR] [keep[oldrdn]] [SUFFIX]
Déplacer/renommer l'objet. L'ancienne valeur est supprimée, à moins que Déplacer/renommer l'objet. L'ancienne valeur est supprimée, à moins que
l'argument keep ne soit spécifié. l'argument keep ne soit spécifié.
Si NEWRDN est vide, alors ',NEWSUPERIOR' doit être spécifié (remarquez la
virgule avant le nouveau supérieur), et cela signifie que l'objet a le même
RDN dans la nouvelle branche.
SUFFIX est le suffixe de la base de donnée. Le DN 'NEWRDN,NEWSUPERIOR' est
exprimé relativement à SUFFIX, sauf s'il se termine par une virgule. Par
exemple, étant donné SUFFIX='dc=domain,dc=tld', les expressions suivantes
sont équivalentes:
modrdn uid=new,ou=people <=> modrdn uid=new,ou=people,dc=domain,dc=tld
modrdn uid=new,cn=config, <=> modrdn uid=new,cn=config
touchentry touchentry
Forcer la réplication de l'objet en simulant une modification" Forcer la réplication de l'objet en simulant une modification"
@ -1293,6 +1313,9 @@ function get_transform_cmd() {
# _T_cut_after: # _T_cut_after:
# faut-il découper automatiquement les lignes *après* avoir lancé les # faut-il découper automatiquement les lignes *après* avoir lancé les
# commandes. # commandes.
# _T_suffix:
# suffixe de la base de données pour les commandes qui prennent des RDN,
# e.g. modrdn
local -a cmds cmdparts local -a cmds cmdparts
local cmd dest first=1 xempty xdel local cmd dest first=1 xempty xdel
local auto_uncut="$_T_uncut_before" local auto_uncut="$_T_uncut_before"
@ -1395,7 +1418,7 @@ function get_transform_cmd() {
d|md|moddel|moddelval) cmdparts=(tl_modifyattr delete);; d|md|moddel|moddelval) cmdparts=(tl_modifyattr delete);;
D|moddelattr) cmdparts=(tl_deleteattr);; D|moddelattr) cmdparts=(tl_deleteattr);;
delentry|moddelentry) cmdparts=(tl_deleteentry);; delentry|moddelentry) cmdparts=(tl_deleteentry);;
rename|modrdn|modrename|modmodrdn) cmdparts=(tl_modrdn "$@");; rename|modrdn|modrename|modmodrdn) cmdparts=(tl_modrdn "$1" "$2" "${3:-$_T_suffix}");;
touch|touchentry|modtouchentry) cmdparts=(tl_touchentry);; touch|touchentry|modtouchentry) cmdparts=(tl_touchentry);;
litteral) cmdparts=("$@");; litteral) cmdparts=("$@");;
*) *)