]> git.sur5r.net Git - openldap/commitdiff
ITS#5540 pieces
authorQuanah Gibson-Mount <quanah@openldap.org>
Tue, 28 Apr 2009 00:50:09 +0000 (00:50 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Tue, 28 Apr 2009 00:50:09 +0000 (00:50 +0000)
14 files changed:
CHANGES
servers/slapd/back-monitor/conn.c
servers/slapd/back-monitor/database.c
servers/slapd/back-monitor/operation.c
servers/slapd/back-monitor/rww.c
servers/slapd/back-monitor/sent.c
servers/slapd/root_dse.c
servers/slapd/schema_prep.c
tests/data/monitor1.out [new file with mode: 0644]
tests/data/monitor2.out [new file with mode: 0644]
tests/data/monitor3.out [new file with mode: 0644]
tests/data/monitor4.out [new file with mode: 0644]
tests/scripts/defines.sh
tests/scripts/test056-monitor [new file with mode: 0755]

diff --git a/CHANGES b/CHANGES
index 2e81641261388f2c3203d473943bd8fee2c74c46..ecd4a05da3d41bd241fd0f0f1b8a01f9ebe5266b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,7 @@
 OpenLDAP 2.4 Change Log
 
 OpenLDAP 2.4.17 Engineering
+       Fixed slapd normalization of updated schema attributes (ITS#5540)
 
 OpenLDAP 2.4.16 Release (2009/04/05)
        Fixed libldap GnuTLS with x509v1 CA certs (ITS#5992)
index 064aeb28e658cfda2902712bcea601d43cfa022d..d962a9fe4cd5be0de87998db4cbcb175908a61ec 100644 (file)
@@ -94,7 +94,7 @@ monitor_subsys_conn_init(
        } else {
                BER_BVSTR( &bv, "0" );
        }
-       attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, &bv );
+       attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, NULL );
        
        mp = monitor_entrypriv_create();
        if ( mp == NULL ) {
@@ -133,7 +133,7 @@ monitor_subsys_conn_init(
        }
        
        BER_BVSTR( &bv, "-1" );
-       attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, &bv );
+       attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, NULL );
        
        mp = monitor_entrypriv_create();
        if ( mp == NULL ) {
@@ -172,7 +172,7 @@ monitor_subsys_conn_init(
        }
        
        BER_BVSTR( &bv, "0" );
-       attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, &bv );
+       attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, NULL );
        
        mp = monitor_entrypriv_create();
        if ( mp == NULL ) {
@@ -398,7 +398,7 @@ conn_create(
        attr_merge_one( e, mi->mi_ad_monitorConnectionNumber, &bv, NULL );
 
        bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", (long) c->c_protocol );
-       attr_merge_one( e, mi->mi_ad_monitorConnectionProtocol, &bv, NULL );
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionProtocol, &bv, NULL );
 
        bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", c->c_n_ops_received );
        attr_merge_one( e, mi->mi_ad_monitorConnectionOpsReceived, &bv, NULL );
@@ -428,31 +428,31 @@ conn_create(
                        LDAP_STAILQ_EMPTY( &c->c_pending_ops ) ? "" : "p",
                        connection_state2str( c->c_conn_state ),
                        c->c_sasl_bind_in_progress ? "S" : "" );
-       attr_merge_one( e, mi->mi_ad_monitorConnectionMask, &bv, NULL );
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionMask, &bv, NULL );
 
        attr_merge_one( e, mi->mi_ad_monitorConnectionAuthzDN,
                &c->c_dn, &c->c_ndn );
 
        /* NOTE: client connections leave the c_peer_* fields NULL */
        assert( !BER_BVISNULL( &c->c_listener_url ) );
-       attr_merge_one( e, mi->mi_ad_monitorConnectionListener,
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionListener,
                &c->c_listener_url, NULL );
 
-       attr_merge_one( e, mi->mi_ad_monitorConnectionPeerDomain,
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionPeerDomain,
                BER_BVISNULL( &c->c_peer_domain ) ? &bv_unknown : &c->c_peer_domain,
                NULL );
 
-       attr_merge_one( e, mi->mi_ad_monitorConnectionPeerAddress,
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionPeerAddress,
                BER_BVISNULL( &c->c_peer_name ) ? &bv_unknown : &c->c_peer_name,
                NULL );
 
        assert( !BER_BVISNULL( &c->c_sock_name ) );
