Changed how the values in 'fail2ban.pm' are shown.

With the new option 'graph_mode' the values are, by default, shown with
absolute values. This new option permits switching between 'absolute' and
'rate'. #241
This commit is contained in:
Jordi Sanfeliu 2019-05-14 13:16:50 +02:00
parent ddfb379157
commit 28ed22b311
3 changed files with 80 additions and 44 deletions

View File

@ -11,9 +11,13 @@
- Added support for FreeBSD NFS Server stats. [#238]
- Added the new option 'rrdtool_extra_options' to be able to include RRDtool
extra options on every graph.
(suggested by Greg Ogonowski, greg AT indexcom.com)
- Changed the main loop functionality using now the select() function, instead
of the alarm()+pause() pair. This should improve the responsiveness on high
system loads. [#230]
- Changed how the values in 'fail2ban.pm' are shown. Now it shows the Bans as
absolute values. The new option 'graph_mode' permits switching between
'absolute' (default) and 'rate'. [#241]
- Fixed the copyright year in 'monitorix.cgi'.
- Fixed in 'mail.pm to use the option 'mail_log' instead the hard coded path I
forgot to remove when adding the Exim support.

View File

@ -142,48 +142,70 @@ sub fail2ban_update {
my $str;
my $rrdata = "N";
if(! -r $config->{fail2ban_log}) {
logger("Couldn't find file '$config->{fail2ban_log}': $!");
return;
}
$seek_pos = $config->{fail2ban_hist} || 0;
$seek_pos = defined($seek_pos) ? int($seek_pos) : 0;
open(IN, $config->{fail2ban_log});
if(!seek(IN, 0, 2)) {
logger("Couldn't seek to the end of '$config->{fail2ban_log}': $!");
return;
}
$logsize = tell(IN);
if($logsize < $seek_pos) {
$seek_pos = 0;
}
if(!seek(IN, $seek_pos, 0)) {
logger("Couldn't seek to $seek_pos in '$config->{fail2ban_log}': $!");
return;
}
if($config->{fail2ban_hist} > 0) { # avoids initial peak
my $date = strftime("%Y-%m-%d", localtime);
while(<IN>) {
if(/^$date/) {
my $e = 0;
while($e < scalar(my @fl = split(',', $fail2ban->{list}))) {
my $e2 = 0;
foreach my $i (split(',', $fail2ban->{desc}->{$e})) {
($str = trim($i)) =~ s/\[/\\[/;
$str =~ s/\]/\\]/;
$jails[$e][$e2] = 0 unless defined $jails[$e][$e2];
if(/ $str Ban /) {
$jails[$e][$e2]++;
if(lc($fail2ban->{graph_mode} || "") ne "rate") {
my $e = 0;
while($e < scalar(my @fl = split(',', $fail2ban->{list}))) {
my $e2 = 0;
foreach my $i (split(',', $fail2ban->{desc}->{$e})) {
($str = trim($i)) =~ s/\[//;
$str =~ s/\]//;
$jails[$e][$e2] = 0 unless defined $jails[$e][$e2];
if(open(IN, "fail2ban-client status $str |")) {
while(<IN>) {
if(/- Currently banned:\s+(\d+)$/) {
$jails[$e][$e2] = $1;
}
$e2++;
}
$e++;
close(IN);
}
$e2++;
}
$e++;
}
} else {
if(! -r $config->{fail2ban_log}) {
logger("Couldn't find file '$config->{fail2ban_log}': $!");
return;
}
$seek_pos = $config->{fail2ban_hist} || 0;
$seek_pos = defined($seek_pos) ? int($seek_pos) : 0;
open(IN, $config->{fail2ban_log});
if(!seek(IN, 0, 2)) {
logger("Couldn't seek to the end of '$config->{fail2ban_log}': $!");
return;
}
$logsize = tell(IN);
if($logsize < $seek_pos) {
$seek_pos = 0;
}
if(!seek(IN, $seek_pos, 0)) {
logger("Couldn't seek to $seek_pos in '$config->{fail2ban_log}': $!");
return;
}
if($config->{fail2ban_hist} > 0) { # avoids initial peak
my $date = strftime("%Y-%m-%d", localtime);
while(<IN>) {
if(/^$date/) {
my $e = 0;
while($e < scalar(my @fl = split(',', $fail2ban->{list}))) {
my $e2 = 0;
foreach my $i (split(',', $fail2ban->{desc}->{$e})) {
($str = trim($i)) =~ s/\[/\\[/;
$str =~ s/\]/\\]/;
$jails[$e][$e2] = 0 unless defined $jails[$e][$e2];
if(/ $str Ban /) {
$jails[$e][$e2]++;
}
$e2++;
}
$e++;
}
}
}
}
close(IN);
}
close(IN);
my $e = 0;
while($e < scalar(my @fl = split(',', $fail2ban->{list}))) {
@ -234,6 +256,7 @@ sub fail2ban_cgi {
my @tmp;
my @tmpz;
my @CDEF;
my $vlabel = "Bans";
my $n;
my $n2;
my $str;
@ -259,6 +282,9 @@ sub fail2ban_cgi {
foreach my $i (split(',', $config->{rrdtool_extra_options} || "")) {
push(@extra, trim($i)) if trim($i);
}
if(lc($fail2ban->{graph_mode} || "") eq "rate") {
$vlabel = "Bans/min";
}
$title = !$silent ? $title : "";
@ -374,11 +400,10 @@ sub fail2ban_cgi {
my $e = 0;
foreach my $i (split(',', $fail2ban->{desc}->{$n})) {
$str = sprintf("%-25s", substr(trim($i), 0, 25));
push(@tmp, "LINE1:j" . ($e + 1) . $LC[$e] . ":$str");
push(@tmp, "GPRINT:j" . ($e + 1) . ":LAST: Cur\\:%2.0lf\\g");
push(@tmp, "GPRINT:j" . ($e + 1) . ":AVERAGE: Avg\\:%2.0lf\\g");
push(@tmp, "GPRINT:j" . ($e + 1) . ":MIN: Min\\:%2.0lf\\g");
push(@tmp, "GPRINT:j" . ($e + 1) . ":MAX: Max\\:%2.0lf\\n");
push(@tmp, "LINE2:j" . ($e + 1) . $LC[$e] . ":$str");
push(@tmp, "GPRINT:j" . ($e + 1) . ":LAST: Cur\\:%3.0lf\\g");
push(@tmp, "GPRINT:j" . ($e + 1) . ":AVERAGE: Avg\\:%3.0lf\\g");
push(@tmp, "GPRINT:j" . ($e + 1) . ":MAX: Max\\:%3.0lf\\n");
push(@tmpz, "LINE2:j" . ($e + 1) . $LC[$e] . ":$str");
$e++;
}
@ -397,7 +422,7 @@ sub fail2ban_cgi {
"--title=$str ($tf->{nwhen}$tf->{twhen})",
"--start=-$tf->{nwhen}$tf->{twhen}",
"--imgformat=$imgfmt_uc",
"--vertical-label=Bans/min",
"--vertical-label=$vlabel",
"--width=$width",
"--height=$height",
@extra,
@ -426,7 +451,7 @@ sub fail2ban_cgi {
"--title=$str ($tf->{nwhen}$tf->{twhen})",
"--start=-$tf->{nwhen}$tf->{twhen}",
"--imgformat=$imgfmt_uc",
"--vertical-label=Bans/min",
"--vertical-label=$vlabel",
"--width=$width",
"--height=$height",
@extra,

View File

@ -452,7 +452,7 @@ Default value: \fI/var/log/proftpd/access.log\fP
.P
.BI fail2ban_log
.RS
This is the path to the Fail2ban log file. Monitorix uses this file to report IP addresses banned.
This is the path to the Fail2ban log file. Monitorix uses this file only if the option \fBgraph_mode\fP has the value \fIrate\fP.
.P
Default value: \fI/var/log/fail2ban.log\fP
.RE
@ -2642,6 +2642,13 @@ This is the number of fail2ban graphs that will be put in a row.
.P
Default value: \fI2\fP
.RE
.P
.BI graph_mode
.RS
This option changes how the values are represented in the graph. It has two possible values: \fIabsolute\fP which is the default, and \fIrate\fP. The former takes the values directly from the command \fIfail2ban-client status <JAIL>\fP and so the values in the graph will appear as absolute. The later option shows the values in a rating format per minute.
.P
Default value: \fIabsolute\fP
.RE
.SS Icecast Streaming Media Server (icecast.pm)
This graph is able to monitor an unlimited number of Icecast servers.
.P