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 }