summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/patches/0100-new_syslog_format.patch~1239
1 files changed, 0 insertions, 1239 deletions
diff --git a/debian/patches/0100-new_syslog_format.patch~ b/debian/patches/0100-new_syslog_format.patch~
deleted file mode 100644
index 5344f07..0000000
--- a/debian/patches/0100-new_syslog_format.patch~
+++ /dev/null
@@ -1,1239 +0,0 @@
-Description: Add new syslog format
-Author: M.D. Klapwijk
-Origin: https://gist.github.com/mdklapwijk/4f8d2fc39f09f4aa615cbf8ffae0379a
-Bug: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1051496
-Forwarded: not-needed
-Last-Update: 2023-09-23
----
-This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
-Index: trunk/mailgraph.pl
-===================================================================
---- trunk.orig/mailgraph.pl
-+++ trunk/mailgraph.pl
-@@ -5,6 +5,10 @@
- # copyright (c) 2000-2007 David Schweikert <david@schweikert.ch>
- # released under the GNU General Public License
-
-+# modifications to handle rsyslog high precision format
-+# copyright (c) 2018 by M.D. Klapwijk
-+# released under the GNU General Public License
-+
- ######## Parse::Syslog 1.09 (automatically embedded) ########
- package Parse::Syslog;
- use Carp;
-@@ -85,7 +89,7 @@ sub str2time($$$$$$$$)
- # - compensate if yes
- # note that we assume that the DST-switch goes like this:
- # time 1:00 1:30 2:00 2:30 2:00 2:30 3:00 3:30
-- # stamp 1 2 3 4 3 3 7 8
-+ # stamp 1 2 3 4 3 3 7 8
- # comp. 0 0 0 0 2 2 0 0
- # result 1 2 3 4 5 6 7 8
- # old Time::Local versions behave differently (1 2 5 6 5 6 7 8)
-@@ -202,27 +206,46 @@ sub _next_syslog($)
- }
- my $file = $self->{file};
- line: while(defined (my $str = $self->_next_line)) {
-- # date, time and host
-- $str =~ /^
-- (\S{3})\s+(\d+) # date -- 1, 2
-- \s
-- (\d+):(\d+):(\d+) # time -- 3, 4, 5
-- (?:\s<\w+\.\w+>)? # FreeBSD's verbose-mode
-- \s
-- ([-\w\.\@:]+) # host -- 6
-- \s+
-- (?:\[LOG_[A-Z]+\]\s+)? # FreeBSD
-- (.*) # text -- 7
-- $/x or do
-- {
-- warn "WARNING: line not in syslog format: $str";
-- next line;
-- };
-- my $mon = $months_map{$1};
-- defined $mon or croak "unknown month $1\n";
-- $self->_year_increment($mon);
-+ # date, time and host
-+ my ($year, $mon, $day, $hour, $min, $sec, $host, $text);
-+ if($self->{type} eq 'rsyslog') {
-+ ($year, $mon, $day, $hour, $min, $sec, $host, $text) = $str =~ /^
-+ (\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)\S+ # datetime
-+ \s+
-+ (\S+) # host
-+ \s+
-+ (.*) # text
-+ $/x or do
-+ {
-+ warn "WARNING: line not in high precision rsyslog format: $str";
-+ next line;
-+ };
-+ $mon--;
-+ $self->{year}=$year;
-+ }
-+ else {
-+ my($montxt, $mon);
-+ ($montxt, $day, $hour, $min, $sec, $host, $text) = $str =~ /^
-+ (\S{3})\s+(\d+) # date
-+ \s
-+ (\d+):(\d+):(\d+) # time
-+ (?:\s<\w+\.\w+>)? # FreeBSD's verbose-mode
-+ \s
-+ ([-\w\.\@:]+) # host
-+ \s+
-+ (?:\[LOG_[A-Z]+\]\s+)? # FreeBSD
-+ (.*) # text
-+ $/x or do
-+ {
-+ warn "WARNING: line not in syslog format: $str";
-+ next line;
-+ };
-+ $mon = $months_map{$montxt};
-+ defined $mon or croak "unknown month $montxt\n";
-+ $self->_year_increment($mon);
-+ }
- # convert to unix time
-- my $time = $self->str2time($5,$4,$3,$2,$mon,$self->{year}-1900,$self->{GMT});
-+ my $time = $self->str2time($sec,$min,$hour,$day,$mon,$self->{year}-1900,$self->{GMT});
- if(not $self->{allow_future}) {
- # accept maximum one day in the present future
- if($time - time > 86400) {
-@@ -230,7 +253,6 @@ sub _next_syslog($)
- next line;
- }
- }
-- my ($host, $text) = ($6, $7);
- # last message repeated ... times
- if($text =~ /^(?:last message repeated|above message repeats) (\d+) time/) {
- next line if defined $self->{repeat} and not $self->{repeat};
-@@ -264,11 +286,11 @@ sub _next_syslog($)
- };
- if($self->{arrayref}) {
- $self->{_last_data}{$host} = [
-- $time, # 0: timestamp
-- $host, # 1: host
-- $1, # 2: program
-- $2, # 3: pid
-- $6, # 4: text
-+ $time, # 0: timestamp
-+ $host, # 1: host
-+ $1, # 2: program
-+ $2, # 3: pid
-+ $6, # 4: text
- ];
- }
- else {
-@@ -292,12 +314,12 @@ sub _next_metalog($)
- my ($self) = @_;
- my $file = $self->{file};
- line: while(my $str = $self->_next_line) {
-- # date, time and host
-- $str =~ /^
-+ # date, time and host
-+ $str =~ /^
- (\S{3})\s+(\d+) # date -- 1, 2
- \s
- (\d+):(\d+):(\d+) # time -- 3, 4, 5
-- # host is not logged
-+ # host is not logged
- \s+
- (.*) # text -- 6
- $/x or do
-@@ -310,22 +332,22 @@ sub _next_metalog($)
- $self->_year_increment($mon);
- # convert to unix time
- my $time = $self->str2time($5,$4,$3,$2,$mon,$self->{year}-1900,$self->{GMT});
-- my $text = $6;
-+ my $text = $6;
- $text =~ /^
- \[(.*?)\] # program -- 1
-- # no PID
-- \s+
-+ # no PID
-+ \s+
- (.*) # text -- 2
- $/x or do
- {
-- warn "WARNING: text line not in metalog format: $text ($str)";
-+ warn "WARNING: text line not in metalog format: $text ($str)";
- next line;
- };
- if($self->{arrayref}) {
- return [
-- $time, # 0: timestamp
-- 'localhost', # 1: host
-- $1, # 2: program
-+ $time, # 0: timestamp
-+ 'localhost', # 1: host
-+ $1, # 2: program
- undef, # 3: (no) pid
- $2, # 4: text
- ];
-@@ -344,7 +366,7 @@ sub _next_metalog($)
- sub next($)
- {
- my ($self) = @_;
-- if($self->{type} eq 'syslog') {
-+ if($self->{type} eq 'syslog' || $self->{type} eq 'rsyslog') {
- return $self->_next_syslog();
- }
- elsif($self->{type} eq 'metalog') {
-@@ -373,15 +395,16 @@ my $points_per_sample = 3;
-
- my $daemon_logfile = '/var/log/mailgraph.log';
- my $daemon_pidfile = '/var/run/mailgraph.pid';
--my $daemon_rrd_dir = '/var/log';
-+my $daemon_rrd_dir = '/var/lib/mailgraph';
-
- # global variables
- my $logfile;
- my $rrd = "mailgraph.rrd";
- my $rrd_virus = "mailgraph_virus.rrd";
-+my $rrd_greylist = "mailgraph_greylist.rrd";
- my $year;
- my $this_minute;
--my %sum = ( sent => 0, received => 0, bounced => 0, rejected => 0, virus => 0, spam => 0 );
-+my %sum = ( sent => 0, received => 0, bounced => 0, rejected => 0, virus => 0, spam => 0, greylisted => 0, delayed => 0);
- my $rrd_inited=0;
-
- my %opt = ();
-@@ -395,499 +418,550 @@ sub event_bounced($);
- sub event_rejected($);
- sub event_virus($);
- sub event_spam($);
-+sub event_greylisted($);
-+sub event_delayed($);
- sub init_rrd($);
- sub update($);
-
- sub usage
- {
-- print "usage: mailgraph [*options*]\n\n";
-- print " -h, --help display this help and exit\n";
-- print " -v, --verbose be verbose about what you do\n";
-- print " -V, --version output version information and exit\n";
-- print " -c, --cat causes the logfile to be only read and not monitored\n";
-- print " -l, --logfile f monitor logfile f instead of /var/log/syslog\n";
-- print " -t, --logtype t set logfile's type (default: syslog)\n";
-- print " -y, --year starting year of the log file (default: current year)\n";
-- print " --host=HOST use only entries for HOST (regexp) in syslog\n";
-- print " -d, --daemon start in the background\n";
-- print " --daemon-pid=FILE write PID to FILE instead of /var/run/mailgraph.pid\n";
-- print " --daemon-rrd=DIR write RRDs to DIR instead of /var/log\n";
-- print " --daemon-log=FILE write verbose-log to FILE instead of /var/log/mailgraph.log\n";
-- print " --ignore-localhost ignore mail to/from localhost (used for virus scanner)\n";
-- print " --ignore-host=HOST ignore mail to/from HOST regexp (used for virus scanner)\n";
-- print " --only-mail-rrd update only the mail rrd\n";
-- print " --only-virus-rrd update only the virus rrd\n";
-- print " --rrd-name=NAME use NAME.rrd and NAME_virus.rrd for the rrd files\n";
-- print " --rbl-is-spam count rbl rejects as spam\n";
-- print " --virbl-is-virus count virbl rejects as viruses\n";
-+ print "usage: mailgraph [*options*]\n\n";
-+ print " -h, --help display this help and exit\n";
-+ print " -v, --verbose be verbose about what you do\n";
-+ print " -V, --version output version information and exit\n";
-+ print " -c, --cat causes the logfile to be only read and not monitored\n";
-+ print " -l, --logfile f monitor logfile f instead of /var/log/syslog\n";
-+ print " -t, --logtype t set logfile's type (default: syslog)\n";
-+ print " -y, --year starting year of the log file (default: current year)\n";
-+ print " --host=HOST use only entries for HOST (regexp) in syslog\n";
-+ print " -d, --daemon start in the background\n";
-+ print " --daemon-pid=FILE write PID to FILE instead of /var/run/mailgraph.pid\n";
-+ print " --daemon-rrd=DIR write RRDs to DIR instead of /var/lib/mailgraph\n";
-+ print " --daemon-log=FILE write verbose-log to FILE instead of /var/log/mailgraph.log\n";
-+ print " --ignore-localhost ignore mail to/from localhost (used for virus scanner)\n";
-+ print " --ignore-host=HOST ignore mail to/from HOST regexp (used for virus scanner)\n";
-+ print " --no-mail-rrd no update mail rrd\n";
-+ print " --no-virus-rrd no update virus rrd\n";
-+ print " --no-greylist-rrd no update greylist rrd\n";
-+ print " --rrd-name=NAME use NAME.rrd and NAME_virus.rrd for the rrd files\n";
-+ print " --rbl-is-spam count rbl rejects as spam\n";
-+ print " --virbl-is-virus count virbl rejects as viruses\n";
-
-- exit;
-+ exit;
- }
-
- sub main
- {
-- Getopt::Long::Configure('no_ignore_case');
-- GetOptions(\%opt, 'help|h', 'cat|c', 'logfile|l=s', 'logtype|t=s', 'version|V',
-- 'year|y=i', 'host=s', 'verbose|v', 'daemon|d!',
-- 'daemon_pid|daemon-pid=s', 'daemon_rrd|daemon-rrd=s',
-- 'daemon_log|daemon-log=s', 'ignore-localhost!', 'ignore-host=s@',
-- 'only-mail-rrd', 'only-virus-rrd', 'rrd_name|rrd-name=s',
-- 'rbl-is-spam', 'virbl-is-virus'
-- ) or exit(1);
-- usage if $opt{help};
--
-- if($opt{version}) {
-- print "mailgraph $VERSION by david\@schweikert.ch\n";
-- exit;
-- }
--
-- $daemon_pidfile = $opt{daemon_pid} if defined $opt{daemon_pid};
-- $daemon_logfile = $opt{daemon_log} if defined $opt{daemon_log};
-- $daemon_rrd_dir = $opt{daemon_rrd} if defined $opt{daemon_rrd};
-- $rrd = $opt{rrd_name}.".rrd" if defined $opt{rrd_name};
-- $rrd_virus = $opt{rrd_name}."_virus.rrd" if defined $opt{rrd_name};
--
-- # compile --ignore-host regexps
-- if(defined $opt{'ignore-host'}) {
-- for my $ih (@{$opt{'ignore-host'}}) {
-- push @{$opt{'ignore-host-re'}}, qr{\brelay=[^\s,]*$ih}i;
-- }
-- }
--
-- if($opt{daemon} or $opt{daemon_rrd}) {
-- chdir $daemon_rrd_dir or die "mailgraph: can't chdir to $daemon_rrd_dir: $!";
-- -w $daemon_rrd_dir or die "mailgraph: can't write to $daemon_rrd_dir\n";
-- }
--
-- daemonize if $opt{daemon};
--
-- my $logfile = defined $opt{logfile} ? $opt{logfile} : '/var/log/syslog';
-- my $file;
-- if($opt{cat}) {
-- $file = $logfile;
-- }
-- else {
-- $file = File::Tail->new(name=>$logfile, tail=>-1);
-- }
-- my $parser = new Parse::Syslog($file, year => $opt{year}, arrayref => 1,
-- type => defined $opt{logtype} ? $opt{logtype} : 'syslog');
--
-- if(not defined $opt{host}) {
-- while(my $sl = $parser->next) {
-- process_line($sl);
-- }
-- }
-- else {
-- my $host = qr/^$opt{host}$/i;
-- while(my $sl = $parser->next) {
-- process_line($sl) if $sl->[1] =~ $host;
-- }
-- }
-+ Getopt::Long::Configure('no_ignore_case');
-+ GetOptions(\%opt, 'help|h', 'cat|c', 'logfile|l=s', 'logtype|t=s', 'version|V',
-+ 'year|y=i', 'host=s', 'verbose|v', 'daemon|d!',
-+ 'daemon_pid|daemon-pid=s', 'daemon_rrd|daemon-rrd=s',
-+ 'daemon_log|daemon-log=s', 'ignore-localhost!', 'ignore-host=s@',
-+ 'no-mail-rrd', 'no-virus-rrd', 'no-greylist-rrd', 'rrd_name|rrd-name=s',
-+ 'rbl-is-spam', 'virbl-is-virus'
-+ ) or exit(1);
-+ usage if $opt{help};
-+
-+ if($opt{version}) {
-+ print "mailgraph $VERSION by david\@schweikert.ch\n";
-+ exit;
-+ }
-+
-+ $daemon_pidfile = $opt{daemon_pid} if defined $opt{daemon_pid};
-+ $daemon_logfile = $opt{daemon_log} if defined $opt{daemon_log};
-+ $daemon_rrd_dir = $opt{daemon_rrd} if defined $opt{daemon_rrd};
-+ $rrd = $opt{rrd_name}.".rrd" if defined $opt{rrd_name};
-+ $rrd_virus = $opt{rrd_name}."_virus.rrd" if defined $opt{rrd_name};
-+ $rrd_greylist = $opt{rrd_name}."_greylist.rrd" if defined $opt{rrd_name};
-+
-+ # compile --ignore-host regexps
-+ if(defined $opt{'ignore-host'}) {
-+ for my $ih (@{$opt{'ignore-host'}}) {
-+ push @{$opt{'ignore-host-re'}}, qr{\brelay=[^\s,]*$ih}i;
-+ }
-+ }
-+
-+ if($opt{daemon} or $opt{daemon_rrd}) {
-+ chdir $daemon_rrd_dir or die "mailgraph: can't chdir to $daemon_rrd_dir: $!";
-+ -w $daemon_rrd_dir or die "mailgraph: can't write to $daemon_rrd_dir\n";
-+ }
-+
-+ daemonize if $opt{daemon};
-+
-+ my $logfile = defined $opt{logfile} ? $opt{logfile} : '/var/log/syslog';
-+ my $file;
-+ if($opt{cat}) {
-+ $file = $logfile;
-+ }
-+ else {
-+ $file = File::Tail->new(name=>$logfile, tail=>-1);
-+ }
-+ my $parser = new Parse::Syslog($file, year => $opt{year}, arrayref => 1,
-+ type => defined $opt{logtype} ? $opt{logtype} : 'syslog');
-+
-+ if(not defined $opt{host}) {
-+ while(my $sl = $parser->next) {
-+ process_line($sl);
-+ }
-+ }
-+ else {
-+ my $host = qr/^$opt{host}$/i;
-+ while(my $sl = $parser->next) {
-+ process_line($sl) if $sl->[1] =~ $host;
-+ }
-+ }
- }
-
- sub daemonize()
- {
-- open STDIN, '/dev/null' or die "mailgraph: can't read /dev/null: $!";
-- if($opt{verbose}) {
-- open STDOUT, ">>$daemon_logfile"
-- or die "mailgraph: can't write to $daemon_logfile: $!";
-- }
-- else {
-- open STDOUT, '>/dev/null'
-- or die "mailgraph: can't write to /dev/null: $!";
-- }
-- defined(my $pid = fork) or die "mailgraph: can't fork: $!";
-- if($pid) {
-- # parent
-- open PIDFILE, ">$daemon_pidfile"
-- or die "mailgraph: can't write to $daemon_pidfile: $!\n";
-- print PIDFILE "$pid\n";
-- close(PIDFILE);
-- exit;
-- }
-- # child
-- setsid or die "mailgraph: can't start a new session: $!";
-- open STDERR, '>&STDOUT' or die "mailgraph: can't dup stdout: $!";
-+ open STDIN, '/dev/null' or die "mailgraph: can't read /dev/null: $!";
-+ if($opt{verbose}) {
-+ open STDOUT, ">>$daemon_logfile"
-+ or die "mailgraph: can't write to $daemon_logfile: $!";
-+ }
-+ else {
-+ open STDOUT, '>/dev/null'
-+ or die "mailgraph: can't write to /dev/null: $!";
-+ }
-+ defined(my $pid = fork) or die "mailgraph: can't fork: $!";
-+ if($pid) {
-+ # parent
-+ open PIDFILE, ">$daemon_pidfile"
-+ or die "mailgraph: can't write to $daemon_pidfile: $!\n";
-+ print PIDFILE "$pid\n";
-+ close(PIDFILE);
-+ exit;
-+ }
-+ # child
-+ setsid or die "mailgraph: can't start a new session: $!";
-+ open STDERR, '>&STDOUT' or die "mailgraph: can't dup stdout: $!";
- }
-
- sub init_rrd($)
- {
-- my $m = shift;
-- my $rows = $xpoints/$points_per_sample;
-- my $realrows = int($rows*1.1); # ensure that the full range is covered
-- my $day_steps = int(3600*24 / ($rrdstep*$rows));
-- # use multiples, otherwise rrdtool could choose the wrong RRA
-- my $week_steps = $day_steps*7;
-- my $month_steps = $week_steps*5;
-- my $year_steps = $month_steps*12;
--
-- # mail rrd
-- if(! -f $rrd and ! $opt{'only-virus-rrd'}) {
-- RRDs::create($rrd, '--start', $m, '--step', $rrdstep,
-- 'DS:sent:ABSOLUTE:'.($rrdstep*2).':0:U',
-- 'DS:recv:ABSOLUTE:'.($rrdstep*2).':0:U',
-- 'DS:bounced:ABSOLUTE:'.($rrdstep*2).':0:U',
-- 'DS:rejected:ABSOLUTE:'.($rrdstep*2).':0:U',
-- "RRA:AVERAGE:0.5:$day_steps:$realrows", # day
-- "RRA:AVERAGE:0.5:$week_steps:$realrows", # week
-- "RRA:AVERAGE:0.5:$month_steps:$realrows", # month
-- "RRA:AVERAGE:0.5:$year_steps:$realrows", # year
-- "RRA:MAX:0.5:$day_steps:$realrows", # day
-- "RRA:MAX:0.5:$week_steps:$realrows", # week
-- "RRA:MAX:0.5:$month_steps:$realrows", # month
-- "RRA:MAX:0.5:$year_steps:$realrows", # year
-- );
-- $this_minute = $m;
-- }
-- elsif(-f $rrd) {
-- $this_minute = RRDs::last($rrd) + $rrdstep;
-- }
--
-- # virus rrd
-- if(! -f $rrd_virus and ! $opt{'only-mail-rrd'}) {
-- RRDs::create($rrd_virus, '--start', $m, '--step', $rrdstep,
-- 'DS:virus:ABSOLUTE:'.($rrdstep*2).':0:U',
-- 'DS:spam:ABSOLUTE:'.($rrdstep*2).':0:U',
-- "RRA:AVERAGE:0.5:$day_steps:$realrows", # day
-- "RRA:AVERAGE:0.5:$week_steps:$realrows", # week
-- "RRA:AVERAGE:0.5:$month_steps:$realrows", # month
-- "RRA:AVERAGE:0.5:$year_steps:$realrows", # year
-- "RRA:MAX:0.5:$day_steps:$realrows", # day
-- "RRA:MAX:0.5:$week_steps:$realrows", # week
-- "RRA:MAX:0.5:$month_steps:$realrows", # month
-- "RRA:MAX:0.5:$year_steps:$realrows", # year
-- );
-- }
-- elsif(-f $rrd_virus and ! defined $rrd_virus) {
-- $this_minute = RRDs::last($rrd_virus) + $rrdstep;
-- }
-+ my $m = shift;
-+ my $rows = $xpoints/$points_per_sample;
-+ my $realrows = int($rows*1.1); # ensure that the full range is covered
-+ my $day_steps = int(3600*24 / ($rrdstep*$rows));
-+ # use multiples, otherwise rrdtool could choose the wrong RRA
-+ my $week_steps = $day_steps*7;
-+ my $month_steps = $week_steps*5;
-+ my $year_steps = $month_steps*12;
-+
-+ # mail rrd
-+ if(! -f $rrd and ! $opt{'no-mail-rrd'}) {
-+ RRDs::create($rrd, '--start', $m, '--step', $rrdstep,
-+ 'DS:sent:ABSOLUTE:'.($rrdstep*2).':0:U',
-+ 'DS:recv:ABSOLUTE:'.($rrdstep*2).':0:U',
-+ 'DS:bounced:ABSOLUTE:'.($rrdstep*2).':0:U',
-+ 'DS:rejected:ABSOLUTE:'.($rrdstep*2).':0:U',
-+ "RRA:AVERAGE:0.5:$day_steps:$realrows", # day
-+ "RRA:AVERAGE:0.5:$week_steps:$realrows", # week
-+ "RRA:AVERAGE:0.5:$month_steps:$realrows", # month
-+ "RRA:AVERAGE:0.5:$year_steps:$realrows", # year
-+ "RRA:MAX:0.5:$day_steps:$realrows", # day
-+ "RRA:MAX:0.5:$week_steps:$realrows", # week
-+ "RRA:MAX:0.5:$month_steps:$realrows", # month
-+ "RRA:MAX:0.5:$year_steps:$realrows", # year
-+ );
-+ $this_minute = $m;
-+ }
-+ elsif(-f $rrd) {
-+ $this_minute = RRDs::last($rrd) + $rrdstep;
-+ }
-+
-+ # virus rrd
-+ if(! -f $rrd_virus and ! $opt{'no-virus-rrd'}) {
-+ RRDs::create($rrd_virus, '--start', $m, '--step', $rrdstep,
-+ 'DS:virus:ABSOLUTE:'.($rrdstep*2).':0:U',
-+ 'DS:spam:ABSOLUTE:'.($rrdstep*2).':0:U',
-+ "RRA:AVERAGE:0.5:$day_steps:$realrows", # day
-+ "RRA:AVERAGE:0.5:$week_steps:$realrows", # week
-+ "RRA:AVERAGE:0.5:$month_steps:$realrows", # month
-+ "RRA:AVERAGE:0.5:$year_steps:$realrows", # year
-+ "RRA:MAX:0.5:$day_steps:$realrows", # day
-+ "RRA:MAX:0.5:$week_steps:$realrows", # week
-+ "RRA:MAX:0.5:$month_steps:$realrows", # month
-+ "RRA:MAX:0.5:$year_steps:$realrows", # year
-+ );
-+ }
-+ elsif(-f $rrd_virus and ! defined $rrd_virus) {
-+ $this_minute = RRDs::last($rrd_virus) + $rrdstep;
-+ }
-+ # greylist rrd
-+ if(! -f $rrd_greylist and ! $opt{'no-greylist-rrd'}) {
-+ RRDs::create($rrd_greylist, '--start', $m, '--step', $rrdstep,
-+ 'DS:greylisted:ABSOLUTE:'.($rrdstep*2).':0:U',
-+ 'DS:delayed:ABSOLUTE:'.($rrdstep*2).':0:U',
-+ "RRA:AVERAGE:0.5:$day_steps:$realrows", # day
-+ "RRA:AVERAGE:0.5:$week_steps:$realrows", # week
-+ "RRA:AVERAGE:0.5:$month_steps:$realrows", # month
-+ "RRA:AVERAGE:0.5:$year_steps:$realrows", # year
-+ "RRA:MAX:0.5:$day_steps:$realrows", # day
-+ "RRA:MAX:0.5:$week_steps:$realrows", # week
-+ "RRA:MAX:0.5:$month_steps:$realrows", # month
-+ "RRA:MAX:0.5:$year_steps:$realrows", # year
-+ );
-+ $this_minute = $m;
-+ }
-+ elsif(-f $rrd_greylist and ! defined $rrd_greylist) {
-+ $this_minute = RRDs::last($rrd_greylist) + $rrdstep;
-+ }
-
-- $rrd_inited=1;
-+ $rrd_inited=1;
- }
-
- sub process_line($)
- {
-- my $sl = shift;
-- my $time = $sl->[0];
-- my $prog = $sl->[2];
-- my $text = $sl->[4];
--
-- if($prog =~ /^postfix\/(.*)/) {
-- my $prog = $1;
-- if($prog eq 'smtp') {
-- if($text =~ /\bstatus=sent\b/) {
-- return if $opt{'ignore-localhost'} and
-- $text =~ /\brelay=[^\s\[]*\[127\.0\.0\.1\]/;
-- if(defined $opt{'ignore-host-re'}) {
-- for my $ih (@{$opt{'ignore-host-re'}}) {
-- warn "MATCH! $text\n" if $text =~ $ih;
-- return if $text =~ $ih;
-- }
-- }
-- event($time, 'sent');
-- }
-- elsif($text =~ /\bstatus=bounced\b/) {
-- event($time, 'bounced');
-- }
-- }
-- elsif($prog eq 'local') {
-- if($text =~ /\bstatus=bounced\b/) {
-- event($time, 'bounced');
-- }
-- }
-- elsif($prog eq 'smtpd') {
-- if($text =~ /^[0-9A-Z]+: client=(\S+)/) {
-- my $client = $1;
-- return if $opt{'ignore-localhost'} and
-- $client =~ /\[127\.0\.0\.1\]$/;
-- return if $opt{'ignore-host'} and
-- $client =~ /$opt{'ignore-host'}/oi;
-- event($time, 'received');
-- }
-- elsif($opt{'virbl-is-virus'} and $text =~ /^(?:[0-9A-Z]+: |NOQUEUE: )?reject: .*: 554.* blocked using virbl.dnsbl.bit.nl/) {
-- event($time, 'virus');
-- }
-- elsif($opt{'rbl-is-spam'} and $text =~ /^(?:[0-9A-Z]+: |NOQUEUE: )?reject: .*: 554.* blocked using/) {
-- event($time, 'spam');
-- }
-- elsif($text =~ /^(?:[0-9A-Z]+: |NOQUEUE: )?reject: /) {
-- event($time, 'rejected');
-- }
-- elsif($text =~ /^(?:[0-9A-Z]+: |NOQUEUE: )?milter-reject: /) {
-- if($text =~ /Blocked by SpamAssassin/) {
-- event($time, 'spam');
-- }
-- else {
-- event($time, 'rejected');
-- }
-- }
-- }
-- elsif($prog eq 'error') {
-- if($text =~ /\bstatus=bounced\b/) {
-- event($time, 'bounced');
-- }
-- }
-- elsif($prog eq 'cleanup') {
-- if($text =~ /^[0-9A-Z]+: (?:reject|discard): /) {
-- event($time, 'rejected');
-- }
-- }
-- }
-- elsif($prog eq 'sendmail' or $prog eq 'sm-mta') {
-- if($text =~ /\bmailer=local\b/ ) {
-- event($time, 'received');
-- }
-+ my $sl = shift;
-+ my $time = $sl->[0];
-+ my $prog = $sl->[2];
-+ my $text = $sl->[4];
-+
-+ if($prog =~ /^postfix\/(.*)/) {
-+ my $prog = $1;
-+ if($prog eq 'smtp') {
-+ if($text =~ /\bstatus=sent\b/) {
-+ return if $opt{'ignore-localhost'} and
-+ $text =~ /\brelay=[^\s\[]*\[127\.0\.0\.1\]/;
-+ if(defined $opt{'ignore-host-re'}) {
-+ for my $ih (@{$opt{'ignore-host-re'}}) {
-+ warn "MATCH! $text\n" if $text =~ $ih;
-+ return if $text =~ $ih;
-+ }
-+ }
-+ event($time, 'sent');
-+ }
-+ elsif($text =~ /\bstatus=bounced\b/) {
-+ event($time, 'bounced');
-+ }
-+ }
-+ elsif($prog eq 'local') {
-+ if($text =~ /\bstatus=bounced\b/) {
-+ event($time, 'bounced');
-+ }
-+ }
-+ elsif($prog eq 'smtpd' || $prog eq 'postscreen') {
-+ if($text =~ /^(?:[\dA-F]+|[\dB-DF-HJ-NP-TV-Zb-df-hj-np-tv-z]+): client=(\S+)/) {
-+ my $client = $1;
-+ return if $opt{'ignore-localhost'} and
-+ $client =~ /\[127\.0\.0\.1\]$/;
-+ return if $opt{'ignore-host'} and
-+ $client =~ /$opt{'ignore-host'}/oi;
-+ event($time, 'received');
-+ }
-+ elsif($opt{'virbl-is-virus'} and $text =~ /^(?:[\dA-F]+: |[\dB-DF-HJ-NP-TV-Zb-df-hj-np-tv-z]+: |NOQUEUE: )?reject: .*: 554.* blocked using virbl.dnsbl.bit.nl/) {
-+ event($time, 'virus');
-+ }
-+ elsif($opt{'rbl-is-spam'} and $text =~ /^(?:[\dA-F]+: |[\dB-DF-HJ-NP-TV-Zb-df-hj-np-tv-z]+: |NOQUEUE: )?reject: .*: 554.* blocked using/) {
-+ event($time, 'spam');
-+ }
-+ elsif($text =~ /Greylisted/) {
-+ event($time, 'greylisted');
-+ }
-+ elsif($text =~ /^(?:[\dA-F]+: |[\dB-DF-HJ-NP-TV-Zb-df-hj-np-tv-z]+: |NOQUEUE: )?reject: /) {
-+ event($time, 'rejected');
-+ }
-+ elsif($text =~ /^(?:[\dA-F]+: |[\dB-DF-HJ-NP-TV-Zb-df-hj-np-tv-z]+: |NOQUEUE: )?milter-reject: /) {
-+ if($text =~ /Blocked by SpamAssassin/) {
-+ event($time, 'spam');
-+ }
-+ else {
-+ event($time, 'rejected');
-+ }
-+ }
-+ }
-+ elsif($prog eq 'error') {
-+ if($text =~ /\bstatus=bounced\b/) {
-+ event($time, 'bounced');
-+ }
-+ }
-+ elsif($prog eq 'cleanup') {
-+ if($text =~ /(?:[\dA-F]+|[\dB-DF-HJ-NP-TV-Zb-df-hj-np-tv-z]+): (?:reject|discard): /) {
-+ event($time, 'rejected');
-+ }
-+ }
-+ }
-+ elsif($prog eq 'sendmail' or $prog eq 'sm-mta') {
-+ if($text =~ /\bmailer=local\b/ ) {
-+ event($time, 'received');
-+ }
- elsif($text =~ /\bmailer=relay\b/) {
- event($time, 'received');
- }
-- elsif($text =~ /\bstat=Sent\b/ ) {
-- event($time, 'sent');
-- }
-+ elsif($text =~ /\bstat=Sent\b/ ) {
-+ event($time, 'sent');
-+ }
- elsif($text =~ /\bmailer=esmtp\b/ ) {
- event($time, 'sent');
- }
-- elsif($text =~ /\bruleset=check_XS4ALL\b/ ) {
-- event($time, 'rejected');
-- }
-- elsif($text =~ /\blost input channel\b/ ) {
-- event($time, 'rejected');
-- }
-- elsif($text =~ /\bruleset=check_rcpt\b/ ) {
-- event($time, 'rejected');
-- }
-+ elsif($text =~ /\bruleset=check_XS4ALL\b/ ) {
-+ event($time, 'rejected');
-+ }
-+ elsif($text =~ /\blost input channel\b/ ) {
-+ event($time, 'rejected');
-+ }
-+ elsif($text =~ /\bruleset=check_rcpt\b/ ) {
-+ event($time, 'rejected');
-+ }
- elsif($text =~ /\bstat=virus\b/ ) {
- event($time, 'virus');
- }
-- elsif($text =~ /\bruleset=check_relay\b/ ) {
-- if (($opt{'virbl-is-virus'}) and ($text =~ /\bivirbl\b/ )) {
-- event($time, 'virus');
-- } elsif ($opt{'rbl-is-spam'}) {
-- event($time, 'spam');
-- } else {
-- event($time, 'rejected');
-- }
-- }
-- elsif($text =~ /\bsender blocked\b/ ) {
-- event($time, 'rejected');
-- }
-- elsif($text =~ /\bsender denied\b/ ) {
-- event($time, 'rejected');
-- }
-- elsif($text =~ /\brecipient denied\b/ ) {
-- event($time, 'rejected');
-- }
-- elsif($text =~ /\brecipient unknown\b/ ) {
-- event($time, 'rejected');
-- }
-- elsif($text =~ /\bUser unknown$/i ) {
-- event($time, 'bounced');
-- }
-- elsif($text =~ /\bMilter:.*\breject=55/ ) {
-- event($time, 'rejected');
-- }
-- }
-- elsif($prog eq 'exim') {
-- if($text =~ /^[0-9a-zA-Z]{6}-[0-9a-zA-Z]{6}-[0-9a-zA-Z]{2} <= \S+/) {
-- event($time, 'received');
-- }
-- elsif($text =~ /^[0-9a-zA-Z]{6}-[0-9a-zA-Z]{6}-[0-9a-zA-Z]{2} => \S+/) {
-- event($time, 'sent');
-- }
-- elsif($text =~ / rejected because \S+ is in a black list at \S+/) {
-- if($opt{'rbl-is-spam'}) {
-- event($time, 'spam');
-- } else {
-- event($time, 'rejected');
-- }
-- }
-- elsif($text =~ / rejected RCPT \S+: (Sender verify failed|Unknown user)/) {
-- event($time, 'rejected');
-- }
-- }
-- elsif($prog eq 'amavis' || $prog eq 'amavisd') {
-- if( $text =~ /^\([\w-]+\) (Passed|Blocked) SPAM(?:MY)?\b/) {
-- if($text !~ /\btag2=/) { # ignore new per-recipient log entry (2.2.0)
-- event($time, 'spam'); # since amavisd-new-2004xxxx
-- }
-- }
-- elsif($text =~ /^\([\w-]+\) (Passed|Not-Delivered)\b.*\bquarantine spam/) {
-- event($time, 'spam'); # amavisd-new-20030616 and earlier
-- }
-- elsif($text =~ /^\([\w-]+\) (Passed |Blocked )?INFECTED\b/) {
-- if($text !~ /\btag2=/) {
-- event($time, 'virus');# Passed|Blocked inserted since 2004xxxx
-- }
-- }
-- elsif($text =~ /^\([\w-]+\) (Passed |Blocked )?BANNED\b/) {
-- if($text !~ /\btag2=/) {
-- event($time, 'virus');
-- }
-- }
-- elsif($text =~ /^Virus found\b/) {
-- event($time, 'virus');# AMaViS 0.3.12 and amavisd-0.1
-- }
--# elsif($text =~ /^\([\w-]+\) Passed|Blocked BAD-HEADER\b/) {
--# event($time, 'badh');
--# }
-- }
-- elsif($prog eq 'vagatefwd') {
-- # Vexira antivirus (old)
-- if($text =~ /^VIRUS/) {
-- event($time, 'virus');
-- }
-- }
-- elsif($prog eq 'hook') {
-- # Vexira antivirus
-- if($text =~ /^\*+ Virus\b/) {
-- event($time, 'virus');
-- }
-- # Vexira antispam
-- elsif($text =~ /\bcontains spam\b/) {
-- event($time, 'spam');
-- }
-- }
-- elsif($prog eq 'avgatefwd' or $prog eq 'avmailgate.bin') {
-- # AntiVir MailGate
-- if($text =~ /^Alert!/) {
-- event($time, 'virus');
-- }
-- elsif($text =~ /blocked\.$/) {
-- event($time, 'virus');
-- }
-- }
-- elsif($prog eq 'avcheck') {
-- # avcheck
-- if($text =~ /^infected/) {
-- event($time, 'virus');
-- }
-- }
-- elsif($prog eq 'spamd') {
-- if($text =~ /^(?:spamd: )?identified spam/) {
-- event($time, 'spam');
-- }
-- # ClamAV SpamAssassin-plugin
-- elsif($text =~ /(?:result: )?CLAMAV/) {
-- event($time, 'virus');
-- }
-- }
-- elsif($prog eq 'dspam') {
-- if($text =~ /spam detected from/) {
-- event($time, 'spam');
-- }
-- }
-- elsif($prog eq 'spamproxyd' or $prog eq 'spampd') {
-- if($text =~ /^\s*SPAM/ or $text =~ /^identified spam/) {
-- event($time, 'spam');
-- }
-- }
-- elsif($prog eq 'drweb-postfix') {
-- # DrWeb
-- if($text =~ /infected/) {
-- event($time, 'virus');
-- }
-- }
-- elsif($prog eq 'BlackHole') {
-- if($text =~ /Virus/) {
-- event($time, 'virus');
-- }
-- if($text =~ /(?:RBL|Razor|Spam)/) {
-- event($time, 'spam');
-- }
-- }
-- elsif($prog eq 'MailScanner') {
-- if($text =~ /(Virus Scanning: Found)/ ) {
-- event($time, 'virus');
-- }
-- elsif($text =~ /Bounce to/ ) {
-- event($time, 'bounced');
-- }
-- elsif($text =~ /^Spam Checks: Found ([0-9]+) spam messages/) {
-- my $cnt = $1;
-- for (my $i=0; $i<$cnt; $i++) {
-- event($time, 'spam');
-- }
-- }
-- }
-- elsif($prog eq 'clamsmtpd') {
-- if($text =~ /status=VIRUS/) {
-- event($time, 'virus');
-- }
-- }
-- elsif($prog eq 'clamav-milter') {
-- if($text =~ /Intercepted/) {
-- event($time, 'virus');
-- }
-- }
-- # uncommment for clamassassin:
-- #elsif($prog eq 'clamd') {
-- # if($text =~ /^stream: .* FOUND$/) {
-- # event($time, 'virus');
-- # }
-- #}
-- elsif ($prog eq 'smtp-vilter') {
-- if ($text =~ /clamd: found/) {
-- event($time, 'virus');
-- }
-- }
-- elsif($prog eq 'avmilter') {
-- # AntiVir Milter
-- if($text =~ /^Alert!/) {
-- event($time, 'virus');
-- }
-- elsif($text =~ /blocked\.$/) {
-- event($time, 'virus');
-- }
-- }
-- elsif($prog eq 'bogofilter') {
-- if($text =~ /Spam/) {
-- event($time, 'spam');
-- }
-- }
-- elsif($prog eq 'filter-module') {
-- if($text =~ /\bspam_status\=(?:yes|spam)/) {
-- event($time, 'spam');
-- }
-- }
-- elsif($prog eq 'sta_scanner') {
-- if($text =~ /^[0-9A-F]+: virus/) {
-- event($time, 'virus');
-- }
-- }
-+ elsif($text =~ /\bruleset=check_relay\b/ ) {
-+ if (($opt{'virbl-is-virus'}) and ($text =~ /\bivirbl\b/ )) {
-+ event($time, 'virus');
-+ } elsif ($opt{'rbl-is-spam'}) {
-+ event($time, 'spam');
-+ } else {
-+ event($time, 'rejected');
-+ }
-+ }
-+ elsif($text =~ /\bsender blocked\b/ ) {
-+ event($time, 'rejected');
-+ }
-+ elsif($text =~ /\bsender denied\b/ ) {
-+ event($time, 'rejected');
-+ }
-+ elsif($text =~ /\brecipient denied\b/ ) {
-+ event($time, 'rejected');
-+ }
-+ elsif($text =~ /\brecipient unknown\b/ ) {
-+ event($time, 'rejected');
-+ }
-+ elsif($text =~ /\bUser unknown$/i ) {
-+ event($time, 'bounced');
-+ }
-+ elsif($text =~ /\bMilter:.*\breject=55/ ) {
-+ event($time, 'rejected');
-+ }
-+ }
-+ elsif($prog eq 'exim') {
-+ if($text =~ /^[0-9a-zA-Z]{6}-[0-9a-zA-Z]{6}-[0-9a-zA-Z]{2} <= \S+/) {
-+ event($time, 'received');
-+ }
-+ elsif($text =~ /^[0-9a-zA-Z]{6}-[0-9a-zA-Z]{6}-[0-9a-zA-Z]{2} => \S+/) {
-+ event($time, 'sent');
-+ }
-+ elsif($text =~ / rejected because \S+ is in a black list at \S+/) {
-+ if($opt{'rbl-is-spam'}) {
-+ event($time, 'spam');
-+ } else {
-+ event($time, 'rejected');
-+ }
-+ }
-+ elsif($text =~ / rejected RCPT \S+: (Sender verify failed|Unknown user)/) {
-+ event($time, 'rejected');
-+ }
-+ }
-+ elsif($prog eq 'amavis' || $prog eq 'amavisd') {
-+ if( $text =~ /^\([\w-]+\) (Passed|Blocked) SPAM(?:MY)?\b/) {
-+ if($text !~ /\btag2=/) { # ignore new per-recipient log entry (2.2.0)
-+ event($time, 'spam'); # since amavisd-new-2004xxxx
-+ }
-+ }
-+ elsif($text =~ /^\([\w-]+\) (Passed|Not-Delivered)\b.*\bquarantine spam/) {
-+ event($time, 'spam'); # amavisd-new-20030616 and earlier
-+ }
-+ elsif($text =~ /^\([\w-]+\) (Passed |Blocked )?INFECTED\b/) {
-+ if($text !~ /\btag2=/) {
-+ event($time, 'virus');# Passed|Blocked inserted since 2004xxxx
-+ }
-+ }
-+ elsif($text =~ /^\([\w-]+\) (Passed |Blocked )?BANNED\b/) {
-+ if($text !~ /\btag2=/) {
-+ event($time, 'virus');
-+ }
-+ }
-+ elsif($text =~ /^Virus found\b/) {
-+ event($time, 'virus');# AMaViS 0.3.12 and amavisd-0.1
-+ }
-+# elsif($text =~ /^\([\w-]+\) Passed|Blocked BAD-HEADER\b/) {
-+# event($time, 'badh');
-+# }
-+ }
-+ elsif($prog eq 'vagatefwd') {
-+ # Vexira antivirus (old)
-+ if($text =~ /^VIRUS/) {
-+ event($time, 'virus');
-+ }
-+ }
-+ elsif($prog eq 'hook') {
-+ # Vexira antivirus
-+ if($text =~ /^\*+ Virus\b/) {
-+ event($time, 'virus');
-+ }
-+ # Vexira antispam
-+ elsif($text =~ /\bcontains spam\b/) {
-+ event($time, 'spam');
-+ }
-+ }
-+ elsif($prog eq 'avgatefwd' or $prog eq 'avmailgate.bin') {
-+ # AntiVir MailGate
-+ if($text =~ /^Alert!/) {
-+ event($time, 'virus');
-+ }
-+ elsif($text =~ /blocked\.$/) {
-+ event($time, 'virus');
-+ }
-+ }
-+ elsif($prog eq 'avcheck') {
-+ # avcheck
-+ if($text =~ /^infected/) {
-+ event($time, 'virus');
-+ }
-+ }
-+ elsif($prog eq 'spamd') {
-+ if($text =~ /^(?:spamd: )?identified spam/) {
-+ event($time, 'spam');
-+ }
-+ # ClamAV SpamAssassin-plugin
-+ elsif($text =~ /(?:result: )?CLAMAV/) {
-+ event($time, 'virus');
-+ }
-+ }
-+ elsif($prog eq 'dspam') {
-+ if($text =~ /spam detected from/) {
-+ event($time, 'spam');
-+ }
-+ elsif($text =~ /infected message from/) {
-+ event($time, 'virus');
-+ }
-+ }
-+ elsif($prog eq 'spamproxyd' or $prog eq 'spampd') {
-+ if($text =~ /^\s*SPAM/ or $text =~ /^identified spam/) {
-+ event($time, 'spam');
-+ }
-+ }
-+ elsif($prog eq 'drweb-postfix') {
-+ # DrWeb
-+ if($text =~ /infected/) {
-+ event($time, 'virus');
-+ }
-+ }
-+ elsif($prog eq 'BlackHole') {
-+ if($text =~ /Virus/) {
-+ event($time, 'virus');
-+ }
-+ if($text =~ /(?:RBL|Razor|Spam)/) {
-+ event($time, 'spam');
-+ }
-+ }
-+ elsif($prog eq 'MailScanner') {
-+ if($text =~ /(Virus Scanning: Found)/ ) {
-+ event($time, 'virus');
-+ }
-+ elsif($text =~ /Bounce to/ ) {
-+ event($time, 'bounced');
-+ }
-+ elsif($text =~ /^Spam Checks: Found ([0-9]+) spam messages/) {
-+ my $cnt = $1;
-+ for (my $i=0; $i<$cnt; $i++) {
-+ event($time, 'spam');
-+ }
-+ }
-+ }
-+ elsif($prog eq 'clamsmtpd') {
-+ if($text =~ /status=VIRUS/) {
-+ event($time, 'virus');
-+ }
-+ }
-+ elsif($prog eq 'clamav-milter') {
-+ if($text =~ /Intercepted/) {
-+ event($time, 'virus');
-+ }
-+ elsif($text =~ /Message.*infected by/) {
-+ event($time, 'virus');
-+ }
-+ }
-+ # uncommment for clamassassin:
-+ #elsif($prog eq 'clamd') {
-+ # if($text =~ /^stream: .* FOUND$/) {
-+ # event($time, 'virus');
-+ # }
-+ #}
-+ elsif ($prog eq 'smtp-vilter') {
-+ if ($text =~ /clamd: found/) {
-+ event($time, 'virus');
-+ }
-+ }
-+ elsif($prog eq 'avmilter') {
-+ # AntiVir Milter
-+ if($text =~ /^Alert!/) {
-+ event($time, 'virus');
-+ }
-+ elsif($text =~ /blocked\.$/) {
-+ event($time, 'virus');
-+ }
-+ }
-+ elsif($prog eq 'bogofilter') {
-+ if($text =~ /Spam/) {
-+ event($time, 'spam');
-+ }
-+ }
-+ elsif($prog eq 'filter-module') {
-+ if($text =~ /\bspam_status\=(?:yes|spam)/) {
-+ event($time, 'spam');
-+ }
-+ }
-+ elsif($prog eq 'sta_scanner') {
-+ if($text =~ /^[0-9A-F]+: virus/) {
-+ event($time, 'virus');
-+ }
-+ }
-+ elsif($prog eq 'postgrey') {
-+ # Old versions (up to 1.27)
-+ if($text =~ /delayed [0-9]+ seconds: client/) {
-+ event($time, 'delayed');
-+ }
-+ # New versions (from 1.28)
-+ if($text =~ /delay=[0-9]+/) {
-+ event($time, 'delayed');
-+ }
-+ }
-+ elsif($prog eq 'grossd') {
-+ if($text =~ /a\=greylist/) {
-+ event($time, 'greylisted');
-+ }
-+ }
- }
-
- sub event($$)
- {
-- my ($t, $type) = @_;
-- update($t) and $sum{$type}++;
-+ my ($t, $type) = @_;
-+ update($t) and $sum{$type}++;
- }
-
- # returns 1 if $sum should be updated
- sub update($)
- {
-- my $t = shift;
-- my $m = $t - $t%$rrdstep;
-- init_rrd($m) unless $rrd_inited;
-- return 1 if $m == $this_minute;
-- return 0 if $m < $this_minute;
--
-- print "update $this_minute:$sum{sent}:$sum{received}:$sum{bounced}:$sum{rejected}:$sum{virus}:$sum{spam}\n" if $opt{verbose};
-- RRDs::update $rrd, "$this_minute:$sum{sent}:$sum{received}:$sum{bounced}:$sum{rejected}" unless $opt{'only-virus-rrd'};
-- RRDs::update $rrd_virus, "$this_minute:$sum{virus}:$sum{spam}" unless $opt{'only-mail-rrd'};
-- if($m > $this_minute+$rrdstep) {
-- for(my $sm=$this_minute+$rrdstep;$sm<$m;$sm+=$rrdstep) {
-- print "update $sm:0:0:0:0:0:0 (SKIP)\n" if $opt{verbose};
-- RRDs::update $rrd, "$sm:0:0:0:0" unless $opt{'only-virus-rrd'};
-- RRDs::update $rrd_virus, "$sm:0:0" unless $opt{'only-mail-rrd'};
-- }
-- }
-- $this_minute = $m;
-- $sum{sent}=0;
-- $sum{received}=0;
-- $sum{bounced}=0;
-- $sum{rejected}=0;
-- $sum{virus}=0;
-- $sum{spam}=0;
-- return 1;
-+ my $t = shift;
-+ my $m = $t - $t%$rrdstep;
-+ init_rrd($m) unless $rrd_inited;
-+ return 1 if $m == $this_minute;
-+ return 0 if $m < $this_minute;
-+
-+ print "update $this_minute:$sum{sent}:$sum{received}:$sum{bounced}:$sum{rejected}:$sum{virus}:$sum{spam}:$sum{greylisted}:$sum{delayed}\n" if $opt{verbose};
-+ RRDs::update $rrd, "$this_minute:$sum{sent}:$sum{received}:$sum{bounced}:$sum{rejected}" unless $opt{'no-mail-rrd'};
-+ RRDs::update $rrd_virus, "$this_minute:$sum{virus}:$sum{spam}" unless $opt{'no-virus-rrd'};
-+ RRDs::update $rrd_greylist, "$this_minute:$sum{greylisted}:$sum{delayed}" unless $opt{'no-greylist-rrd'};
-+ if($m > $this_minute+$rrdstep) {
-+ for(my $sm=$this_minute+$rrdstep;$sm<$m;$sm+=$rrdstep) {
-+ print "update $sm:0:0:0:0:0:0:0:0 (SKIP)\n" if $opt{verbose};
-+ RRDs::update $rrd, "$sm:0:0:0:0" unless $opt{'no-mail-rrd'};
-+ RRDs::update $rrd_virus, "$sm:0:0" unless $opt{'no-virus-rrd'};
-+ RRDs::update $rrd_greylist, "$sm:0:0" unless $opt{'no-greylist-rrd'};
-+ }
-+ }
-+ $this_minute = $m;
-+ $sum{sent}=0;
-+ $sum{received}=0;
-+ $sum{bounced}=0;
-+ $sum{rejected}=0;
-+ $sum{virus}=0;
-+ $sum{spam}=0;
-+ $sum{greylisted}=0;
-+ $sum{delayed}=0;
-+ return 1;
- }
-
- main;
-@@ -919,8 +993,9 @@ B<mailgraph> [I<options>...]
- --daemon-log=FILE write verbose-log to FILE instead of /var/log/mailgraph.log
- --ignore-localhost ignore mail to/from localhost (used for virus scanner)
- --ignore-host=HOST ignore mail to/from HOST regexp (used for virus scanner)
-- --only-mail-rrd update only the mail rrd
-- --only-virus-rrd update only the virus rrd
-+ --no-mail-rrd do not update mail rrd
-+ --no-virus-rrd do not update virus rrd
-+ --no-greylist-rrd do not update greylist rrd
- --rrd-name=NAME use NAME.rrd and NAME_virus.rrd for the rrd files
- --rbl-is-spam count rbl rejects as spam
- --virbl-is-virus count virbl rejects as viruses
-@@ -940,6 +1015,10 @@ The following types can be given to --lo
-
- Traditional "syslog" (default)
-
-+=item rsyslog
-+
-+High precision format "rsyslog"
-+
- =item metalog
-
- Metalog (see http://metalog.sourceforge.net/)
-@@ -950,6 +1029,7 @@ Metalog (see http://metalog.sourceforge.
-
- Copyright (c) 2000-2007 by ETH Zurich
- Copyright (c) 2000-2007 by David Schweikert
-+Copyright (c) 2018 by M.D. Klapwijk
-
- =head1 LICENSE
-
-@@ -973,4 +1053,4 @@ S<David Schweikert E<lt>david@schweikert
-
- =cut
-
--# vi: sw=8
-+# vi: sw=8
-\ No newline at end of file