YoLinux LDAP Tutorial: Support scripts and software tools for OpenLDAP directories


A few software tools I wrote to help out:

Note that I like to use ".csv" formats. These are "Comma Separated Variables" in a file with the extension ".csv". These can be read by all spreadsheets, word processors and many SQL databases to load a table. If a field contains a comma, then the field is encapsulated in quotes. Each line/record should have the same number of commas. An empty field is NOT represented by a blank but by an empty field.

  • Empty field: ,,
  • Field containing a single blank character: , ,
  • A field which contains a comma: ,"123 Cresent St., Unit A",

Note that the code you write will have to support the database schema and attributes you choose.

Related YoLinux Tutorials:

°LDAP server configuration

°LDAP client authentication

°LDAP bind authentication

°Extending LDAP an schema

°LDAP schema for MS/Outlook

°AWebDap: LDAP web interface

°YoLinux Tutorials Index




Free Information Technology Magazines and Document Downloads
TradePub link image


   

    Bookmark and Share


Advertisements




LDAP database dump to CSV:

Script to dump the LDAP database into CSV (Comma Separated Variables) format:

If you wish to allow others access to the entire database in a form that other programs such as spread sheets and databases can easily read, dump the LDAP database to a CSV format.

#!/bin/sh
#
# Dump LDAP database
/usr/sbin/ldbmcat -n /var/lib/ldap/stooges/id2entry.gdbm > /home/dbdumps/stooges-`date +%m%d%y`.ldif
sleep 10
#
# Convert ldif format to csv
/bin/awk -F ': ' -f /opt/bin/ldif2csv-StoogesDumpAll.awk < /home/dbdumps/stooges-`date +%m%d%y`.ldif > /home/dbdumps/StoogesDatabaseAll-`date +%m%d%y`.csv

File: ldif2csv-StoogesDumpAll.awk

# File: ldif2csv-StoogesDumpAll.awk
# Create csv dump for whole database
#
BEGIN {
last = ""
first = ""
name = ""
address = ""
loc = ""
state = ""
postalcode = ""
homephone = ""
telephonenumber = ""
mail = ""
mobile = ""
printf(" last,first,full name,address1,address2,city,state,postalcode,home#,work#,e-mail,phone3\n");
}
/^sn: / {last=$2}
/^givenName: / {first=$2}
/^cn: / {name=$2}
/^street: / {address=$2}
/^l: / {loc=$2}
/^st: / {state=$2}
/^postalCode: / {postalcode=$2}
/^homePhone: / {homephone=$2}
/^telephoneNumber: / {telephonenumber=$2}
/^mail: / {mail=$2}
/^mobile: / {mobile=$2}
/^dn/ {
if(last != "" && first != "" && last != "StoogeAdmin") printf("%s,%s,%s,%s,,%s,%s,%s,%s,%s,%s,%s\n",last,first,name,address,loc,state,postalcode,homephone,telephonenumber,mail,mobile)
last = ""
first = ""
name = ""
address = ""
loc = ""
state = ""
postalcode = ""
homephone = ""
telephonenumber = ""
mail = ""
mobile = ""
}
# Capture last dn
END {
if(last != "" && first != "" && last != "StoogeAdmin") printf("%s,%s,%s,%s,,%s,%s,%s,%s,%s,%s,%s\n",last,first,name,address,loc,state,postalcode,homephone,telephonenumber,mail,mobile)
}


CSV to LDAP LDIF format:

File: csvDump2ldif.c

/* File:  csvDump2ldif.c
Author: Greg Ippolito
Version: 1.0

Useage: csvDump2ldf < inputfile.csv > outfile.ldif

Load into LDAP:
ldapadd -f stooges.ldif -cxv -D "cn=StoogeAdmin,o=stooges" -W

*/

#include <stdio.h>
#include <string.h>

#define MAX_NUMBER_OF_FIELDS 17
#define MAX_FIELD_LENGTH 132
#define TOTAL_SIZE (MAX_FIELD_LENGTH * MAX_NUMBER_OF_FIELDS)
#define SERVER_ROOT "o=stooges"

