summaryrefslogtreecommitdiffstats
path: root/cgi/exilog_cgi_queues.pm
diff options
context:
space:
mode:
Diffstat (limited to 'cgi/exilog_cgi_queues.pm')
-rw-r--r--cgi/exilog_cgi_queues.pm323
1 files changed, 266 insertions, 57 deletions
diff --git a/cgi/exilog_cgi_queues.pm b/cgi/exilog_cgi_queues.pm
index 1b1158e..4c7a61b 100644
--- a/cgi/exilog_cgi_queues.pm
+++ b/cgi/exilog_cgi_queues.pm
@@ -38,11 +38,76 @@ BEGIN {
sub queues {
_print_Queue_selector();
- my $messages = sql_select('queue',[ '*' ]);
- print render_queue_table($messages);
+
+ # Return unless the search type is set.
+ return unless (edt($param,'q_qt'));
+
+ # Get all data for messages passing the filter settings.
+ my $criteria = { 'timestamp' => (edt($param,'q_tr') ? _make_tr() : undef),
+ 'server' => (edt($param,'q_sr') ? $param->{'q_sr'} : undef ) };
+
+ my $messages = sql_select('queue',[ '*' ], $criteria);
+
+ my $prefiltered = [];
+ foreach my $message (@{ $messages }) {
+ next if (!ina($param->{'q_qw'},'frozen') && (edt($message,'frozen')));
+ next if (!ina($param->{'q_qw'},'deferred') && (!edt($message,'frozen')));
+ next if (!ina($param->{'q_qw'},'bounce') && ($message->{mailfrom} eq '<>'));
+ push @{$prefiltered}, $message;
+ }
+
+ # Now do the most expensive filtering
+ my $regex = dos2rx(($param->{'q_qs'} || '*'));
+ my $filtered = [];
+ if ($param->{'q_qt'} eq 'addr') {
+ MESSAGE: foreach my $message (@{ $prefiltered }) {
+ if ($message->{'mailfrom'} =~ /$regex/i) {
+ push @{$filtered}, $message;
+ next;
+ }
+ foreach my $addr (split / /, $message->{'recipients_pending'}.' '.$message->{'recipients_delivered'}) {
+ if ($addr =~ /$regex/i) {
+ push @{$filtered}, $message;
+ next MESSAGE;
+ }
+ }
+ }
+ }
+ elsif ($param->{'q_qt'} eq 'subject') {
+ foreach my $message (@{ $prefiltered }) {
+ if ($message->{'subject'} =~ /$regex/i) {
+ push @{$filtered}, $message;
+ }
+ }
+ }
+ elsif ($param->{'q_qt'} eq 'headers') {
+ foreach my $message (@{ $prefiltered }) {
+ if ($message->{'headers'} =~ /$regex/smi) {
+ push @{$filtered}, $message;
+ }
+ }
+ }
+ else {
+ $filtered = $prefiltered;
+ }
+
+ print render_queue_table($filtered);
};
+sub _make_tr {
+ my $str = $q->param('q_tr') || 0;
+
+ my $unit = chop $str;
+ my $now = time();
+ my $units = { '0' => 0,
+ 'm' => 60,
+ 'h' => 3600,
+ 'd' => 86400 };
+ return '0 '.($now + $units->{$unit}*$str);
+}
+
+
sub _print_Queue_selector {
print
@@ -51,68 +116,202 @@ sub _print_Queue_selector {
$q->table({-cellspacing=>0,-cellpadding=>4,-border=>0},
$q->Tr(
- $q->td({-align=>"left",-valign=>"top",-style=>"width: 16px;"},
- $q->img({-src=>$config->{web}->{webroot}."icons/server.png"})
+ $q->td({-align=>"left",-style=>"width: 16px;"},
+ $q->img({-src=>$config->{web}->{webroot}."icons/event_type.png"})
),
- $q->td({-align=>"left",-valign=>"top",-style=>"width: 100px;"},
- "Servers"
+ $q->td({-align=>"left",-style=>"width: 100px;"},
+ "Search Type"
),
$q->td({-align=>"left"},
- eval {
- my $html ="";
- my $num = 0;
- my $groups = {};
- foreach my $server (sort {$a cmp $b} keys %{ $config->{servers} }) {
- if (($num % 4) == 0) {
- $html .= '<tr>';
- };
- $html .= $q->td({-width=>"1%",-style=>"padding-right: 4px;"},
- $q->checkbox( { -name=>"sr",
- -label=>"",
- -id=>(edt($config->{servers}->{$server},'group') ? $config->{servers}->{$server}->{group} : "-XXX"),
- -checked=>(ina($param->{'sr'},$server) ? 'checked' : undef),
- -override=>1,
- -onDblClick=>"javascript:sr_off_except(this);",
- -onChange=>"javascript:sr_changed();",
- -value=>$server } )
- ).
- $q->td({-width=>"1%",-style=>"padding-right: 10px;"},
- $server
- );
- if (($num % 4) == 3) {
- $html .= '<td>&nbsp;</td></tr>';
- };
- $num++;
- if (edt($config->{servers}->{$server},'group')) {
- $groups->{$config->{servers}->{$server}->{group}} = '{'.$config->{servers}->{$server}->{group}.'}';
- };
- };
- if (($num % 4) != 0) {
- $html .= '<td>&nbsp;</td>' x ((4-($num % 4))*2);
- $html .= '<td>&nbsp;</td></tr>';
- };
- $groups->{'-all'} = 'All servers';
- $groups->{'-custom'} = 'Custom selection';
- $q->table({-border=>0,-cellpadding=>0,-cellspacing=>0,-width=>"1%"},
- $q->Tr(
- $q->td({-colspan=>9,-align=>"left",-style=>"padding-bottom: 4px;"},
- $q->popup_menu({ -name=>"ss",
- -id=>"ss",
- -style=>"width: 400px;",
- -values=>[ sort {$a cmp $b} keys(%{$groups}) ],
- -labels=>$groups,
- -onChange=>"javascript:ss_changed();",
- -default=>(exists($param->{'ss'}) ? ($param->{'ss'} || '-all') : '-all'),
- -override=>1})
- )
- ),
- $html
- );
- }.($@ ? $@ : "")
+ $q->popup_menu({ -name=>"q_qt",
+ -id=>"q_qt",
+ -style=>"width: 400px;",
+ -values=>[ 'all',
+ 'addr',
+ 'subject',
+ 'headers'
+ ],
+ -labels=>{ 'all' => "None - show everything",
+ 'addr' => "Address",
+ 'subject' => "Subject",
+ 'headers' => "Headers"
+ },
+ -default=>(exists($param->{'q_qt'}) ? ($param->{'q_qt'} || 'all') : 'all'),
+ -onChange=>"javascript:switch_controls(document.getElementById('q_qt').options[document.getElementById('q_qt').selectedIndex].value);",
+ -override=>1})
+ )
+ )
+ )
+ .
+ $q->span({-id=>"term"},'<!-- Dynamic content target DIV -->').
+ $q->div({-id=>"term_hidden",-style=>"visibility: hidden; position: absolute;"},
+ $q->table({-cellspacing=>0,-cellpadding=>4,-border=>0},
+ $q->Tr(
+ $q->td({-align=>"left",-style=>"width: 16px;"},
+ $q->img({-src=>$config->{web}->{webroot}."icons/find.png"})
+ ),
+ $q->td({-align=>"left",-style=>"width: 100px;"},
+ "Search Term"
+ ),
+ $q->td({-align=>"left"},
+ $q->textfield( { -name=>"q_qs",
+ -style=>"width: 400px;",
+ -value=>(exists($param->{'q_qs'}) ? ($param->{'q_qs'} || '') : ''),
+ -override=>1 } )
+ )
)
)
)
.
+ $q->span({-id=>"events"},'<!-- Dynamic content target DIV -->').
+ $q->div({-id=>"events_hidden",-style=>"visibility: hidden; position: absolute;"},
+ $q->table({-cellspacing=>0,-cellpadding=>4,-border=>0},
+ $q->Tr(
+ $q->td({-align=>"left",-valign=>"top",-style=>"width: 16px;"},
+ $q->img({-src=>$config->{web}->{webroot}."icons/address.png"})
+ ),
+ $q->td({-align=>"left",-valign=>"top",-style=>"width: 100px;"},
+ "Status"
+ ),
+ $q->td({-align=>"left",-style=>"padding:2px 4px 4px 4px;"},
+ eval {
+ my @where = ( 'frozen',
+ 'deferred',
+ 'bounce' );
+
+ my $labels = { 'frozen' => 'Frozen',
+ 'deferred' => 'Deferred',
+ 'bounce' => 'Bounce' };
+
+ my $html = "";
+ my $num = 0;
+ foreach my $w (@where) {
+ if (($num % 3) == 0) {
+ $html .= '<tr>';
+ }
+ $html .= $q->td({-width=>"1%",-style=>"padding-right: 4px;"},
+ $q->checkbox( { -name=>"q_qw",
+ -label=>"",
+ -checked=>(ina($param->{'q_qw'},$w) ? 'checked' : undef),
+ -onDblClick=>"javascript:q_qw_off_except(this);",
+ -override=>1,
+ -value=>$w } )
+ ).
+ $q->td({-style=>"padding-right: 10px;"},
+ $labels->{$w}
+ );
+ if (($num % 3) == 2) {
+ $html .= '</tr>';
+ }
+ $num++;
+ }
+ $q->table({-border=>0,-cellpadding=>0,-cellspacing=>0,-width=>"1%"},
+ $html
+ );
+ }
+ )
+ )
+ )
+ )
+ .
+ $q->span({-id=>"server"},'<!-- Dynamic content target DIV -->').
+ $q->div({-id=>"server_hidden",-style=>"visibility: hidden; position: absolute;"},
+ $q->table({-cellspacing=>0,-cellpadding=>4,-border=>0},
+ $q->Tr(
+ $q->td({-align=>"left",-valign=>"top",-style=>"width: 16px;"},
+ $q->img({-src=>$config->{web}->{webroot}."icons/server.png"})
+ ),
+ $q->td({-align=>"left",-valign=>"top",-style=>"width: 100px;"},
+ "Servers"
+ ),
+ $q->td({-align=>"left"},
+ eval {
+ my $html ="";
+ my $num = 0;
+ my $groups = {};
+ foreach my $server (sort {$a cmp $b} keys %{ $config->{servers} }) {
+ if (($num % 4) == 0) {
+ $html .= '<tr>';
+ }
+ $html .= $q->td({-width=>"1%",-style=>"padding-right: 4px;"},
+ $q->checkbox( { -name=>"q_sr",
+ -label=>"",
+ -id=>(edt($config->{servers}->{$server},'group') ? $config->{servers}->{$server}->{group} : "-XXX"),
+ -checked=>(ina($param->{'q_sr'},$server) ? 'checked' : undef),
+ -override=>1,
+ -onDblClick=>"javascript:q_sr_off_except(this);",
+ -onChange=>"javascript:q_sr_changed();",
+ -value=>$server } )
+ ).
+ $q->td({-width=>"1%",-style=>"padding-right: 10px;"},
+ $server
+ );
+ if (($num % 4) == 3) {
+ $html .= '<td>&nbsp;</td></tr>';
+ }
+ $num++;
+ if (edt($config->{servers}->{$server},'group')) {
+ $groups->{$config->{servers}->{$server}->{group}} = '{'.$config->{servers}->{$server}->{group}.'}';
+ }
+ }
+ if (($num % 4) != 0) {
+ $html .= '<td>&nbsp;</td>' x ((4-($num % 4))*2);
+ $html .= '<td>&nbsp;</td></tr>';
+ }
+ $groups->{'-all'} = 'All servers';
+ $groups->{'-custom'} = 'Custom selection';
+ $q->table({-border=>0,-cellpadding=>0,-cellspacing=>0,-width=>"1%"},
+ $q->Tr(
+ $q->td({-colspan=>9,-align=>"left",-style=>"padding-bottom: 4px;"},
+ $q->popup_menu({ -name=>"q_ss",
+ -id=>"q_ss",
+ -style=>"width: 400px;",
+ -values=>[ sort {$a cmp $b} keys(%{$groups}) ],
+ -labels=>$groups,
+ -onChange=>"javascript:q_ss_changed();",
+ -default=>(exists($param->{'q_ss'}) ? ($param->{'q_ss'} || '-all') : '-all'),
+ -override=>1})
+ )
+ ),
+ $html
+ );
+ }
+ )
+ )
+ )
+ )
+ .
+ $q->span({-id=>"time"},'<!-- Dynamic content target DIV -->').
+ $q->div({-id=>"time_hidden",-style=>"visibility: hidden; position: absolute;"},
+ $q->table({-cellspacing=>0,-cellpadding=>4,-border=>0},
+ $q->Tr(
+ $q->td({-align=>"left",-style=>"width: 16px;"},
+ $q->img({-src=>$config->{web}->{webroot}."icons/timerange.png"})
+ ),
+ $q->td({-align=>"left",-style=>"width: 100px;"},
+ "Age"
+ ),
+ $q->td({-align=>"left"},
+ $q->popup_menu({ -name=>"q_tr",
+ -id=>"q_tr",
+ -style=>"width: 400px;",
+ -values=>[ '0',
+ '-5m',
+ '-1h',
+ '-12h',
+ '-1d' ],
+ -labels=>{ '0' => 'Any',
+ '-5m' => 'Older than 5 minutes',
+ '-1h' => 'Older than 1 hour',
+ '-12h' => 'Older than 12 hours',
+ '-1d' => 'Older than 1 day' },
+ -default=>(exists($param->{'q_tr'}) ? $param->{'q_tr'} : '-5m'),
+ -override=>1})
+ )
+ )
+ )
+ )
+ .
'<hr>'
.
$q->table({-cellspacing=>0,-cellpadding=>4,-border=>0,-align=>"center"},
@@ -125,6 +324,16 @@ sub _print_Queue_selector {
)
);
+
+ print "\n".
+ '
+ <script language="JavaScript">
+ init_controls();
+ switch_controls(document.getElementById("q_qt").options[document.getElementById("q_qt").selectedIndex].value);
+ </script>
+ '
+ ."\n";
+
};
1;