diff options
author | gshapiro <gshapiro@FreeBSD.org> | 2002-02-17 21:56:45 +0000 |
---|---|---|
committer | gshapiro <gshapiro@FreeBSD.org> | 2002-02-17 21:56:45 +0000 |
commit | 8449595fe97f4474b9b9a7e4edee1ef35dcff393 (patch) | |
tree | e7a33b132264d449a512ddf4a8685df097669c1d /contrib/sendmail/contrib/qtool.pl | |
parent | 289b381b31415647269c7520d881017e2dcb27f1 (diff) | |
download | FreeBSD-src-8449595fe97f4474b9b9a7e4edee1ef35dcff393.zip FreeBSD-src-8449595fe97f4474b9b9a7e4edee1ef35dcff393.tar.gz |
Import sendmail 8.12.2
Diffstat (limited to 'contrib/sendmail/contrib/qtool.pl')
-rwxr-xr-x | contrib/sendmail/contrib/qtool.pl | 124 |
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) { |