-       attr_merge_one( e, mi->mi_ad_monitorConnectionLocalAddress,
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionLocalAddress,
                &c->c_sock_name, NULL );
 
-       attr_merge_one( e, mi->mi_ad_monitorConnectionStartTime, &bv2, NULL );
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionStartTime, &bv2, NULL );
 
-       attr_merge_one( e, mi->mi_ad_monitorConnectionActivityTime, &bv3, NULL );
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionActivityTime, &bv3, NULL );
 
        mp = monitor_entrypriv_create();
        if ( mp == NULL ) {
index 3b43f16c29249f28ce10b9e8875e7a17cd2be950..eb75a340f08eff109d0ec119c264fed33f0c14e2 100644 (file)
@@ -66,7 +66,7 @@ init_readOnly( monitor_info_t *mi, Entry *e, slap_mask_t restrictops )
        struct berval   *tf = ( ( restrictops & SLAP_RESTRICT_OP_MASK ) == SLAP_RESTRICT_OP_WRITES ) ?
                (struct berval *)&slap_true_bv : (struct berval *)&slap_false_bv;
 
-       return attr_merge_one( e, mi->mi_ad_readOnly, tf, tf );
+       return attr_merge_one( e, mi->mi_ad_readOnly, tf, NULL );
 }
 
 static int
@@ -162,9 +162,9 @@ monitor_subsys_database_init_one(
                                rdnval, 0, 0 );
                } else {
                        attr_merge( e, slap_schema.si_ad_namingContexts,
-                               be->be_suffix, be->be_nsuffix );
+                               be->be_suffix, NULL );
                        attr_merge( e_database, slap_schema.si_ad_namingContexts,
-                               be->be_suffix, be->be_nsuffix );
+                               be->be_suffix, NULL );
                }
        }
 
@@ -301,7 +301,7 @@ monitor_subsys_database_init_one(
 
                        } else {
                                attr_merge( e_overlay, slap_schema.si_ad_namingContexts,
-                                               be->be_suffix, be->be_nsuffix );
+                                               be->be_suffix, NULL );
                        }
 
                        mp_overlay = monitor_entrypriv_create();
