#!/usr/bin/perl -wT #---------------------------------------------------------------------- # heading : Administration # description : E-mail Warteschlange # navigation : 5000 5100 # Copyright (C) 2005/2008 Peter Schubert, SACO Software and Consulting GmbH #---------------------------------------------------------------------- use strict; use esmith::FormMagick; use esmith::ConfigDB; use esmith::AccountsDB; use esmith::config; use esmith::cgi; use esmith::util; use esmith::lockfile; my $fm = esmith::FormMagick->new(); use CGI; $CGI::POST_MAX = -1; $CGI::DISABLE_UPLOADS = 0; $fm->{cgi} = CGI->new(); $fm->parse_xml(); my $conf = esmith::ConfigDB->open() || die $fm->localise('CANNOT_OPEN').'/home/e-smith/configuration'; # We need this hash for some esmith::cgi calls, so... tie my %conf, 'esmith::config', $conf->file; # Unbuffer standard output so that files and directories are listed as # they are restored $| = 1; # Store away current gid of 'www' group. my $www_gid = getgrnam("www"); #------------------------------------------------------------ # examine state parameter and display the appropriate form #------------------------------------------------------------ my $q = $fm->{cgi}; if (! grep (/^state$/, $q->param)) { showInitial ($q, ''); } elsif ($q->param ('state') eq "perform") { performAndShowResult ($q); } else { esmith::cgi::genStateError ($q, \%conf); } exit (0); #------------------------------------------------------------ # subroutine to display initial form #------------------------------------------------------------ sub showInitial { my ($q, $msg) = @_; if ($msg eq '') { esmith::cgi::genHeaderNonCacheable ($q, \%conf, $fm->localise('QMH_TITLE')); } else { esmith::cgi::genHeaderNonCacheable ($q, \%conf, $fm->localise('OPERATION_STATUS_REPORT')); print $q->div ({-class => "sme-error"}, $msg); print $q->hr; } # Hack to evaluate embedded vars print eval 'return "'.$fm->localise('QMH_DESC').'\n";'; my %labels = ( "list-queues" => $fm->localise('LIST_QUEUE'), "list-local-queue" => $fm->localise('LIST_LOCAL_QUEUE'), "list-remote-queue" => $fm->localise('LIST_REMOTE_QUEUE'), "resend" => $fm->localise('RESEND_QUEUE'), ); my @labels = ( 'list-queues', 'list-local-queue', 'list-remote-queue', 'resend', ); my $altqmail=$conf->get('altqmail') || 0; if ( $altqmail) { %labels = ( "list-queues" => $fm->localise('LIST_QUEUE'), "list-local-queue" => $fm->localise('LIST_LOCAL_QUEUE'), "list-remote-queue" => $fm->localise('LIST_REMOTE_QUEUE'), "resend" => $fm->localise('RESEND_QUEUE'), "alt-list-queues" => "altqmail: ". $fm->localise('LIST_QUEUE'), "alt-list-local-queue" => "altqmail: ". $fm->localise('LIST_LOCAL_QUEUE'), "alt-list-remote-queue" => "altqmail: ". $fm->localise('LIST_REMOTE_QUEUE'), "alt-resend" => "altqmail: ". $fm->localise('RESEND_QUEUE'), ); @labels = ( 'list-queues', 'list-local-queue', 'list-remote-queue', 'resend', 'alt-list-queues', 'alt-list-local-queue', 'alt-list-remote-queue', 'alt-resend', ); } my $default_action = 'list-queues'; print $q->startform( -method => 'POST', -action => $q->url (-absolute => 1) ),"\n"; print $q->start_table ({-class => "sme-noborders"}),"\n"; print $q->Tr( $q->td({-class => "sme-noborders-label"}, $fm->localise("SELECT_AN_ACTION")), $q->td({-class => "sme-noborders-content"}, $q->popup_menu ( -name => 'function', -values => [ @labels ], -default => $default_action, -labels => \%labels ) ) ),"\n"; print $q->end_table,"\n"; print $q->start_table ({width => "100%", -class => "sme-noborders"}), "\n"; print esmith::cgi::genButtonRow( $q, $q->submit (-name => 'action', -value => $fm->localise('PERFORM')) ); print $q->end_table,"\n"; print $q->hidden ( -name => 'state', -override => 1, -default => 'perform' ),"\n"; print $q->endform,"\n"; esmith::cgi::genFooter($fm); return; } sub performAndShowResult { my ($q) = @_; my $function = $q->param ('function'); if ($function eq 'refresh') { showInitial ($q, ''); } elsif ($function eq 'list-queues') { showListQueues ($q); } elsif ($function eq 'list-local-queue') { showListLocalQueue ($q); } elsif ($function eq 'list-remote-queue') { showListRemoteQueue ($q); } elsif ($function eq 'resend') { resend($q); } elsif ($function eq 'confirm-delete-message-number') { showDeleteMessageNumber ($q); } elsif ($function eq 'delete-message-number') { deleteMessageNumber($q); } elsif ($function eq 'alt-list-queues') { showListAltQueues ($q); } elsif ($function eq 'alt-list-local-queue') { showListLocalAltQueue ($q); } elsif ($function eq 'alt-list-remote-queue') { showListRemoteAltQueue ($q); } elsif ($function eq 'alt-resend') { Altresend($q); } elsif ($function eq 'alt-confirm-delete-message-number') { showDeleteAltMessageNumber ($q); } elsif ($function eq 'alt-delete-message-number') { deleteAltMessageNumber($q); } else { # Unknown function - refresh the screen anyway showInitial ($q, 'unknown'); } return; print $q->p ( $function ); esmith::cgi::genFooter($fm); } #------------------------------------------------------------ # subroutine to showListQueues #------------------------------------------------------------ sub showListQueues ($) { my ($q) = @_; esmith::cgi::genHeaderNonCacheable ($q, \%conf, $fm->localise('SHOWLISTQUEUES')); { print $q->hr; print $q->p($fm->localise('VIEW_TIME')),scalar localtime(time),"\n"; my $MailQueues = `/usr/bin/qmHandle -l`; my $queuetype = 'list-queues'; $MailQueues =~ s//'/g; $MailQueues = AddLinks($MailQueues, $queuetype, $q); print $q->p ($q->pre ("$MailQueues")); } esmith::cgi::genFooter($fm); return; } sub showListAltQueues ($) { my ($q) = @_; esmith::cgi::genHeaderNonCacheable ($q, \%conf, "altqmail: ". $fm->localise('SHOWLISTQUEUES')); { print $q->hr; print $q->p($fm->localise('VIEW_TIME')),scalar localtime(time),"\n"; my $MailQueues = `/usr/bin/qmHandle -X -l`; my $queuetype = 'alt-list-queues'; $MailQueues =~ s//'/g; $MailQueues = AddAltLinks($MailQueues, $queuetype, $q); print $q->p ($q->pre ("$MailQueues")); } esmith::cgi::genFooter($fm); return; } sub AddLinks { my $queues = shift; my $queueType = shift; my @splitq = split(/\n/, $queues); for (my $i = 0; $i < $#splitq; $i++) { if ($splitq[$i] =~ /^(\d+)\s+(\(\d+\,\s+\d+\/+\d+\)\s*)$/ ) { $splitq[$i] = "url( -absolute => 1 ) . "?state=perform&function=confirm-delete-message-number&queue=$queueType" . "&msgid=$1\">$1 $2"; } } $queues = join("\n", @splitq); return $queues; } sub AddAltLinks { my $queues = shift; my $queueType = shift; my @splitq = split(/\n/, $queues); for (my $i = 0; $i < $#splitq; $i++) { if ($splitq[$i] =~ /^(\d+)\s+(\(\d+\,\s+\d+\/+\d+\)\s*)$/ ) { $splitq[$i] = "url( -absolute => 1 ) . "?state=perform&function=alt-confirm-delete-message-number&queue=$queueType" . "&msgid=$1\">$1 $2"; } } $queues = join("\n", @splitq); return $queues; } #------------------------------------------------------------ # subroutine to showListLocalQueue #------------------------------------------------------------ sub showListLocalQueue ($) { my ($q) = @_; esmith::cgi::genHeaderNonCacheable ($q, \%conf, $fm->localise('LIST_LOCAL_QUEUE')); { print $q->hr; print $q->p($fm->localise('VIEW_TIME')),scalar localtime(time),"\n"; my $LocalQueue = `/usr/bin/qmHandle -L`; my $queuetype = 'list-local-queue'; $LocalQueue =~ s//'/g; $LocalQueue = AddLinks($LocalQueue, $queuetype); print $q->p ($q->pre ("$LocalQueue")); } esmith::cgi::genFooter($fm); return; } sub showListLocalAltQueue ($) { my ($q) = @_; esmith::cgi::genHeaderNonCacheable ($q, \%conf, "altqmail: ". $fm->localise('LIST_LOCAL_QUEUE')); { print $q->hr; print $q->p($fm->localise('VIEW_TIME')),scalar localtime(time),"\n"; my $LocalQueue = `/usr/bin/qmHandle -X -L`; my $queuetype = 'alt-list-local-queue'; $LocalQueue =~ s//'/g; $LocalQueue = AddAltLinks($LocalQueue, $queuetype); print $q->p ($q->pre ("$LocalQueue")); } esmith::cgi::genFooter($fm); return; } #------------------------------------------------------------ # subroutine to showListRemoteQueue #------------------------------------------------------------ sub showListRemoteQueue ($) { my ($q) = @_; esmith::cgi::genHeaderNonCacheable ($q, \%conf, $fm->localise('LIST_REMOTE_QUEUE')); { print $q->hr; print $q->p($fm->localise('VIEW_TIME')),scalar localtime(time),"\n"; my $RemoteQueue = `/usr/bin/qmHandle -R`; my $queuetype = 'list-remote-queue'; $RemoteQueue =~ s//'/g; $RemoteQueue = AddLinks($RemoteQueue, $queuetype); print $q->p ($q->pre ("$RemoteQueue")); } esmith::cgi::genFooter($fm); return; } sub showListRemoteAltQueue ($) { my ($q) = @_; esmith::cgi::genHeaderNonCacheable ($q, \%conf, "altqmail: ". $fm->localise('LIST_REMOTE_QUEUE')); { print $q->hr; print $q->p($fm->localise('VIEW_TIME')),scalar localtime(time),"\n"; my $RemoteQueue = `/usr/bin/qmHandle -X -R`; my $queuetype = 'alt-list-remote-queue'; $RemoteQueue =~ s//'/g; $RemoteQueue = AddAltLinks($RemoteQueue, $queuetype); print $q->p ($q->pre ("$RemoteQueue")); } esmith::cgi::genFooter($fm); return; } #------------------------------------------------------------ # subroutine to send ALARM to qmail #------------------------------------------------------------ sub resend ($) { my ($q) = @_; esmith::cgi::genHeaderNonCacheable ($q, \%conf, $fm->localise('TRY_SEND_QUEUE')); { print $q->hr; print $q->p($fm->localise('SEND_QUEUE_AT')),scalar localtime(time),"\n"; my $res = `/usr/bin/qmHandle -a`; print $q->p ($q->pre ("$res")); print $q->h3 ("Done."); } esmith::cgi::genFooter($fm); return; } sub Altresend ($) { my ($q) = @_; esmith::cgi::genHeaderNonCacheable ($q, \%conf, "altqmail: ". $fm->localise('TRY_SEND_QUEUE')); { print $q->hr; print $q->p($fm->localise('SEND_QUEUE_AT')),scalar localtime(time),"\n"; my $res = `/usr/bin/qmHandle -X -a`; print $q->p ($q->pre ("$res")); print $q->h3 ("Done."); } esmith::cgi::genFooter($fm); return; } #------------------------------------------------------------ # subroutine to showDeleteMessageNumber #------------------------------------------------------------ sub showDeleteMessageNumber ($) { my ($q) = @_; my $msgid = $q->param ('msgid'); my $queuetype = $q->param ('queue'); if ($msgid =~ /^(\d+)$/) { $msgid = $1; } else { $msgid = undef; } esmith::cgi::genHeaderNonCacheable ($q, \%conf, $fm->localise('DELETE_MSG_TITLEB')); print $q->hr; print $q->p($fm->localise('DELETE_MESSAGE')),"\n"; my $Message = `/usr/bin/qmHandle -m$msgid|head -100`; print $q->textarea (-name => 'message', -override => 1, -default => "$Message", -rows => 30, -cols => 80); print $q->start_multipart_form(-method => 'POST', -action => $q->url (-absolute => 1)); print $q->table ({border => 0, cellspacing => 0, cellpadding => 4}, esmith::cgi::genButtonRow ($q, $q->submit (-name => 'action', -value => $fm->localise('Delete')))); print $q->hidden (-name => 'state', -override => 1, -default => 'perform'); print $q->hidden (-name => 'msgid', -override => 1, -default => "$msgid"); print $q->hidden (-name => 'function', -override => 1, -default => 'delete-message-number'); print $q->hidden (-name => 'queue', -override => 1, -default => "$queuetype"); print $q->endform; esmith::cgi::genFooter ($q); return; } sub showDeleteAltMessageNumber ($) { my ($q) = @_; my $msgid = $q->param ('msgid'); my $queuetype = $q->param ('queue'); if ($msgid =~ /^(\d+)$/) { $msgid = $1; } else { $msgid = undef; } esmith::cgi::genHeaderNonCacheable ($q, \%conf, "altqmail: ". $fm->localise('DELETE_MSG_TITLEB')); print $q->hr; print $q->p($fm->localise('DELETE_MESSAGE')),"\n"; my $Message = `/usr/bin/qmHandle -X -m$msgid|head -100`; print $q->textarea (-name => 'message', -override => 1, -default => "$Message", -rows => 30, -cols => 80); print $q->start_multipart_form(-method => 'POST', -action => $q->url (-absolute => 1)); print $q->table ({border => 0, cellspacing => 0, cellpadding => 4}, esmith::cgi::genButtonRow ($q, $q->submit (-name => 'action', -value => $fm->localise('Delete')))); print $q->hidden (-name => 'state', -override => 1, -default => 'perform'); print $q->hidden (-name => 'msgid', -override => 1, -default => "$msgid"); print $q->hidden (-name => 'function', -override => 1, -default => 'delete-message-number'); print $q->hidden (-name => 'queue', -override => 1, -default => "$queuetype"); print $q->endform; esmith::cgi::genFooter ($q); return; } sub deleteMessageNumber ($) { my ($q) = @_; my $msgid = $q->param ('msgid'); my $queuetype = $q->param ('queue'); if ($msgid =~ /^(\d+)$/) { $msgid = $1; } else { $msgid = undef; } my $Output = `/usr/bin/qmHandle -d$msgid`; esmith::cgi::genHeaderNonCacheable ($q, \%conf, "qmail: ". $fm->localise('QMH_TITLE')); print $q->hr; print $q->h3 ($fm->localise('DELETED'))," $msgid "; print $q->br(); print $q->br(); print $q->start_multipart_form(-method => 'POST', -action => $q->url (-absolute => 1)); print $q->table ({border => 0, cellspacing => 0, cellpadding => 4}, esmith::cgi::genButtonRow ($q, $q->submit (-name => 'action', -value => $fm->localise('RETURN_TO_QUEUE')))); print $q->hidden (-name => 'state', -override => 1, -default => 'perform'); print $q->hidden (-name => 'function', -override => 1, -default => "$queuetype"); print $q->endform; esmith::cgi::genFooter ($q); return; } sub deleteAltMessageNumber ($) { my ($q) = @_; my $msgid = $q->param ('msgid'); my $queuetype = $q->param ('queue'); if ($msgid =~ /^(\d+)$/) { $msgid = $1; } else { $msgid = undef; } my $Output = `/usr/bin/qmHandle -X -d$msgid`; esmith::cgi::genHeaderNonCacheable ($q, \%conf, "altqmail: ". $fm->localise('QMH_TITLE')); print $q->hr; print $q->h3 ($fm->localise('DELETED'))," $msgid "; print $q->br(); print $q->br(); print $q->start_multipart_form(-method => 'POST', -action => $q->url (-absolute => 1)); print $q->table ({border => 0, cellspacing => 0, cellpadding => 4}, esmith::cgi::genButtonRow ($q, $q->submit (-name => 'action', -value => $fm->localise('RETURN_TO_QUEUE')))); print $q->hidden (-name => 'state', -override => 1, -default => 'perform'); print $q->hidden (-name => 'function', -override => 1, -default => "$queuetype"); print $q->endform; esmith::cgi::genFooter ($q); return; } __DATA__