v5/common/usr/sbin/ms-peek

101 lines
2.7 KiB
Text
Raw Normal View History

#!/usr/bin/perl
# JKF 2009-08-26 Replace the functionality of lines like this:
# MTA=`perl -n -e 'print "$_" if chomp && s/^\s*MTA\s*=\s*([a-zA-Z]+).*$/$1/ && ($_=lc($_))' /etc/MailScanner/MailScanner.conf`
# with lines like this:
# MTA=`/usr/sbin/ms-peek MTA /etc/MailScanner/MailScanner.conf`
# using a Perl script so that we process 'include' files too.
use FileHandle;
use strict;
# Command-line syntax is this:
if ($ARGV[0] =~ /^-+h(elp)?/) {
print STDERR "Usage: $0 'Key name' full-path-of-MailScanner-conf-file\n\n";
exit 1;
}
my %QPConfFilesSeen = ();
my %PercentVars = ();
my $target = shift;
my $filename = shift;
$target =~ s/\s+//g; # Remove all whitespace from conf setting name
print QuickPeek($filename, $target) . "\n";
exit 0;
sub QuickPeek {
my($filename, $target) = @_;
my($fh, $key, $value, $targetfound, $targetvalue, $savedline);
$target = lc($target);
$target =~ s/[^%a-z0-9]//g; # Leave % vars intact
$fh = new FileHandle;
$fh->open("<$filename") or die "Cannot open config file $filename, $!";
while(<$fh>) {
chomp;
s/#.*$//;
s/^\s*//g;
s/\s*$//g;
next if /^$/;
$savedline = $_;
# Implement "include" files
if ($savedline =~ /^include\s+([^=]*)$/i) {
my $wildcard = $1;
my @newfiles = glob($wildcard);
if (@newfiles) {
# Go through each of the @newfiles reading conf from them.
for my $newfile (sort @newfiles) {
# Have we seen it before?
#print STDERR "Checking $newfile\n";
unless ($QPConfFilesSeen{$newfile}) {
# No, so read it.
my $ret = QuickPeek($newfile, $target);
if (defined $ret) {
$targetfound = 1;
$targetvalue = $ret;
}
}
}
}
# And don't do any more processing on the "include" line.
next;
}
$_ = $savedline;
$key = undef; # Don't carry over values from previous iteration
$value = undef;
/^(.*?)\s*=\s*(.*)$/;
($key,$value) = ($1,$2);
# Allow %var% = value lines with $VAR in value
$value =~ s/\%([^%]+)\%/$PercentVars{lc($1)}/g;
$value =~ s/\$\{?(\w+)\}?/$ENV{$1}/g;
$value =~ s/\\n/\n/g;
if ($key =~ /^\%([^%]+)\%$/) {
# 20090826 Always use the most recent value of %variable%
#$PercentVars{lc($1)} = $value unless exists $PercentVars{lc($1)};
$PercentVars{lc($1)} = $value;
#next; -- Store the percentvars in the key{value} hash as well.
}
$key = lc($key);
$key =~ s/[^%a-z0-9]//g; # Leave numbers and letters only -- leave % vars
if ($key =~ /^$target$/i) {
$targetfound = 1;
$targetvalue = $value;
}
}
$fh->close();
return $targetvalue;
}