diff options
Diffstat (limited to 'mmuegel/src')
-rw-r--r-- | mmuegel/src/cqueue | 242 | ||||
-rw-r--r-- | mmuegel/src/postclip | 74 |
2 files changed, 316 insertions, 0 deletions
diff --git a/mmuegel/src/cqueue b/mmuegel/src/cqueue new file mode 100644 index 0000000..f94252a --- /dev/null +++ b/mmuegel/src/cqueue @@ -0,0 +1,242 @@ +#!/usr/bin/perl + +# NAME +# cqueue - check sendmail queue for problems +# +# SYNOPSIS +# Type cqueue -usage +# +# AUTHOR +# Michael S. Muegel <mmuegel@mot.com> +# +# RCS INFORMATION +# mmuegel +# /usr/local/ustart/src/mail-tools/dist/foo/src/cqueue,v 1.1 1993/07/28 08:09:02 mmuegel Exp + +# So that date.pl does not yell (Domain/OS version does a ``) +$ENV{'PATH'} = ""; + +# A better getopts routine +require "newgetopts.pl"; +require "timespec.pl"; +require "mail.pl"; +require "date.pl"; +require "mqueue.pl"; +require "strings1.pl"; +require "elapsed.pl"; + +($Script_Name = $0) =~ s/.*\///; + +# Some defaults you may want to change +$DEF_TIME = "2h"; +$DEF_QUEUE = "/usr/spool/mqueue"; +$DEF_COLUMNS = 80; +$DATE_FORMAT = "%r %D"; + +# Constants that probably should not be changed +$USAGE = "Usage: $Script_Name [ -abdms ] [ -q queue-dir ] [ -t time ] [ -u user ] [ -w width ]\n"; +$VERSION = "${Script_Name} by mmuegel; 1.1 of 1993/07/28 08:09:02"; +$SWITCHES = "abdmst:u:q:w:"; +$SPLIT_EXPR = '\s,\.@!%:'; +$ADDR_PART_EXPR = '[^!@%]+'; + +# Let getopts parse for switches +$Status = &New_Getopts ($SWITCHES, $USAGE); +exit (0) if ($Status == -1); +exit (1) if (! $Status); + +# Check args +die "${Script_Name}: -u only valid with -m\n" if (($opt_u) && (! $opt_m)); +die "${Script_Name}: -a not valid with -t option\n" if ($opt_a && $opt_t); +$opt_u = getlogin || (getpwuid ($<))[0] || $ENV{"USER"} || die "${Script_Name}: can not determine who you are!\n" if (! $opt_u); + +# Set defaults +$opt_t = "0s" if ($opt_a); +$opt_t = $DEF_TIME if ($opt_t eq ""); +$opt_w = $DEF_COLUMNS if ($opt_w eq ""); +$opt_q = $DEF_QUEUE if ($opt_q eq ""); +$opt_s = $opt_d = 1 if (! ($opt_s || $opt_d)); + +# Untaint the users to mail to +$opt_u =~ /^(.*)$/; +$Users = $1; + +# Convert time option to seconds and seconds to elapsed form +die "${Script_Name}: $Msg\n" if (! (($Status, $Msg, $Seconds) = &Time_Spec_To_Seconds ($opt_t))[0]); +$Elapsed = &Seconds_To_Elapsed ($Seconds, 1); +$Time_Info = " longer than $Elapsed" if ($Seconds); + +# Get the current time +$Current_Time = time; +$Current_Date = &date ($Current_Time, $DATE_FORMAT); + +($Status, $Msg, @Queue_IDs) = &Get_Queue_IDs ($opt_q, 1, @Missing_Control_IDs, + @Missing_Data_IDs); +die "$Script_Name: $Msg\n" if (! $Status); + +# Yell about missing data/control files? +if ($opt_b) +{ + + $Report = "\nMessages missing control files:\n\n " . + join ("\n ", @Missing_Control_IDs) . + "\n" + if (@Missing_Control_IDs); + + $Report .= "\nMessages missing data files:\n\n " . + join ("\n ", @Missing_Data_IDs) . + "\n" + if (@Missing_Data_IDs); +}; + +# See if any mail messages are older than $Seconds +foreach $Queue_ID (@Queue_IDs) +{ + # Get lots of info about this sendmail message via the control file + ($Status, $Msg) = &Parse_Control_File ($opt_q, $Queue_ID, *Sender, + *Recipients, *Errors_To, *Creation_Time, *Priority, *Status_Message, + *Headers); + next if ($Status == -1); + if (! $Status) + { + warn "$Script_Name: $Queue_ID: $Msg\n"; + next; + }; + + # Report on message if it is older than $Seconds + if ($Current_Time - $Creation_Time >= $Seconds) + { + # Build summary by host information. Keep track of each host destination + # encountered. + if ($opt_s) + { + %Host_Map = (); + foreach (@Recipients) + { + if ((/@($ADDR_PART_EXPR)$/) || (/($ADDR_PART_EXPR)!$ADDR_PART_EXPR$/)) + { + ($Host = $1) =~ tr/A-Z/a-z/; + $Host_Map {$Host} = 1; + } + else + { + warn "$Script_Name: could not find host part from $_; contact author\n"; + }; + }; + + # For each unique target host add to its stats + grep ($Host_Queued {$_}++, keys (%Host_Map)); + + # Build summary by message information. + $Message_Queued {$Status_Message}++ if ($Status_Message); + }; + + # Build long report information for this creation time (there may be + # more than one message created at the same time) + if ($opt_d) + { + $Creation_Date = &date ($Creation_Time, $DATE_FORMAT); + $Recipient_Info = &Format_Text_Block (join (", ", @Recipients), + " Recipient: ", 1, 0, $opt_w, $SPLIT_EXPR); + $Time_To_Report {$Creation_Time} .= <<"EOS"; + + ID: $Queue_ID + Date: $Creation_Date + Sender: $Sender +$Recipient_Info +EOS + + # Add the status message if available to long report + if ($Status_Message) + { + $Time_To_Report {$Creation_Time} .= &Format_Text_Block ($Status_Message, + " Status: ", 1, 0, $opt_w, $SPLIT_EXPR) . "\n"; + }; + }; + }; + +}; + +# Add the summary report by target host? +if ($opt_s) +{ + foreach $Host (sort (keys (%Host_Queued))) + { + $Host_Report .= &Format_Text_Block ($Host, + sprintf (" %-9d ", $Host_Queued{$Host}), 1, 0, $opt_w, + $SPLIT_EXPR) . "\n"; + $Num_Hosts += $Host_Queued{$Host}; + }; + if ($Host_Report) + { + chop ($Host_Report); + $Report .= &Format_Text_Block("\nSummary of messages in queue$Time_Info by destination host:\n", "", 0, 0, $opt_w); + + $Report .= <<"EOS"; + + Number of + Messages Destination Host + --------- ---------------- +$Host_Report + --------- + $Num_Hosts +EOS + }; +}; + +# Add the summary by message report? +if ($opt_s) +{ + foreach $Message (sort (keys (%Message_Queued))) + { + $Message_Report .= &Format_Text_Block ($Message, + sprintf (" %-9d ", $Message_Queued{$Message}), 1, 0, $opt_w, + $SPLIT_EXPR) . "\n"; + $Num_Messages += $Message_Queued{$Message}; + }; + if ($Message_Report) + { + chop ($Message_Report); + $Report .= &Format_Text_Block ("\nSummary of messages in queue$Time_Info by status message:\n", "", 0, 0, $opt_w); + + $Report .= <<"EOS"; + + Number of + Messages Status Message + --------- -------------- +$Message_Report + --------- + $Num_Messages +EOS + }; +}; + +# Add the detailed message reports? +if ($opt_d) +{ + foreach $Time (sort { $a <=> $b} (keys (%Time_To_Report))) + { + $Report .= &Format_Text_Block ("\nDetail of messages in queue$Time_Info sorted by creation date:\n","", 0, 0, $opt_w) if (! $Detailed_Header++); + $Report .= $Time_To_Report {$Time}; + }; +}; + +# Now mail or print the report +if ($Report) +{ + $Report .= "\n"; + if ($opt_m) + { + ($Status, $Msg) = &Send_Mail ($Users, "sendmail queue report for $Current_Date", $Report, 0); + die "${Script_Name}: $Msg" if (! $Status); + } + + else + { + print $Report; + }; + +}; + +# I am outta here... +exit (0); diff --git a/mmuegel/src/postclip b/mmuegel/src/postclip new file mode 100644 index 0000000..63f6df0 --- /dev/null +++ b/mmuegel/src/postclip @@ -0,0 +1,74 @@ +#!/usr/local/bin/perl + +# NAME +# postclip - send only the headers to Postmaster +# +# SYNOPSIS +# postclip [ -v ] [ to ... ] +# +# AUTHOR +# Michael S. Muegel <mmuegel@mot.com> +# +# RCS INFORMATION +# /usr/local/ustart/src/mail-tools/dist/foo/src/postclip,v +# 1.1 of 1993/07/28 08:09:02 + +# We use this to send off the mail +require "newgetopts.pl"; +require "mail.pl"; + +# Get the basename of the script +($Script_Name = $0) =~ s/.*\///; + +# Some famous constants +$USAGE = "Usage: $Script_Name [ -v ] [ to ... ]\n"; +$VERSION = "${Script_Name} by mmuegel; 1.1 of 1993/07/28 08:09:02"; +$SWITCHES = "v"; + +# Let getopts parse for switches +$Status = &New_Getopts ($SWITCHES, $USAGE); +exit (0) if ($Status == -1); +exit (1) if (! $Status); + +# Who should we send the modified mail to? +@ARGV = ("postmaster") if (! @ARGV); +$Users = join (" ", @ARGV); +@ARGV = (); + +# Suck in the original header and save a few interesting lines +while (<>) +{ + $Buffer .= $_ if (! /^From /); + $Subject = $1 if (/^Subject:\s+(.*)$/); + $From = $1 if (/^From:\s+(.*)$/); + last if (/^$/); +}; + +# Do not filter the message unless it has a subject and the subject indicates +# it is an NDN +if ($Subject && ($Subject =~ /^returned mail/i)) +{ + # Slurp input by paragraph. Keep track of the last time we saw what + # appeared to be NDN text. We keep this. + $/ = "\n\n"; + $* = 1; + while (<>) + { + push (@Paragraphs, $_); + $Last_Error_Para = $#Paragraphs + if (/unsent message follows/i || /was not delivered because/); + }; + + # Now save the NDN text into $Buffer + $Buffer .= join ("", @Paragraphs [0..$Last_Error_Para]); +} + +else +{ + undef $/; + $Buffer .= <>; +}; + +# Send off the (possibly) modified mail +($Status, $Msg) = &Send_Mail ($Users, "", $Buffer, 0, $opt_v, 1); +die "$Script_Name: $Msg\n" if (! $Status); |