Listing 1. A data-loading LDAP client.
1   #!/usr/bin/perl --
2   # Script to transform tab delimited address data into LDAP.
3
4
5
6   use Net::LDAP;
7   use strict;
8
9   my $infile = $ARGV[0] || "addresses.txt";
10
11  my $conn = Net::LDAP->new("ldap.daisypark.net") or # Replace with your LDAP server
12    die "ERROR: Can't connect: $@";
13
14  # make a authenticated connection
15  $conn->bind( dn => 'cn=Manager, dc=daisypark, dc=net',
16              password => 'secret',
17            );
18
19  my $progress = 1;
20  $|++;
21  while ( my $rec = get_next_record($infile) ) {
22
23      next unless "$rec->{FirstName}$rec->{LastName}";
24
25      my $result = $conn->add(
26        dn => "cn=$rec->{FirstName} $rec->{LastName}, dc=daisypark, dc=net",
27
28        attr => [
29             cn	=> "$rec->{FirstName} $rec->{LastName}",
30 
31             sn	=> $rec->{LastName},
32             mail	=> $rec->{EmailAddress},
33             telephoneNumber	=> $rec->{HomePhone},
34             street	=> $rec->{Address},
35             postalCode	=> $rec->{PostalCode},
36             st	=> $rec->{StateOrProvince},
37             l	=> $rec->{StateOrProvince},
38             c	=> 'US',
39             objectclass	=> [ 'top', 'person', 
40                                  'organizationalPerson', 'inetOrgPerson',
41                                ],
42               ],
43      );
44
45      if ( $result->code ) {
46          warn "WARN: Failed to add entry: $rec->{FirstName}, $rec->{LastName}: ",
47          sprintf "%x", $result->code;
48      }
49
50      printf "seen: %d\r", $progress++;
51  }
52
53  print "\nClosing LDAP connection\n";
54  $conn->unbind;
55  print "done\n";
56
57  #------
58  # Subroutines
59  #------
60  # get_next_record() opens the tab-delimited file, returning successive
61  # hashref records, one per entry.
62  {
63    my ($seen, @headers); # persistent variables
64    sub get_next_record {
65        my $file = shift || return;
66
67        unless ( $seen ) {
68            open F, $file or die "ERROR: Can't open $file: $!";
69            @headers   = split "\t", scalar ;
70            $seen = 1;
71        }
72
73        my $line;
74        unless ( defined ($line = <F>) ) {
75            close F;
76            return;
77        }
78
79        until ( $line ) {
80            chomp $line;
81            $line =~ s/\s*$//;
82        }
83
84        my $record = {};
85
86        @$record{ @headers } = (split "\t", $line);
87
88        return $record;
89    }
90  }