summaryrefslogtreecommitdiffstats
path: root/contrib/sendmail/contrib/qtool.pl
diff options
context:
space:
mode:
authorgshapiro <gshapiro@FreeBSD.org>2002-02-17 21:56:45 +0000
committergshapiro <gshapiro@FreeBSD.org>2002-02-17 21:56:45 +0000
commit8449595fe97f4474b9b9a7e4edee1ef35dcff393 (patch)
treee7a33b132264d449a512ddf4a8685df097669c1d /contrib/sendmail/contrib/qtool.pl
parent289b381b31415647269c7520d881017e2dcb27f1 (diff)
downloadFreeBSD-src-8449595fe97f4474b9b9a7e4edee1ef35dcff393.zip
FreeBSD-src-8449595fe97f4474b9b9a7e4edee1ef35dcff393.tar.gz
Import sendmail 8.12.2
Diffstat (limited to 'contrib/sendmail/contrib/qtool.pl')
-rwxr-xr-xcontrib/sendmail/contrib/qtool.pl124
1 files changed, 94 insertions, 30 deletions
diff --git a/contrib/sendmail/contrib/qtool.pl b/contrib/sendmail/contrib/qtool.pl
index f4d36f3..d93f743a 100755
--- a/contrib/sendmail/contrib/qtool.pl
+++ b/contrib/sendmail/contrib/qtool.pl
@@ -1,9 +1,9 @@
#!/usr/bin/env perl
##
-## Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
-## All rights reserved.
+## Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
+## All rights reserved.
##
-## $Id: qtool.pl,v 8.15.16.4 2000/11/30 07:14:01 gshapiro Exp $
+## $Id: qtool.pl,v 8.26 2001/11/21 19:26:17 gshapiro Exp $
##
use strict;
use File::Basename;
@@ -43,7 +43,7 @@ use Getopt::Std;
## queue message. This lets you check for any value in the message
## headers or the control file. Here's an example:
##
-## ./qtool.pl -e '$msg->{num_delivery_attempts} >= 2' /q1 /q2
+## ./qtool.pl -e '$msg{num_delivery_attempts} >= 2' /q1 /q2
##
## This would move any queue files whose number of delivery attempts
## is greater than or equal to 2 from the queue 'q2' to the queue 'q1'.
@@ -61,9 +61,10 @@ my $source;
my $result;
my $action;
my $new_condition;
+my $qprefix;
my $conditions = new Compound();
-Getopt::Std::getopts('bde:s:', \%opts);
+Getopt::Std::getopts('bC:de:Qs:', \%opts);
sub move_action
{
@@ -113,6 +114,15 @@ if (defined $opts{e})
$conditions->add($new_condition);
}
+if (defined $opts{Q})
+{
+ $qprefix = "hf";
+}
+else
+{
+ $qprefix = "qf";
+}
+
if ($action == \&move_action)
{
$dst_name = shift(@ARGV);
@@ -126,6 +136,37 @@ if ($action == \&move_action)
$destination = new Queue($dst_name);
}
+# determine queue_root by reading config file
+my $queue_root;
+{
+ my $config_file = "/etc/mail/sendmail.cf";
+ if (defined $opts{C})
+ {
+ $config_file = $opts{C};
+ }
+
+ my $line;
+ open(CONFIG_FILE, $config_file) or die "$config_file: $!";
+ while ($line = <CONFIG_FILE>)
+ {
+ chomp $line;
+ if ($line =~ m/^O QueueDirectory=(.*)/)
+ {
+ $queue_root = $1;
+ if ($queue_root =~ m/(.*)\/[^\/]+\*$/)
+ {
+ $queue_root = $1;
+ }
+ last;
+ }
+ }
+ close(CONFIG_FILE);
+ if (!defined $queue_root)
+ {
+ die "QueueDirectory option not defined in $config_file";
+ }
+}
+
while (@ARGV)
{
$source_name = shift(@ARGV);
@@ -157,13 +198,18 @@ while (($source_name, $source) = each(%sources))
sub usage
{
- print("Usage: $0 [options] directory source ...\n");
- print(" $0 [-d|-b] source ...\n");
- print("options:\n");
- print(" -b Bounce the messages specified by source.\n");
- print(" -d Delete the messages specified by source.\n");
- print(" -e [perl expression] Move only messages for which perl expression returns true.\n");
- print(" -s [seconds] Move only messages whose qf file is older than seconds.\n");
+ print("Usage:\t$0 [options] directory source ...\n");
+ print("\t$0 [-Q][-d|-b] source ...\n");
+ print("Options:\n");
+ print("\t-b\t\tBounce the messages specified by source.\n");
+ print("\t-C configfile\tSpecify sendmail config file.\n");
+ print("\t-d\t\tDelete the messages specified by source.\n");
+ print("\t-e [perl expression]\n");
+ print("\t\t\tMove only messages for which perl expression\n");
+ print("\t\t\treturns true.\n");
+ print("\t-Q\t\tOperate on quarantined files.\n");
+ print("\t-s [seconds]\tMove only messages whose queue file is older\n");
+ print("\t\t\tthan seconds.\n");
}
##
@@ -204,10 +250,10 @@ sub add_source
$data_dir_name = $source_dir_name;
$source_prefix = substr($source_base_name, 0, 2);
- if (!-d $source_name && $source_prefix ne 'qf' &&
+ if (!-d $source_name && $source_prefix ne $qprefix &&
$source_prefix ne 'df')
{
- $source_base_name = "qf$source_base_name";
+ $source_base_name = "$qprefix$source_base_name";
$source_name = File::Spec->catfile("$source_dir_name",
"$source_base_name");
}
@@ -216,12 +262,16 @@ sub add_source
if (!-e $source_name)
{
$source_name = File::Spec->catfile("$source_dir_name", "qf",
- "qf$source_id");
+ "$qprefix$source_id");
if (!-e $source_name)
{
return "'$source_name' does not exist";
}
$data_dir_name = File::Spec->catfile("$source_dir_name", "df");
+ if (!-d $data_dir_name)
+ {
+ $data_dir_name = $source_dir_name;
+ }
$source_dir_name = File::Spec->catfile("$source_dir_name",
"qf");
}
@@ -377,7 +427,7 @@ sub initialize
my $queue_dir = shift;
$self->{id} = shift;
- $self->{file_name} = $queue_dir . '/qf' . $self->{id};
+ $self->{file_name} = $queue_dir . '/' . $qprefix . $self->{id};
$self->{headers} = {};
}
@@ -402,9 +452,11 @@ sub parse
'B' => 'body_type',
'C' => 'controlling_user',
'D' => 'data_file_name',
+ 'd' => 'data_file_directory',
'E' => 'error_recipient',
'F' => 'flags',
'H' => 'parse_header',
+ 'G' => 'queue_delay',
'I' => 'inode_number',
'K' => 'next_delivery_time',
'L' => 'content-length',
@@ -413,11 +465,14 @@ sub parse
'P' => 'priority',
'Q' => 'original_recipient',
'R' => 'recipient',
+ 'q' => 'quarantine_reason',
+ 'r' => 'final_recipient',
'S' => 'sender',
'T' => 'creation_time',
'V' => 'version',
- 'X' => 'charset',
+ 'Y' => 'current_delay',
'Z' => 'envid',
+ '!' => 'deliver_by',
'$' => 'macro'
);
my $line;
@@ -488,7 +543,7 @@ sub parse_header
if (ref($headers->{$last_header}) eq 'ARRAY')
{
$headers->{$last_header}[-1] =
- $headers->{$last_header}[-1] . $line;
+ $headers->{$last_header}[-1] . $line;
}
else
{
@@ -621,10 +676,21 @@ sub new
sub initialize
{
my $self = shift;
- my $queue_dir = shift;
+ my $data_dir = shift;
$self->{id} = shift;
-
- $self->{file_name} = $queue_dir . '/df' . $self->{id};
+ my $control_file = shift;
+
+ $self->{file_name} = $data_dir . '/df' . $self->{id};
+ return if -e $self->{file_name};
+ $control_file->parse();
+ return if !defined $control_file->{data_file_directory};
+ $data_dir = $queue_root . '/' . $control_file->{data_file_directory};
+ chomp $data_dir;
+ if (-d ($data_dir . '/df'))
+ {
+ $data_dir .= '/df';
+ }
+ $self->{file_name} = $data_dir . '/df' . $self->{id};
}
sub do_stat
@@ -694,14 +760,11 @@ sub initialize
$self->{id} = $id;
$self->{control_file} = new ControlFile($queue_dir, $id);
- if ($data_dir)
- {
- $self->{data_file} = new DataFile($data_dir, $id);
- }
- else
+ if (!$data_dir)
{
- $self->{data_file} = new DataFile($queue_dir, $id);
+ $data_dir = $queue_dir;
}
+ $self->{data_file} = new DataFile($data_dir, $id, $self->{control_file});
}
sub last_modified_time
@@ -780,7 +843,7 @@ sub move
$df_dest = $destination;
}
- if (-e File::Spec->catfile($qf_dest, "qf$self->{id}"))
+ if (-e File::Spec->catfile($qf_dest, "$qprefix$self->{id}"))
{
$result = "There is already a queued message with id '$self->{id}' in '$destination'";
}
@@ -884,7 +947,8 @@ sub initialize
## READ - Loads the queue with all of the objects that reside in it.
##
## This reads the queue's directory and creates QueuedMessage objects
-## for every file in the queue that starts with 'qf'.
+## for every file in the queue that starts with 'qf' or 'hf'
+## (depending on the -Q option).
##
sub read
@@ -920,7 +984,7 @@ sub read
return "Unable to open directory '$control_dir'";
}
- @control_files = grep { /^qf.*/ && -f "$control_dir/$_" } readdir(QUEUE_DIR);
+ @control_files = grep { /^$qprefix.*/ && -f "$control_dir/$_" } readdir(QUEUE_DIR);
closedir(QUEUE_DIR);
foreach $file_name (@control_files)
{
OpenPOWER on IntegriCloud