|
 |
dc8c34 |
From 5c3d35055fa16a319600c83bd9cacd040b63ac39 Mon Sep 17 00:00:00 2001
|
|
 |
dc8c34 |
From: Mark Reynolds <mreynolds@redhat.com>
|
|
 |
dc8c34 |
Date: Wed, 28 May 2014 14:38:03 -0400
|
|
 |
dc8c34 |
Subject: [PATCH 216/225] Ticket 47446 - logconv.pl memory continually grows
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
Bug Description: Running logconv.pl without any special options
|
|
 |
dc8c34 |
continually consumes more memory.
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
Fix Description: The main "leak" was a file descriptor array that
|
|
 |
dc8c34 |
was constantly growing with every connection, but
|
|
 |
dc8c34 |
the array served no purpose - so it was removed.
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
Some other minor changes were made: output formating
|
|
 |
dc8c34 |
improvements, making sure verbose hashes were not
|
|
 |
dc8c34 |
being updated if the verbose optoin was not enabled,
|
|
 |
dc8c34 |
and not calling the CSV report fiunctions if a report
|
|
 |
dc8c34 |
was not being asked for.
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
https://fedorahosted.org/389/ticket/47446
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
Reviewed by: nhosoi(Thanks!)
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
(cherry picked from commit 805386caff210ac07a428b38e99ea7b853bece1f)
|
|
 |
dc8c34 |
(cherry picked from commit 519c58e8082ef093e676eb7a1aaaec03a739ea69)
|
|
 |
dc8c34 |
(cherry picked from commit bf4cbf12875cf46d4eecd67a579c857c997e1ce9)
|
|
 |
dc8c34 |
---
|
|
 |
dc8c34 |
ldap/admin/src/logconv.pl | 133 ++++++++++++++++++++++++++++------------------
|
|
 |
dc8c34 |
1 file changed, 80 insertions(+), 53 deletions(-)
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
diff --git a/ldap/admin/src/logconv.pl b/ldap/admin/src/logconv.pl
|
|
 |
dc8c34 |
index ea33544..edc5fd1 100755
|
|
 |
dc8c34 |
--- a/ldap/admin/src/logconv.pl
|
|
 |
dc8c34 |
+++ b/ldap/admin/src/logconv.pl
|
|
 |
dc8c34 |
@@ -56,7 +56,7 @@ Getopt::Long::Configure ("bundling");
|
|
 |
