diff --git a/lib/ulib/.ulibver b/lib/ulib/.ulibver index cf07fe1..7532e0c 100644 --- a/lib/ulib/.ulibver +++ b/lib/ulib/.ulibver @@ -1 +1 @@ -007018000 +007019000 diff --git a/lib/ulib/ldif b/lib/ulib/ldif index 380fbe2..7d9a1c7 100644 --- a/lib/ulib/ldif +++ b/lib/ulib/ldif @@ -457,6 +457,51 @@ END { awk "$script" } +function tl_defval() { + local attr="$1"; shift + local script="$(def_match_attr "$attr") +function resetp() { + add = 0 + found = 0 +} +function print_values() { + for (i = 0; i < count; i++) { + print attr \" \" values[i] + } + resetp() +} +BEGIN { + add = 0 + found = 0 + attr = fix_attr($(quoted_awk "$attr")) + count = $#" + local i value + let i=0 + for value in "$@"; do + script="$script +values[$i] = $(quoted_awk "$value")" + let i=$i+1 + done + script="$script +}"' +/^dn:/ { + add = 1 +} +add && match_attr($1) { + found = 1 +} +add && $0 == "" { + if (!found) print_values() + resetp() +} +{ print } +END { + if (add && !found) print_values() +} +' + awk "$script" +} + function tl_decode() { local match_attr="$1" awkrun -f "$match_attr"' @@ -853,45 +898,48 @@ u, uncut c, cut Couper les lignes trop longues. Il n'est pas conseillé d'appliquer des méthodes de transformation après avoir utilisé cette action. -dec, decode [attrs...] +dec, decode [ATTRS...] Décoder les valeurs des attributs mentionnés si nécessaire (c'est à dire s'ils sont encodés en base64) -enc, encode [attrs...] +enc, encode [ATTRS...] Encoder en base64 les valeurs des attributs mentionnés. -k, keepattr attrs... +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... +kv, keepval 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... +x, excludeattr ATTRS... Supprimer les lignes des attributs mentionnés. Ensuite, supprimer les objets ayant uniquement la ligne dn: -xv, excludeval attr patterns... +xv, excludeval 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: -kve, keepvalentry attr patterns... +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 supprimer toute l'entrée. -xve, excludevalentry attr patterns... +xve, excludevalentry ATTR PATTERNS... Pour l'attribut attr, vérifier si *aucune* des valeurs ne correspond à l'une des expressions régulières. Si c'est le cas, garder toute l'entrée, sinon supprimer toute l'entrée. -rv, replval attr values... +rv, replval ATTR VALUES... Remplacer toutes les valeurs de l'attribut attr par les valeurs spécifiées. -av, addval attr values... +av, addval ATTR VALUES... Ajouter un nouvel attribut avec les valeurs spécifiées. Si l'attribut existe déjà, les nouvelles valeurs sont ajoutées à la fin. -sed args -awk args -grep args -sort [args] -awkrun [args] +dv, defval ATTR VALUES... + Ajouter un nouvel attribut avec les valeurs spécifiées, s'il n'existe pas + déjà. Si l'attribut existe déjà, cette opération est un NOP. +sed ARGS +awk ARGS +grep ARGS +sort [ARGS] +awkrun [ARGS] Traiter le flux avec respectivement les commandes sed, awk, grep, sort et awkrun. awkrun est la version 'améliorée' de awk offerte par nutools. Note: ces commandes ne tiennent pas compte de la locale: elles sont lancées @@ -899,7 +947,7 @@ awkrun [args] Note: aucun argument n'est filtré, mais il ne faudrait pas utiliser les options qui provoquent la modification en place d'un fichier, comme par exemple l'option -i de sed -format [options] attrs... +format [OPTIONS] ATTRS... Formater le flux au format ldif en données tabulaires. Chaque attribut peut être de la forme newname:oldname pour avoir des en-têtes avec un nom différent des noms des attributs. L'effet est le même @@ -951,7 +999,7 @@ format [options] attrs... --ec Dans le mode -e, spécifier une commande à insérer après le dernier enregistrement -formatcsv [options] attrs... +formatcsv [OPTIONS] ATTRS... Equivalent à 'format -F , --show-headers --quote \\\"' -n, --no-headers Ne pas afficher les en-têtes. Par défaut, les en-têtes sont affichés. @@ -959,16 +1007,16 @@ formatcsv [options] attrs... --quote QUOTE --escape ESCAPE Ces options ont la même signification que pour format -parsecsv [options] basedn [attrs...] +parsecsv [OPTIONS] BASEDN [ATTRS...] Analyser le flux au format CSV (qui a par exemple été générée avec la commande formatcsv), et reconstruire les objets LDAP associés. - En principe, basedn n'est pas vide, et l'option -u détermine l'attribut dont - la valeur est utilisée pour nommer les objets. Le cas particulier basedn=='' + En principe, BASEDN n'est pas vide, et l'option -u détermine l'attribut dont + la valeur est utilisée pour nommer les objets. Le cas particulier BASEDN=='' est aussi supporté, auquel cas la valeur par défaut de rdnattr n'est plus 'uid' mais 'dn' - basedn + BASEDN DN de base des objets à construire -u, --rdnattr rdnattr[=uid] Nommer les objets avec la valeur de l'attribut spécifié @@ -981,20 +1029,20 @@ parsecsv [options] basedn [attrs...] -R VSEP Spécifier le séparateur pour les valeurs des attributs. Par défaut, il s'agit du point-virgule ';' -parsecsvmod [options] basedn [attrs...] +parsecsvmod [OPTIONS] BASEDN [ATTRS...] Analyser le flux au format CSV qui contient des ordres de modification des objets LDAP, et construire les modifications au format LDIF. - L'attribut rdnattr est le seul dont la valeur doit être au format standard. - Les valeurs des autres attributs doivent être de la forme [CHANGETYPE:]value - où CHANGETYPE peut valoir replace (par défaut), add, delete. Si une valeur - est vide, elle est ignorée - - En principe, basedn n'est pas vide, et l'option -u détermine l'attribut dont + L'attribut rdnattr (spécifié avec l'option -u) est le seul dont la valeur + doit être au format standard. Les valeurs des autres attributs doivent être + de la forme [CHANGETYPE:]value où CHANGETYPE peut valoir replace, add, ou + delete. CHANGETYPE vaut replace par défaut. Si une valeur est vide, elle est + ignorée + En principe, BASEDN n'est pas vide, et l'option -u détermine l'attribut dont la valeur est utilisée pour nommer les objets. Le cas particulier basedn=='' est aussi supporté, auquel cas la valeur par défaut de rdnattr n'est plus 'uid' mais 'dn' - basedn + BASEDN DN de base des objets à construire -u, --rdnattr rdnattr[=uid] Nommer les objets avec la valeur de l'attribut spécifié @@ -1007,35 +1055,35 @@ parsecsvmod [options] basedn [attrs...] -R VSEP Spécifier le séparateur pour les valeurs des attributs. Par défaut, il s'agit du point-virgule ';' -awkcsv [options] [attrs...] +awkcsv [OPTIONS] [ATTRS...] $(sed 's/^/ /g' <<<"$__AWKCSV_HELP") -mergecsv [options] left right -k field +mergecsv [OPTIONS] LEFT RIGHT -k FIELD $(sed 's/^/ /g' <<<"$__MERGECSV_HELP") -sortcsv [options] input -k field +sortcsv [OPTIONS] INPUT -k FIELD $(sed 's/^/ /g' <<<"$__SORTCSV_HELP") -lsed args -lawk args -lgrep args -lsort [args] -lawkrun [args] -lawkcsv [options] [attrs...] -lmergecsv [options] left right -k field -lsortcsv [options] input -k field +lsed ARGS +lawk ARGS +lgrep ARGS +lsort [ARGS] +lawkrun [ARGS] +lawkcsv [OPTIONS] [ATTRS...] +lmergecsv [OPTIONS] LEFT RIGHT -k FIELD +lsortcsv [OPTIONS] INPUT -k FIELD Ces commandes sont comme les commandes sans le préfixe 'l', mais elles sont lancées sans LANG=C, ce qui fait qu'elle tiennent compte de la locale. En effet, les outils de coreutils utilisent les règles de la locale pour le tri et la comparaison des chaines, et par exemple, avec LANG=fr_FR.UTF-8, la locale indique que les ponctuations doivent être ignorées pour le tri, ce qui peut poser problème. -csed args -cawk args -cgrep args -csort [args] -cawkrun [args] -cawkcsv [options] [attrs...] -cmergecsv [options] left right -k field -csortcsv [options] input -k field +csed ARGS +cawk ARGS +cgrep ARGS +csort [ARGS] +cawkrun [ARGS] +cawkcsv [OPTIONS] [ATTRS...] +cmergecsv [OPTIONS] LEFT RIGHT -k FIELD +csortcsv [OPTIONS] INPUT -k FIELD Ces commandes existent pour compatibilité. Ces commandes sont des aliases des commandes sans le préfixe 'c', et existent pour insister sur le fait qu'elles sont lancées avec LANG=C. @@ -1149,6 +1197,10 @@ function get_transform_cmd() { cmdparts=(tl_addval "$@") xempty=1 ;; + dv|defval) + cmdparts=(tl_defval "$@") + xempty=1 + ;; xe|xempty|excludeempty) cmdparts=(ensure_complete_objects);; sed|awk|grep|sort) cmdparts=(LANG=C "$cmd" "$@");; csed|cawk|cgrep|csort) cmdparts=(LANG=C "${cmd#c}" "$@");;