diff options
author | Tom Kistner <tom@duncanthrax.net> | 2008-12-04 11:24:17 +0100 |
---|---|---|
committer | Andreas Unterkircher <unki@netshadow.at> | 2008-12-12 23:18:56 +0100 |
commit | f8a8bc98f9a77d24e0fce2abd73c9512bcf26f2d (patch) | |
tree | 84af841fdb450b60d54e590ec02b9ddb0e671cba /cgi | |
parent | a35e1469841bfbc7e58b66dcefb108993bc4b494 (diff) | |
download | exilog-f8a8bc98f9a77d24e0fce2abd73c9512bcf26f2d.zip exilog-f8a8bc98f9a77d24e0fce2abd73c9512bcf26f2d.tar.gz exilog-f8a8bc98f9a77d24e0fce2abd73c9512bcf26f2d.tar.bz2 |
Forward unreleased changes
- IPv6 address parsing
- Some queue management
- Better SQL quoting
- More misc stuff
Signed-off-by: Tom Kistner <tom@duncanthrax.net>
Diffstat (limited to 'cgi')
-rwxr-xr-x | cgi/exilog_cgi.pl | 37 | ||||
-rw-r--r-- | cgi/exilog_cgi_html.pm | 223 | ||||
-rw-r--r-- | cgi/exilog_cgi_messages.pm | 69 | ||||
-rw-r--r-- | cgi/exilog_cgi_param.pm | 10 | ||||
-rw-r--r-- | cgi/exilog_cgi_queues.pm | 323 |
5 files changed, 485 insertions, 177 deletions
diff --git a/cgi/exilog_cgi.pl b/cgi/exilog_cgi.pl index f8b6867..6c3afb8 100755 --- a/cgi/exilog_cgi.pl +++ b/cgi/exilog_cgi.pl @@ -23,10 +23,23 @@ use exilog_sql; # Put user name into global variable my $user = $ENV{'REMOTE_USER'} || 'anonymous'; +# XMLHTTP requests are handled here. +# We only return short result statements +# in text/plain format for those. +if ($param->{'xmlhttp'} == 1) { + print $q->header(-expires=>'Thursday, 01-Jan-1970 00:00:01 GMT', + -Expires=>'now', + -Content-Type=>'text/plain', + -Cache-Control=>'no-cache', + -Cache-Control=>'no-store', + -Pragma=>'no-cache'); + print _do_xmlhttp_actions(); + exit(0); +} + _print_cgi_headers(); _print_html_header(); _print_html_tabs(); -_do_global_actions(); print '<div class="display" align="center">'; if ($param->{tab} eq 'queues') { @@ -48,23 +61,19 @@ _print_html_footer(); # -- Private functions --------------------------------------------------------- -sub _do_global_actions { - +sub _do_xmlhttp_actions { # queue actions my $valid_actions = [ 'deliver', 'cancel', 'delete' ]; my $restricted_actions = [ 'cancel', 'delete' ]; - foreach my $p (keys %{ $param }) { - if ($p =~ /^ac_([A-Za-z0-9_.-]+?)_([A-Za-z0-9]{6}\-[A-Za-z0-9]{6}-[A-Za-z0-9]{2})$/) { - my $server = $1; - my $message_id = $2; - my $action = $param->{$p}; - if (ina($valid_actions,$action)) { - next if (ina($restricted_actions,$action) && ina($config->{web}->{restricted_users},$main::user)); - sql_queue_set_action($server,$message_id,$action); - } - } + my $action_text = { 'deliver' => 'Forcing', 'cancel' => 'Cancelling', 'delete' => 'Deleting' }; + + if ( ina($valid_actions,$param->{'action'}) && + !(ina($restricted_actions,$param->{'action'}) && ina($config->{web}->{restricted_users},$main::user)) ) { + sql_queue_set_action($param->{'server'},$param->{'message_id'},$param->{'action'}); + return $action_text->{$param->{'action'}}; } + return 0; }; @@ -95,7 +104,7 @@ sub _print_html_header { sub _print_html_tabs { my $tabs = { 'servers' => "Servers", 'messages' => "Messages", - #'queues' => "Queues", # Queue manager is still unfinished ... + 'queues' => "Queues", 'messages' => "Messages" }; my $html; diff --git a/cgi/exilog_cgi_html.pm b/cgi/exilog_cgi_html.pm index 9011369..bfb207c 100644 --- a/cgi/exilog_cgi_html.pm +++ b/cgi/exilog_cgi_html.pm @@ -30,7 +30,6 @@ BEGIN { &render_server &render_queue_table $q - ); %EXPORT_TAGS = (); @@ -281,16 +280,20 @@ sub _titlebar_html { ( (edv($h,'queue') && defined(@{$h->{queue}}[0])) ? { 'text' => '·' } : undef ), ( (edv($h,'queue') && - defined(@{$h->{queue}}[0])) ? { 'html' => $q->popup_menu({ - -name => 'ac_'.$h->{server}.'_'.$h->{'message_id'}, - -values => $actions, - -default => 0, - -labels => { 0 => ':: Please select action ::', - 'deliver' => 'Force delivery', - 'cancel' => 'Cancel (bounce)', - 'delete' => 'Delete' }, - -override => 1 - }).$q->submit({-name=>'Go'}) + defined(@{$h->{queue}}[0])) ? { 'html' => + + $q->div({ -id=>'ac_'.$h->{server}.'_'.$h->{'message_id'}.'_div', + -style=>"margin:0; padding:0; border:0; width: 110px; color: red;" }, + $q->popup_menu({ -values => $actions, + -default => 0, + -onChange=>"javascript:message_action('$h->{server}','$h->{message_id}',this,'ac_$h->{server}_$h->{message_id}_div');", + -labels => { 0 => ':: Select action ::', + 'deliver' => 'Force delivery', + 'cancel' => 'Cancel (bounce)', + 'delete' => 'Delete' }, + -override => 1 } ) + ) + } : undef ) ) ), (exists($h->{size}) ? @@ -802,64 +805,126 @@ sub render_queue_table { my $rows = ""; foreach my $message (@{ $messages }) { + + my $actions = [ 0, 'deliver' ]; + unless (ina($config->{web}->{restricted_users}, $main::user)) { + if ($message->{mailfrom} ne '<>') { + push @{$actions}, 'cancel'; + } + push @{$actions}, 'delete'; + } + my $row_id = $message->{server}.'_'.$message->{message_id}; my @rcpts_delivered = split / /,$message->{recipients_delivered}; my @rcpts_pending = split / /,$message->{recipients_pending}; + my $rcpts_html = ""; + foreach my $rcpt (@rcpts_pending) { + $rcpts_html .= + _item( { 'icon' => 'icons/deferred.png' }, + { 'text' => $rcpt } ); + } + foreach my $rcpt (@rcpts_delivered) { + $rcpts_html .= + _item( { 'icon' => 'icons/delivered.png' }, + { 'text' => $rcpt } ); + } + my $headers = $message->{headers}; + $headers =~ s/\&/&/g; + $headers =~ s/\</</g; + $headers =~ s/\>/>/g; + $rows .= $q->Tr( - $q->td({-class=>"queue"}, - # Actions - ), - $q->td({-class=>"queue"}, - $message->{server} - ), - $q->td({-class=>"queue"}, - edt($message,'timestamp') ? - _timespan($now - $message->{timestamp}) - : - '?' - ), - $q->td({-class=>"queue"}, - _shorten_addr($message->{mailfrom},40) - ), - $q->td({-class=>"queue", - -onMouseOver=>"javascript:document.getElementById('$row_id' + '_pending').style.visibility = 'visible';", - -onMouseOut=>"javascript:document.getElementById('$row_id' + '_pending').style.visibility = 'hidden';"}, - _shorten_addr($rcpts_pending[0],40) - ), - $q->td({-class=>"queue"}, - (defined($rcpts_pending[0]) ? - $q->div({-id=>$row_id.'_pending', -class=>"rcpts_pending_popup"},"Test<br>Test2<br>Test3") - : - ''). - _shorten_string($message->{subject},60) + $q->td( + $q->table({-class=>"queue_entry_table",-cellpadding=>2,-cellspacing=>1,-border=>0}, + $q->Tr( + $q->td({ -class=>"queue", + -width=>32, + -rowspan=>2}, + ( edt($message,'frozen') ? + png("icons/queue_frozen.png",32,32,"Frozen at ".stamp_to_date($message->{frozen})) + : + png("icons/queue_deferred.png",32,32,"") + ) + ), + $q->td({-class=>"queue"}, + _item( { 'icon' => "icons/server.png" }, + { 'text' => $message->{server} } ) + ), + $q->td({-class=>"queue", -align=>"center"}, + _item( { 'icon' => "icons/timerange.png" }, + { 'text' => (edt($message,'timestamp') ? + _timespan($now - $message->{timestamp},2) + : + '?' ) } ) + ), + $q->td({ -class=>"queue", + -width=>"300" }, + _item( { 'icon' => "icons/arrival.png" }, + { 'text' => _shorten_addr($message->{mailfrom},40) } ) + ), + $q->td({-class=>"queue", + -onMouseOver=>"javascript:document.getElementById('$row_id' + '_rcpts').style.visibility = 'visible';", + -onMouseOut=>"javascript:document.getElementById('$row_id' + '_rcpts').style.visibility = 'hidden';" }, + $q->div({-class=>"popup_container"}, + $q->div({-id=>$row_id.'_rcpts', + -class=>"popup", + -style=>"width:326px;"}, + $rcpts_html + ) + ). + _item( { 'icon' => "icons/deferred.png" }, + { 'html' => _shorten_addr($rcpts_pending[0],40). + ( ((scalar @rcpts_pending) + (scalar @rcpts_delivered) > 1) ? + ' (+'.((scalar @rcpts_pending)+(scalar @rcpts_delivered)-1).'↓)' : "" ) } ) + ) + ), + $q->Tr( + $q->td({ -class=>"queue", + -width=>120, + -nowrap=>"nowrap", + -align=>"center"}, + $message->{message_id} + ), + $q->td({ -class=>"queue", + -style=>"padding: 0px;", + -width=>110, + -align=>"center"}, + $q->div({ -id=>'ac_'.$message->{server}.'_'.$message->{'message_id'}.'_div', + -style=>"margin:0; padding:0; border:0; width: 110px; color: red;" }, + $q->popup_menu({ -values => $actions, + -style=>"width: 110px;", + -default => 0, + -onChange=>"javascript:message_action('$message->{server}','$message->{message_id}',this,'ac_$message->{server}_$message->{message_id}_div');", + -labels => { 0 => ':: Select action ::', + 'deliver' => 'Force delivery', + 'cancel' => 'Cancel (bounce)', + 'delete' => 'Delete' }, + -override => 1 }) ) + ), + $q->td({-class=>"queue", + -onMouseDown=>"javascript:document.getElementById('$row_id' + '_headers').style.visibility = 'visible';", + -style=>"font-family: Arial, Helvetica, Sans-Serif;",colspan=>2}, + $q->div({-class=>"popup_container"}, + $q->div({-id=>$row_id.'_headers', + -class=>"popup", + -onDblClick=>"javascript:document.getElementById('$row_id' + '_headers').style.visibility = 'hidden';", + -style=>"width:635px;"}, + '<pre style="font-size: 12px;">'. + $headers. + '</pre>' + ) + ). + _shorten_string($message->{subject},100) + ) + ) + ) ) ); }; $q->div({-class=>"top_spacer"}, - $q->table({-class=>"queue_table",-cellpadding=>0,-cellspacing=>1,border=>0}, - $q->Tr( - # Table header - $q->td({-class=>"queue_header",-width=>"1%"}, - " " - ), - $q->td({-class=>"queue_header",-width=>"1%"}, - "Server" - ), - $q->td({-class=>"queue_header",-width=>"1%"}, - "Age" - ), - $q->td({-class=>"queue_header",-width=>"1%"}, - "Sender" - ), - $q->td({-class=>"queue_header",-width=>"1%"}, - "Recipient(s)" - ), - $q->td({-class=>"queue_header"}, - "Subject" - ) - ), + $q->table({-class=>"queue_frame_table",-cellpadding=>0,-cellspacing=>0,border=>0}, $rows ) ); @@ -888,15 +953,15 @@ sub _item { if (exists($part->{icon})) { $html .= - $q->td({-class=>"item_icon",-style=>(exists($part->{style}) ? $part->{style} : "")}, - $q->img({ -src=>$part->{icon}, - -title=>(exists($part->{title}) ? $part->{title} : "" ), - -border=>0 }) + $q->td({ -class=>"item_icon", + -style=>(exists($part->{style}) ? $part->{style} : "")}, + png($part->{icon},16,16,(exists($part->{title}) ? $part->{title} : "" )) ); next; } elsif (exists($part->{html})) { - $html .= $q->td({-class=>"item_text"}, $part->{html}); + $html .= $q->td({ -class=>"item_text", + }, $part->{html}); } elsif (exists($part->{text})) { # HTML-quote angle brackets @@ -965,18 +1030,26 @@ sub _shorten_string { sub _timespan { my $amnt = shift; - my @steps = (1,60,60,24,7,999999999); - my @units = ('s','m','h','d','wk'); - - my $str = ""; - while ($amnt > $steps[1]) { - my $rest = $amnt % $steps[1]; - $str = $rest.$units[0]." ".$str; - $amnt = int($amnt/$steps[1]); + my $cutoff = shift || 999; + my $str = ''; + my @units = ('wk','d','h','m','s'); + my @quantums = ( (7*24*60*60*1), + ( 24*60*60*1), + ( 60*60*1), + ( 60*1), + ( 1) ); + + foreach my $quantum (@quantums) { + if (int($amnt/$quantum) > 0) { + $str .= int($amnt/$quantum).$units[0]." "; + $amnt = $amnt%$quantum; + last unless (--$cutoff); + } shift @units; - shift @steps; - }; - $str = $amnt.$units[0]." ".$str; + last unless ($amnt); + } + # Fall-through default + $str = '0s' unless ($str); return $str; }; diff --git a/cgi/exilog_cgi_messages.pm b/cgi/exilog_cgi_messages.pm index 9556771..bbcb062 100644 --- a/cgi/exilog_cgi_messages.pm +++ b/cgi/exilog_cgi_messages.pm @@ -62,7 +62,7 @@ sub _select_ident { } my $criteria = { 'timestamp' => (edt($param,'tr') ? _make_tr() : undef), 'server' => (edt($param,'sr') ? $param->{'sr'} : undef ), - 'host_ident' => $param->{'qs'} }; + 'host_ident' => dos2sql($param->{'qs'}) }; # Only messages table return sql_select( 'messages', [ 'server','message_id','timestamp' ], $criteria ); }; @@ -72,7 +72,7 @@ sub _select_msgid { return []; } # Only messages table - return sql_select( 'messages', [ 'server','message_id','timestamp' ], { 'msgid' => $param->{'qs'} } ); + return sql_select( 'messages', [ 'server','message_id','timestamp' ], { 'msgid' => dos2sql($param->{'qs'}) } ); }; sub _select_message_id { @@ -82,13 +82,14 @@ sub _select_message_id { my @results = (); my @tables = ( 'deliveries','errors','unknown','deferrals','messages','rejects','queue' ); - my $criteria = { 'message_id' => $param->{'qs'} }; + my $criteria = { 'message_id' => dos2sql($param->{'qs'}) }; foreach my $table (@tables) { push @results, @{ sql_select( $table, [ 'server','message_id','timestamp' ], $criteria ) }; }; # check bounce parent field too - push @results, @{ sql_select( 'messages', [ 'server','message_id','timestamp' ], { 'bounce_parent' => $param->{'qs'} } ) }; + push @results, @{ sql_select( 'messages', [ 'server','message_id','timestamp' ], + { 'bounce_parent' => dos2sql($param->{'qs'}) } ) }; return \@results; }; @@ -102,25 +103,25 @@ sub _select_addr { my @queries; push @queries, { 'table' => 'messages', - 'criteria' => { 'mailfrom' => $param->{'qs'} } }, + 'criteria' => { 'mailfrom' => dos2sql($param->{'qs'}) } }, { 'table' => 'rejects', - 'criteria' => { 'mailfrom' => $param->{'qs'} } } + 'criteria' => { 'mailfrom' => dos2sql($param->{'qs'}) } } if (($p eq 'sender') || ($p eq 'all')); push @queries, { 'table' => 'rejects', - 'criteria' => { 'rcpt' => $param->{'qs'} } }, + 'criteria' => { 'rcpt' => dos2sql($param->{'qs'}) } }, { 'table' => 'deliveries', - 'criteria' => { 'rcpt' => $param->{'qs'} } }, + 'criteria' => { 'rcpt' => dos2sql($param->{'qs'}) } }, { 'table' => 'deliveries', - 'criteria' => { 'rcpt_final' => $param->{'qs'} } }, + 'criteria' => { 'rcpt_final' => dos2sql($param->{'qs'}) } }, { 'table' => 'deferrals', - 'criteria' => { 'rcpt' => $param->{'qs'} } }, + 'criteria' => { 'rcpt' => dos2sql($param->{'qs'}) } }, { 'table' => 'deferrals', - 'criteria' => { 'rcpt_final' => $param->{'qs'} } }, + 'criteria' => { 'rcpt_final' => dos2sql($param->{'qs'}) } }, { 'table' => 'errors', - 'criteria' => { 'rcpt' => $param->{'qs'} } }, + 'criteria' => { 'rcpt' => dos2sql($param->{'qs'}) } }, { 'table' => 'errors', - 'criteria' => { 'rcpt_final' => $param->{'qs'} } } + 'criteria' => { 'rcpt_final' => dos2sql($param->{'qs'}) } } if (($p eq 'rcpt') || ($p eq 'all')); @@ -145,22 +146,22 @@ sub _select_host { } my @queries; - if ($param->{'qs'} =~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/) { - # IPv4 address + if ($param->{'qs'} =~ /^[0-9A-Fa-f.:]+$/) { + # IPv4 or IPv6 address push @queries, { 'table' => 'messages', - 'criteria' => { 'host_addr' => $param->{'qs'} } }, + 'criteria' => { 'host_addr' => dos2sql($param->{'qs'}) } }, { 'table' => 'rejects', - 'criteria' => { 'host_addr' => $param->{'qs'} } } + 'criteria' => { 'host_addr' => dos2sql($param->{'qs'}) } } if (($p eq 'incoming') || ($p eq 'all')); push @queries, { 'table' => 'deliveries', - 'criteria' => { 'host_addr' => $param->{'qs'} } }, + 'criteria' => { 'host_addr' => dos2sql($param->{'qs'}) } }, { 'table' => 'deferrals', - 'criteria' => { 'host_addr' => $param->{'qs'} } }, + 'criteria' => { 'host_addr' => dos2sql($param->{'qs'}) } }, { 'table' => 'errors', - 'criteria' => { 'host_addr' => $param->{'qs'} } }, + 'criteria' => { 'host_addr' => dos2sql($param->{'qs'}) } }, { 'table' => 'unknown', - 'criteria' => { 'line' => '%'.$param->{'qs'}.'%' } } + 'criteria' => { 'line' => '%'.dos2sql($param->{'qs'}).'%' } } if (($p eq 'outgoing') || ($p eq 'all')); } @@ -210,24 +211,24 @@ sub _select_host { $suffix_wc = '%' if ($param->{'qs'} !~ /\%$/); push @queries, { 'table' => 'messages', - 'criteria' => { 'host_helo' => $param->{'qs'} } }, + 'criteria' => { 'host_helo' => dos2sql($param->{'qs'}) } }, { 'table' => 'messages', - 'criteria' => { 'host_rdns' => $param->{'qs'} } }, + 'criteria' => { 'host_rdns' => dos2sql($param->{'qs'}) } }, { 'table' => 'rejects', - 'criteria' => { 'host_helo' => $param->{'qs'} } }, + 'criteria' => { 'host_helo' => dos2sql($param->{'qs'}) } }, { 'table' => 'rejects', - 'criteria' => { 'host_rdns' => $param->{'qs'} } } + 'criteria' => { 'host_rdns' => dos2sql($param->{'qs'}) } } if (($p eq 'incoming') || ($p eq 'all')); push @queries, { 'table' => 'deliveries', - 'criteria' => { 'host_dns' => $param->{'qs'} } }, + 'criteria' => { 'host_dns' => dos2sql($param->{'qs'}) } }, { 'table' => 'deferrals', - 'criteria' => { 'host_dns' => $param->{'qs'} } }, + 'criteria' => { 'host_dns' => dos2sql($param->{'qs'}) } }, { 'table' => 'errors', - 'criteria' => { 'host_dns' => $param->{'qs'} } }, + 'criteria' => { 'host_dns' => dos2sql($param->{'qs'}) } }, { 'table' => 'unknown', # the blank makes sure that we do not match domains in addresses - 'criteria' => { 'line' => $prefix_wc.' '.$param->{'qs'}.$suffix_wc } } + 'criteria' => { 'line' => $prefix_wc.' '.dos2sql($param->{'qs'}).$suffix_wc } } if (($p eq 'outgoing') || ($p eq 'all')); }; @@ -525,6 +526,16 @@ sub _print_Messages_selector { _make_tr(); + # Calendar popup DIVs + print "\n". + ' + <script language="JavaScript"> + var cal1x = new CalendarPopup("caldiv1x"); + var cal2x = new CalendarPopup("caldiv2x"); + </script> + ' + ."\n"; + print $q->div({-class=>"top_spacer"}, $q->div({-align=>"left",-style=>"padding: 10px; border: 1px solid black; background: #eeeeee;"}, diff --git a/cgi/exilog_cgi_param.pm b/cgi/exilog_cgi_param.pm index 5096ee3..5948530 100644 --- a/cgi/exilog_cgi_param.pm +++ b/cgi/exilog_cgi_param.pm @@ -57,11 +57,17 @@ sub _init_cgi_params { 'deferrals', 'rejects', 'queue' ], + 'q_qw' => [ 'frozen', + 'deferred', + 'bounce' ], 'ss' => '-all', + 'q_ss' => '-all', 'tr' => '-10m', - #'qt' => 'all', + 'q_tr' => '-5m', 'qs' => "", - 'sr' => [ keys %{ $config->{servers} } ] + 'q_qs' => "", + 'sr' => [ keys %{ $config->{servers} } ], + 'q_sr' => [ keys %{ $config->{servers} } ] }; foreach (keys %{ $defaults }) { 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> </td></tr>'; - }; - $num++; - if (edt($config->{servers}->{$server},'group')) { - $groups->{$config->{servers}->{$server}->{group}} = '{'.$config->{servers}->{$server}->{group}.'}'; - }; - }; - if (($num % 4) != 0) { - $html .= '<td> </td>' x ((4-($num % 4))*2); - $html .= '<td> </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> </td></tr>'; + } + $num++; + if (edt($config->{servers}->{$server},'group')) { + $groups->{$config->{servers}->{$server}->{group}} = '{'.$config->{servers}->{$server}->{group}.'}'; + } + } + if (($num % 4) != 0) { + $html .= '<td> </td>' x ((4-($num % 4))*2); + $html .= '<td> </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; |