@@ -405,9 +405,15 @@ monitor_back_register_database(
                if ( a ) {
                        int             j, k;
 
-                       for ( j = 0; !BER_BVISNULL( &a->a_nvals[ j ] ); j++ ) {
-                               for ( k = 0; !BER_BVISNULL( &be->be_nsuffix[ k ] ); k++ ) {
-                                       if ( dn_match( &a->a_nvals[ j ], &be->be_nsuffix[ k ] ) ) {
+                       /* FIXME: RFC 4512 defines namingContexts without an
+                        *        equality matching rule, making comparisons
+                        *        like this one tricky.  We use a_vals and
+                        *        be_suffix instead for now.
+                        */
+                       for ( j = 0; !BER_BVISNULL( &a->a_vals[ j ] ); j++ ) {
+                               for ( k = 0; !BER_BVISNULL( &be->be_suffix[ k ] ); k++ ) {
+                                       if ( dn_match( &a->a_vals[ j ],
+                                                      &be->be_suffix[ k ] ) ) {
                                                rc = 0;
                                                goto done;
                                        }
index 5605183d7d2b823261ac42b2114b2048112853e6..6f07777a4b89aab1cb2a73a370bf2937adb75224 100644 (file)
@@ -86,8 +86,8 @@ monitor_subsys_ops_init(
                return( -1 );
        }
 
-       attr_merge_one( e_op, mi->mi_ad_monitorOpInitiated, &bv_zero, &bv_zero );
-       attr_merge_one( e_op, mi->mi_ad_monitorOpCompleted, &bv_zero, &bv_zero );
+       attr_merge_one( e_op, mi->mi_ad_monitorOpInitiated, &bv_zero, NULL );
+       attr_merge_one( e_op, mi->mi_ad_monitorOpCompleted, &bv_zero, NULL );
 
        mp = ( monitor_entry_t * )e_op->e_private;
        mp->mp_children = NULL;
index 9cdb4058feea631690ff82ca96deef4d7010fdc1..114d534002755934487747781d9dbc5089a13330 100644 (file)
@@ -104,7 +104,7 @@ monitor_subsys_rww_init(
                ber_dupbv( &monitor_rww[ i ].nrdn, &nrdn );
        
                BER_BVSTR( &bv, "0" );
-               attr_merge_normalize_one( e, mi->mi_ad_monitorCounter, &bv, NULL );
+               attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, NULL );
        
                mp = monitor_entrypriv_create();
                if ( mp == NULL ) {
index 856920d95821be6c9b17eed053b3885c6a461673..50b526ce2e79752d12f9044208f5b851df4d8bdb 100644 (file)
@@ -110,7 +110,7 @@ monitor_subsys_sent_init(
                ber_dupbv( &monitor_sent[ i ].nrdn, &nrdn );
        
                BER_BVSTR( &bv, "0" );
-               attr_merge_normalize_one( e, mi->mi_ad_monitorCounter, &bv, NULL );
+               attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, NULL );
        
                mp = monitor_entrypriv_create();
                if ( mp == NULL ) {
index 4871006693076253dbcc968f2f66c06fce4a4117..8b7322122e6f0cb82155bf9970b410e9aa704c4c 100644 (file)
@@ -277,8 +277,7 @@ fail:
                }
                for ( j = 0; be->be_suffix[j].bv_val != NULL; j++ ) {
                        if( attr_merge_one( e, ad_namingContexts,
-                                       &be->be_suffix[j],
-                                       &be->be_nsuffix[0] ) )
+                                       &be->be_suffix[j], NULL ) )
                        {
                                goto fail;
                        }
index ebfdd5586c6baab31dd4ffd04443c8807a00aa33..040120759db672a086489a69b0c48f7ead09e271 100644 (file)
@@ -684,6 +684,7 @@ static struct slap_schema_ad_map {
                        "NAME 'monitorContext' "
                        "DESC 'monitor context' "
                        "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 "
+                       "EQUALITY distinguishedNameMatch "
                        "SINGLE-VALUE NO-USER-MODIFICATION "
                        "USAGE dSAOperation )",
                rootDseAttribute, SLAP_AT_HIDE,
@@ -694,6 +695,7 @@ static struct slap_schema_ad_map {
                        "NAME 'configContext' "
                        "DESC 'config context' "
                        "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 "
+                       "EQUALITY distinguishedNameMatch "
                        "SINGLE-VALUE NO-USER-MODIFICATION "
                        "USAGE dSAOperation )",
                rootDseAttribute, SLAP_AT_HIDE,
diff --git a/tests/data/monitor1.out b/tests/data/monitor1.out
new file mode 100644 (file)
index 0000000..8b394df
--- /dev/null
@@ -0,0 +1,31 @@
+dn: cn=Connection 1,cn=Connections,cn=Monitor
+structuralObjectClass: monitorConnection
+monitorConnectionProtocol: 3
+monitorConnectionOpsReceived: 2
+monitorConnectionOpsExecuting: 1
+monitorConnectionOpsPending: 0
+monitorConnectionOpsCompleted: 1
+monitorConnectionGet: 2
+monitorConnectionRead: 2
+monitorConnectionWrite: 0
+monitorConnectionMask: rx
+monitorConnectionListener: ldap://localhost:9011/
+monitorConnectionLocalAddress: IP=127.0.0.1:9011
+entryDN: cn=Connection 1,cn=Connections,cn=Monitor
+
+dn: cn=Connections,cn=Monitor
+structuralObjectClass: monitorContainer
+entryDN: cn=Connections,cn=Monitor
+
+dn: cn=Current,cn=Connections,cn=Monitor
+structuralObjectClass: monitorCounterObject
+entryDN: cn=Current,cn=Connections,cn=Monitor
+
+dn: cn=Max File Descriptors,cn=Connections,cn=Monitor
+structuralObjectClass: monitorCounterObject
+entryDN: cn=Max File Descriptors,cn=Connections,cn=Monitor
+
+dn: cn=Total,cn=Connections,cn=Monitor
+structuralObjectClass: monitorCounterObject
+entryDN: cn=Total,cn=Connections,cn=Monitor
+
diff --git a/tests/data/monitor2.out b/tests/data/monitor2.out
new file mode 100644 (file)
index 0000000..26e9ce9
--- /dev/null
@@ -0,0 +1,40 @@
+dn: cn=Database 0,cn=Databases,cn=Monitor
+structuralObjectClass: monitoredObject
+monitorIsShadow: FALSE
+namingContexts: cn=config
+readOnly: FALSE
+entryDN: cn=Database 0,cn=Databases,cn=Monitor
+
+dn: cn=Database 1,cn=Databases,cn=Monitor
+structuralObjectClass: monitoredObject
+monitorIsShadow: FALSE
+namingContexts: o=OpenLDAP Project,l=Internet
+readOnly: FALSE
+olmBDBEntryCache: 0
+olmBDBDNCache: 0
+olmBDBIDLCache: 0
+entryDN: cn=Database 1,cn=Databases,cn=Monitor
+
+dn: cn=Database 2,cn=Databases,cn=Monitor
+structuralObjectClass: monitoredObject
+monitorIsShadow: FALSE
+monitorContext: cn=Monitor
+readOnly: FALSE
+entryDN: cn=Database 2,cn=Databases,cn=Monitor
+
+dn: cn=Databases,cn=Monitor
+structuralObjectClass: monitorContainer
+readOnly: FALSE
+namingContexts:
+namingContexts: cn=config
+namingContexts: o=OpenLDAP Project,l=Internet
+monitorContext: cn=Monitor
+entryDN: cn=Databases,cn=Monitor
+
+dn: cn=Frontend,cn=Databases,cn=Monitor
+structuralObjectClass: monitoredObject
+monitorIsShadow: FALSE
+namingContexts:
+readOnly: FALSE
+entryDN: cn=Frontend,cn=Databases,cn=Monitor
+
diff --git a/tests/data/monitor3.out b/tests/data/monitor3.out
new file mode 100644 (file)
index 0000000..b40e98b
--- /dev/null
@@ -0,0 +1,15 @@
+dn: cn=Entries,cn=Statistics,cn=Monitor
+structuralObjectClass: monitorCounterObject
+monitorCounter: 12
+entryDN: cn=Entries,cn=Statistics,cn=Monitor
+
+dn: cn=PDU,cn=Statistics,cn=Monitor
+structuralObjectClass: monitorCounterObject
+monitorCounter: 18
+entryDN: cn=PDU,cn=Statistics,cn=Monitor
+
+dn: cn=Referrals,cn=Statistics,cn=Monitor
+structuralObjectClass: monitorCounterObject
+monitorCounter: 0
+entryDN: cn=Referrals,cn=Statistics,cn=Monitor
+
diff --git a/tests/data/monitor4.out b/tests/data/monitor4.out
new file mode 100644 (file)
index 0000000..f6e82d3
--- /dev/null
@@ -0,0 +1,66 @@
+dn: cn=Abandon,cn=Operations,cn=Monitor
+structuralObjectClass: monitorOperation
+monitorOpInitiated: 0
+monitorOpCompleted: 0
+entryDN: cn=Abandon,cn=Operations,cn=Monitor
+
+dn: cn=Add,cn=Operations,cn=Monitor
+structuralObjectClass: monitorOperation
+monitorOpInitiated: 0
+monitorOpCompleted: 0
+entryDN: cn=Add,cn=Operations,cn=Monitor
+
+dn: cn=Bind,cn=Operations,cn=Monitor
+structuralObjectClass: monitorOperation
+monitorOpInitiated: 5
+monitorOpCompleted: 5
+entryDN: cn=Bind,cn=Operations,cn=Monitor
+
+dn: cn=Compare,cn=Operations,cn=Monitor
+structuralObjectClass: monitorOperation
+monitorOpInitiated: 0
+monitorOpCompleted: 0
+entryDN: cn=Compare,cn=Operations,cn=Monitor
+
+dn: cn=Delete,cn=Operations,cn=Monitor
+structuralObjectClass: monitorOperation
+monitorOpInitiated: 0
+monitorOpCompleted: 0
+entryDN: cn=Delete,cn=Operations,cn=Monitor
+
+dn: cn=Extended,cn=Operations,cn=Monitor
+structuralObjectClass: monitorOperation
+monitorOpInitiated: 0
+monitorOpCompleted: 0
+entryDN: cn=Extended,cn=Operations,cn=Monitor
+
+dn: cn=Modify,cn=Operations,cn=Monitor
+structuralObjectClass: monitorOperation
+monitorOpInitiated: 0
+monitorOpCompleted: 0
+entryDN: cn=Modify,cn=Operations,cn=Monitor
+
+dn: cn=Modrdn,cn=Operations,cn=Monitor
+structuralObjectClass: monitorOperation
+monitorOpInitiated: 0
+monitorOpCompleted: 0
+entryDN: cn=Modrdn,cn=Operations,cn=Monitor
+
+dn: cn=Operations,cn=Monitor
+structuralObjectClass: monitorContainer
+monitorOpInitiated: 14
+monitorOpCompleted: 13
+entryDN: cn=Operations,cn=Monitor
+
+dn: cn=Search,cn=Operations,cn=Monitor
+structuralObjectClass: monitorOperation
+monitorOpInitiated: 5
+monitorOpCompleted: 4
+entryDN: cn=Search,cn=Operations,cn=Monitor
+
+dn: cn=Unbind,cn=Operations,cn=Monitor
+structuralObjectClass: monitorOperation
+monitorOpInitiated: 4
+monitorOpCompleted: 4
+entryDN: cn=Unbind,cn=Operations,cn=Monitor
+
index a42a52cddea29a1efa431f701568b2b3a095c2c1..b4d20fcdf437504f702f7fc395202978f1b765c8 100755 (executable)
@@ -269,6 +269,11 @@ METABASEDN="ou=Meta,$BASEDN"
 METAMANAGERDN="cn=Manager,$METABASEDN"
 VALSORTDN="cn=Manager,o=valsort"
 VALSORTBASEDN="o=valsort"
+MONITORDN="cn=Monitor"
+OPERATIONSMONITORDN="cn=Operations,$MONITORDN"
+CONNECTIONSMONITORDN="cn=Connections,$MONITORDN"
+DATABASESMONITORDN="cn=Databases,$MONITORDN"
+STATISTICSMONITORDN="cn=Statistics,$MONITORDN"
 
 # generated outputs
 SEARCHOUT=$TESTDIR/ldapsearch.out
@@ -281,6 +286,10 @@ INITOUT=$TESTDIR/init.out
 VALSORTOUT1=$DATADIR/valsort1.out
 VALSORTOUT2=$DATADIR/valsort2.out
 VALSORTOUT3=$DATADIR/valsort3.out
+MONITOROUT1=$DATADIR/monitor1.out
+MONITOROUT2=$DATADIR/monitor2.out
+MONITOROUT3=$DATADIR/monitor3.out
+MONITOROUT4=$DATADIR/monitor4.out
 
 SERVER1OUT=$TESTDIR/server1.out
 SERVER1FLT=$TESTDIR/server1.flt
diff --git a/tests/scripts/test056-monitor b/tests/scripts/test056-monitor
new file mode 100755 (executable)
index 0000000..2998c7c
--- /dev/null
@@ -0,0 +1,170 @@
+#! /bin/sh
+# $OpenLDAP$
+## This work is part of OpenLDAP Software <http://www.openldap.org/>.
+##
+## Copyright 1998-2008 The OpenLDAP Foundation.
+## All rights reserved.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted only as authorized by the OpenLDAP
+## Public License.
+##
+## A copy of this license is available in the file LICENSE in the
+## top-level directory of the distribution or, alternatively, at
+## <http://www.OpenLDAP.org/license.html>.
+
+echo "running defines.sh"
+. $SRCDIR/scripts/defines.sh
+
+mkdir -p $TESTDIR $DBDIR1
+
+echo "Starting slapd on TCP/IP port $PORT..."
+. $CONFFILTER $BACKEND $MONITORDB < $SCHEMACONF > $CONF1
+$SLAPD -f $CONF1 -h $URI1 -d $LVL $TIMING > $LOG1 2>&1 &
+PID=$!
+if test $WAIT != 0 ; then
+    echo PID $PID
+    read foo
+fi
+KILLPIDS="$PID"
+
+sleep 1
+
+echo "Using ldapsearch to check that slapd is running..."
+for i in 0 1 2 3 4 5; do
+       $LDAPSEARCH -s base -b "$MONITOR" -h $LOCALHOST -p $PORT1 \
+               'objectclass=*' > /dev/null 2>&1
+       RC=$?
+       if test $RC = 0 ; then
+               break
+       fi
+       echo "Waiting 5 seconds for slapd to start..."
+       sleep 5
+done
+
+echo "Using ldapsearch to read connection monitor entries..."
+$LDAPSEARCH -S "" -b "$CONNECTIONSMONITORDN" -h $LOCALHOST -p $PORT1 \
+       'objectclass=*' \
+       structuralObjectClass entryDN \
+       monitorConnectionProtocol monitorConnectionOpsReceived \
+       monitorConnectionOpsExecuting monitorConnectionOpsPending \
+       monitorConnectionOpsCompleted monitorConnectionGet \
+       monitorConnectionRead monitorConnectionWrite \
+       monitorConnectionMask monitorConnectionAuthzDN \
+       monitorConnectionListener monitorConnectionLocalAddress \
+       > $SEARCHOUT 2>&1
+RC=$?
+
+if test $RC != 0 ; then
+        echo "ldapsearch failed ($RC)!"
+       test $KILLSERVERS != no && kill -HUP $KILLPIDS
+        exit $RC
+fi
+
+echo "Filtering ldapsearch results..."
+. $LDIFFILTER < $SEARCHOUT > $SEARCHFLT
+
+echo "Comparing filter output..."
+$CMP $SEARCHFLT $MONITOROUT1 > $CMPOUT
+
+if test $? != 0 ; then
+        echo "comparison failed - connection monitor output is not correct"
+       test $KILLSERVERS != no && kill -HUP $KILLPIDS
+        exit 1
+fi
+
+echo "Using ldapsearch to read database monitor entries..."
+$LDAPSEARCH -S "" -b "$DATABASESMONITORDN" -h $LOCALHOST -p $PORT1 \
+       'objectclass=*' \
+       structuralObjectClass entryDN namingContexts readOnly \
+       monitorIsShadow monitorContext \
+       olmBDBEntryCache olmBDBDNCache olmBDBIDLCache \
+       > $SEARCHOUT 2>&1
+RC=$?
+
+if test $RC != 0 ; then
+        echo "ldapsearch failed ($RC)!"
+       test $KILLSERVERS != no && kill -HUP $KILLPIDS
+        exit $RC
+fi
+
+echo "Filtering ldapsearch results..."
+. $LDIFFILTER < $SEARCHOUT > $SEARCHFLT
+
+TMPMONITOROUT2=$MONITOROUT2
+case $BACKEND in
+bdb|hdb)
+       ;;
+*)
+       TMPMONITOROUT2=$TESTDIR/monitor2.out
+       grep -v "olmBDB" $MONITOROUT2 > $TMPMONITOROUT2
+       ;;
+esac
+
+echo "Comparing filter output..."
+$CMP $SEARCHFLT $TMPMONITOROUT2 > $CMPOUT
+
+if test $? != 0 ; then
+        echo "comparison failed - database monitor output is not correct"
+       test $KILLSERVERS != no && kill -HUP $KILLPIDS
+        exit 1
+fi
+
+echo "Using ldapsearch to read statistics monitor entries..."
+$LDAPSEARCH -S "" -b "$STATISTICSMONITORDN" -h $LOCALHOST -p $PORT1 \
+       '(|(cn=Entries)(cn=PDU)(cn=Referrals))' \
+       structuralObjectClass monitorCounter entryDN \
+       > $SEARCHOUT 2>&1
+RC=$?
+
+if test $RC != 0 ; then
+        echo "ldapsearch failed ($RC)!"
+       test $KILLSERVERS != no && kill -HUP $KILLPIDS
+        exit $RC
+fi
+
+echo "Filtering ldapsearch results..."
+. $LDIFFILTER < $SEARCHOUT > $SEARCHFLT
+
+echo "Comparing filter output..."
+$CMP $SEARCHFLT $MONITOROUT3 > $CMPOUT
+
+if test $? != 0 ; then
+        echo "comparison failed - statistics monitor output is not correct"
+       test $KILLSERVERS != no && kill -HUP $KILLPIDS
+        exit 1
+fi
+
+echo "Using ldapsearch to read operation monitor entries..."
+$LDAPSEARCH -S "" -b "$OPERATIONSMONITORDN" -h $LOCALHOST -p $PORT1 \
+       'objectclass=*' \
+       structuralObjectClass monitorOpInitiated monitorOpCompleted entryDN \
+       > $SEARCHOUT 2>&1
+RC=$?
+
+if test $RC != 0 ; then
+        echo "ldapsearch failed ($RC)!"
+       test $KILLSERVERS != no && kill -HUP $KILLPIDS
+        exit $RC
+fi
+
+echo "Filtering ldapsearch results..."
+. $LDIFFILTER < $SEARCHOUT > $SEARCHFLT
+
+echo "Comparing filter output..."
+$CMP $SEARCHFLT $MONITOROUT4 > $CMPOUT
+
+if test $? != 0 ; then
+        echo "comparison failed - operations monitor output is not correct"
+       test $KILLSERVERS != no && kill -HUP $KILLPIDS
+        exit 1
+fi
+
+test $KILLSERVERS != no && kill -HUP $KILLPIDS
+
+echo ">>>>> Test succeeded"
+
+test $KILLSERVERS != no && wait
+
+exit 0
+