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.
# retourner 1 si la valeur n'a pas pu être obtenue
local suffix
suffix="$(get_suffixes "$1" | awk '/(^|,)dc=[^,]+/ { print }')" || return 1
suffix="$(get_suffixes "$1" | awk '/(^|,)[dD][cC]=[^,]+/ { print }')" || return 1
<<<"$suffix" head -n1
}
@ -140,22 +140,23 @@ function get_suffix() {
# 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 }')"
suffix="$(<<<"$suffixes" awk '/(^|,)[dD][cC]=[^,]+/ { print }')"
[ -n "$suffix" ] || suffix="$suffixes"
<<<"$suffix" head -n1
}
function reldn() {
local suffix="${2:-$SUFFIX}"
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 "$1" -o "$1" == "$suffix" ]; then
elif [ -z "$dn" -o "$dn" == "$suffix" ]; then
echo ""
elif [ "${1%,$suffix}" != "$1" ]; then
elif [ "${dn%,$suffix}" != "$dn" ]; then
# absolu, enlever $suffix
echo "${1%,$suffix}"
echo "${1:$((${#dn} - ${#suffix}))}"
else
# relatif
echo "$1"
@ -163,19 +164,20 @@ function reldn() {
}
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
if [ -z "$suffix" ]; then
echo "$1"
elif [ -z "$1" -o "$1" == "$suffix" ]; then
echo "$suffix"
elif [ "${1%,$suffix}" != "$1" ]; then
elif [ -z "$dn" -o "$dn" == "$suffix" ]; then
echo "$2"
elif [ "${dn%,$suffix}" != "$dn" ]; then
# absolu
echo "$1"
else
# relatif, ajouter $suffix
echo "$1,$suffix"
echo "$1,$2"
fi
}
@ -187,7 +189,9 @@ function absdn() {
function subof() {
# 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() {
@ -207,7 +211,7 @@ function rabsdn() {
if [ "${dn#/}" != "$dn" ]; then
echo "${dn#/}"
elif [ "$dn" == "~" ]; then
echo "$SUFFIX"
echo "$suffix"
elif [ "${dn#\~/}" != "$dn" ]; then
_absdn "${dn#\~/}" "$suffix"
else

View File

@ -274,16 +274,27 @@ function tl_deleteentry() {
function tl_modrdn() {
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
case "$2" in
k|keep|keepold|keepoldrdn) keep=1;;
esac
case "$2" in k|keep|keepold|keepoldrdn) keep=1;; esac
awkrun newrdn:str="$newrdn" newsup:str="$newsup" keep:int="$keep" '
/^dn:/ {
dn = $0
print dn
actual_newrdn = newrdn
if (actual_newrdn == "") {
actual_newrdn = $2
gsub(/,.*$/, "", actual_newrdn)
}
print
print "changetype: modrdn"
print "newrdn: " newrdn
print "newrdn: " actual_newrdn
if (keep) print "deleteoldrdn: 0"
else print "deleteoldrdn: 1"
if (newsup != "") print "newsuperior: " newsup
@ -1274,9 +1285,18 @@ D, moddelattr
Supprimer l'attribut
delentry
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
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
Forcer la réplication de l'objet en simulant une modification"
@ -1293,6 +1313,9 @@ function get_transform_cmd() {
# _T_cut_after:
# faut-il découper automatiquement les lignes *après* avoir lancé les
# 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 cmd dest first=1 xempty xdel
local auto_uncut="$_T_uncut_before"
@ -1395,7 +1418,7 @@ function get_transform_cmd() {
d|md|moddel|moddelval) cmdparts=(tl_modifyattr delete);;
D|moddelattr) cmdparts=(tl_deleteattr);;
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);;
litteral) cmdparts=("$@");;
*)