dc8c34 |
Getopt::Long::Configure ("permute");
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
if ($#ARGV < 0){;
|
|
 |
dc8c34 |
-&displayUsage;
|
|
 |
dc8c34 |
+ &displayUsage;
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
#######################################
|
|
 |
dc8c34 |
@@ -78,8 +78,8 @@ my $dataLocation = "/tmp";
|
|
 |
dc8c34 |
my $startTLSoid = "1.3.6.1.4.1.1466.20037";
|
|
 |
dc8c34 |
my @statnames=qw(last last_str results srch add mod modrdn moddn cmp del abandon
|
|
 |
dc8c34 |
conns sslconns bind anonbind unbind notesA notesU etime);
|
|
 |
dc8c34 |
-my $s_stats = new_stats_block( );
|
|
 |
dc8c34 |
-my $m_stats = new_stats_block( );
|
|
 |
dc8c34 |
+my $s_stats;
|
|
 |
dc8c34 |
+my $m_stats;
|
|
 |
dc8c34 |
my $verb = "no";
|
|
 |
dc8c34 |
my @excludeIP;
|
|
 |
dc8c34 |
my $xi = 0;
|
|
 |
dc8c34 |
@@ -99,7 +99,6 @@ my %bindReport;
|
|
 |
dc8c34 |
my @vlvconn;
|
|
 |
dc8c34 |
my @vlvop;
|
|
 |
dc8c34 |
my @fds;
|
|
 |
dc8c34 |
-my $fdds = 0;
|
|
 |
dc8c34 |
my $reportBinds = "no";
|
|
 |
dc8c34 |
my $rootDN = "";
|
|
 |
dc8c34 |
my $needCleanup = 0;
|
|
 |
dc8c34 |
@@ -392,34 +391,28 @@ sub statusreport {
|
|
 |
dc8c34 |
##########################################
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
if ($files[$#files] =~ m/access.rotationinfo/) { $file_count--; }
|
|
 |
dc8c34 |
+$logCount = $file_count;
|
|
 |
dc8c34 |
+
|
|
 |
dc8c34 |
+print "Processing $logCount Access Log(s)...\n";
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
-print "Processing $file_count Access Log(s)...\n\n";
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
#print "Filename\t\t\t Total Lines\n";
|
|
 |
dc8c34 |
#print "--------------------------------------------------\n";
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
my $skipFirstFile = 0;
|
|
 |
dc8c34 |
-if ($file_count > 1 && $files[0] =~ /\/access$/){
|
|
 |
dc8c34 |
- $files[$file_count] = $files[0];
|
|
 |
dc8c34 |
- $file_count++;
|
|
 |
dc8c34 |
- $skipFirstFile = 1;
|
|
 |
dc8c34 |
+if ($logCount > 1 && $files[0] =~ /\/access$/){
|
|
 |
dc8c34 |
+ $files[$logCount] = $files[0];
|
|
 |
dc8c34 |
+ $skipFirstFile = 1;
|
|
 |
dc8c34 |
+ $file_count++;
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
-$logCount = $file_count;
|
|
 |
dc8c34 |
+
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
my $logline;
|
|
 |
dc8c34 |
my $totalLineCount = 0;
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
for (my $count=0; $count < $file_count; $count++){
|
|
 |
dc8c34 |
# we moved access to the end of the list, so if its the first file skip it
|
|
 |
dc8c34 |
- if($file_count > 1 && $count == 0 && $skipFirstFile == 1){
|
|
 |
dc8c34 |
- next;
|
|
 |
dc8c34 |
- }
|
|
 |
dc8c34 |
- if($file_count > 1 && $count == 0 && $skipFirstFile == 1){
|
|
 |
dc8c34 |
- next;
|
|
 |
dc8c34 |
- }
|
|
 |
dc8c34 |
- if (-z $files[$count]){
|
|
 |
dc8c34 |
- # access log is empty
|
|
 |
dc8c34 |
- print "Skipping empty access log ($files[$count])...\n";
|
|
 |
dc8c34 |
+ if($logCount > 1 && $count == 0 && $skipFirstFile == 1){
|
|
 |
dc8c34 |
next;
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
$linesProcessed = 0; $lineBlockCount = 0;
|
|
 |
dc8c34 |
@@ -428,6 +421,12 @@ for (my $count=0; $count < $file_count; $count++){
|
|
 |
dc8c34 |
$atime,$mtime,$ctime,$blksize,$blocks) = stat($files[$count]);
|
|
 |
dc8c34 |
print sprintf "[%03d] %-30s\tsize (bytes): %12s\n",$logCount, $files[$count], $cursize;
|
|
 |
dc8c34 |
$logCount--;
|
|
 |
dc8c34 |
+ if ($cursize == 0){
|
|
 |
dc8c34 |
+ # access log is empty
|
|
 |
dc8c34 |
+ print "Skipping empty access log ($files[$count])...\n";
|
|
 |
dc8c34 |
+ next;
|
|
 |
dc8c34 |
+ }
|
|
 |
dc8c34 |
+
|
|
 |
dc8c34 |
my $logCountStr;
|
|
 |
dc8c34 |
if($logCount < 10 ){
|
|
 |
dc8c34 |
# add a zero for formatting purposes
|
|
 |
dc8c34 |
@@ -612,6 +611,12 @@ if($reportBinds eq "yes"){
|
|
 |
dc8c34 |
&displayBindReport();
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
+if($reportStats ne ""){
|
|
 |
dc8c34 |
+ # No need to print the general report, so exit here
|
|
 |
dc8c34 |
+ removeDataFiles();
|
|
 |
dc8c34 |
+ exit (0);
|
|
 |
dc8c34 |
+}
|
|
 |
dc8c34 |
+
|
|
 |
dc8c34 |
#
|
|
 |
dc8c34 |
# Continue with standard report
|
|
 |
dc8c34 |
#
|
|
 |
dc8c34 |
@@ -1366,9 +1371,9 @@ if ($usage =~ /j/i || $verb eq "yes"){
|
|
 |
dc8c34 |
# We're done, clean up the data files
|
|
 |
dc8c34 |
#
|
|
 |
dc8c34 |
removeDataFiles();
|
|
 |
dc8c34 |
-
|
|
 |
dc8c34 |
exit (0);
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
+
|
|
 |
dc8c34 |
#######################
|
|
 |
dc8c34 |
# #
|
|
 |
dc8c34 |
# Display Usage #
|
|
 |
dc8c34 |
@@ -1524,7 +1529,11 @@ parseLineBind {
|
|
 |
dc8c34 |
$bindReport{$dn}{"failedBind"} = 0;
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
if ($_ =~ /conn= *([0-9A-Z]+)/i) {
|
|
 |
dc8c34 |
- $bindReport{$dn}{"conn"} = $bindReport{$dn}{"conn"} . " $1 ";
|
|
 |
dc8c34 |
+ if($bindReport{$dn}{"conn"}){
|
|
 |
dc8c34 |
+ $bindReport{$dn}{"conn"} = $bindReport{$dn}{"conn"} . " $1 ";
|
|
 |
dc8c34 |
+ } else {
|
|
 |
dc8c34 |
+ $bindReport{$dn}{"conn"} = $1;
|
|
 |
dc8c34 |
+ }
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
return;
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
@@ -1645,7 +1654,7 @@ sub parseLineNormal
|
|
 |
dc8c34 |
|
|
 |
dc8c34 |
# Additional performance stats
|
|
 |
dc8c34 |
my ($time, $tzone) = split (' ', $_);
|
|
 |
dc8c34 |
- if (($reportStats or ($verb eq "yes") || ($usage =~ /y/)) && (!defined($last_tm) or ($time ne $last_tm)))
|
|
 |
dc8c34 |
+ if (($reportStats || ($verb eq "yes") || ($usage =~ /y/)) && (!defined($last_tm) or ($time ne $last_tm)))
|
|
 |
dc8c34 |
{
|
|
 |
dc8c34 |
$last_tm = $time;
|
|
 |
dc8c34 |
$time =~ s/\[//;
|
|
 |
dc8c34 |
@@ -1685,12 +1694,16 @@ sub parseLineNormal
|
|
 |
dc8c34 |
if($reportStats){ inc_stats('srch',$s_stats,$m_stats); }
|
|
 |
dc8c34 |
if ($_ =~ / attrs=\"(.*)\"/i){
|
|
 |
dc8c34 |
$anyAttrs++;
|
|
 |
dc8c34 |
- my $attr = $hashes->{attr};
|
|
 |
dc8c34 |
- map { $attr->{$_}++ } split /\s/, $1;
|
|
 |
dc8c34 |
+ if ($usage =~ /r/i || $verb eq "yes"){
|
|
 |
dc8c34 |
+ my $attr = $hashes->{attr};
|
|
 |
dc8c34 |
+ map { $attr->{$_}++ } split /\s/, $1;
|
|
 |
dc8c34 |
+ }
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
if (/ attrs=ALL/){
|
|
 |
dc8c34 |
- my $attr = $hashes->{attr};
|
|
 |
dc8c34 |
- $attr->{"All Attributes"}++;
|
|
 |
dc8c34 |
+ if ($usage =~ /r/i || $verb eq "yes"){
|
|
 |
dc8c34 |
+ my $attr = $hashes->{attr};
|
|
 |
dc8c34 |
+ $attr->{"All Attributes"}++;
|
|
 |
dc8c34 |
+ }
|
|
 |
dc8c34 |
$anyAttrs++;
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
if ($verb eq "yes"){
|
|
 |
dc8c34 |
@@ -1768,16 +1781,20 @@ sub parseLineNormal
|
|
 |
dc8c34 |
$bindCount++;
|
|
 |
dc8c34 |
if($reportStats){ inc_stats('bind',$s_stats,$m_stats); }
|
|
 |
dc8c34 |
if ($1 ne ""){
|
|
 |
dc8c34 |
- $tmpp = $1;
|
|
 |
dc8c34 |
- $tmpp =~ tr/A-Z/a-z/;
|
|
 |
dc8c34 |
- $hashes->{bindlist}->{$tmpp}++;
|
|
 |
dc8c34 |
if($1 eq $rootDN){
|
|
 |
dc8c34 |
$rootDNBindCount++;
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
+ if($usage =~ /f/ || $usage =~ /u/ || $usage =~ /U/ || $usage =~ /b/ || $verb eq "yes"){
|
|
 |
dc8c34 |
+ $tmpp = $1;
|
|
 |
dc8c34 |
+ $tmpp =~ tr/A-Z/a-z/;
|
|
 |
dc8c34 |
+ $hashes->{bindlist}->{$tmpp}++;
|
|
 |
dc8c34 |
+ }
|
|
 |
dc8c34 |
} else {
|
|
 |
dc8c34 |
$anonymousBindCount++;
|
|
 |
dc8c34 |
- $hashes->{bindlist}->{"Anonymous Binds"}++;
|
|
 |
dc8c34 |
- inc_stats('anonbind',$s_stats,$m_stats);
|
|
 |
dc8c34 |
+ if($usage =~ /f/ || $usage =~ /u/ || $usage =~ /U/ || $usage =~ /b/ || $verb eq "yes"){
|
|
 |
dc8c34 |
+ $hashes->{bindlist}->{"Anonymous Binds"}++;
|
|
 |
dc8c34 |
+ if($reportStats){ inc_stats('anonbind',$s_stats,$m_stats); }
|
|
 |
dc8c34 |
+ }
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
if (m/ connection from/){
|
|
 |
dc8c34 |
@@ -1796,15 +1813,20 @@ sub parseLineNormal
|
|
 |
dc8c34 |
if ($simConnection > $maxsimConnection) {
|
|
 |
dc8c34 |
$maxsimConnection = $simConnection;
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
- ($connID) = $_ =~ /conn=(\d*)\s/;
|
|
 |
dc8c34 |
- $openConnection{$connID} = $ip;
|
|
 |
dc8c34 |
- if ($reportStats or ($verb eq "yes") || ($usage =~ /y/)) {
|
|
 |
dc8c34 |
- $hashes->{start_time_of_connection}->{$connID} = $gmtime;
|
|
 |
dc8c34 |
+ if ($verb eq "yes" || $usage =~ /p/ || $reportStats){
|
|
 |
dc8c34 |
+ ($connID) = $_ =~ /conn=(\d*)\s/;
|
|
 |
dc8c34 |
+ $openConnection{$connID} = $ip;
|
|
 |
dc8c34 |
+ if ($reportStats or ($verb eq "yes") || ($usage =~ /y/)) {
|
|
 |
dc8c34 |
+ $hashes->{start_time_of_connection}->{$connID} = $gmtime;
|
|
 |
dc8c34 |
+ }
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
if (m/ SSL client bound as /){$sslClientBindCount++;}
|
|
 |
dc8c34 |
if (m/ SSL failed to map client certificate to LDAP DN/){$sslClientFailedCount++;}
|
|
 |
dc8c34 |
- if (m/ fd=/ && m/slot=/){$fdTaken++}
|
|
 |
dc8c34 |
+ if (m/slot=/ && $_ =~ /fd= *([0-9]+)/i) {
|
|
 |
dc8c34 |
+ $fdTaken++;
|
|
 |
dc8c34 |
+ if ($1 > $highestFdTaken){ $highestFdTaken = $1; }
|
|
 |
dc8c34 |
+ }
|
|
 |
dc8c34 |
if (m/ fd=/ && m/closed/){
|
|
 |
dc8c34 |
($connID) = $_ =~ /conn=(\d*)\s/;
|
|
 |
dc8c34 |
handleConnClose($connID);
|
|
 |
dc8c34 |
@@ -1819,20 +1841,20 @@ sub parseLineNormal
|
|
 |
dc8c34 |
$op = $2;
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
if ($binddn ne ""){
|
|
 |
dc8c34 |
- if($binddn eq $rootDN){$rootDNBindCount++;}
|
|
 |
dc8c34 |
- $tmpp = $binddn;
|
|
 |
dc8c34 |
- $tmpp =~ tr/A-Z/a-z/;
|
|
 |
dc8c34 |
- $hashes->{bindlist}->{$tmpp}++;
|
|
 |
dc8c34 |
- if($usage =~ /f/ || $verb eq "yes"){
|
|
 |
dc8c34 |
+ if($binddn eq $rootDN){ $rootDNBindCount++; }
|
|
 |
dc8c34 |
+ if($usage =~ /f/ || $usage =~ /u/ || $usage =~ /U/ || $usage =~ /b/ || $verb eq "yes"){
|
|
 |
dc8c34 |
+ $tmpp = $binddn;
|
|
 |
dc8c34 |
+ $tmpp =~ tr/A-Z/a-z/;
|
|
 |
dc8c34 |
+ $hashes->{bindlist}->{$tmpp}++;
|
|
 |
dc8c34 |
$hashes->{bind_conn_op}->{"$serverRestartCount,$conn,$op"} = $tmpp;
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
} else {
|
|
 |
dc8c34 |
$anonymousBindCount++;
|
|
 |
dc8c34 |
- $hashes->{bindlist}->{"Anonymous Binds"}++;
|
|
 |
dc8c34 |
- if($usage =~ /f/ || $verb eq "yes"){
|
|
 |
dc8c34 |
+ if($usage =~ /f/ || $usage =~ /u/ || $usage =~ /U/ || $usage =~ /b/ || $verb eq "yes"){
|
|
 |
dc8c34 |
+ $hashes->{bindlist}->{"Anonymous Binds"}++;
|
|
 |
dc8c34 |
$hashes->{bind_conn_op}->{"$serverRestartCount,$conn,$op"} = "";
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
- inc_stats('anonbind',$s_stats,$m_stats);
|
|
 |
dc8c34 |
+ if($reportStats){ inc_stats('anonbind',$s_stats,$m_stats); }
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
if (m/ UNBIND/){
|
|
 |
dc8c34 |
@@ -2109,20 +2131,30 @@ sub parseLineNormal
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
if ($_ =~ /err= *([0-9]+)/i){
|
|
 |
dc8c34 |
- $errorCode[$1]++;
|
|
 |
dc8c34 |
+ if ($usage =~ /e/i || $verb eq "yes"){ $errorCode[$1]++; }
|
|
 |
dc8c34 |
if ($1 ne "0"){ $errorCount++;}
|
|
 |
dc8c34 |
else { $successCount++;}
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
- if ($_ =~ /etime= *([0-9.]+)/ ) { $hashes->{etime}->{$1}++; inc_stats_val('etime',$1,$s_stats,$m_stats); }
|
|
 |
dc8c34 |
+ if ($_ =~ /etime= *([0-9.]+)/ ) {
|
|
 |
dc8c34 |
+ my $etime_val = $1;
|
|
 |
dc8c34 |
+ if ($usage =~ /t/i || $verb eq "yes"){ $hashes->{etime}->{$etime_val}++; }
|
|
 |
dc8c34 |
+ if ($reportStats){ inc_stats_val('etime',$etime_val,$s_stats,$m_stats); }
|
|
 |
dc8c34 |
+ }
|
|
 |
dc8c34 |
if ($_ =~ / tag=101 / || $_ =~ / tag=111 / || $_ =~ / tag=100 / || $_ =~ / tag=115 /){
|
|
 |
dc8c34 |
- if ($_ =~ / nentries= *([0-9]+)/i ){ $hashes->{nentries}->{$1}++; }
|
|
 |
dc8c34 |
+ if ($_ =~ / nentries= *([0-9]+)/i ){
|
|
 |
dc8c34 |
+ if ($usage =~ /n/i || $verb eq "yes"){
|
|
 |
dc8c34 |
+ $hashes->{nentries}->{$1}++;
|
|
 |
dc8c34 |
+ }
|
|
 |
dc8c34 |
+ }
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
if (m/objectclass=\*/i || m/objectclass=top/i ){
|
|
 |
dc8c34 |
if (m/ scope=2 /){ $objectclassTopCount++;}
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
if (m/ EXT oid=/){
|
|
 |
dc8c34 |
$extopCount++;
|
|
 |
dc8c34 |
- if ($_ =~ /oid=\" *([0-9\.]+)/i ){ $hashes->{oid}->{$1}++; }
|
|
 |
dc8c34 |
+ if ($_ =~ /oid=\" *([0-9\.]+)/i ){
|
|
 |
dc8c34 |
+ if ($usage =~ /x/i || $verb eq "yes"){$hashes->{oid}->{$1}++; }
|
|
 |
dc8c34 |
+ }
|
|
 |
dc8c34 |
if ($1 && $1 eq $startTLSoid){$startTLSCount++;}
|
|
 |
dc8c34 |
if ($verb eq "yes"){
|
|
 |
dc8c34 |
if ($_ =~ /conn= *([0-9A-Z]+) +op= *([0-9\-]+)/i){ $hashes->{ext_conn_op}->{"$serverRestartCount,$1,$2"}++;}
|
|
 |
dc8c34 |
@@ -2182,11 +2214,6 @@ sub parseLineNormal
|
|
 |
dc8c34 |
$scopeCount++;
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
}
|
|
 |
dc8c34 |
- if ($_ =~ /fd= *([0-9]+)/i ) {
|
|
 |
dc8c34 |
- $fds[$fdds] = $1;
|
|
 |
dc8c34 |
- if ($fds[$fdds] > $highestFdTaken) {$highestFdTaken = $fds[$fdds];}
|
|
 |
dc8c34 |
- $fdds++;
|
|
 |
dc8c34 |
- }
|
|
 |
dc8c34 |
if ($usage =~ /f/ || $verb eq "yes"){
|
|
 |
dc8c34 |
if (/ err=49 tag=/ && / dn=\"/){
|
|
 |
dc8c34 |
if ($_ =~ /dn=\"(.*)\"/i ){
|
|
 |
dc8c34 |
--
|
|
 |
dc8c34 |
1.8.1.4
|
|
 |
dc8c34 |
|