diff --git a/lib/ulib/ldif b/lib/ulib/ldif index 1d5c794..d122438 100644 --- a/lib/ulib/ldif +++ b/lib/ulib/ldif @@ -13,7 +13,7 @@ function def_match_attr() { return attr \":\" } function norm_attr(attr) { - return tolower(attr) + return tolower(attr) } function match_attr(attr) { attr = tolower(attr) @@ -88,7 +88,7 @@ BEGIN { } END { - if (inline) print line + if (inline) print line } ' } @@ -170,23 +170,23 @@ END { dump_ldif() } function tl_addattr() { awk ' /^dn:/ { - lastattr = "" - dn = $0 - next + lastattr = "" + dn = $0 + next } { - attr = $1 - if (attr != "") { - if (dn != "") { - print dn - print "changetype: add" - dn = "" - } - sub(/:+$/, "", attr) + attr = $1 + if (attr != "") { + if (dn != "") { + print dn + print "changetype: add" + dn = "" } - print - lastattr = attr + sub(/:+$/, "", attr) + } + print + lastattr = attr } ' } @@ -195,33 +195,33 @@ function tl_modifyattr() { local modtype="$1" awkrun modtype="$modtype" ' /^dn:/ { - lastattr = "" - dn = $0 - next + lastattr = "" + dn = $0 + next } { - attr = $1 - if (attr == "") { - if (lastattr != "") { - print "-" - } - } else { - if (dn != "") { - print dn - print "changetype: modify" - dn = "" - } - sub(/:+$/, "", attr) - if (lastattr != attr) { - if (lastattr != "") { - print "-" - } - print modtype ": " attr - } + attr = $1 + if (attr == "") { + if (lastattr != "") { + print "-" } - print - lastattr = attr + } else { + if (dn != "") { + print dn + print "changetype: modify" + dn = "" + } + sub(/:+$/, "", attr) + if (lastattr != attr) { + if (lastattr != "") { + print "-" + } + print modtype ": " attr + } + } + print + lastattr = attr } ' } @@ -229,33 +229,33 @@ function tl_modifyattr() { function tl_deleteattr() { awk ' /^dn:/ { - lastattr = "" - dn = $0 - next + lastattr = "" + dn = $0 + next } { - attr = $1 - if (attr == "") { - if (lastattr != "") { - print "-" - print - } - } else { - if (dn != "") { - print dn - print "changetype: modify" - dn = "" - } - sub(/:+$/, "", attr) - if (lastattr != attr) { - if (lastattr != "") { - print "-" - } - print "delete: " attr - } + attr = $1 + if (attr == "") { + if (lastattr != "") { + print "-" + print } - lastattr = attr + } else { + if (dn != "") { + print dn + print "changetype: modify" + dn = "" + } + sub(/:+$/, "", attr) + if (lastattr != attr) { + if (lastattr != "") { + print "-" + } + print "delete: " attr + } + } + lastattr = attr } ' } @@ -263,11 +263,11 @@ function tl_deleteattr() { function tl_deleteentry() { awk ' /^dn:/ { - dn = $0 - print dn - print "changetype: delete" - print "" - next + dn = $0 + print dn + print "changetype: delete" + print "" + next } ' } @@ -275,11 +275,11 @@ function tl_deleteentry() { function tl_touchentry() { awk ' /^dn:/ { - dn = $0 - print dn - print "changetype: modify" - print "" - next + dn = $0 + print dn + print "changetype: modify" + print "" + next } ' } @@ -288,7 +288,7 @@ function tl_keepattr() { local match_attr="$1" awk "$match_attr"' $0 == "" || match_attr($1) { - print + print } ' } @@ -447,11 +447,11 @@ add && match_attr($1) { print_values() } add && $0 == "" { - print_values() + print_values() } { print } END { - if (add) print_values() + if (add) print_values() } ' awk "$script" @@ -496,7 +496,7 @@ add && $0 == "" { } { print } END { - if (add && !found) print_values() + if (add && !found) print_values() } ' awk "$script" @@ -505,41 +505,6 @@ END { function tl_ensureval() { local attr="$1"; shift local script="$(def_match_attr "$attr") -function resetp() { - ensure = 0 - found = 0 -} -function get_attrvalue(line) { - sub(/^[^:]+::?[ ]+/, \"\", line) - return line -} -function add_to_found_values(value) { - found_values[found_count] = value - found_count++ -} -function in_found_values(value, i) { - for (i = 0; i < found_count; i++) { - if (found_values[i] == value) { - return 1 - } - } - return 0 -} -function print_ensure_values() { - for (i = 0; i < ensure_count; i++) { - print attr \" \" ensure_values[i] - } - resetp() -} -function print_missing_values( value) { - for (i = 0; i < ensure_count; i++) { - value = ensure_values[i] - if (!in_found_values(value)) { - print attr \" \" value - } - } - resetp() -} BEGIN { resetp() attr = fix_attr($(quoted_awk "$attr")) @@ -556,6 +521,55 @@ BEGIN { found_values[0] = 0 delete found_values }"' +function resetp() { + ensure = 0 + found = 0 +} +function get_attrvalue(line) { + sub(/^[^:]+::?[ ]+/, "", line) + return line +} +function add_to_found_values(value) { + found_values[found_count] = value + found_count++ +} +function in_found_values(value, i, found_value) { + if (value ~ /^{}/) { + sub(/^{}/, "", value) + for (i = 0; i < found_count; i++) { + found_value = found_values[i] + sub(/^{[0-9]+}/, "", found_value) + if (found_value == value) { + return 1 + } + } + } else { + for (i = 0; i < found_count; i++) { + if (found_values[i] == value) { + return 1 + } + } + } + return 0 +} +function print_ensure_values() { + for (i = 0; i < ensure_count; i++) { + value = ensure_values[i] + sub(/^{}/, "", value) + print attr " " value + } + resetp() +} +function print_missing_values( value) { + for (i = 0; i < ensure_count; i++) { + value = ensure_values[i] + if (!in_found_values(value)) { + sub(/^{}/, "", value) + print attr " " value + } + } + resetp() +} /^dn:/ { ensure = 1 } @@ -584,28 +598,28 @@ function tl_decode() { local match_attr="$1" awkrun -f "$match_attr"' function split_base64(text, result) { - result = "" - while (text != "") { - if (result != "") result = result "\n" - result = result substr(text, 1, 64) - text = substr(text, 65) - } - return result + result = "" + while (text != "") { + if (result != "") result = result "\n" + result = result substr(text, 1, 64) + text = substr(text, 65) + } + return result } /^[^:]+:: / && match_attr($1) { - name = $0; sub(/::.*$/, "", name) - value = $0; sub(/^[^:]+:: /, "", value) + name = $0; sub(/::.*$/, "", name) + value = $0; sub(/^[^:]+:: /, "", value) - decoded_value = b64decode(value) - #cmd = "echo '\''" split_base64(value) "'\'' | openssl base64 -d" - #decoded_value = "" - #while ((cmd | getline line) > 0) { - # decoded_value = decoded_value line - #} - #close(cmd) - print name ": " decoded_value - next + decoded_value = b64decode(value) + #cmd = "echo '\''" split_base64(value) "'\'' | openssl base64 -d" + #decoded_value = "" + #while ((cmd | getline line) > 0) { + # decoded_value = decoded_value line + #} + #close(cmd) + print name ": " decoded_value + next } { print } ' @@ -615,23 +629,23 @@ function tl_encode() { local match_attr="$1" awkrun "$match_attr"' function quote(text) { - # remplacer les quotes par le caractere echappement approprie - gsub('"/'/, \"'\\\\''\""', text) - return text + # remplacer les quotes par le caractere echappement approprie + gsub('"/'/, \"'\\\\''\""', text) + return text } /^[^:]+: / && match_attr($1) { - name = $0; sub(/:.*$/, "", name) - value = $0; sub(/^[^:]+: /, "", value) + name = $0; sub(/:.*$/, "", name) + value = $0; sub(/^[^:]+: /, "", value) - cmd = "echo '\''" quote(value) "'\'' | openssl base64" - coded_value = "" - while ((cmd | getline line) > 0) { - coded_value = coded_value line - } - close(cmd) - print name ":: " coded_value - next + cmd = "echo '\''" quote(value) "'\'' | openssl base64" + coded_value = "" + while ((cmd | getline line) > 0) { + coded_value = coded_value line + } + close(cmd) + print name ":: " coded_value + next } { print } ' @@ -1019,22 +1033,25 @@ dec, decode [ATTRS...] s'ils sont encodés en base64) enc, encode [ATTRS...] Encoder en base64 les valeurs des attributs mentionnés. -k, keepattr ATTRS... - Garder uniquement les lignes des attributs mentionnés. Ensuite, supprimer - les objets ayant uniquement la ligne dn: (en d'autres termes, keepattr sans - argument supprime *tout* le flux) -kv, keepval ATTR PATTERNS... +xe, xempty, excludeempty + Supprimer les objets sans attributs, qui ont uniquement une ligne dn: +k, keepattr [--no-xempty] ATTRS... + Garder uniquement les attributs mentionnés, puis supprimer les objets sans + attributs avec xempty, sauf si l'option --no-xempty est spécifiée (en + d'autres termes, keepattr sans argument supprime *tout* le flux) +kv, keepval [--no-xempty] ATTR PATTERNS... Pour l'attribut attr, garder uniquement les lignes pour lesquelles les valeurs correspondent aux expressions régulières. Les autres attributs ne - sont pas modifiés. Ensuite, supprimer les objets ayant uniquement la ligne - dn: -x, excludeattr ATTRS... + sont pas modifiés. Ensuite, supprimer les objets sans attributs avec xempty, + sauf si l'option --no-xempty est spécifiée +x, excludeattr [--no-xempty] ATTRS... Supprimer les lignes des attributs mentionnés. Ensuite, supprimer les objets - ayant uniquement la ligne dn: -xv, excludeval ATTR PATTERNS... + sans attributs avec xempty, sauf si l'option --no-xempty est spécifiée +xv, excludeval [--no-xempty] ATTR PATTERNS... Pour l'attribut attr, supprimer les lignes pour lesquelles les valeurs correspondent aux expressions régulières. Les autres attributs ne sont pas - modifiés. Ensuite, supprimer les objets ayant uniquement la ligne dn: + modifiés. Ensuite, supprimer les objets sans attributs avec xempty, sauf si + l'option --no-xempty est spécifiée. kve, keepvalentry ATTR PATTERNS... Pour l'attribut attr, vérifier si *au moins une* valeur correspond à l'une des expressions régulières. Si c'est le cas, garder toute l'entrée, sinon @@ -1056,6 +1073,12 @@ ev, ensureval ATTR VALUES... déjà. Par exemple, pour s'assurer que l'attribut ATTR a les valeurs V0 et V1, on ferait: ensureval ATTR V0 V1 // modaddval + Certains attributs sont ordonnés. Leurs valeurs sont étiquettées avec leur + index, e.g {2}value. Si l'on ne veut pas faire de correspondance exacte, + c'est à dire tester uniquement la présence d'une valeur indépendamment de + son index, il faut utiliser la syntaxe {}value, e.g: + ensureval ATTR {}value // modaddval + S'il faut ajouter les valeurs, elle sont mentionnées sans le préfixe {} sed ARGS awk ARGS grep ARGS @@ -1281,23 +1304,24 @@ function get_transform_cmd() { ;; dec|decode) cmdparts=(tl_decode "$(def_match_attr "$@")");; enc|encode) cmdparts=(tl_encode "$(def_match_attr "$@")");; + xe|xempty|excludeempty) cmdparts=(ensure_complete_objects);; k|keep|keepattr) + [ "$1" == --no-xempty ] && shift || xempty=1 cmdparts=(tl_keepattr "$(def_match_attr dn "$@")") - xempty=1 ;; K|kv|keepval) + [ "$1" == --no-xempty ] && shift || xempty=1 local match_attr="$(def_match_attr "$1")"; shift cmdparts=(tl_keepval "$match_attr" "$(def_match_value "$@")") - xempty=1 ;; x|exclude|excludeattr) + [ "$1" == --no-xempty ] && shift || xempty=1 cmdparts=(tl_excludeattr "$(def_match_attr "$@")") - xempty=1 ;; dv|delval|X|xv|excludeval) + [ "$1" == --no-xempty ] && shift || xempty=1 local match_attr="$(def_match_attr "$1")"; shift cmdparts=(tl_excludeval "$match_attr" "$(def_match_value "$@")") - xempty=1 ;; xve|excludevalentry) local match_attr="$(def_match_attr "$1")"; shift @@ -1312,21 +1336,10 @@ function get_transform_cmd() { sv|setval|rv|replval) local match_attr="$(def_match_attr "$1")"; shift cmdparts=(tl_replval "$match_attr" "$@") - xempty=1 ;; - av|addval) - cmdparts=(tl_addval "$@") - xempty=1 - ;; - fv|defval) - cmdparts=(tl_defval "$@") - xempty=1 - ;; - ev|ensureval) - cmdparts=(tl_ensureval "$@") - xempty=1 - ;; - xe|xempty|excludeempty) cmdparts=(ensure_complete_objects);; + av|addval) cmdparts=(tl_addval "$@");; + fv|defval) cmdparts=(tl_defval "$@");; + ev|ensureval) cmdparts=(tl_ensureval "$@");; sed|awk|grep|sort) cmdparts=(LANG=C "$cmd" "$@");; csed|cawk|cgrep|csort) cmdparts=(LANG=C "${cmd#c}" "$@");; lsed|lawk|lgrep|lsort) cmdparts=("${cmd#l}" "$@");;