On Tue, 4 Mar 2008, Marantz, Roy wrote:
Again any help would be appreciated.
Here's a simple perl script I run on my ldap replicas to check their state. Seems to work for me, although I can't guarantee I didn't misunderstand something...
#! /usr/bin/perl
use Net::LDAP ();
my $ldap_master = Net::LDAP->new("ldap-master.csupomona.edu", timeout => 10) or do { print STDERR "Error: failed to connect to LDAP master: $@"; exit(1); };
my $ldap_slave = Net::LDAP->new("localhost", timeout => 10) or do { print STDERR "Error: failed to connect to LDAP slave: $@"; exit(1); };
my $master_csn = lookup_csn($ldap_master, 'master'); my $slave_csn = lookup_csn($ldap_slave, 'slave');
if ($master_csn ne $slave_csn) { my $prev_master_csn = $master_csn; my $prev_slave_csn = $slave_csn;
sleep 120;
$master_csn = lookup_csn($ldap_master, 'master'); $slave_csn = lookup_csn($ldap_slave, 'slave');
if ($master_csn ne $slave_csn) {
if ($prev_slave_csn ne $slave_csn) { my $master_csn_date = $master_csn; $master_csn_date =~ s/Z.*//; my $slave_csn_date = $slave_csn; $slave_csn_date =~ s/Z.*//;
if ($master_csn_date - $slave_csn_date > 1000) { print STDERR "Warning: LDAP replica out of syncronization\n"; print STDERR " master_csn = $master_csn, slave_csn = $slave_csn\n"; exit(1); } } else { print STDERR "Error: LDAP replica out of syncronization, no apparent update progress seen\n"; print STDERR " master_csn = $master_csn, slave_csn = $slave_csn\n"; exit(1); } } }
sub lookup_csn { my ($ldap, $server_name) = @_;
my $search = $ldap->search( scope => 'base', base => "dc=csupomona,dc=edu", filter => "(objectclass=*)", attrs => [ 'contextCSN' ] );
$search->code() and do { print STDERR "Error: failed to execute search on $server_name: " . $search->error() . " (" . $search->code() . ")\n"; exit(1); };
my $entry = $search->shift_entry() or do { print STDERR "Error: search on $server_name failed to find entry\n"; exit(1); };
my $csn = $entry->get_value('contextCSN'); if (!defined($csn)) { print STDERR "Error: no contextCSN attribute found in $server_name entry\n"; exit(1); }
return $csn; }