package MailReport; use strict; use warnings; my %CONSTANTS = ( tool => "sendmail", sender => "", recipients => [], subject => "", subnets => ["147."], signature => "XXX", threshold => 0, excludedsensor => [], excludedip => [], eventtype => [], maxage => "1D", summary => "yes", ); my %FORMAT = ( maxage => qr/\d+[hdmHDM]/, tool => qr/(ssmtp|sendmail)/, ); sub run { my (undef, $modprefix, $cfg, $dbh, $db_engine) = @_; my $v = Constants::mergeConfigs($cfg, $modprefix, \%CONSTANTS, \%FORMAT); my $eventtype_query = DB::joinIN("type", \@{$v->{'eventtype'}}); my $excluded_query = DB::joinNotIN("source", \@{$v->{'excludedip'}}); my $excludedsensor_query = DB::joinNotIN("service", \@{$v->{'excludedsensor'}}); my $subnets_query = DB::joinLIKE("source", \@{$v->{'subnets'}}); my $condition = substr($excluded_query . $eventtype_query . $excludedsensor_query . $subnets_query, 0, -5); my @columns= ("source", "hostname", "service", "type", "detected", "target_proto", "target_port", "attack_scale"); my @params = ($condition, DB::getOldDataDB($db_engine, "NEWER", $v->{'maxage'})); my $query = DB::getQueryCondThreshold($db_engine, "events", \@columns, \@params, $v->{'threshold'}); my @rows = Utils::fetchall_array_hashref($dbh, $query); if($v->{'subject'} eq "") { my $hostname = `hostname -f`; $v->{'subject'} = "$modprefix (Warden-app) on $hostname"; } $v->{'modprefix'} = $modprefix; sub header { my $v = shift; my $header; $header = "$v->{'modprefix'} noticed following events during $v->{'maxage'} timeframe:\n\n"; $header .= sprintf("+-------------------------------+---------------------+------------+-----------------+-------+----------+--------+\n"); $header .= sprintf("| Detector/Service | Detected | Type | Source | Dport | Proto | Volume |\n"); $header .= sprintf("+-------------------------------+---------------------+------------+-----------------+-------+----------+--------+\n"); return $header }; sub record { my $r = shift; return sprintf("|%30s | %19s | %10s | %15s | %5s | %8s | %6s |\n", "$r->{'hostname'}/$r->{'service'}", $r->{'detected'}, $r->{'type'}, $r->{'source'}, $r->{'target_port'}, $r->{'target_proto'}, $r->{'attack_scale'}); }; sub footer { my $v = shift; my $footer = sprintf("+-------------------------------+---------------------+------------+-----------------+-------+----------+--------+\n\n"); $footer .= $v->{'signature'}; return $footer; }; Utils::generateEmails($v->{'tool'}, \@{$v->{'recipients'}}, $v->{'sender'}, $v->{'subject'}, \@rows, \&header, \&record, \&footer, $v, $v->{'summary'}); return 1; } 1;