NetBSD/external/ibm-public/postfix/dist/mantools/xpostconf

154 lines
3.2 KiB
Perl
Executable File

#!/usr/bin/perl
use Getopt::Std;
# xpostconf - extract parameter info from postconf prototype file
# Usage: xpostconf [options] protofile [parameter...]
#
# -b: Brief output: print only the first sentence of each definition
#
# -c: print the classes named on the command line (default: all).
#
# -h: print help message.
#
# -p: print the parameters named on the command line (default: all).
#
# -s specfile: process the entries listed in the named file: ordinary
# text is copied as is,
# %CLASS class-name mode
# %PARAM param-name mode
# are replaced by the respective information. Mode is b (brief)
# f (full) or i (ignore).
#
# If no -s is specified, extracts the named parameter text (all
# parameters by default).
$opt_b = undef;
$opt_c = undef;
$opt_p = undef;
$opt_s = undef;
$opt_v = undef;
getopts("bcps:v");
die "Usage: $0 [-bcpv] [-s specfile] protofile [parameter...]\n"
unless $protofile = shift(@ARGV);
# Save one definition.
sub save_text {
if ($category eq "PARAM") {
$param_text{$name} = $text;
if ($opt_v) {
printf "saving entry %s %.20s..\n", $name, $text;
}
} elsif ($category eq "CLASS") {
$class_text{$name} = $text;
if ($opt_v) {
printf "saving class %s %.20s..\n", $name, $text;
}
} else {
die "Unknown category: $category. Need PARAM or CLASS.\n";
}
}
# Read the whole file even if we want to print only one parameter.
open(POSTCONF, $protofile) || die " cannot open $protofile: $!\n";
while(<POSTCONF>) {
next if /^#/ && $text eq "";
next unless ($name || /\S/);
if (/^%(PARAM|CLASS)/) {
# Save the accumulated text.
if ($name && $text) {
save_text();
}
# Reset the parameter name and accumulated text.
$name = $text = "";
$category = $1;
# Accumulate the parameter name and default value.
do {
$text .= $_;
} while(($_ = <POSTCONF>) && /\S/);
($junk, $name, $junk) = split(/\s+/, $text, 3);
}
# Accumulate the text in the class or parameter definition.
$text .= $_;
}
# Save the last definition.
if ($name && $text) {
save_text();
}
# If working from a spec file, emit output in the specified order.
if ($opt_s) {
open(SPEC, "$opt_s") || die "cannot open $opt_s: $!\m";
while(<SPEC>) {
if (/^%/) {
($category, $name, $mode) = split(/\s+/, substr($_, 1));
if ($category eq "CLASS") {
die "Unknown class name: $name.\n"
unless $text = $class_text{$name};
} elsif ($category eq "PARAM") {
die "Unknown parameter name: $name.\n"
unless $text = $param_text{$name};
} else {
die "Unknown category: $category. Need CLASS or PARAM\n";
}
if ($mode eq "i") {
next;
} elsif ($mode eq "b") {
$text =~ s/\.\s.*/.\n\n/s;
} elsif ($mode ne "p") {
die "Unknown mode: $mode. Need b or p or i,\n";
}
print $text, "\n";
} else {
print;
}
}
exit;
}
# Print all the parameters.
if ($opt_c) {
$what = \%class_text;
} else {
$what = \%param_text;
}
if ($#ARGV < 0) {
for $name (sort keys %{$what}) {
$text = ${$what}{$name};
$text =~ s/\.\s.*/.\n\n/s if ($opt_b);
print $text, "\n";
}
}
# Print parameters in the specified order.
else {
for $name (@ARGV) {
$text = ${$what}{$name};
$text =~ s/\.\s.*/.\n\n/s if ($opt_b);
print $text;
}
}