int main(int argv, char *argc[])
{
int i, c;
int ifield; /* Field count */
int iline=0; /* Line count */
int ignoreCommaFlag = 0;
char field[MAX_NUMBER_OF_FIELDS][MAX_FIELD_LENGTH]; /* 17 fields */
char *server_root = SERVER_ROOT;
int ii, kk, fComma;

for( ii=1910; ii<2100; ii++ )
{
printf("dn: ou=%d,o=stooges\n",ii);
printf("ou: %d\n",ii);
printf("objectclass: top\n");
printf("objectclass: organizationalUnit\n");
printf("\n");
}

bzero((char *)field, (size_t) TOTAL_SIZE);

i = 0;
ifield = 0;
fComma = 0;

while ((c = getchar()) != EOF)
{
if( c == '"' && ignoreCommaFlag ) ignoreCommaFlag = 0;
else if( c == '"' && !ignoreCommaFlag ) ignoreCommaFlag = 1;
else if( c == ',' && ignoreCommaFlag )
{
field[ifield][i] = ' ';
i++;
}
else if( c == ',' && !ignoreCommaFlag )
{
fComma = 1; /* Set comma flag */
field[ifield][i] = '\0'; /* NULL terminate */
i = 0;
ifield++;
/* Found line with bogus number of fields. Keep repeating last field.*/
if( ifield == MAX_NUMBER_OF_FIELDS ) ifield--;
}
else if( c == '\n' )
{ /* First field number begins count at 0 */
iline++;
field[ifield][i] = '\0'; /* NULL terminate */
fComma = 0; /* Set comma flag */

if( field[2][0] == '\0' )
fprintf(stderr,"Error line %d: Blank field 3 - no cn\n", iline);
else
{
printf("dn: cn=%s,ou=%s,%s\n",field[2],field[11],server_root);
printf("cn: %s\n", field[2]);
printf("objectClass: top\n");
printf("objectClass: person\n");
printf("objectClass: organizationalPerson\n");
printf("objectClass: inetOrgPerson\n");
printf("givenname: %s\n", field[1]);
printf("sn: %s\n", field[0]);
if( field[11][0] != '\0')
printf("ou: %s\n", field[11]); /* Department=organizational unit */
if( field[12][0] != '\0' ) printf("mail: %s\n", field[12]) ;
printf("employeetype: A\n");
if( field[3][0] != 0 && field[4][0] != 0)
printf("streetAddress: %s %s\n", field[3], field[4]);
else if( field[3][0] != 0 && field[4][0] == 0)
printf("streetAddress: %s\n", field[3]);
else if( field[3][0] == 0 && field[4][0] != 0)
printf("streetAddress: %s\n", field[4]);
if( field[5][0] != '\0') printf("l: %s\n",field[5]);
if( field[6][0] != '\0') printf("st: %s\n", field[6]);
if( field[7][0] != '\0') printf("postalCode: %s\n", field[7]);
if( field[10][0] != '\0') printf("telephoneNumber: %s\n", field[10]);
if( field[9][0] != '\0') printf("homePhone: %s\n", field[9]);
if( field[13][0] != '\0') printf("mobile: %s\n", field[13]);
if( field[11][0] != '\0')
printf("departmentNumber: %s\n", field[11]);

printf("\n");

/* Clear variables */
bzero((char *)field, (size_t) TOTAL_SIZE);
}

i = 0;
ifield = 0;
}
else
{
//if( i==0 && c==' ' )
field[ifield][i] = c;
i++;
fComma = 0; /* Set comma flag */
}

}

}


LDAP LDIF file dump to CSV:

File: ldif2csv.cpp

// ldif2csv.cpp
// Greg Ippolito

// ldif2csv < file.ldif > file.csv

#include <string>
#include <algorithm>
#include <vector>
#include <cctype>
#include <iostream.h>
#include <fstream.h>

main()
{
const string sDelim(":");
string sLine, sValue;
string::size_type posBeginIdx, posEndIdx;
string::size_type ipos;
string::size_type ilength;
string sKeyWord;
string cn,givenname,sn,streetaddress,l,st,postalcode;
string mail,homephone,telephonenumber,mobile;

cout << " last,first,full name,address1,address2,city,state,postalcode,country,home#,work#,year,e-mail,phone3" << endl;

while( getline(std::cin, sLine) )
{
if( sLine.empty() ); // Ignore empty lines
else
{
ipos = 0;
posEndIdx = sLine.find_first_of( sDelim );
sKeyWord = sLine.substr( ipos, posEndIdx ); // Extract word
posBeginIdx = posEndIdx + 2; // Beginning of next word (after ': ')

if( !sKeyWord.compare( "cn" ) ) cn = sLine.substr(posBeginIdx);
if( !sKeyWord.compare( "givenname" ) ) givenname = sLine.substr(posBeginIdx);
if( !sKeyWord.compare( "sn" ) ) sn = sLine.substr(posBeginIdx);
if( !sKeyWord.compare( "streetaddress" ) ) streetaddress = sLine.substr(posBeginIdx);
if( !sKeyWord.compare( "l" ) ) l = sLine.substr(posBeginIdx);
if( !sKeyWord.compare( "st" ) ) st = sLine.substr(posBeginIdx);
if( !sKeyWord.compare( "postalcode" ) ) postalcode = sLine.substr(posBeginIdx);
if( !sKeyWord.compare( "mail" ) ) mail = sLine.substr(posBeginIdx);
if( !sKeyWord.compare( "homephone" ) ) homephone = sLine.substr(posBeginIdx);
if( !sKeyWord.compare( "telephonenumber" ) ) telephonenumber = sLine.substr(posBeginIdx);
if( !sKeyWord.compare( "mobile" ) ) mobile = sLine.substr(posBeginIdx);

if( !sKeyWord.compare( "dn" ) && cn.compare("StoogeAdmin")
&& !givenname.empty() && !sn.empty() )
{
if(index(cn.c_str(),',' ) )
{
cn="\""+cn;
cn.append("\"");
}
if(index(sn.c_str(),',' ) )
{
sn="\""+sn;
sn.append("\"");
}
if(index(givenname.c_str(),',' ) )
{
givenname="\""+givenname;
givenname.append("\"");
}
if(index(mail.c_str(),',' ) )
{
mail="\""+mail;
mail.append("\"");
}
}
if(index(streetaddress.c_str(),',' ) )
{
streetaddress="\""+streetaddress;
streetaddress.append("\"");
}
if(index(telephonenumber.c_str(),',' ) )
{
telephonenumber="\""+telephonenumber;
telephonenumber.append("\"");
}
if(index(homephone.c_str(),',' ) )
{
homephone="\""+homephone;
homephone.append("\"");
}
if(index(mobile.c_str(),',' ) )
{
mobile="\""+mobile;
mobile.append("\"");
}
cout << sn << "," << givenname << "," << cn << "," ;
cout << streetaddress << ",," << l << "," << st << "," ;
cout << postalcode << "," << homephone << "," ;
cout << telephonenumber << ",";
cout << endl;
cn.erase();
givenname.erase();
sn.erase();
streetaddress.erase();
l.erase();
st.erase();
postalcode.erase();
mail.erase();
homephone.erase();
telephonenumber.erase();
mobile.erase();
}
}

}

}

Return to YoLinux LDAP Tutorial

Copyright © 2000, 2001 by Greg Ippolito