diff --git a/ulib/ldif b/ulib/ldif index a7f4e19..20e2976 100644 --- a/ulib/ldif +++ b/ulib/ldif @@ -686,7 +686,7 @@ function tl_formatcsv() { function tl_parsecsv() { local -a args headers - local basedn= rdnattr=uid skip_lines=0 parse_headers= vsep=';' + local basedn= rdnattr= skip_lines=0 parse_headers= vsep=';' if parse_opts \ -u:,--rdnattr: rdnattr= \ -s:,--skip-lines: skip_lines= \ @@ -699,6 +699,11 @@ function tl_parsecsv() { return 1 fi basedn="$1"; shift + if [ -n "$basedn" ]; then + [ -n "$rdnattr" ] || rdnattr=uid + else + [ -n "$rdnattr" ] || rdnattr=dn + fi [ -n "$*" ] && headers=("$@") [ -n "${headers[*]}" ] || parse_headers=1 @@ -717,12 +722,19 @@ parse_headers { array_parsecsv(attrs, $0) rdnindex = key_index(rdnattr, headers) rdnvalue = attrs[rdnindex] - print "dn: " rdnattr "=" rdnvalue "," basedn + if (basedn != "") { + print "dn: " rdnattr "=" rdnvalue "," basedn + } else { + print "dn: " rdnvalue + } nbheaders = length(headers) for (i = 1; i <= nbheaders; i++) { attr = attrs[i] split(attr, values, vsep) attr = headers[i] + if (basedn == "" && attr == rdnattr) { + continue # ne pas écrire deux fois le même attribut + } for (j = 1; j <= length(values); j++) { print attr ": " values[j] } @@ -734,7 +746,7 @@ parse_headers { function tl_parsecsvmod() { local -a args headers - local basedn= rdnattr=uid skip_lines=0 parse_headers= vsep=';' + local basedn= rdnattr= skip_lines=0 parse_headers= vsep=';' if parse_opts \ -u:,--rdnattr: rdnattr= \ -s:,--skip-lines: skip_lines= \ @@ -747,6 +759,11 @@ function tl_parsecsvmod() { return 1 fi basedn="$1"; shift + if [ -n "$basedn" ]; then + [ -n "$rdnattr" ] || rdnattr=uid + else + [ -n "$rdnattr" ] || rdnattr=dn + fi [ -n "$*" ] && headers=("$@") [ -n "${headers[*]}" ] || parse_headers=1 @@ -765,33 +782,48 @@ parse_headers { array_parsecsv(attrvalues, $0) rdnindex = key_index(rdnattr, headers) rdnvalue = attrvalues[rdnindex] - printdn = 1 nbheaders = length(headers) + # déterminer d"abord s"il faut écrire l"objet + printobj = 0 for (i = 1; i <= nbheaders; i++) { attr = headers[i] if (attr == rdnattr) continue attrvalue = attrvalues[i] - if (attrvalue == "") { - continue - } else if (attrvalue ~ /^(replace|add|delete):/) { - changetype = attrvalue - sub(/:.*/, "", changetype) - attrvalue = substr(attrvalue, length(changetype) + 2) + if (attrvalue == "") continue + # ok on doit ecrire le dn + if (basedn != "") { + print "dn: " rdnattr "=" rdnvalue "," basedn } else { - changetype = "replace" + print "dn: " rdnvalue } - if (printdn) { - print "dn: " rdnattr "=" rdnvalue "," basedn "\nchangetype: modify" - printdn = 0 - } - print changetype ": " attr - split(attrvalue, values, vsep) - for (j = 1; j <= length(values); j++) { - print attr ": " values[j] - } - print "-" + print "changetype: modify" + printobj = 1 + break + } + # maintenant, écrire l"objet le cas échéant + if (printobj) { + for (i = 1; i <= nbheaders; i++) { + attr = headers[i] + if (attr == rdnattr) continue + attrvalue = attrvalues[i] + if (attrvalue == "") { + continue + } else if (attrvalue ~ /^(replace|add|delete):/) { + changetype = attrvalue + sub(/:.*/, "", changetype) + attrvalue = substr(attrvalue, length(changetype) + 2) + } else { + changetype = "replace" + } + print changetype ": " attr + split(attrvalue, values, vsep) + for (j = 1; j <= length(values); j++) { + print attr ": " values[j] + } + print "-" + } + print "" } - if (!printdn) print "" } ' } @@ -913,6 +945,11 @@ 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=='' + est aussi supporté, auquel cas la valeur par défaut de rdnattr n'est plus + 'uid' mais 'dn' + basedn DN de base des objets à construire -u, --rdnattr rdnattr[=uid] @@ -934,6 +971,11 @@ parsecsvmod [options] basedn [attrs...] 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 + 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 DN de base des objets à construire -u, --rdnattr rdnattr[=uid]