andykimpe / rpms / 389-ds-base

Forked from rpms/389-ds-base 4 months ago
Clone
Blob Blame History Raw
From 948fafdad56860ab7099f4137dfea4f65d39a960 Mon Sep 17 00:00:00 2001
From: Mark Reynolds <mreynolds@redhat.com>
Date: Tue, 15 Jan 2013 12:41:23 -0500
Subject: [PATCH 124/225] TIcket 419 - logconv.pl - improve memory management

Remove old logconv.pl script - to make room for the new rewrite of logconv.pl

https://fedorahosted.org/389/ticket/419
(cherry picked from commit 472373506eeca676dbbf9b9f56c2248761068752)
(cherry picked from commit fc3c9192d37631948ca17fec3cd9bd2fed1ffdbc)
(cherry picked from commit 3badb6cd2f784543e31cce7cf97958f7281951e9)
---
 ldap/admin/src/logconv.pl | 2271 ---------------------------------------------
 1 file changed, 2271 deletions(-)
 delete mode 100755 ldap/admin/src/logconv.pl

diff --git a/ldap/admin/src/logconv.pl b/ldap/admin/src/logconv.pl
deleted file mode 100755
index 0ec596a..0000000
--- a/ldap/admin/src/logconv.pl
+++ /dev/null
@@ -1,2271 +0,0 @@
-#!/usr/bin/env perl
-
-#
-# BEGIN COPYRIGHT BLOCK
-# This Program is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; version 2 of the License.
-# 
-# This Program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License along with
-# this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
-# Place, Suite 330, Boston, MA 02111-1307 USA.
-# 
-# In addition, as a special exception, Red Hat, Inc. gives You the additional
-# right to link the code of this Program with code not covered under the GNU
-# General Public License ("Non-GPL Code") and to distribute linked combinations
-# including the two, subject to the limitations in this paragraph. Non-GPL Code
-# permitted under this exception must only link to the code of this Program
-# through those well defined interfaces identified in the file named EXCEPTION
-# found in the source code files (the "Approved Interfaces"). The files of
-# Non-GPL Code may instantiate templates or use macros or inline functions from
-# the Approved Interfaces without causing the resulting work to be covered by
-# the GNU General Public License. Only Red Hat, Inc. may make changes or
-# additions to the list of Approved Interfaces. You must obey the GNU General
-# Public License in all respects for all of the Program code and other code used
-# in conjunction with the Program except the Non-GPL Code covered by this
-# exception. If you modify this file, you may extend this exception to your
-# version of the file, but you are not obligated to do so. If you do not wish to
-# provide this exception without modification, you must delete this exception
-# statement from your version and license this file solely under the GPL without
-# exception. 
-# 
-# 
-# Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
-# Copyright (C) 2005 Red Hat, Inc.
-# All rights reserved.
-# END COPYRIGHT BLOCK
-#
-
-#
-# Check for usage
-#
-use Time::Local;
-use IO::File;
-use Getopt::Long;
-
-Getopt::Long::Configure ("bundling");
-Getopt::Long::Configure ("permute");
-
-if ($#ARGV < 0){;
-&displayUsage;
-}
-
-#######################################
-#                                     #
-# parse commandline switches          #
-#                                     #
-#######################################
-
-$x = "0";
-$fc = 0;
-$sn = 0;
-$logversion = "6.11";
-$sizeCount = "20";
-$startFlag = 0;
-$startTime = 0;
-$endFlag = 0;
-$endTime = 0;
-$s_stats = new_stats_block( );
-$m_stats = new_stats_block( );
-$report_opt = "";
-
-GetOptions(
-	'd|rootDN=s' => \$manager,
-	'v|version' => sub { print "Access Log Analyzer v$logversion\n"; exit (0); },
-	'V|verbose' => sub { $verb = "yes"; },
-	'X|excludeIP=s' => \$exclude[$xi++],
-	's|sizeLimit=s' => \$sizeCount,
-	'S|startTime=s' => \$startTime,
-	'E|endTime=s' => \$endTime,
-	'B|bind=s' => sub { $reportBinds = "yes"; $bindReportDN=($_[1]) },
-	'm|reportFileSecs=s' => sub { my ($opt,$value) = @_; $s_stats = new_stats_block($value); $report_opt = "-m"; },
-	'M|reportFileMins=s' =>  sub { my ($opt,$value) = @_; $m_stats = new_stats_block($value); $report_opt = "-M"; },
-	'h|help' => sub { displayUsage() },
-	# usage options '-efcibaltnxgjuiryp'
-	'e' => sub { $usage = $usage . "e"; },
-	'f' => sub { $usage = $usage . "f"; },
-	'c' => sub { $usage = $usage . "c"; },
-	'i' => sub { $usage = $usage . "i"; },
-	'b' => sub { $usage = $usage . "b"; },
-	'a' => sub { $usage = $usage . "a"; },
-	'l' => sub { $usage = $usage . "l"; },
-	't' => sub { $usage = $usage . "t"; },
-	'n' => sub { $usage = $usage . "n"; },
-	'x' => sub { $usage = $usage . "x"; },
-	'g' => sub { $usage = $usage . "g"; },
-	'j' => sub { $usage = $usage . "j"; },
-	'u' => sub { $usage = $usage . "u"; },
-	'r' => sub { $usage = $usage . "r"; },
-	'y' => sub { $usage = $usage . "y"; },
-	'p' => sub { $usage = $usage . "p"; }
-);
-
-#
-# setup the report Bind DN if any
-#
-if($reportBinds eq "yes"){
-	$bindReportDN =~ tr/A-Z/a-z/;
-	if($bindReportDN eq "all"){
-		$bindReportDN = "";
-	}
-	if($bindReportDN eq "anonymous"){
-		$bindReportDN = "Anonymous";
-	}
-}
-
-#
-# set the default root DN
-#
-if($manager eq ""){
-	$manager = "cn=directory manager";
-}
-
-#
-#  get the logs
-#
-while($sn <= $#ARGV){
-	$files[$fc] = $ARGV[$sn];
-	$fc++;
-	$sn++;
-}
-
-if($fc == 0){
-	if($report_opt ne ""){
-		print "Usage error for option $report_opt, either the output file or access log is missing!\n\n";
-	} else {
-		print "There are no access logs specified!\n\n";
-	}
-	exit 1;
-}
-
-if ($sizeCount eq "all"){$sizeCount = "100000";}
-
-#######################################
-#                                     #
-# Initialize Arrays and variables     #
-#                                     #
-#######################################
-
-print "\nAccess Log Analyzer $logversion\n";
-print "\nCommand : logconv.pl @ARGV\n\n";
-
-$dirmgr = "0";
-$notes = "0";
-$vlvnotes= "0";
-$search = "0";
-$fdtake = "0";
-$fdreturn = "0";
-$highfd = "0";
-$bind = "0";
-$unbind = "0";
-$anony = "0";
-$mod = "0";
-$delete = "0";
-$add = "0";
-$modrdn = "0";
-$moddn = "0";
-$compare = "0";
-$proxiedAuth = "0";
-$restarts = "0";
-$resource = "0";
-$broken = "0";
-$vlv = "0";
-$version2 = "0";
-$version3 = "0";
-$sortvlv = "0";
-$reset = "0";
-$vet = "0";
-$v = "0";
-$errorck = "0";
-$errorsucc = "0";
-$sslconn = "0";
-$sslClientBind = "0";
-$sslClientFailed = "0";
-$objectclass= "0";
-$nc = "0";
-$no = "0";
-$nt = "0";
-$nb = "0";
-$bc = "0";
-$fcc = "0";
-$bcc = "0";
-$scc = "0";
-$nent = "0";
-$allOps = "0";
-$allResults = "0";
-$bpc = "0";
-$bpo = "0";
-$bpi = 0;
-$abandon = "0";
-$mmasterop = "0";
-$extendedop = "0";
-$sasl = "0";
-$internal = "0";
-$entryOp = "0";
-$referral = "0";
-$anyAttrs = "0";
-$persistent = "0";
-$sconn = "0";
-$dconn = "0";
-$aconn = "0";
-$mconn = "0";
-$mdconn = "0";
-$mddconn = "0";
-$bconn = "0";
-$ubconn = "0";
-$econn = "0";
-$cconn = "0";
-$connectionCount = "0";
-$timerange = 0;
-$simConnection = 0;
-$maxsimConnection = 0;
-$firstFile = "1";
-$elapsedDays = "0";
-$logCount = "0";
-$limit = "25000"; # number of lines processed to trigger output
-
-$err[0] = "Successful Operations\n";
-$err[1] = "Operations Error(s)\n";
-$err[2] = "Protocal Errors\n";
-$err[3] = "Time Limit Exceeded\n";
-$err[4] = "Size Limit Exceeded\n";
-$err[5] = "Compare False\n";
-$err[6] = "Compare True\n";
-$err[7] = "Strong Authentication Not Supported\n";
-$err[8] = "Strong Authentication Required\n";
-$err[9] = "Partial Results\n";
-$err[10] = "Referral Received\n";
-$err[11] = "Administrative Limit Exceeded (Look Through Limit)\n";
-$err[12] = "Unavailable Critical Extension\n";
-$err[13] = "Confidentiality Required\n";
-$err[14] = "SASL Bind in Progress\n";
-$err[16] = "No Such Attribute\n";
-$err[17] = "Undefined Type\n";
-$err[18] = "Inappropriate Matching\n";
-$err[19] = "Constraint Violation\n";
-$err[20] = "Type or Value Exists\n";
-$err[21] = "Invalid Syntax\n";
-$err[32] = "No Such Object\n";
-$err[33] = "Alias Problem\n";
-$err[34] = "Invalid DN Syntax\n";
-$err[35] = "Is Leaf\n";
-$err[36] = "Alias Deref Problem\n";
-$err[48] = "Inappropriate Authentication (No password presented, etc)\n";
-$err[49] = "Invalid Credentials (Bad Password)\n";
-$err[50] = "Insufficent (write) Privledges\n";
-$err[51] = "Busy\n";
-$err[52] = "Unavailable\n";
-$err[53] = "Unwilling To Perform\n";
-$err[54] = "Loop Detected\n";
-$err[60] = "Sort Control Missing\n";
-$err[61] = "Index Range Error\n";
-$err[64] = "Naming Violation\n";
-$err[65] = "Objectclass Violation\n";
-$err[66] = "Not Allowed on Non Leaf\n";
-$err[67] = "Not Allowed on RDN\n";
-$err[68] = "Already Exists\n";
-$err[69] = "No Objectclass Mods\n";
-$err[70] = "Results Too Large\n";
-$err[71] = "Effect Multiple DSA's\n";
-$err[80] = "Other\n";
-$err[81] = "Server Down\n";
-$err[82] = "Local Error\n";
-$err[83] = "Encoding Error\n";
-$err[84] = "Decoding Error\n";
-$err[85] = "Timeout\n";
-$err[86] = "Authentication Unknown\n";
-$err[87] = "Filter Error\n";
-$err[88] = "User Canceled\n";
-$err[89] = "Parameter Error\n";
-$err[90] = "No Memory\n";
-$err[91] = "Connect Error\n";
-$err[92] = "Not Supported\n";
-$err[93] = "Control Not Found\n";
-$err[94] = "No Results Returned\n";
-$err[95] = "More Results To Return\n";
-$err[96] = "Client Loop\n";
-$err[97] = "Referral Limit Exceeded\n";
-
-
-$conn{"A1"} = "A1";
-$conn{"B1"} = "B1";
-$conn{"B4"} = "B4";
-$conn{"T1"} = "T1";
-$conn{"T2"} = "T2";
-$conn{"B2"} = "B2";
-$conn{"B3"} = "B3";
-$conn{"R1"} = "R1";
-$conn{"P1"} = "P1";
-$conn{"P2"} = "P2";
-$conn{"U1"} = "U1";
-
-$connmsg{"A1"} = "Client Aborted Connections";
-$connmsg{"B1"} = "Bad Ber Tag Encountered";
-$connmsg{"B4"} = "Server failed to flush data (response) back to Client";
-$connmsg{"T1"} = "Idle Timeout Exceeded";
-$connmsg{"T2"} = "IO Block Timeout Exceeded or NTSSL Timeout";
-$connmsg{"B2"} = "Ber Too Big";
-$connmsg{"B3"} = "Ber Peek";
-$connmsg{"R1"} = "Revents";
-$connmsg{"P1"} = "Plugin";
-$connmsg{"P2"} = "Poll";
-$connmsg{"U1"} = "Cleanly Closed Connections";
-
-%monthname = (
-	"Jan" => 0,
-	"Feb" => 1,
-	"Mar" => 2,
-	"Apr" => 3,
-	"May" => 4,
-	"Jun" => 5,
-	"Jul" => 6,
-	"Aug" => 7,
-	"Sep" => 8,
-	"Oct" => 9,
-	"Nov" => 10,
-	"Dec" => 11,
-
-);
-
-##########################################
-#                                        #
-#         Parse Access Logs              #
-#                                        # 
-##########################################
-
-if ($files[$#files] =~ m/access.rotationinfo/) {  $fc--; }
-
-print "Processing $fc Access Log(s)...\n\n";
-
-print "Filename\t\t\t   Total Lines\n";
-print "--------------------------------------------------\n";
-
-$ofc = $fc;
-
-if ($fc > 1 && $files[0] =~ /\/access$/){
-        $files[$fc] = $files[0];
-        $fc++;
-        $skipFirstFile = "1";
-}
-
-for ($count=0; $count < $fc; $count++){
-	# we moved access to the end of the list, so if its the first file skip it
-        if($fc > 1 && $count == 0 && $skipFirstFile eq "1"){
-                next;
-        }
-        $logCount++;
-        $logsize = `wc -l $files[$count]`;
-        $logsize =~ /([0-9]+)/;
-        $ff="";$iff="";
-	if($logCount < 10 ){ 
-		# add a zero for formatting purposes
-		$lc = "0" . $logCount;
-	} else {
-		$lc = $logCount;
-	}
-	print sprintf "[%s] %-30s %7s\n",$lc, $files[$count], $1;
-
-	open(LOG,"$files[$count]") || die "Error: Can't open file $infile: $!";
-
-	$firstline = "yes";
-	while (<LOG>) {
-		unless ($endFlag) {
-			if ($firstline eq "yes"){
-				if (/^\[/) {
-                        		$tline = $_;
-                        		$firstline = "no";
-				}
-				$ff++;$iff++;
-                	} elsif (/^\[/ && $firstline eq "no"){
-                         	&parseLine($tline);
-                         	$tline = $_;
-                	} else {
-                        	$tline = $tline . $_;
-                        	$tline =~ s/\n//;
-                	}
-		}
-	}
-	&parseLine($tline);
-	close (LOG);
-	print_stats_block( $s_stats );
-	print_stats_block( $m_stats );
-	$tlc = $tlc + $ff;
-	if($ff => $limit){print sprintf " %10s Lines Processed\n\n",--$ff;}
-}
-
-print "\n\nTotal Log Lines Analysed:  " . ($tlc - 1) . "\n";
-
-$allOps = $search + $mod + $add + $delete + $modrdn + $bind + $extendedop;
-
-##################################################################
-#                                                                #
-#  Calculate the total elapsed time of the processed access logs #
-#                                                                #
-##################################################################
-
-# if we are using startTime & endTime then we need to clean it up for our processing
-
-if($startTime){
-	if ($start =~ / *([0-9a-z:\/]+)/i){$start=$1;}
-}
-if($endTime){
-	if ($end =~ / *([0-9a-z:\/]+)/i){$end =$1;}
-}
-
-#
-#  Get the start time in seconds
-#  
-
-$logStart = $start;
-
-if ($logStart =~ / *([0-9A-Z\/]+)/i ){
-        $logDate = $1;
-        @dateComps = split /\//, $logDate;
-
-        $timeMonth = 1 +$monthname{$dateComps[1]};
-        $timeMonth = $timeMonth * 3600 *24 * 30; 
-        $timeDay= $dateComps[0] * 3600 *24;
-        $timeYear = $dateComps[2] *365 * 3600 * 24;
-        $dateTotal = $timeMonth + $timeDay + $timeYear;
-}
-
-if ($logStart =~ / *(:[0-9:]+)/i ){
-        $logTime = $1;
-        @timeComps = split /:/, $logTime;
-
-        $timeHour = $timeComps[1] * 3600;
-        $timeMinute = $timeComps[2] *60;
-        $timeSecond = $timeComps[3];
-        $timeTotal = $timeHour + $timeMinute + $timeSecond;
-}
-
-$startTotal = $timeTotal + $dateTotal;
-
-#
-#  Get the end time in seconds
-#
-
-$logEnd = $end;
-
-if ($logEnd =~ / *([0-9A-Z\/]+)/i ){
-        $logDate = $1;
-        @dateComps = split /\//, $logDate;
-
-        $endDay = $dateComps[0] *3600 * 24;
-        $endMonth = 1 + $monthname{$dateComps[1]};
-        $endMonth = $endMonth * 3600 * 24 * 30;
-        $endYear = $endTotal + $dateComps[2] *365 * 3600 * 24 ;
-        $dateTotal = $endDay + $endMonth + $endYear;
-}
-
-if ($logEnd =~ / *(:[0-9:]+)/i ){
-        $logTime = $1;
-        @timeComps = split /:/, $logTime;
-
-        $endHour = $timeComps[1] * 3600;
-        $endMinute = $timeComps[2] *60;
-        $endSecond = $timeComps[3];
-        $timeTotal = $endHour + $endMinute + $endSecond;	
-}
-
-$endTotal = $timeTotal +  $dateTotal;
-
-#
-#  Tally the numbers
-#
-$totalTimeInSecs = $endTotal - $startTotal;
-$remainingTimeInSecs = $totalTimeInSecs;
-
-#
-#  Calculate the elapsed time
-#
-
-# days
-while(($remainingTimeInSecs - 86400) > 0){
-	$elapsedDays++;
-	$remainingTimeInSecs =  $remainingTimeInSecs - 86400;
-
-}
-
-# hours
-while(($remainingTimeInSecs - 3600) > 0){
-	$elapsedHours++;
-	$remainingTimeInSecs = $remainingTimeInSecs - 3600;
-}
-
-#  minutes
-while($remainingTimeInSecs - 60 > 0){
-	$elapsedMinutes++;
-	$remainingTimeInSecs = $remainingTimeInSecs - 60;
-}
-
-#seconds
-$elapsedSeconds = $remainingTimeInSecs;
-
-#####################################
-#                                   #
-#     Display Basic Results         #
-#                                   #
-#####################################
-
-
-print "\n\n----------- Access Log Output ------------\n";
-print "\nStart of Logs:    $start\n";
-print "End of Logs:      $end\n\n";
-if($elapsedDays eq "0"){
-        print "Processed Log Time:  $elapsedHours Hours, $elapsedMinutes Minutes, $elapsedSeconds Seconds\n\n";
-} else {
-        print "Processed Log Time:  $elapsedDays Days, $elapsedHours Hours, $elapsedMinutes Minutes, $elapsedSeconds Seconds\n\n";
-}
-
-#
-#  Check here if we are producing any unqiue reports
-#
-
-if($reportBinds eq "yes"){
-	&displayBindReport();
-}
-
-#
-# Continue with standard report
-#
-
-print "Restarts:                     $restarts\n";
-print "Total Connections:            $connectionCount\n";
-print "SSL Connections:              $sslconn\n";
-print "Peak Concurrent Connections:  $maxsimConnection\n";
-print "Total Operations:             $allOps\n";
-print "Total Results:                $allResults\n";
-if ($allOps ne "0"){
- print sprintf "Overall Performance:          %.1f%\n\n" , ($perf = ($tmp = ($allResults / $allOps)*100) > 100 ? 100.0 : $tmp) ;
- }
-else {
- print "Overall Performance:          No Operations to evaluate\n\n";
-}
-
-$searchStat = sprintf "(%.2f/sec)  (%.2f/min)\n",($search / $totalTimeInSecs), $search / ($totalTimeInSecs/60);
-$modStat = sprintf "(%.2f/sec)  (%.2f/min)\n",$mod / $totalTimeInSecs, $mod/($totalTimeInSecs/60);
-$addStat = sprintf "(%.2f/sec)  (%.2f/min)\n",$add/$totalTimeInSecs, $add/($totalTimeInSecs/60);
-$deleteStat = sprintf "(%.2f/sec)  (%.2f/min)\n",$delete/$totalTimeInSecs, $delete/($totalTimeInSecs/60);
-$modrdnStat = sprintf "(%.2f/sec)  (%.2f/min)\n",$modrdn/$totalTimeInSecs, $modrdn/($totalTimeInSecs/60);
-$compareStat = sprintf "(%.2f/sec)  (%.2f/min)\n",$compare/$totalTimeInSecs, $compare/($totalTimeInSecs/60);
-$bindStat = sprintf "(%.2f/sec)  (%.2f/min)\n",$bind/$totalTimeInSecs, $bind/($totalTimeInSecs/60);
-
-format STDOUT =
-Searches:                     @<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<
-                              $search,        $searchStat
-Modifications:                @<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<
-                              $mod,           $modStat
-Adds:                         @<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<
-                              $add,           $addStat
-Deletes:                      @<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<
-                              $delete,        $deleteStat
-Mod RDNs:                     @<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<
-                              $modrdn,        $modrdnStat
-Compares:                     @<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<
-                              $compare,       $compareStat
-Binds:                        @<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<
-                              $bind           $bindStat
-.
-write STDOUT;
-
-print "\n";
-print "Proxied Auth Operations:      $proxiedAuth\n";
-print "Persistent Searches:          $persistent\n";
-print "Internal Operations:          $internal\n";
-print "Entry Operations:             $entryOp\n";
-print "Extended Operations:          $extendedop\n";
-print "Abandoned Requests:           $abandon\n";
-print "Smart Referrals Received:     $referral\n";
-print "\n";
-print "VLV Operations:               $vlv\n";
-print "VLV Unindexed Searches:       $vlvnotes\n";
-print "SORT Operations:              $sortvlv\n";
-print "\n";
-print "Entire Search Base Queries:   $objectclass\n";
-print "Unindexed Searches:           $notes\n";
-if ($verb eq "yes" || $usage =~ /u/){
-if ($notes > 0){
-	$ns = "1";
-	for ($n = 0; $n <= $#notesEtime; $n++){
-		@alreadyseenDN = ();
-		print "\n  Unindexed Search #".$ns."\n";
-		$ns++;
-		print "  -  Date/Time:             $notesTime[$n]\n";
-		print "  -  Connection Number:     $notesConn[$n]\n";
-		print "  -  Operation Number:      $notesOp[$n]\n";
-		print "  -  Etime:                 $notesEtime[$n]\n";
-		print "  -  Nentries:              $notesNentries[$n]\n";
-		print "  -  IP Address:            $conn_hash{$notesConn[$n]}\n";
-		for ($nn = 0; $nn <= $bc; $nn++){
-			if ($notesConn[$n] eq $bindInfo[$nn][1]) {
-
-					## Here, we check if the bindDN is already printed.
-					## If not, we print it and push it to @alreadyseenDN.
-					## So, in the beginning, we iterate thru @alreadyseenDN
-
-					for ($j=0, $DNisThere=0; $j <=$#alreadyseenDN; $j++) {
-						if ($alreadyseenDN[$j] eq $bindInfo[$nn][0]) {
-							$DNisThere = 1;
-						}
-					}
-					unless ($DNisThere) {
-						print "  -  Bind DN:               $bindInfo[$nn][0]\n";
-						push @alreadyseenDN, $bindInfo[$nn][0];
-					}
-			}
-		}
-		for ($nnn = 0; $nnn <= $bcc; $nnn++){
-			if ($notesConn[$n] eq $baseInfo[$nnn][1] && $notesOp[$n] eq $baseInfo[$nnn][2]){
-				print "  -  Search Base:           $baseInfo[$nnn][0]\n";
-			}
-		}
-		for ($nnn = 0; $nnn <= $scc; $nnn++){
-			if ($notesConn[$n] eq $scopeInfo[$nnn][1] && $notesOp[$n] eq $scopeInfo[$nnn][2]){
-				print "  -  Search Scope:          $scopeInfo[$nnn][0]\n";
-			}
-		}
-		for ($nnn = 0; $nnn <= $fcc; $nnn++){	
-			if ($notesConn[$n] eq $filterInfo[$nnn][1] && $notesOp[$n] eq $filterInfo[$nnn][2]){
-				print "  -  Search Filter:         $filterInfo[$nnn][0]\n";
-			}	
-		}
-	}
-}
-
-}
-
-print "\n";
-print "FDs Taken:                    $fdtake\n";
-print "FDs Returned:                 $fdreturn\n";
-print "Highest FD Taken:             $highfd\n\n";
-print "Broken Pipes:                 $broken\n";
-if ($broken > 0){
-	foreach $key (sort { $rc{$b} <=> $rc{$a} } keys %rc) {
-          if ($rc{$key} > 0){
-           if ($conn{$key} eq ""){$conn{$key} = "** Unknown **";}
-           push @etext, sprintf "     -  %-4s (%2s) %-40s\n",$rc{$key},$conn{$key},$connmsg{$key
-};
-          }
-        }
-        print @etext;
-        print "\n";
-}
-
-print "Connections Reset By Peer:    $reset\n";
-if ($reset > 0){
-	foreach $key (sort { $src{$b} <=> $src{$a} } keys %src) {
-          if ($src{$key} > 0){
-           if ($conn{$key} eq ""){$conn{$key} = "** Unknown **";}
-           push @retext, sprintf "     -  %-4s (%2s) %-40s\n",$src{$key},$conn{$key},$connmsg{$key
-};
-          }
-        }
-        print @retext;
-	print "\n";
-}
-
-print "Resource Unavailable:         $resource\n";
-if ($resource > 0){
-	foreach $key (sort { $rsrc{$b} <=> $rsrc{$a} } keys %rsrc) {
-          if ($rsrc{$key} > 0){
-           if ($conn{$key} eq ""){$conn{$key} = "** Resource Issue **";}
-           push @rtext, sprintf "     -  %-4s (%2s) %-40s\n",$rsrc{$key},$conn{$key},$connmsg{$key};
-          }
-  	}
-  	print @rtext;
-}
-print "\n";
-print "Binds:                        $bind\n";
-print "Unbinds:                      $unbind\n";
-print "\n LDAP v2 Binds:               $version2\n";
-print " LDAP v3 Binds:               $version3\n";
-print " SSL Client Binds:            $sslClientBind\n";
-print " Failed SSL Client Binds:     $sslClientFailed\n";
-print " SASL Binds:                  $sasl\n";
-if ($sasl > 0){
- foreach $saslb ( sort {$saslmech{$b} <=> $saslmech{$a} } (keys %saslmech) ){
-	printf "  %-4s  %-12s\n",$saslmech{$saslb}, $saslb;   
- }
-}
-
-print "\n Directory Manager Binds:     $dirmgr\n";
-print " Anonymous Binds:             $anony\n";
-$other = $bind -($dirmgr + $anony);
-print " Other Binds:                 $other";
-
-if ($verb eq "yes" || $usage =~ /y/){
-print "\n\n----- Connection Latency Details -----\n\n";
-print " (in seconds)\t\t<=1\t2\t3\t4-5\t6-10\t11-15\t>15\n";
-print " --------------------------------------------------------------------------\n";
-print " (# of connections)\t";
-for ($i=0; $i <=$#latency; $i++) {
-	print "$latency[$i]\t";
-}
-}
-
-if ($verb eq "yes" || $usage =~ /p/){
-print "\n\n----- Current Open Connection IDs ----- \n\n";
-for ($i=0; $i <= $#openConnection ; $i++) {
-	if ($openConnection[$i]) {
-		print "\t$i\n";
-	}
-}
-}
-
-###################################
-#                                 #
-#      Display Error Codes        #
-#                                 #
-###################################
-
-if ($usage =~ /e/i || $verb eq "yes"){
-print "\n\n----- Errors -----\n";
-
-%er = sort( {$b <=> $a} %er);
-for ($i = 0; $i<98; $i++){
-      if ($err[$i] ne "" && $er[$i] >0) {
-                push @errtext, sprintf "%-8s       %12s    %-25s","err=$i",$er[$i],$err[$i];
-        }
-}
-
-for ($i = 0; $i < $#errtext; $i++){
-
-  for ($ii = 0; $ii < $#errtext; $ii++){
-    $yy="0";
-    $zz="0";
-    while ($errtext[$ii] =~ /(\w+)\s/g){
-        $errornum[$yy]="$1";
-        $yy++;
-    }
-    while ($errtext[$ii+1] =~ /(\w+)\s/g){
-        $errornum2[$zz]="$1";
-        $zz++;
-    }
-
-        if ($errornum2[1] > $errornum[1]){
-                $tmp = $errtext[$ii];
-                $errtext[$ii] = $errtext[$ii+1];
-                $errtext[$ii+1] = $tmp;
-                }
-        }
-}
-
-for ($i = 0; $i <= $#errtext; $i++){
-	$errtext[$i] =~ s/\n//g;
-	print  "\n" . $errtext[$i];
-} 
-
-}
-
-####################################
-#            			   #
-#     Print Failed Logins          #
-# 				   #
-####################################
-
-if ($verb eq "yes" || $usage =~ /f/i ){
-if ($bpc > 0){
-print "\n\n----- Top $sizeCount Failed Logins ------\n\n";
-
-if ($ds6x eq "true"){
-	$eloop = "0";
-	foreach $dsbp (sort { $ds6xbadpwd{$b} <=> $ds6xbadpwd{$a} } keys %ds6xbadpwd) {
-		if ($eloop > $sizeCount){ last; }
-		printf "%-4s        %-40s\n", $ds6xbadpwd{$dsbp}, $dsbp;
-	}
-
-} else { 
-for ($ii =0 ; $ii < $bpc; $ii++){
- for ($i = 0; $i < $bc; $i++){
-	if ($badPasswordConn[$ii] eq $bindInfo[$i][1] && $badPasswordOp[$ii] eq $bindInfo[$i][2] ){
-		$badPassword{ "$bindInfo[$i][0]" } = $badPassword{ "$bindInfo[$i][0]" } + 1;
-	}
- }
-}
-
-# sort the new list of $badPassword{}
-
-$bpTotal = "0";
-$bpCount = "0";
-foreach $badpw (sort {$badPassword{$b} <=> $badPassword{$a} } keys %badPassword){
-	if ($bpCount > $sizeCount){ last;}
-	$bpCount++;
-	$bpTotal = $bpTotal + $badPassword{"$badpw"};
-	printf "%-4s        %-40s\n", $badPassword{"$badpw"}, $badpw;
-}
-
-print "\nFrom the IP address(s) :\n\n";
-for ($i=0; $i<$bpi; $i++) {
-	print "\t\t$badPasswordIp[$i]\n";
-}
-
-if ($bpTotal > $bpc){
-	print "\n** Warning : Wrongly reported failed login attempts : ". ($bpTotal - $bpc) . "\n";
-}
-}  # this ends the if $ds6x = true
-
-}
-
-}
-
-
-####################################
-#                                  #
-#     Print Connection Codes       #
-#                                  #
-####################################
-
-
-if ($concount > 0){
-if ($usage =~ /c/i || $verb eq "yes"){
- print "\n\n----- Total Connection Codes -----\n\n";
-
-  foreach $key (sort { $conncount{$b} <=> $conncount{$a} } keys %conncount) {
-          if ($conncount{$key} > 0){
-                  push @conntext, sprintf "%-4s                 %6s    %-40s\n",$conn{ $key },$conncount{$key},$connmsg{ $key };
-          }
-  }
-print @conntext;
-}
-
-}
-
-########################################
-#                                      #
-#  Gather and Process all unique IPs   #
-#                                      #
-########################################
-
-if ($usage =~ /i/i || $verb eq "yes"){
-@ipkeys = keys %ip_hash;
-@exxCount = keys %exCount;
-$ip_count = ($#ipkeys + 1)-($#exxCount + 1); 
-if ($ip_count > 0){
- print "\n\n----- Top $sizeCount Clients -----\n\n";
- print "Number of Clients:  $ip_count\n\n";
-
-        foreach $key (sort { $ip_hash{$b}{"count"} <=> $ip_hash{$a}{"count"} } keys %ip_hash) {
-			$exc = "no";
-			if ($ccount > $sizeCount){ last;}
-       		        $ccount++;
-			for ($xxx =0; $xxx <= $#exclude; $xxx++){
-				if ($exclude[$xxx] eq $key){$exc = "yes";}
-			}
-			if ($exc ne "yes"){
-				if ($ip_hash{ $key }{"count"} eq ""){$ip_hash{ $key }{"count"} = "*";}
-                		printf "%-6s %-17s\n", $ip_hash{ $key }{"count"}, $key;
-			}
-
-     			if ($exc ne "yes"){ 	
-				foreach $code (sort { $ip_hash{ $key }{$b} <=> $ip_hash{ $key }{$a} } keys %{$ip_hash{ $key }}) {
-		 			if ($code eq 'count' ) { next; }
-                        		printf "\t\t %6s - %3s   %s\n", $ip_hash{ $key }{ $code }, $code, $connmsg{ $code };
-			        }
-     			}
-                	
-                	if ($exc ne "yes"){ print "\n";}
-        }
-}
-}
-
-
-
-###################################
-#                                 #
-#   Gather All unique Bind DN's   #
-#                                 #
-###################################
-
-if ($usage =~ /b/i || $verb eq "yes"){
-@bindkeys = keys %bindlist;
-$bind_count = $#bindkeys + 1;
-if ($bind_count > 0){
-        print "\n----- Top $sizeCount Bind DN's -----\n\n";
-        print "Number of Unique Bind DN's: $bind_count\n\n"; 
-
-	$bindcount = 0;
-        
-        foreach $dn (sort { $bindlist{$b} <=> $bindlist{$a} } keys %bindlist) {
-                if ($bindcount < $sizeCount){
-			printf "%-8s        %-40s\n", $bindlist{ $dn },$dn;
-		}
-		$bindcount++;
-        }
-}
-
-}
-
-
-#########################################
-#					#
-#  Gather and process search bases      #
-#					#
-#########################################
-
-if ($usage =~ /a/i || $verb eq "yes"){
-@basekeys = keys %base;
-$base_count = $#basekeys + 1;
-if ($base_count > 0){
-        print "\n\n----- Top $sizeCount Search Bases -----\n\n";
-        print "Number of Unique Search Bases: $base_count\n\n";
-
-        $basecount = 0;
-
-        foreach $bas (sort { $base{$b} <=> $base{$a} } keys %base) {
-                if ($basecount < $sizeCount){
-                        printf "%-8s        %-40s\n", $base{ $bas },$bas;
-                }
-                $basecount++;
-        }
-}
-
-}
- 
-#########################################
-#                                       #
-#   Gather and process search filters   #
-#                                       #
-#########################################
-
-if ($usage =~ /l/ || $verb eq "yes"){
-
-@filterkeys = keys %filter;
-$filter_count = $#filterkeys + 1;
-if ($filter_count > 0){
-	print "\n\n----- Top $sizeCount Search Filters -----\n";  
-	print "\nNumber of Unique Search Filters: $filter_count\n\n";
-
-	$filtercount = 0;
-
-	foreach $filt (sort { $filter{$b} <=> $filter{$a} } keys %filter){
-		if ($filtercount < $sizeCount){
-			printf "%-8s        %-40s\n", $filter{$filt}, $filt;
-		}
-		$filtercount++;
-	}
-}
-
-}
-
-#########################################
-#                                       #
-# Gather and Process the unique etimes  #
-#                                       # 
-#########################################
-
-if ($usage =~ /t/i || $verb eq "yes"){
-	#
-	# print most often etimes
-	#
-	print "\n\n----- Top $sizeCount Most Frequent etimes -----\n\n";
-	$eloop = 0;
-	foreach $et (sort { $etime{$b} <=> $etime{$a} } keys %etime) {
-		if ($eloop == $sizeCount) { last; }
-		if ($retime ne "2"){
-			$first = $et;
-			$retime = "2";
-		}
-		printf "%-8s        %-12s\n", $etime{ $et }, "etime=$et";
-		$eloop++;
-	}
-	#
-	# print longest etimes
-	#
-	print "\n\n----- Top $sizeCount Longest etimes -----\n\n";
-	$eloop = 0;
-	foreach $et (sort { $b <=> $a } (keys %etime)) {
-		if ($eloop == $sizeCount) { last; }
-		printf "%-12s    %-10s\n","etime=$et",$etime{ $et };
-		$eloop++;
-	}   
-}
-
-#######################################
-#                                     #
-# Gather and Process unique nentries  #
-#                                     #
-#######################################
-
-
-if ($usage =~ /n/i || $verb eq "yes"){
-print "\n\n----- Top $sizeCount Largest nentries -----\n\n";
-$eloop = 0;
-foreach $nentry (sort { $b <=> $a } (keys %nentries)){
-        if ($eloop == $sizeCount) { last; }
-    printf "%-18s   %12s\n","nentries=$nentry", $nentries{ $nentry };
-        $eloop++;
-}
-
-print "\n\n----- Top $sizeCount Most returned nentries -----\n\n";
-$eloop = 0;
-foreach $nentry (sort { $nentries{$b} <=> $nentries{$a} } (keys %nentries)){
-        if ($eloop == $sizeCount) { last; }
-        printf "%-12s    %-14s\n", $nentries{ $nentry }, "nentries=$nentry";
-        $eloop++;
-}
-
-print "\n";
-}
-
-
-##########################################
-#                                        #
-# Gather and process extended operations #
-#                                        #
-##########################################
-
-if ($usage =~ /x/i || $verb eq "yes"){
-
-if ($extendedop > 0){
-print "\n\n----- Extended Operations -----\n\n";
-foreach $oids (sort { $oid{$b} <=> $oid{$a} } (keys %oid) ){
-
-	if ($oids eq "2.16.840.1.113730.3.5.1"){ $oidmessage = "Transaction Request"}
-	elsif ($oids eq "2.16.840.1.113730.3.5.2"){ $oidmessage = "Transaction Response"}
-	elsif ($oids eq "2.16.840.1.113730.3.5.3"){ $oidmessage = "Start Replication Request (incremental update)"}
-	elsif ($oids eq "2.16.840.1.113730.3.5.4"){ $oidmessage = "Replication Response"}
-	elsif ($oids eq "2.16.840.1.113730.3.5.5"){ $oidmessage = "End Replication Request (incremental update)"}
-	elsif ($oids eq "2.16.840.1.113730.3.5.6"){ $oidmessage = "Replication Entry Request"}
-	elsif ($oids eq "2.16.840.1.113730.3.5.7"){ $oidmessage = "Start Bulk Import"}
-	elsif ($oids eq "2.16.840.1.113730.3.5.8"){ $oidmessage = "Finished Bulk Import"}
-	elsif ($oids eq "2.16.840.1.113730.3.6.1"){ $oidmessage = "Incremental Update Replication Protocol"}
-	elsif ($oids eq "2.16.840.1.113730.3.6.2"){ $oidmessage = "Total Update Replication Protocol (Initialization)"}
-	elsif ($oids eq "2.16.840.1.113730.3.5.9"){ $oidmessage = "Digest Authentication"}
-	else {$oidmessage = "Other"}
-
-	printf "%-6s      %-23s     %-60s\n", $oid{ $oids }, $oids, $oidmessage;
-}
-}
-
-}
-
-############################################
-#					   	
-# Print most commonly requested attributes 
-#					   
-############################################
-
-if ($usage =~ /r/i || $verb eq "yes"){
-if ($anyAttrs > 0){
-print "\n\n----- Top $sizeCount Most Requested Attributes -----\n\n";
-$eloop = "0";
-foreach $mostAttr (sort { $attr{$b} <=> $attr{$a} } (keys %attr) ){
-	if ($eloop eq $sizeCount){ last; }
-	printf "%-10s  %-19s\n", $attr{$mostAttr}, $mostAttr;
-	$eloop++;
-}
-}
-
-}
-
-#################################
-#
-# abandoned operation stats 
-#				
-#################################
-
-if ($usage =~ /g/i || $verb eq "yes"){
-$acTotal = $sconn + $dconn + $mconn + $aconn + $mdconn + $bconn + $ubconn + $econn + $mddconn + $cconn;
-if ($verb eq "yes" && $ac > 0 && $acTotal > 0){
-
-print "\n\n----- Abandon Request Stats -----\n\n";
-
- for ($g = 0; $g < $ac; $g++){
-  for ($sc = 0; $sc < $sconn; $sc++){
-	if ($srchConn[$sc] eq $targetConn[$g] && $srchOp[$sc] eq $targetOp[$g] ){
-		print " - SRCH conn=$targetConn[$g] op=$targetOp[$g] msgid=$msgid[$g] client=$conn_hash{$targetConn[$g]}\n";	
-	}
-  }
-  for ($dc = 0; $dc < $dconn; $dc++){
-	if ($delConn[$dc] eq $targetConn[$g] && $delOp[$dc] eq $targetOp[$g]){
-		print " - DEL conn=$targetConn[$g] op=$targetOp[$g] msgid=$msgid[$g] client=$conn_hash{$targetConn[$g]}\n";
-	}
-  }
-  for ($adc = 0; $adc < $aconn; $adc++){
-	if ($addConn[$adc] eq $targetConn[$g] && $addOp[$adc] eq $targetOp[$g]){
-		print " - ADD conn=$targetConn[$g] op=$targetOp[$g] msgid=$msgid[$g] client=$conn_hash{$targetConn[$g]}\n";
-	}
-  }
-  for ($mc = 0; $mc < $mconn; $mc++){
-	if ($modConn[$mc] eq $targetConn[$g] && $modOp[$mc] eq $targetOp[$g]){
-		print " - MOD conn=$targetConn[$g] op=$targetOp[$g] msgid=$msgid[$g] client=$conn_hash{$targetConn[$g]}\n";
-	}
-  }
-  for ($mddc = 0; $mddc < $mddconn; $mddc++){
-        if ($moddnConn[$mdc] eq $targetConn[$g] && $moddnOp[$mdc] eq $targetOp[$g]){
-                print " - MODDN conn=$targetConn[$g] op=$targetOp[$g] msgid=$msgid[$g] client=$conn_hash{$targetConn[$g]}\n";
-        }
-  }
-  for ($cc = 0; $cc < $cconn; $cc++){
-        if ($compConn[$mdc] eq $targetConn[$g] && $compOp[$mdc] eq $targetOp[$g]){
-                print " - CMP conn=$targetConn[$g] op=$targetOp[$g] msgid=$msgid[$g] client=$conn_hash{$targetConn[$g]}\n";
-        }
-  }
-  for ($mdc = 0; $mdc < $mdconn; $mdc++){
-	if ($modrdnConn[$mdc] eq $targetConn[$g] && $modrdnOp[$mdc] eq $targetOp[$g]){
-		print " - MODRDN conn=$targetConn[$g] op=$targetOp[$g] msgid=$msgid[$g] client=$conn_hash{$targetConn[$g]}\n";
-	}
-  }
-  for ($bcb = 0; $bcb < $bconn; $bcb++){
-	if ($bindConn[$bcb] eq $targetConn[$g] && $bindOp[$bcb] eq $targetOp[$g]){
-		print " - BIND conn=$targetConn[$g] op=$targetOp[$g] msgid=$msgid[$g] client=$conn_hash{$targetConn[$g]}\n";
-	}
-  }
-  for ($ubc = 0; $ubc < $ubconn; $ubc++){
-	if ($unbindConn[$ubc] eq $targetConn[$g] && $unbindOp[$ubc] eq $targetOp[$g]){
-		print " - UNBIND conn=$targetConn[$g] op=$targetOp[$g] msgid=$msgid[$g] client=$conn_hash{$targetConn[$g]}\n";
-	}
-  }
-  for ($ec = 0; $ec < $econn; $ec++){
-	if ($extConn[$ec] eq $targetConn[$g] && $extOp[$ec] eq $targetOp[$g]){
-		print " - EXT conn=$targetConn[$g] op=$targetOp[$g] msgid=$msgid[$g] client=$conn_hash{$targetConn[$g]}\n";
-	}
-  }
-	
-	
- }
-}
-
-}
-
-
-
-print "\n";
-
-#######################################
-#                                     #
-#       Recommendations               #
-#                                     #
-#######################################
-
-if ($usage =~ /j/i || $verb eq "yes"){
-print "\n----- Recommendations -----\n";
-$recCount = "1";
-if ($notes > 0){
-	print "\n $recCount.  You have unindexed searches, this can be caused from a search on an unindexed attribute, or your returned results exceeded the allidsthreshold.  Unindexed searches are not recommended. To refuse unindexed searches, switch \'nsslapd-require-index\' to \'on\' under your database entry (e.g. cn=UserRoot,cn=ldbm database,cn=plugins,cn=config).\n";
-	$recCount++;
-	}
-
-if ($conncount{"T1"} > 0){
-	print "\n $recCount.  You have some connections that are are being closed by the idletimeout setting. You may want to increase the idletimeout if it is set low.\n";
-	$recCount++;
-	}
-
-if ($conncount{"T2"} > 0){
-	print "\n $recCount.  You have some coonections that are being closed by the ioblocktimeout setting. You may want to increase the ioblocktimeout.\n";
-	$recCount++;
-	}
-
-# compare binds to unbinds, if the difference is more than 30% of the binds, then report a issue
-
-if (($bind - $unbind) > ($bind*.3)){
-	print "\n $recCount.  You have a significant difference between binds and unbinds.  You may want to investigate this difference.\n";
-	$recCount++;
-	}
-
-# compare fds taken and return, if the difference is more than 30% report a issue
-
-if (($fdtaken -$fdreturn) > ($fdtaken*.3)){
-	print "\n $recCount.  You have a significant difference between file descriptors taken and file descriptors returned.  You may want to investigate this difference.\n";
-	$recCount++;
-	}
-
-if ($dirmgr > ($bind *.2)){
-	print "\n $recCount.  You have a high number of Directory Manager binds.  The Directory Manager account should only be used under certain circumstances.  Avoid using this account for client applications.\n";
-	$recCount++;
-	}
-
-if ($errorck > $errorsucc){
-	print "\n $recCount.  You have more unsuccessful operations than successful operations.  You should investigate this difference.\n";
-	$recCount++;
-	}
-
-if ($conncount{"U1"} < ($concount - $conncount{"U1"})){
-	print "\n $recCount.  You have more abnormal connection codes than cleanly closed connections.  You may want to investigate this difference.\n";
-	$recCount++;
-	}
-
-if ($first > 0){
-	print "\n $recCount.  You have a majority of etimes that are greater than zero, you may want to investigate this performance problem.\n";
-	$recCount++;
-	}
-
-if ($objectclass > ($search *.25)){
-	print "\n $recCount.  You have a high number of searches that query the entire search base.  Although this is not necessarily bad, it could be resource intensive if the search base contains many entries.\n"; 
-	$recCount++;
-	}
-
-if ($recCount == 1){
-	print "\nNone.\n";
-	}
-}
-
-print "\n";
-
-# dispaly usage
-
-sub displayUsage {
-
-	print "Usage:\n\n";
-
-	print " ./logconv.pl [-h] [-d|--rootdn <rootDN>] [-s|--sizeLimit <size limit>] [-v|verison] [-Vi|verbose]\n";
-	print " [-S|--startTime <start time>] [-E|--endTime <end time>] \n"; 
-	print " [-efcibaltnxrgjuyp] [ access log ... ... ]\n\n"; 
-
-	print "- Commandline Switches:\n\n";
-
-	print "         -h, --help         help/usage\n";
-	print "         -d, --rootDN        <Directory Managers DN>  DEFAULT -> cn=directory manager\n";
-	print "         -s, --sizeLimit    <Number of results to return per catagory>  DEFAULT -> 20\n";
-	print "         -X, --excludeIP    <IP address to exclude from connection stats>  E.g. Load balancers\n";
-	print "         -v, --version      show version of tool\n"; 
-	print "         -S, --startTime    <time to begin analyzing logfile from>\n";
-	print "             E.g. \"[28/Mar/2002:13:14:22 -0800]\"\n";
-	print "         -E, --endTime      <time to stop analyzing logfile>\n";
-	print "             E.g. \"[28/Mar/2002:13:24:62 -0800]\"\n";
-	print "         -m, --reportFileSecs  <CSV output file - per second stats>\n"; 
-	print "         -M, --reportFileMins  <CSV output file - per minute stats>\n";	
-	print "         -B, --bind         <ALL | ANONYMOUS | \"Actual Bind DN\">\n";
-	print "         -V, --verbose      <enable verbose output - includes all stats listed below>\n";
-	print "         -[efcibaltnxrgjuyp]\n\n";
-
-	print "                 e       Error Code stats\n";
-	print "                 f       Failed Login Stats\n";
-	print "                 c       Connection Code Stats\n";
-	print "                 i       Client Stats\n";
-	print "                 b       Bind Stats\n";
-	print "                 a       Search Base Stats\n";
-	print "                 l       Search Filter Stats\n";
-	print "                 t       Etime Stats\n";
-	print "                 n       Nentries Stats\n";
-	print "                 x       Extended Operations\n";
-	print "                 r       Most Requested Attribute Stats\n";
-	print "                 g       Abandoned Operation Stats\n";
-	print "                 j       Recommendations\n";
-	print "                 u       Unindexed Search Stats\n";
-	print "                 y       Connection Latency Stats\n";
-	print "                 p       Open Connection ID Stats\n\n";
-
-	print "  Examples:\n\n";
-
-	print "         ./logconv.pl -s 10 -V /logs/access*\n\n";
-	print "         ./logconv.pl --rootDN cn=dm /logs/access*\n\n";
-	print "         ./logconv.pl --sizeLimit 50 -ibgju /logs/access*\n\n";
-	print "         ./logconv.pl -S \"\[28/Mar/2002:13:14:22 -0800\]\" --endTime \"\[28/Mar/2002:13:50:05 -0800\]\" -e /logs/access*\n\n";
-	print "         ./logconv.pl -m log-minute-stats-csv.out /logs/access*\n\n";
-	print "         ./logconv.pl -B ANONYMOUS /logs/access*\n\n";
-	print "         ./logconv.pl -B \"uid=mreynolds,dc=example,dc=com\" /logs/access*\n\n";
-
-	exit 1;
-}
-
-######################################################
-#
-# Parsing Routines That Do The Actual Parsing Work
-#
-######################################################
-
-sub
-parseLine {
-	if($reportBinds eq "yes"){
-		&parseLineBind();		
-	} else {
-		&parseLineNormal();
-	}
-}
-
-sub
-parseLineBind {
-	$ff++;
-	$iff++;
-	local $_ = $tline;
-
-	if ($iff >= $limit){
-		print STDERR sprintf" %10s Lines Processed\n",$ff;
-		$iff="0";
-	}
-
-	# skip blank lines
-	return if $_ =~ /^\s/;
-
-	if($firstFile eq "1" && $_ =~ /^\[/){
-        	$start = $_;
-        	if ($start =~ / *([0-9a-z:\/]+)/i){$start=$1;}
-        		$firstFile = "0";
-	}
-
-	if ($endFlag != 1 && $_ =~ /^\[/ && $_ =~ / *([0-9a-z:\/]+)/i){
-		$end =$1;
-	}
-
-	if ($startTime && !$startFlag) {
-        	if (index($_, $startTime) == 0) {
-                	$startFlag = 1;
-                	($start) = $startTime =~ /\D*(\S*)/;
-        	} else {
-                	return;
-        	}
-	}
-
-	if ($endTime && !$endFlag) {
-        	if (index($_, $endTime) == 0) {
-                	$endFlag = 1;
-                	($end) = $endTime =~ /\D*(\S*)/;
-        	}
-	}
-
-	if ($_ =~ /connection from *([0-9A-Fa-f\.\:]+)/i ) {
-		for ($excl =0; $excl <= $#exclude; $excl++){
-			if ($exclude[$excl] eq $1){
-				$skip = "yes";
-				last;
-			}
-                }
-                if ($skip eq "yes"){
-			return ;
-		}
-		$ip = $1;
-		if ($_ =~ /conn= *([0-9]+)/i ){
-			$connList{$ip} = $connList{$ip} . " $1 ";
-		}
-		return;
-	}
-
- 	if (/ BIND/ && $_ =~ /dn=\"(.*)\" method/i ){
-        	if ($1 eq ""){
-			$dn = "Anonymous";
-		} else {
-			$dn = $1;
-			$dn =~ tr/A-Z/a-z/;
-		}
-
-		if($bindReportDN ne ""){
-			if($dn ne $bindReportDN){
-				#  We are not looking for this DN, skip it
-				return;
-			}
-		}
-
-		$bindReport{$dn}{"binds"}++;
-        	if ($bindReport{$dn}{"binds"} eq 1){
-			# For hashes we need to init the counters
-			$bindReport{$dn}{"srch"} = 0;
-			$bindReport{$dn}{"add"} = 0;
-			$bindReport{$dn}{"mod"} = 0;
-			$bindReport{$dn}{"del"} = 0;
-			$bindReport{$dn}{"cmp"} = 0;
-			$bindReport{$dn}{"ext"} = 0;
-			$bindReport{$dn}{"modrdn"} = 0;
-			$bindReport{$dn}{"failedBind"} = 0;
-		}
-
-		if ($_ =~ /conn= *([0-9]+)/i) {
-			$bindReport{$dn}{"conn"} = $bindReport{$dn}{"conn"} . " $1 ";
-		}
-		return;
- 	}
-
-	if (/ RESULT err=49 /){
-		processOpForBindReport("failedBind",$tline);
-	}
-
-	if (/ SRCH base=/){
-		processOpForBindReport("srch",$tline);
-	} elsif (/ ADD dn=/){
-		processOpForBindReport("add",$tline);
-	} elsif (/ MOD dn=/){
-		processOpForBindReport("mod",$tline);
-	} elsif (/ DEL dn=/){                
-		processOpForBindReport("del",$tline);
-	} elsif (/ MODRDN dn=/){
-		processOpForBindReport("modrdn",$tline);
-	} elsif (/ CMP dn=/){
-		processOpForBindReport("cmp",$tline);
-	} elsif (/ EXT oid=/){
-		processOpForBindReport("ext",$tline);
-	} 
-
-}
-
-sub
-processOpForBindReport
-{
-	$op = @_[0];
-	$data = @_[1];
-
-	if ($data =~ /conn= *([0-9]+)/i) {
-		foreach $dn (keys %bindReport){
-			if ($bindReport{$dn}{"conn"} =~ / $1 /){
-				$bindDN = $dn;
-				$bindReport{$bindDN}{$op}++;
-				return;
-			}
-		}
-	}
-}
-
-sub parseLineNormal {
-local $_ = $tline;
-
-# lines starting blank are restart
-return if $_ =~ /^\s/;
-
-if($firstFile eq "1" && $_ =~ /^\[/){
-	# if we are using startTime & endTime, this will get overwritten, which is ok
-	$start = $_;
-	if ($start =~ / *([0-9a-z:\/]+)/i){$start=$1;}
-	$firstFile = "0";
-}
-
-if ($endFlag != 1 && $_ =~ /^\[/ && $_ =~ / *([0-9a-z:\/]+)/i){$end =$1;}
-
-if ($startTime && !$startFlag) {
-	if (index($_, $startTime) == 0) {
-		$startFlag = 1;
-		($start) = $startTime =~ /\D*(\S*)/;
-	} else {
-		return;
-	}
-}
-
-if ($endTime && !$endFlag) {
-	if (index($_, $endTime) == 0) {
-		$endFlag = 1;
-		($end) = $endTime =~ /\D*(\S*)/;
-	}
-}
-
-$ff++;
-$iff++;
-if ($iff >= $limit){ print STDERR sprintf" %10s Lines Processed\n",$ff; $iff="0";}
-
-# Additional performance stats
-($time, $tzone) = split (' ', $_);
-if ($time ne $last_tm)
-{
-	$last_tm = $time;
-
-	$time =~ s/\[//;
-	$tzone =~ s/\].*//;
-
-	if($tzone ne $lastzone)
-	{
-	    # tz offset change
-	    $lastzone=$tzone;
-	    ($sign,$hr,$min) = $tzone =~ m/(?)(\d\d)(\d\d)/;
-	    $tzoff = $hr*3600 + $min*60;
-	    $tzoff *= -1
-		if $sign eq '-';
-	    # to be subtracted from converted values.
-	}
-
-	($date, $hr, $min, $sec) = split (':', $time);
-	($day, $mon, $yr) = split ('/', $date);
-	$newmin = timegm(0, $min, $hours, $day, $monthname{$mon}, $yr) - $tzoff;
-	$gmtime = $newmin + $sec;
-	print_stats_block( $s_stats );
-	reset_stats_block( $s_stats, $gmtime, $time.' '.$tzone );
-	if ($newmin != $last_min)
-	{
-	    print_stats_block( $m_stats );
-	    $time =~ s/\d\d$/00/;
-            reset_stats_block( $m_stats, $newmin, $time.' '.$tzone );
-            $last_min = $newmin;
-	}
-}
-
-if (m/ RESULT err/){$allResults++;inc_stats('results',$s_stats,$m_stats);}
-if (m/ SRCH/){
-	$search++;
-	inc_stats('srch',$s_stats,$m_stats);
-	if ($_ =~ / attrs=\"(.*)\"/i){
-		$anyAttrs++;
-		$attrs = $1 . " ";
-		while ($attrs =~ /(\S+)\s/g){
-			$attr{$1}++;
-		}
-	} 
-	if (/ attrs=ALL/){
-		$attr{"All Attributes"}++;
-		$anyAttrs++;
-	}
-
-	if ($verb eq "yes"){ 
-		if ($_ =~ /conn= *([0-9]+)/i){ $srchConn[$sconn] = $1;}
-		if ($_ =~ /op= *([0-9]+)/i){ $srchOp[$sconn] = $1;}
-		$sconn++;
-	}
-}
-if (m/ DEL/){
-	$delete++;
-	inc_stats('del',$s_stats,$m_stats);
-	if ($verb eq "yes"){
-		if ($_ =~ /conn= *([0-9]+)/i){ $delConn[$dconn] = $1;}
-		if ($_ =~ /op= *([0-9]+)/i){ $delOp[$dconn] = $1;}
-		$dconn++;
-	}
-}
-if (m/ MOD dn=/){
-	$mod++;
-	inc_stats('mod',$s_stats,$m_stats);
-	if ($verb eq "yes"){
-                if ($_ =~ /conn= *([0-9]+)/i){ $modConn[$mconn] = $1;}
-		if ($_ =~ /op= *([0-9]+)/i){ $modOp[$mconn] = $1; }
-		$mconn++;
-	}
-}
-if (m/ MODDN dn=/){
-        $moddn++;
-        inc_stats('moddn',$s_stats,$m_stats);
-        if ($verb eq "yes"){
-                if ($_ =~ /conn= *([0-9]+)/i){ $moddnConn[$mconn] = $1;}
-                if ($_ =~ /op= *([0-9]+)/i){ $moddnOp[$mconn] = $1; }
-                $mddconn++;
-        }
-}
-if (m/ ADD/){
-	$add++;
-	inc_stats('add',$s_stats,$m_stats);
-	if ($verb eq "yes"){
-                if ($_ =~ /conn= *([0-9]+)/i){ $addConn[$aconn] = $1; }
-		if ($_ =~ /op= *([0-9]+)/i){ $addOp[$aconn] = $1; }
-		$aconn++;
-	}
-}
-if (m/ MODRDN/){
-	$modrdn++;
-	inc_stats('modrdn',$s_stats,$m_stats);
-	if ($verb eq "yes"){
-                if ($_ =~ /conn= *([0-9]+)/i){ $modrdnConn[$mdconn] = $1; }
-		if ($_ =~ /op= *([0-9]+)/i){ $modrdnOp[$mdconn] = $1; }
-		$mdconn++;
-	}
-}
-if (m/ CMP dn=/){
-	$compare++;
-	inc_stats('cmp',$s_stats,$m_stats);	
-	if ($verb eq "yes"  || $usage =~ /g/i){
-		if ($_ =~ /conn= *([0-9]+)/i){ $compConn[$dconn] = $1;}
-		if ($_ =~ /op= *([0-9]+)/i){ $compOp[$dconn] = $1;}
-		$cconn++;
-	}
-}
-if (m/ ABANDON /){
-	$abandon++;
-	inc_stats('abandon',$s_stats,$m_stats);
-	$allResults++;
-	if ($_ =~ /targetop= *([0-9a-zA-Z]+)/i ){
-		$targetOp[$ac] = $1;
-		if ($_ =~ /conn= *([0-9]+)/i){ $targetConn[$ac] = $1; }
-		if ($_ =~ /msgid= *([0-9]+)/i){ $msgid[$ac] = $1;}
-		$ac++;
-	}
-}
-if (m/ VLV /){
-        if ($_ =~ /conn= *([0-9]+)/i){ $vlvconn[$vlv] = $1;}
-        if ($_ =~ /op= *([0-9]+)/i){ $vlvop[$vlv] = $1;}
-        $vlv++;
-}
-if (m/ authzid=/){
-	$proxiedAuth++;
-}
-if (m/ SORT /){$sortvlv++}
-if (m/ version=2/){$version2++}
-if (m/ version=3/){$version3++}
-if (m/ conn=1 fd=/){$restarts++}
-if (m/ SSL connection from/){$sslconn++;}
-if (m/ connection from/){
-     $exc = "no";
-     if ($_ =~ /connection from *([0-9A-Fa-f\.\:]+)/i ){ 
-	for ($xxx =0; $xxx <= $#exclude; $xxx++){
-		if ($exclude[$xxx] eq $1){$exc = "yes";}
-	}
-	if ($exc ne "yes"){ $connectionCount++;}
-    }
-	$simConnection++;
-	if ($simConnection > $maxsimConnection) {
-	 	$maxsimConnection = $simConnection;
-	}
-	
-	($connID) = $_ =~ /conn=(\d*)\s/;
-	$openConnection[$connID]++;
-	($time, $tzone) = split (' ', $_);
-	($date, $hr, $min, $sec) = split (':', $time);
-	($day, $mon, $yr) = split ('/', $date);
-	$day =~ s/\[//;
-	$start_time_of_connection[$connID] = timegm($sec, $min, $hours, $day, $monthname{$mon}, $yr);
-}
-
-if (m/ SSL client bound as /){$sslClientBind++;}
-if (m/ SSL failed to map client certificate to LDAP DN/){$sslClientFailed++;}
-if (m/ fd=/ && m/slot=/){$fdtake++}
-if (m/ fd=/ && m/closed/){
-	$fdreturn++;
-	$simConnection--;
-
-	($connID) = $_ =~ /conn=(\d*)\s/;
-	$openConnection[$connID]--;
-	$end_time_of_connection[$connID] = $gmtime;
-	$diff = $end_time_of_connection[$connID] - $start_time_of_connection[$connID];
-	$start_time_of_connection[$connID] =  $end_time_of_connection[$connID] = 0;
-	if ($diff <= 1) { $latency[0]++;}
-	if ($diff == 2) { $latency[1]++;}
-	if ($diff == 3) { $latency[2]++;}
-	if ($diff >= 4 && $diff <=5 ) { $latency[3]++;}
-	if ($diff >= 6 && $diff <=10 ) { $latency[4]++;}
-	if ($diff >= 11 && $diff <=15 ) { $latency[5]++;}
-	if ($diff >= 16) { $latency[6] ++;}
-}
-if (m/ BIND/){
-	$bind++;
-	inc_stats('bind',$s_stats,$m_stats);
-	if ($verb eq "yes"){
-                if ($_ =~ /conn= *([0-9]+)/i){ $bindConn[$bconn] = $1; }
-		if ($_ =~ /op= *([0-9]+)/i){ $bindOp[$bconn] = $1; }
-		$bconn++;
-	}
-}
-if (m/ BIND/ && m/$manager/i){$dirmgr++}
-if (m/ BIND/ && m/dn=""/){$anony++; $bindlist{"Anonymous Binds"}++;inc_stats('anonbind',$s_stats,$m_stats);}
-if (m/ UNBIND/){
-	$unbind++;
-	if ($verb eq "yes"){
-                if ($_ =~ /conn= *([0-9]+)/i){ $unbindConn[$ubconn] = $1; }
-		if ($_ =~ /op= *([0-9]+)/i){ $unbindOp[$ubconn] = $1; }
-		$ubconn++;
-	}
-}
-if (m/ notes=U/){
-        if ($_ =~ /conn= *([0-9]+)/i){
-                $con = $1;
-                if ($_ =~ /op= *([0-9]+)/i){ $op = $1;}
-        }
-        for ($i=0; $i <= $vlv;$i++){
-                if ($vlvconn[$i] eq $con && $vlvop[$i] eq $op){ $vlvnotes++; $v="1";}
-        }
-        if($v ne "1"){
-		#  We don't want to record vlv unindexed searches for our regular "bad" 
-		#  unindexed search stat, as VLV unindexed searches aren't that bad
-		$notes++;
-		inc_stats('notesu',$s_stats,$m_stats);
-        }
-        if ($usage =~ /u/ || $verb eq "yes"){
-        	if ($v eq "0" ){
-                	if ($_ =~ /etime= *([0-9.]+)/i ) {
-                        	$notesEtime[$vet]=$1;
-                        	$vet++;
-                	}
-                	if ($_ =~ /conn= *([0-9]+)/i){
-                        	$notesConn[$nc]=$1;
-                        	$nc++;
-                	}
-                	if ($_ =~ /op= *([0-9]+)/i){
-                        	$notesOp[$no]=$1;
-                        	$no++;
-                	}
-                	if ($_ =~ / *([0-9a-z:\/]+)/i){
-                        	$notesTime[$nt] = $1;
-                        	$nt++;
-                	}
-		}
-		if ($_ =~ /nentries= *([0-9]+)/i ){
-			$notesNentries[$nent] = $1;
-			$nent++;
-		}
-	}
-        $v = "0";
-}
-
-if (m/ closed error 32/){
-        $broken++;
-        if (m/- T1/){ $rc{"T1"}++ }
-        elsif (m/- T2/){ $rc{"T2"}++ }
-        elsif (m/- A1/){ $rc{"A1"}++ }
-        elsif (m/- B1/){ $rc{"B1"}++ }
-        elsif (m/- B4/){ $rc{"B4"}++ }
-        elsif (m/- B2/){ $rc{"B2"}++ }
-        elsif (m/- B3/){ $rc{"B3"}++ }
-        elsif (m/- R1/){ $rc{"R1"}++ }
-        elsif (m/- P1/){ $rc{"P1"}++ }
-        elsif (m/- P1/){ $rc{"P2"}++ }
-        elsif (m/- U1/){ $rc{"U1"}++ }
-        else { $rc{"other"}++; }
-}
-if (m/ closed error 131/ || m/ closed error -5961/){
-        $reset++;
-        if (m/- T1/){ $src{"T1"}++ }
-        elsif (m/- T2/){ $src{"T2"}++ }
-        elsif (m/- A1/){ $src{"A1"}++ }
-        elsif (m/- B1/){ $src{"B1"}++ }
-        elsif (m/- B4/){ $src{"B4"}++ }
-        elsif (m/- B2/){ $src{"B2"}++ }
-        elsif (m/- B3/){ $src{"B3"}++ }
-        elsif (m/- R1/){ $src{"R1"}++ }
-        elsif (m/- P1/){ $src{"P1"}++ }
-        elsif (m/- P1/){ $src{"P2"}++ }
-        elsif (m/- U1/){ $src{"U1"}++ }
-        else { $src{"other"}++ }
-}
-
-if (m/ closed error 11/){
-        $resource++;
-        if (m/- T1/){ $rsrc{"T1"}++ }
-        elsif (m/- T2/){ $rsrc{"T2"}++ }
-        elsif (m/- A1/){ $rsrc{"A1"}++ }
-        elsif (m/- B1/){ $rsrc{"B1"}++ }
-        elsif (m/- B4/){ $rsrc{"B4"}++ }
-        elsif (m/- B2/){ $rsrc{"B2"}++ }
-        elsif (m/- B3/){ $rsrc{"B3"}++ }
-        elsif (m/- R1/){ $rsrc{"R1"}++ }
-        elsif (m/- P1/){ $rsrc{"P1"}++ }
-        elsif (m/- P1/){ $rsrc{"P2"}++ }
-        elsif (m/- U1/){ $rsrc{"U1"}++ }
-        else { $rsrc{"other"}++ }
-}
-
-if ($usage =~ /g/ || $usage =~ /c/ || $usage =~ /i/ || $verb eq "yes"){
-
-$exc = "no";
-
-if ($_ =~ /connection from *([0-9A-fa-f\.\:]+)/i ) {
-	for ($xxx = 0; $xxx <= $#exclude; $xxx++){
-		if ($1 eq $exclude[$xxx]){
-			$exc = "yes";
-			$exCount{$1}++;
-		}
-	}
-        $ip = $1;
-        $ip_hash{$ip}{"count"}++;
-        if ($_ =~ /conn= *([0-9]+)/i ){ 
-	if ($exc ne "yes"){	$ip_hash2{$ip} = sprintf "%-12s               %18s\n",$1,$ip;} 
-		$conn_hash{$1} = $ip;
-		
-	}
-	
-}
-if (m/- A1/){
-        if ($_ =~ /conn= *([0-9]+)/i) {
-		$exc = "no";
-                $ip = $conn_hash{$1};
-		if ($ip eq ""){$ip = "Unknown Host";}
-		for ($xxx = 0; $xxx <= $#exclude; $xxx++){
-                	if ($ip eq $exclude[$xxx]){$exc = "yes";}
-        	}
-		if ($exc ne "yes"){
-                	$ip_hash{$ip}{"A1"}++;
-			$conncount{"A1"}++;
-			$concount++;
-		}
-        }
-}
-if (m/- B1/){
-        if ($_ =~ /conn= *([0-9]+)/i) {
-		$exc = "no";
-                $ip = $conn_hash{$1};
-		if ($ip eq ""){$ip = "Unknown Host";}
-		for ($xxx = 0; $xxx <= $#exclude; $xxx++){
-                        if ($ip eq $exclude[$xxx]){$exc = "yes";}
-                }
-                if ($exc ne "yes"){
-                	$ip_hash{$ip}{"B1"}++;
-			$conncount{"B1"}++;
-			$concount++;	
-		}
-        }
-}
-if (m/- B4/){
-        if ($_ =~ /conn= *([0-9]+)/i) {
-		$exc = "no";
-                $ip = $conn_hash{$1};
-		if ($ip eq ""){$ip = "Unknown Host";}
-		for ($xxx = 0; $xxx <= $#exclude; $xxx++){
-                        if ($ip eq $exclude[$xxx]){$exc = "yes";}
-                }
-                if ($exc ne "yes"){
-                	$ip_hash{$ip}{"B4"}++;
-			$conncount{"B4"}++;
-			$concount++;
-		}
-    }
-}
-if (m/- T1/){
-        if ($_ =~ /conn= *([0-9]+)/i) {
-		$exc = "no";
-               	$ip = $conn_hash{$1};
-		if ($ip eq ""){$ip = "Unknown Host";}
-		for ($xxx = 0; $xxx <= $#exclude; $xxx++){
-                        if ($ip eq $exclude[$xxx]){$exc = "yes";}
-                }
-                if ($exc ne "yes"){
-                	$ip_hash{$ip}{"T1"}++;
-			$conncount{"T1"}++;
-			$concount++;	
-		}
-        }
-}
-if (m/- T2/){
-        if ($_ =~ /conn= *([0-9]+)/i) {
-		$exc = "no"; 
-                $ip = $conn_hash{$1};
-		if ($ip eq ""){$ip = "Unknown Host";}
-		for ($xxx = 0; $xxx <= $#exclude; $xxx++){
-                        if ($ip eq $exclude[$xxx]){$exc = "yes";}
-                }
-                if ($exc ne "yes"){
-                	$ip_hash{$ip}{"T2"}++;
-			$conncount{"T2"}++;
-			$concount++;	
-		}
-        }
-}
-if (m/- B2/){
-        if ($_ =~ /conn= *([0-9]+)/i) {
-		$exc = "no";
-                $ip = $conn_hash{$1};
-		if ($ip eq ""){$ip = "Unknown Host";}
-		for ($xxx = 0; $xxx <= $#exclude; $xxx++){
-                        if ($ip eq $exclude[$xxx]){$exc = "yes";}
-                }
-                if ($exc ne "yes"){
-                	$ip_hash{$ip}{"B2"}++;
-			$conncount{"B2"}++;
-			$concount++;	
-		}
-        }
-}
-if (m/- B2/){
-        if ($_ =~ /conn= *([0-9]+)/i) {
-		$exc = "no";
-                $ip = $conn_hash{$1};
-		if ($ip eq ""){$ip = "Unknown Host";}
-		for ($xxx = 0; $xxx <= $#exclude; $xxx++){
-                        if ($ip eq $exclude[$xxx]){$exc = "yes";}
-                }
-                if ($exc ne "yes"){
-                	$ip_hash{$ip}{"B2"}++;
-			$conncount{"B2"}++;
-			$concount++;	
-		}
-        }
-}
-if (m/- B3/){
-        if ($_ =~ /conn= *([0-9]+)/i) {
-		$exc = "no";
-                $ip = $conn_hash{$1};
-		if ($ip eq ""){$ip = "Unknown Host";}
-		for ($xxx = 0; $xxx <= $#exclude; $xxx++){
-                        if ($ip eq $exclude[$xxx]){$exc = "yes";}
-                }
-                if ($exc ne "yes"){
-                	$ip_hash{$ip}{"B3"}++;
-			$conncount{"B3"}++;
-			$concount++;	
-		}
-        }
-}
-if (m/- R1/){
-        if ($_ =~ /conn= *([0-9]+)/i) {
-		$exc = "no";
-                $ip = $conn_hash{$1};
-		if ($ip eq ""){$ip = "Unknown Host";}
-		for ($xxx = 0; $xxx <= $#exclude; $xxx++){
-                        if ($ip eq $exclude[$xxx]){$exc = "yes";}
-                }
-		if ($exc ne "yes"){
-                	$ip_hash{$ip}{"R1"}++;
-			$conncount{"R1"}++;
-			$concount++;
-		}
-        }
-}
-if (m/- P1/){
-        if ($_ =~ /conn= *([0-9]+)/i) {
-		$exc = "no";
-                $ip = $conn_hash{$1};
-		if ($ip eq ""){$ip = "Unknown Host";}
-		for ($xxx = 0; $xxx <= $#exclude; $xxx++){
-                        if ($ip eq $exclude[$xxx]){$exc = "yes";}
-                }
-                if ($exc ne "yes"){
-                	$ip_hash{$ip}{"P1"}++;
-			$conncount{"P1"}++;
-			$concount++;	
-		}
-        }
-}
-if (m/- P2/){
-        if ($_ =~ /conn= *([0-9]+)/i) {
-		$exc = "no";
-                $ip = $conn_hash{$1};
-		if ($ip eq ""){$ip = "Unknown Host";}
-		for ($xxx = 0; $xxx <= $#exclude; $xxx++){
-                        if ($ip eq $exclude[$xxx]){$exc = "yes";}
-                }
-                if ($exc ne "yes"){
-                	$ip_hash{$ip}{"P2"}++;
-			$conncount{"P2"}++;
-			$concount++;
-		}
-        }
-}
-if (m/- U1/){
-        if ($_ =~ /conn= *([0-9]+)/i) {
-		$exc = "no";
-                $ip = $conn_hash{$1};
-		if ($ip eq ""){$ip = "Unknown Host";}
-		for ($xxx = 0; $xxx <= $#exclude; $xxx++){
-                        if ($ip eq $exclude[$xxx]){$exc = "yes";}
-                }
-                if ($exc ne "yes"){
-                	$ip_hash{$ip}{"U1"}++;
-			$conncount{"U1"}++;
-			$concount++;
-		}
-        }
-
-}
-
-}
-if ($_ =~ /err= *([0-9]+)/i){
-        $er[$1]++;
-        if ($1 ne "0"){ $errorck++;}
-        else { $errorsucc++;}
-}
-if ($_ =~ /etime= *([0-9.]+)/ ) { $etime{$1}++;}
-if ($_ =~ / tag=101 nentries= *([0-9]+)/i ) {$nentries{$1}++}
-if ($_ =~ / tag=111 nentries= *([0-9]+)/i ) {$nentries{$1}++}
-if ($_ =~ / tag=100 nentries= *([0-9]+)/i ) {$nentries{$1}++}
-if ($_ =~ / tag=115 nentries= *([0-9]+)/i ) {$nentries{$1}++}
-if (m/objectclass=\*/i || m/objectclass=top/i ){
-	if (m/ scope=2 /){ $objectclass++;}
-}
-
-if (m/ EXT oid=/){
-        $extendedop++;
-        if ($_ =~ /oid=\" *([0-9\.]+)/i ){ $oid{$1}++; }
-	if ($verb eq "yes"){
-                if ($_ =~ /conn= *([0-9]+)/i){ $extConn[$econn] = $1; }
-		if ($_ =~ /op= *([0-9]+)/i){ $extOp[$econn] = $1; }
-		$econn++;
-	}
-}
-
-if (m/ BIND/ && $_ =~ /dn=\"(.*)\" method/i ){
-	if ($1 ne ""){ 
-	$tmpp = $1;
-	$tmpp =~ tr/A-Z/a-z/;
-	$bindlist{$tmpp} = $bindlist{$tmpp} + 1; 
-
-	$bindInfo[$bc][0] = $tmpp;
-	if ($_ =~ /conn= *([0-9]+)/i) { $bindInfo[$bc][1] = $1; }
-	if ($_ =~ /op= *([0-9]+)/i) { $bindInfo[$bc][2] = $1; }
-	$bc++;
-	}
-}
-
-if ($usage =~ /l/ || $verb eq "yes"){
-	if (/ SRCH / && / attrs=/ && $_ =~ /filter=\"(.*)\" /i ){
-		$tmpp = $1;
-		$tmpp =~ tr/A-Z/a-z/;
-		$tmpp =~ s/\\22/\"/g;
-		$filter{$tmpp} = $filter{$tmpp} + 1; 
-		$filterInfo[$fcc][0] = $tmpp;
-		if ($_ =~ /conn= *([0-9]+)/i) { $filterInfo[$fcc][1] = $1; }
-		if ($_ =~ /op= *([0-9]+)/i) { $filterInfo[$fcc][2] = $1; }
-		$fcc++;
-	} elsif (/ SRCH / && $_ =~ /filter=\"(.*)\"/i){
-        	$tmpp = $1;
-        	$tmpp =~ tr/A-Z/a-z/;
-        	$tmpp =~ s/\\22/\"/g;
-        	$filter{$tmpp} = $filter{$tmpp} + 1;
-        	$filterInfo[$fcc][0] = $tmpp;
-        	if ($_ =~ /conn= *([0-9]+)/i) { $filterInfo[$fcc][1] = $1; }
-        	if ($_ =~ /op= *([0-9]+)/i) { $filterInfo[$fcc][2] = $1; }
-        	$fcc++;
-	}
-}
-
-if ($usage =~ /a/ || $verb eq "yes"){
-	if (/ SRCH /   && $_ =~ /base=\"(.*)\" scope/i ){
-		if ($1 eq ""){
-			$tmpp = "Root DSE";
-        	} else {
-			$tmpp = $1;
-		}
-        	$tmpp =~ tr/A-Z/a-z/;
-        	$base{$tmpp} = $base{$tmpp} + 1;
-
-		#
-		# grab the search bases & scope for potential unindexed searches
-		#
-		$baseInfo[$bcc][0] = $tmpp;
-		if ($_ =~ /scope= *([0-9]+)/i) { 
-			$scopeInfo[$scc][0] = $1; 
-		}
-		if ($_ =~ /conn= *([0-9]+)/i) { 
-			$baseInfo[$bcc][1] = $1; 
-			$scopeInfo[$scc][1] = $1;	
-		}
-		if ($_ =~ /op= *([0-9]+)/i) { 
-			$baseInfo[$bcc][2] = $1;
-			$scopeInfo[$scc][2] = $1;
-		}
-		$bcc++;
-		$scc++;
-
-	}
-}
-
-if ($_ =~ /fd= *([0-9]+)/i ) {
-        $fds[$fdds] = $1;
-        if ($fds[$fdds] > $highfd) {$highfd = $fds[$fdds];}
-        $fdds++;
-}
-
-
-if ($usage =~ /f/ || $verb eq "yes"){
-	if (/ err=49 tag=/ && / dn=\"/){
-		if ($_ =~ /dn=\"(.*)\"/i ){
-			$ds6xbadpwd{$1}++;
-		}
-		$ds6x = "true";
-		$bpc++;
-
-	} elsif (/ err=49 tag=/ ){
-		if ($_ =~ /conn= *([0-9]+)/i ){
-			$badPasswordConn[$bpc] = $1;
-			$bpc++;
-		}
-		if ($_ =~ /op= *([0-9]+)/i ){
-			$badPasswordOp[$bpo] = $1;
-			$bpo++;
-		}
-		$badPasswordIp[$bpi] = $ip;
-		$bpi++;
-	}
-}
-
-if (/ BIND / && /method=sasl/i){
-	$sasl++;
-	if ($_ =~ /mech=(.*)/i ){     
-		$saslmech{$1}++;
-	}
-}
-
-if (/ conn=Internal op=-1 / && !/ RESULT err=/){ $internal++; }
-
-if (/ ENTRY dn=/ ){ $entryOp++; }
-
-if (/ conn=/ && /op=/ && / REFERRAL/){ $referral++; }
-
-if (/ options=persistent/){$persistent++;}
-
-}
-
- #######################################
- # #                                     #
- # +#          CSV Helper Routines        #
- # +#                                     #
-#######################################
-#                                     #
-# To convert the CSV to chart in OO   #
-#                                     #
-#  * Select active rows and columns   #
-#  * Insert -> Chart                  #
-#  * Chart type "XY (Scatter)"        #
-#  *   sub-type "Lines Only"          #
-#  * select "Sort by X values"        #
-#  * "Next"                           #
-#  * select "Data series in columns"  #
-#  * select "First row as label"      #
-#  * select "First column as label"   #
-#  * "Next"                           #
-#  * "Next"                           #
-#  * "Finish"                         #
-#                                     #
-#######################################
-
-sub
-reset_stats_block
-{
-    my $stats = shift;
-
-    $stats->{'last'} = shift || 0;
-    $stats->{'last_str'} = shift || '';
-
-    $stats->{'results'}=0;
-    $stats->{'srch'}=0;
-    $stats->{'add'}=0;
-    $stats->{'mod'}=0;
-    $stats->{'modrdn'}=0;
-    $stats->{'moddn'}=0;
-    $stats->{'cmp'}=0;
-    $stats->{'del'}=0;
-    $stats->{'abandon'}=0;
-    $stats->{'conns'}=0;
-    $stats->{'sslconns'}=0;
-    $stats->{'bind'}=0;
-    $stats->{'anonbind'}=0;
-    $stats->{'unbind'}=0;
-    $stats->{'notesu'}=0;
-    return;
-}
-
-sub
-new_stats_block
-{
-    my $name = shift || '';
-    my $stats = {
-	'active' => 0,
-    };
-
-    if ($name)
-    {
-	$stats->{'filename'} = $name;
-	$stats->{'fh'} = new IO::File;
-	$stats->{'active'} = open($stats->{'fh'},">$name");
-    }
-
-    reset_stats_block( $stats );
-    return $stats;
-}
-
-sub
-print_stats_block
-{
-    foreach my $stats( @_ )
-    {
-	if ($stats->{'active'})
-	{
-	    if ($stats->{'last'})
-	    {
-		$stats->{'fh'}->print(
-		    join(',',
-			    $stats->{'last_str'},
-			    $stats->{'last'},
-			    $stats->{'results'},
-			    $stats->{'srch'},
-			    $stats->{'add'},
-			    $stats->{'mod'},
-			    $stats->{'modrdn'},
-			    $stats->{'moddn'},
-			    $stats->{'cmp'},
-			    $stats->{'del'},
-			    $stats->{'abandon'},
-			    $stats->{'conns'},
-			    $stats->{'sslconns'},
-			    $stats->{'bind'},
-			    $stats->{'anonbind'},
-			    $stats->{'unbind'},
-			    $stats->{'notesu'} ),
-		    "\n" );
-	    }else
-	    {
-		$stats->{'fh'}->print(
-		    "Time,time_t,Results,Search,Add,Mod,Modrdn,Delete,Abandon,".
-		    "Connections,SSL Conns,Bind,Anon Bind,Unbind,Unindexed\n"
-		    );
-	    }
-	}
-    }
-    return;
-}
-
-sub
-inc_stats
-{
-    my $n = shift;
-    foreach(@_)
-    {
-	$_->{$n}++
-	    if exists $_->{$n};
-    }
-    return;
-}
-
-sub
-displayBindReport
-{
-    #
-    #  Loop for each DN - sort alphabetically
-    #
-    #  Display all the IP addresses, then counts of all the operations it did
-    #
-
-    print "\nBind Report\n";
-    print "====================================================================\n\n";
-    foreach $bindDN (sort { $bindReport{$a} <=> $bindReport{$b} } keys %bindReport) {
-        print("Bind DN: $bindDN\n");
-        print("--------------------------------------------------------------------\n");
-        print("   Client Addresses:\n\n");
-        &printClients($bindReport{$bindDN}{"conn"});
-        print("\n   Operations Performed:\n\n");
-        &printOpStats($bindDN);
-        print("\n");	
-    }
-    print "Done.\n";
-    exit (0);
-}
-
-sub
-printClients
-{ 
-    @bindConns = &cleanConns(split(' ', @_[0]));
-    $IPcount = "1";
-
-    foreach $ip ( keys %connList ){   # Loop over all the IP addresses
-        foreach $bc (@bindConns){ # Loop over each bind conn number and compare it 
-	    if($connList{$ip} =~ / $bc /){ 
-                print("        [$IPcount]  $ip\n");
-                $IPcount++;
-                last;
-            }
-        }
-    }
-}
-
-sub
-cleanConns
-{
-    @dirtyConns = @_;
-    $#cleanConns = -1;
-    $c = 0;
-
-    for ($i = 0; $i <=$#dirtyConns; $i++){
-        if($dirtyConns[$i] ne ""){
-            $cleanConns[$c++] = $dirtyConns[$i];
-        }
-    }	
-    return @cleanConns;
-}
-
-sub
-printOpStats
-{
-    $dn = @_[0];
-
-    if( $bindReport{$dn}{"failedBind"} eq "0" ){
-        print("        Binds:        " . $bindReport{$dn}{"binds"} . "\n");
-    } else {
-        print("        Binds:        " . $bindReport{$dn}{"binds"} . "  (Invalid Credentials: " . $bindReport{$dn}{"failedBind"} . ")\n");
-    }
-    print("        Searches:     " . $bindReport{$dn}{"srch"} . "\n");
-    print("        Modifies:     " . $bindReport{$dn}{"mod"} . "\n");
-    print("        Adds:         " . $bindReport{$dn}{"add"} . "\n");
-    print("        Deletes:      " . $bindReport{$dn}{"del"} . "\n");
-    print("        Compares:     " . $bindReport{$dn}{"cmp"} . "\n");
-    print("        ModRDNs:      " . $bindReport{$dn}{"modrdn"} . "\n");
-    print("        Ext Ops:      " . $bindReport{$dn}{"ext"} . "\n\n");
-}
-
-#######################################
-#                                     #
-#             The  End                #
-#                                     #
-#######################################
-
-- 
1.8.1.4