diff options
Diffstat (limited to 'util/rtrfilter.in')
-rwxr-xr-x | util/rtrfilter.in | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/util/rtrfilter.in b/util/rtrfilter.in new file mode 100755 index 0000000..d1fa45f --- /dev/null +++ b/util/rtrfilter.in @@ -0,0 +1,145 @@ +#!@PERLV_PATH@ +## +# rtrtfilter - "| rtrfilter -x <perl regex> -i <perl regex> -f <regex file> \ +# -u <From address> -s <subject> <rcpts>" +# expects to read an email message on stdin containing a diff from +# rancid and emails a filtered copy to <rcpts> with the subject of the +# original msg or the contents of -s <subject>. the perl regex(es) specified +# via -x or -i (exclusive and inclusive, respectively) are applied to the +# router names (ie: files) from the "Index:" of the diff o/p. alternatively, +# the regex's may be specified in -f <regex file> in the form: +# # comment +# x <regex> +# # comment +# i <regex> +# do not include /'s in the regex's. +# eg: +# #i inc1 +# i a0[12]\. +# i a0[34]\. +# # comment +# x router\.db +# x ^r0[0-9] +# #i foo +# +# exclusion takes precedence and defaults to nothing. inclusion defaults to +# everything. +# +# this program require the Mail::Mailer module which can be found on CPAN. +## +BEGIN { +$me = $0; +$me =~ s/.*\/(\S+)$/$1/; +} + +require 'newgetopt.pl'; +use Mail::Mailer; + +# process command line options +$newgetopt'ignorecase=0; +$newgetopt'autoabbrev=1; +$result = &NGetOpt('h','x=s@','i=s@','f=s','s=s'); +&usage($result) if (defined($opt_h) || $result == 0); + +if ($#ARGV < 0) { + usage; +} +my($rcpts) = join(',', @ARGV); + +# if specified, read the regex file and append to @opt_i / @opt_x +if (defined($opt_f)) { + open(FILE, "< $opt_f") || die "Cant open the regex file $opt_f: $!"; + + while (<FILE>) { + next if (! /^(i|x)\s+(.*$)/); + #/(i|x)\s+(.*)$/; + if ($1 eq "i" ) { + push(@opt_i, $2); + } else { + push(@opt_x, $2); + } + } + close(FILE); +} + +# read the header, grok the subject line +my($subject, $from); +while (<STDIN>) { + last if (/^$/); + if (s/^from: //i) { + chomp; + $from = $_; + } + if (s/^subject: //i) { + chomp; + $subject = $_; + } +} +if (defined($opt_s)) { $subject = $opt_s;} +if (defined($opt_u)) { $from = $opt_u;} + +# filter the remainder of the mail. save mail in memory to avoid empty msgs +my(@mail); +my($skip) = 1; +while (<STDIN>) { + # look for /^Index: ", the filtering key + if (/^Index: (.*)$/) { + # strip the directory before passing to filter() + my($line) = ($1 =~ /.*\/([^\/\s]*)$/); + $skip = filter($line); + } + + next if ($skip); + + push(@mail, $_); +} + +# send mail, if any +if ($#mail < 0) { exit; } +$mailer = new Mail::Mailer 'sendmail', ('-t'); +$headers{From} = $from; +$headers{"Reply-To"} = $from; +$headers{"Errors-To"} = $from; +$headers{Subject} = $subject; +$headers{To} = $rcpts; +$headers{Precedence} = "bulk"; + +$mailer->open(\%headers); +print $mailer @mail; +$mailer->close; + +exit; + +# filter $line inclusive/exclusive (0 / 1) +sub filter { + my($line) = shift; + + # exclusion + if (defined(@opt_x)) { + foreach $regex (@opt_x) { + if ($line =~ /$regex/) { return(1); } + } + } + + # inclusion / default inclusion + if (! @opt_i) { return(0); } + foreach $regex (@opt_i) { + if ($line =~ /$regex/) { return(0); } + } + + # inclusion regex specified, but fall through + return(1); +} + +sub usage { + print STDERR <<USAGE; +usage: $me [-h] [-i <perl regex>] [-x <perl regex>] [-f <regex file>] [-u <From: address> [-s <subject>] <mail rcpt> [<rcpt> ...] + -h prints this message + -f file containing perl regex matching router names (mind the cwd()) + -i perl regex matching router names (inclusive) + -u From: address + -s mail subject + -x perl regex matching router names (exclusive) +USAGE + exit $_; +} |