summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMantas Mikulėnas <grawity@gmail.com>2024-01-04 10:39:34 +0200
committerMantas Mikulėnas <grawity@gmail.com>2024-01-04 10:39:34 +0200
commitad18da0591ceef9cd58906944dcd97b3fcd17e10 (patch)
tree39e577a5581e9d45f795f6ecb226985b436cbcd6
parent1393daa4415d6db209fa0d69fab9232030bbb9e7 (diff)
add ldifls
-rwxr-xr-xldifls42
1 files changed, 42 insertions, 0 deletions
diff --git a/ldifls b/ldifls
new file mode 100755
index 0000000..8dca4f4
--- /dev/null
+++ b/ldifls
@@ -0,0 +1,42 @@
+#!/usr/bin/env perl
+# ldifls -- convert LDIF output to a plain list of DNs
+use v5.10;
+use Getopt::Long qw(:config bundling no_ignore_case);
+use Net::LDAP::LDIF;
+use Net::LDAP::Util qw(escape_dn_value ldap_explode_dn);
+
+sub usage {
+ print "$_\n" for
+ "Usage: ldapsearch -LLL | ldifls [-s SEP] [-S SEP]",
+ "", #
+ " -s, --rdn-separator SEP Separator between DN elements (RDNs)",
+ " -S, --attr-separator SEP Separator between RDN attributes (default '+')",
+ ;
+}
+
+my $rdn_sep = undef;
+my $attr_sep = "+";
+
+GetOptions(
+ "help" => sub { usage(); exit; },
+ "s|rdn-separator=s" => \$rdn_sep,
+ "S|attr-separator=s" => \$attr_sep,
+) or exit(2);
+
+my $ldif = Net::LDAP::LDIF->new(\*STDIN);
+
+while (!$ldif->eof) {
+ my $e = $ldif->read_entry();
+ my $dn = $e->dn;
+ if (defined $rdn_sep) {
+ my @dn = @{ldap_explode_dn($dn, casefold => "none")};
+ @dn = map {
+ my $rdn = $_;
+ join($attr_sep, map {
+ $_."=".escape_dn_value($rdn->{$_})
+ } keys %$_)
+ } @dn;
+ $dn = join($rdn_sep, @dn);
+ }
+ print "$dn\n";
+}