#################################################### # Copy Lotus Domino entries to IBM Tivoli ldap server. # Uses "exec" to shell out to ldap client utilities rather than using ldap package. #################################################### puts "\n executing [info script]\n" # make script drive independent. set drive [lindex [file split [info script]] 0 ] puts "\n proclib = $drive/scripts/TCL/proclib" source [ file join $drive /scripts/TCL/proclib/checkFile_proc.tcl ] source [ file join $drive /scripts/TCL/proclib/smtp_proc.tcl ] source [ file join $drive /scripts/TCL/proclib/netSend_proc.tcl ] source [ file join $drive /scripts/TCL/proclib/reportHeader_proc.tcl ] ########################################### # Extract dominoPersons from Lotus ldap ########################################### proc extractDominoPersons { lotusServer } { if {[catch {exec ldapsearch -h $lotusServer -v -b "o=xxx" "objectclass=dominoPerson" uid cn sn givenname mail } r] == 0} { return $r } else { return -code error $r } } ############################################################## # Load Tivoli Ldap server with Domino Persons. # Use textutil package to parse data into appropriate format. ############################################################## proc importDominoPersons { ldapServer userid password reportFileId dominoPersons baseDN deleteFileId } { package require textutil set listed [ textutil::splitx $dominoPersons "CN=" ] # delete first element. set listed [ lreplace $listed 0 0 ] foreach dominoPerson $listed { set dominoPersonListed [ split $dominoPerson \n ] append cn cn= [ string trimleft [ lsearch -inline $dominoPersonListed {*uid*} ] "uid=" ] set sn [ lsearch -inline $dominoPersonListed {*sn=*} ] set uid [ lsearch -inline $dominoPersonListed {*uid*} ] set givenName [ lsearch -inline $dominoPersonListed {*givenname*} ] set mail [ lsearch -inline $dominoPersonListed {*mail*} ] set userPassword "userPassword=password" # set cn to the UID. #regexp {(uid=)(.*)} $uid match 1 2 #set cn "cn=$2" puts $deleteFileId "$cn\,$baseDN" flush $deleteFileId set objectclass1 top set objectclass2 person set objectclass3 organizationalPerson set objectclass4 inetOrgPerson set objectclass5 ldapPerson lappend list1 "$cn\,$baseDN" lappend list1 "objectclass=$objectclass5" lappend list1 "objectclass=$objectclass4" lappend list1 "objectclass=$objectclass3" lappend list1 "objectclass=$objectclass2" lappend list1 "objectclass=$objectclass1" lappend list1 "$cn" lappend list1 "$uid" lappend list1 "$sn" lappend list1 "$givenName" lappend list1 "$mail" lappend list1 "$userPassword" lappend ldifList $list1 unset list1 unset cn } # If the entry already exists modify instead. foreach e $ldifList { set e [ join $e \n] puts $e if { [ catch {exec ldapadd -h $ldapServer -D $userid -w $password -c << $e } r ] == 0 } { puts $r puts $reportFileId $r } else { puts $r puts "ldap modify instead" puts $reportFileId $r puts $reportFileId "ldap modify instead" catch { exec ldapmodify -h $ldapServer -D $userid -w $password -c << $e } r } } } ########################################### # Email Report ########################################### proc emailReport { reportFile reportFileId } { flush $reportFileId set computerName $::env(COMPUTERNAME) set subject "$computerName - Lotus - LDAP Replication" sendSimpleMessage youremail@xxx.com $subject $reportFile } ###################################### # Control Section ###################################### ###################################### # Set Variables ###################################### set reportFile [ file join $drive reports/ldap/lotusReplication.txt ] set deleteFile [ file join $drive reports/ldap/lotusReplicationDelete_[clock seconds].txt ] set lotusServer xxxxxxx set ldapServer yyyyyyy set userid "cn=xtxtxt" set password yourpassword puts "\nlotusServer = $lotusServer" puts "ldapServer = $ldapServer\n" puts "reportfile = $reportFile\n" puts "deleteFile = $deleteFile\n" ###################################### # Report Header. ###################################### set reportFileId [ open $reportFile w ] set deleteFileId [ open $deleteFile w ] set header "$::env(COMPUTERNAME) - Lotus LDAP Replication" set baseDN "ou=xxxx,o=yyyy,dc=com.au,c=au" reportHeader $reportFileId $header $reportFile ###################################### # Extract dominoPersons from Lotus. ###################################### if { [ catch { extractDominoPersons $lotusServer } r ] == 0 } { set dominoPersons $r } else { puts "r = $r" puts $reportFileId $r } ####################################### ## Import dominoPersons to Ldap ####################################### if { [ catch { importDominoPersons $ldapServer $userid $password $reportFileId $dominoPersons $baseDN $deleteFileId } r ] == 0 } { set continue true } else { puts $reportFileId $r } puts "Report written to $reportFile" puts $reportFileId "Report written to $reportFile" puts $reportFileId "\n#################################################################" emailReport $reportFile $reportFileId close $reportFileId ###################################### # END. ######################################