summaryrefslogtreecommitdiff
path: root/debian/local/Parse_conf.pm
diff options
context:
space:
mode:
Diffstat (limited to 'debian/local/Parse_conf.pm')
-rw-r--r--debian/local/Parse_conf.pm963
1 files changed, 963 insertions, 0 deletions
diff --git a/debian/local/Parse_conf.pm b/debian/local/Parse_conf.pm
new file mode 100644
index 0000000..708de7d
--- /dev/null
+++ b/debian/local/Parse_conf.pm
@@ -0,0 +1,963 @@
+#!/usr/bin/perl -w
+#------------------------------------------------------------------------
+#
+# $Sendmail: Parse_conf.pm,v 8.14.3 2008-05-04 22:26:20 cowboy Exp $
+#
+# Parse and update /etc/mail/sendmail.conf
+#
+# Copyright (c) 2001-2008 Richard Nelson. All Rights Reserved.
+#
+# Notes (to all):
+#
+# Notes (to self):
+#
+#------------------------------------------------------------------------
+#
+# Package/Module declaration
+package Parse_conf;
+require Exporter;
+@ISA = qw(Exporter);
+#@EXPORT = qw(read_conf write_conf);
+@EXPORT_OK = qw(read_conf write_conf get_value);
+$VERSION = '2.0000';
+#
+# Initialization of the perl environment
+use strict; # be kosher
+#use warnings; # Not needed here
+use Cwd; # provide cwd()
+use Env; # A few environmental references
+use integer; # Peformance
+use Sys::Hostname; # make sure we have a valid hostname
+use Getopt::Long; # parameter handling
+use FileHandle; # I/O
+
+# Local libraries - for Debian Sendmail Perl helper functions
+# BEGIN { $main::my_path = substr($0,$[,rindex($0,'/')) };
+use lib ('.', substr($0,$[,rindex($0,'/')), "/usr/share/sendmail");
+require Parse_mc;
+
+# Version of this program
+#($main::MYNAME = $main::0) =~ s|.*/||;
+#$main::Author = "Richard Nelson";
+#$main::AuthorMail = "cowboy\@debian.org";
+#$main::Version = '$Revision: 1.00 $ ';
+$Parse_conf::program_name = 'Parse_conf.pm';
+$Parse_conf::program_version = '8.14.3';
+$Parse_conf::program_date = '2008-05-04 22:26:20 cowboy';
+$Parse_conf::debug = 0;
+
+my $interp_pgm = "$^X";
+my $interp_vrm = $];
+$interp_vrm = ("$^V" | '000') if (defined $^V);
+my $current_time = scalar localtime;
+my $user = getlogin || (getpwuid($<))[0] || "Unknown!!";
+my $hostname = hostname();
+my $directory = getcwd();
+
+$Parse_conf::Conffile = "/etc/mail/sendmail.conf";
+my $debug;
+
+#
+#------------------------------------------------------------------------------
+# Global variables
+#------------------------------------------------------------------------------
+my %parm_def = (
+ 'DAEMON_NETMODE' => 'Static'
+ ,'DAEMON_NETIF' => 'eth0'
+ ,'DAEMON_MODE' => 'Daemon'
+ ,'DAEMON_RUNASUSER' => 'No'
+ ,'DAEMON_PARMS' => ''
+ ,'DAEMON_HOSTSTATS' => 'No'
+ ,'DAEMON_MAILSTATS' => 'No'
+ ,'QUEUE_MODE' => '${DAEMON_MODE}'
+ ,'QUEUE_INTERVAL' => '10m'
+ ,'QUEUE_PARMS' => ''
+ ,'MSP_MODE' => 'Cron'
+ ,'MSP_INTERVAL' => '20m'
+ ,'MSP_PARMS' => ''
+ ,'MSP_MAILSTATS' => '${DAEMON_MAILSTATS}'
+ ,'MISC_PARMS' => ''
+ ,'CRON_MAILTO' => 'root'
+ ,'CRON_PARMS' => ''
+ ,'HANDS_OFF' => 'No'
+ ,'LOG_CMDS' => 'No'
+ ,'AGE_DATA' => ''
+ );
+
+my %parameter = %parm_def;
+
+my %parm_kw = (
+ 'DAEMON_NETMODE' => ['static', 'dynamic']
+ ,'DAEMON_MODE' => ['daemon', 'inetd','none']
+ ,'QUEUE_MODE' => ['daemon', 'cron', 'none']
+ ,'MSP_MODE' => ['daemon', 'cron', 'none']
+ );
+
+my %parm_bool = (
+ 'HANDS_OFF' => 1
+ ,'DAEMON_RUNASUSER' => 1
+ ,'DAEMON_HOSTSTATS' => 1
+ ,'DAEMON_MAILSTATS' => 1
+ ,'MSP_MAILSTATS' => 1
+ ,'LOG_CMDS' => 1
+ );
+
+my %parm_dependant = (
+ );
+
+my %parm_deprecated = (
+ 'DAEMON_STATS' => 'DAEMON_MAILSTATS'
+ ,'MSP_STATS' => 'MSP_MAILSTATS'
+ );
+
+my %parm_hidden = (
+ 'DAEMON_RUNASUSER' => 1
+ ,'prefix' => 1
+ ,'exec_prefix' => 1
+ ,'bindir' => 1
+ ,'sbindir' => 1
+ ,'libexecdir' => 1
+ ,'datadir' => 1
+ ,'sysconfdir' => 1
+ ,'sharedstatedir' => 1
+ ,'localstatedir' => 1
+ ,'libdir' => 1
+ ,'MTA_DAEMON' => 1
+ ,'MTA_COMMAND' => 1
+ ,'MTA_L' => 1
+ ,'MTA_L_QUEUE' => 1
+ ,'MTA_ROOT' => 1
+ ,'MTA_PIDFILE' => 1
+ ,'MSP_DAEMON' => 1
+ ,'MSP_COMMAND' => 1
+ ,'MSP_L' => 1
+ ,'MSP_L_QUEUE' => 1
+ ,'MSP_ROOT' => 1
+ ,'MSP_PIDFILE' => 1
+ );
+
+#
+#------------------------------------------------------------------------------
+# Finally, some code (almost)
+#------------------------------------------------------------------------------
+1; # return (true);
+
+
+#
+#------------------------------------------------------------------------------
+# Read /etc/mail/sendmail.conf
+#------------------------------------------------------------------------------
+sub read_conf {
+ my ($input_file) = @_;
+ $input_file ||= $Parse_conf::Conffile;
+
+ $debug = $main::debug || $Parse_conf::debug;
+
+ # Update defaults according to current environment
+ &update_defaults;
+
+ # Read /etc/mail/sendmail.conf (if extant)
+ &read_config($input_file);
+
+ # Update old values to new format
+ &update_values;
+
+ # Make sure things are kosher
+ my $ok = &validate_config;
+ if (! $ok) {
+ die "Terminating due to configuration error.";
+ };
+ };
+
+#
+#------------------------------------------------------------------------------
+# [Re]write /etc/mail/sendmail.conf
+#------------------------------------------------------------------------------
+sub write_conf {
+ my ($output_file) = @_;
+
+ $debug = $main::debug || $Parse_conf::debug;
+
+ &write_config($output_file);
+ };
+
+#
+#------------------------------------------------------------------------
+# Update default settings according to current environment
+#------------------------------------------------------------------------
+sub update_defaults {
+ my ($class, $flags, $files, $options);
+ my ($ok, $stats);
+ my $file;
+
+ # Read the mc/m4 files
+ &Parse_mc::read_dbs('', '');
+
+ # Obtain entry for HOST_STATUS_DIRECTORY
+ ($class, $flags, $files, $options) =
+ &Parse_mc::entry_dbs('confHOST_STATUS_DIRECTORY');
+ $file = @{$files}[0];
+ if ( $file ne '-' and -d $file ) {
+ $parameter{'DAEMON_HOSTSTATS'} = 'Yes';
+ }
+ else {
+ $parameter{'DAEMON_HOSTSTATS'} = 'No';
+ };
+
+ # Obtain entry for STATUS_FILE
+ ($class, $flags, $files, $options) =
+ &Parse_mc::entry_dbs('STATUS_FILE');
+ $file = @{$files}[0];
+ if ( $file ne '-' and -e $file ) {
+ $parameter{'DAEMON_MAILSTATS'} = 'Yes';
+ }
+ else {
+ $parameter{'DAEMON_MAILSTATS'} = 'No';
+ };
+
+ # Obtain entry for MSP_STATUS_FILE
+ ($class, $flags, $files, $options) =
+ &Parse_mc::entry_dbs('MSP_STATUS_FILE');
+ $file = @{$files}[0];
+ if ( $file ne '-' and -e $file ) {
+ $parameter{'MSP_MAILSTATS'} = 'Yes';
+ }
+ else {
+ $parameter{'MSP_MAILSTATS'} = 'No';
+ };
+
+ };
+
+#
+#------------------------------------------------------------------------
+# Update old settings according to current format
+#------------------------------------------------------------------------
+sub update_values {
+ my ($ok, $var);
+
+ # Add m(inutes) to {queue,msp}_interval if needed
+ $parameter{'QUEUE_INTERVAL'} =~ s/^(\d+)$/$1m/;
+ $parameter{'MSP_INTERVAL'} =~ s/^(\d+)$/$1m/;
+
+ # Also update the queue aging data
+ ($ok, $var) = &get_value('AGE_DATA');
+ my $tmpval = eval $var;
+ if ($@) {
+ warn $@;
+ }
+ else {
+ $var = $tmpval;
+ };
+ if (not defined $var) {
+ $tmpval = '""';
+ }
+ elsif (not ref $var) {
+ $tmpval = "$var";
+ }
+ elsif (@{$var} == 0) {
+ $tmpval = '""';
+ }
+ else {
+ $tmpval = '[';
+ foreach my $entry (@{$var}) {
+ foreach my $ndx ($[ .. $#{@{$entry}}) {
+ @{$entry}[$ndx] =~ s/'/\\'/g;
+ };
+ @{$entry}[0] =~ s/^(\d+)$/$1m/;
+ $tmpval .= "['" . join("', '", @{$entry}) . "'],";
+ };
+ $tmpval .= ']';
+ $parameter{'AGE_DATA'} = $tmpval;
+ };
+
+ # Set any dependant fields here...
+ };
+
+#
+#------------------------------------------------------------------------
+# Obtain parameter name
+#------------------------------------------------------------------------
+sub get_name {
+ my ($name, $quiet) = @_;
+
+ # Handle deprecated/renamed variables
+ if ( exists($parm_deprecated{$name}) ) {
+ print STDERR "$name is deprecated."
+ if ($debug and ! $quiet);
+ if ( $parm_deprecated{$name} ) {
+ print STDERR " Please use $parm_deprecated{$name} instead.\n"
+ if ($debug and ! $quiet);
+ $name = $parm_deprecated{$name};
+ }
+ else {
+ print STDERR " It will be ignored.\n"
+ if ($debug and ! $quiet);
+ };
+ };
+
+ return $name;
+ };
+
+#
+#------------------------------------------------------------------------
+# Obtain value directly, or indirectly
+#------------------------------------------------------------------------
+sub get_value {
+ my ($name) = @_;
+ my $ok = 1;
+ my $value = '';
+ if ( ! exists($parameter{$name}) ) {
+ print STDERR "Variable $name not defined...\n";
+ return ($ok, $value);
+ };
+
+ $name = get_name($name, '');
+ $value = $parameter{$name};
+
+ my $tval = $value;
+ $tval =~ s/^\s*//;
+ my $default = 0;
+
+ # Dereference loop... keep original value if we get any errors...
+ Dereference:;
+ if ($tval =~ /^\$/) {
+ my @ref_stack = ($name);
+ my %ref_hash = ($name => 1);
+ while ($tval =~ /^\$/ and $ok) {
+ my $start = 1;
+ my $del = 1;
+ my $char = substr($tval, 1, 1);
+ if ( $char eq '{' or $char eq '(' ) {
+ $start += 1; $del += 2;
+ };
+ my $ref = get_name(substr($tval, $start,
+ length($tval)-$del), '');
+ push @ref_stack, $ref;
+ if (exists($ref_hash{$ref})) {
+ print STDERR "Go directly to jail; do not pass go, ",
+ "do not collect \$200\n";
+ print STDERR " Reference loop: ",
+ join('->', @ref_stack, '...'),"\n";
+ $ok = 0;
+ }
+ else {
+ $ref_hash{$ref} = 1;
+ if (lc $ref eq 'default') {
+ $tval = $parm_def{$name};
+ print STDERR
+ "Setting $name to default value: ",
+ "$parm_def{$name}.\n"
+ if ($debug);
+ }
+ elsif (exists($parameter{$ref})) {
+ $tval = $parameter{$ref};
+ print STDERR
+ "Setting $name to value of $ref: $tval.\n"
+ if ($debug);
+ }
+ else {
+ print STDERR
+ "Can not deference $ref, it doesn't exist.\n";
+ $ok = 0;
+ };
+ };
+ };
+ };
+
+ if ( $ok ) {
+ # Check keyword parms for valid values
+ if (exists $parm_kw{$name}) {
+ my @ltval = split(/\s/,$tval);
+ my $ltval = lc(@ltval[$[]);
+ my $found = "";
+ foreach my $value (@{$parm_kw{$name}}) {
+ if ($value eq $ltval) {
+ $found = 1; $tval = ucfirst($ltval); };
+ };
+ if ( ! $found ) {
+ $default += 1;
+ if ( $default > 1 ) {
+ print STDERR
+ "Can not resolve $name, value=$value.\n";
+ $ok = 0;
+ }
+ else {
+ print STDERR "Illegal value($tval) for $name.\n",
+ " Valid values are: ",
+ join(', ', @{$parm_kw{$name}}),
+ "\n",
+ " Set to default: $parm_def{$name}.\n";
+ $tval = $parm_def{$name};
+ goto Dereference;
+ };
+ };
+ }
+
+ # Check boolean parms for valid values
+ elsif (exists $parm_bool{$name}) {
+ my @ltval = split(/\s/,$tval);
+ my $ltval = lc(@ltval[$[]);
+ $ltval =~ s/^[ty1].*/1/;
+ $ltval =~ s/^[fn0].*/0/;
+ if ($ltval eq '0' or $ltval eq '1') {
+ $tval = ucfirst($ltval); }
+ else {
+ $default += 1;
+ if ( $default > 1 ) {
+ print STDERR
+ "Can not resolve $name, value=$value.\n";
+ $ok = 0;
+ }
+ else {
+ print STDERR "Illegal value($tval) for $name.\n",
+ " Valid values are: T[rue],Y[es],1,",
+ " F[alse],N[o],0\n",
+ " Set to default: $parm_def{$name}.\n";
+ $tval = $parm_def{$name};
+ goto Dereference;
+ };
+ };
+ };
+ };
+
+ $value = $tval if $ok;
+
+ print STDERR "get_value : $name => $value\n"
+ if ($debug);
+
+ return ($ok, $value);
+ };
+
+#
+#------------------------------------------------------------------------
+# Read input configuration file (if no input, just use defaults)
+#------------------------------------------------------------------------
+sub read_config {
+ my ($input_file) = @_;
+ @ARGV = split(' ', $input_file);
+ return if (! -r $input_file);
+
+ my $savename = '';
+ my $parmname = '';
+ my $parmval = '';
+ my $parmref = '';
+ my $defname = '';
+ my $defval = '';
+ my $tmpval = '';
+
+ print STDOUT "Reading configuration from ", join(',',@ARGV), ".\n";
+
+ line: while (<ARGV>) {
+ next line if /^$/; # skip empty lines
+ chomp; # drop tailing \n
+ if (s/\\$//) {
+ $_ .= <>;
+ redo unless eof();
+ };
+
+ # check commented lines for default parameter values
+ # a bit of a kluge, but it works out nicely
+ if (/^#\s*([\w_]+)="([^"]*)"/) {
+ $defname = get_name($1, 1);
+ $defval = $2;
+ print STDERR "Default: $defname => $defval.\n"
+ if ($debug);
+ next line;
+ };
+ # Skip any comments
+ next line if /^#/; # skip comments
+
+ # Process assignment statements
+ if (/^\s*([\w_]+)="([^"]*)"/) {
+ $savename = $1;
+ $parmname = get_name($savename, '');
+ $parmval = $2;
+ print STDERR "Value : $savename => $parmval.\n"
+ if ($debug);
+
+ # Do we know about this parameter?
+ # NOTE: keep, even if we don't know about it to prevent
+ # problems with up/down grades (not loose anything)
+ if ( ! exists($parm_def{$parmname}) and
+ ! exists($parm_hidden{$parmname}) ) {
+ print STDERR "$parmname is a user defined parameter.\n"
+ if ($debug);
+ };
+
+ # Note if value is default, if so, we'll change it to
+ # the current default - maybe counterintuitive, oh well
+ # it does help with migration
+ if ($parmname eq $defname and $parmval eq $defval) {
+ print STDERR "$parmname is the default value: $defval.\n"
+ if ($debug);
+ $parmval = $parm_def{$parmname};
+ };
+
+ # Finally, assign value
+ if (exists $parm_kw{$savename} or
+ exists $parm_bool{$savename}) {
+ $parmval = ucfirst($parmval);
+ };
+
+ if ($savename eq $parmname) {
+ $parameter{$parmname} = $parmval;
+ }
+ else {
+ $parameter{$savename} = $parmval;
+ };
+ };
+ };
+ };
+
+#
+#------------------------------------------------------------------------
+# Validate current configuration
+#------------------------------------------------------------------------
+sub validate_config {
+
+ my $valid = 1;
+
+ print STDOUT "Validating configuration.\n";
+
+ # Really, we only care about the some of the variables - those
+ # that have defaults... the rest, well, so what !
+ foreach my $val (sort keys %parm_def) {
+ my ($ok, $value) = &get_value($val, 1);
+ if (! $ok) { $valid = 0; };
+ };
+
+ if (! $valid ) {
+ print STDERR "\nOne or more errors were encountered!\n\n";
+ };
+
+ return ($valid);
+ };
+
+#
+#------------------------------------------------------------------------
+# Write updated configuration file
+#------------------------------------------------------------------------
+sub write_config {
+ my ($database_file) = @_;
+ my $ofh = new FileHandle;
+
+ # Make sure things are kosher
+ my $result = &validate_config;
+ if (! $result) {
+ die "Terminating due to configuration error.";
+ };
+
+ $database_file = $database_file || $Parse_conf::Conffile;
+ my $caller = "$main::program_name" if ($main::program_name);
+ $caller .= " $main::program_version" if ($main::program_version);
+ $caller .= " $main::program_date" if ($main::program_date);
+
+ print STDOUT "Writing configuration to $database_file.\n";
+ $database_file = '&STDOUT' if ($database_file eq '-');
+ unless ( open($ofh, ">$database_file") ) {
+ warn("Could not open $database_file($!), using STDOUT\n");
+ open($ofh, ">&STDOUT");
+ };
+ $database_file = '-' if ($database_file eq '&STDOUT');
+
+# print $ofh <<"EOT";
+####################################################################
+##### This file is automagically generated -- edit at your own risk
+#####
+##### file: ${database_file}
+##### generated via: (${interp_pgm} ${interp_vrm})
+##### ${caller}
+##### ${Parse_conf::program_name} ${Parse_conf::program_version} ${Parse_conf::program_date}
+##### by: ${user}\@${hostname}
+##### on: ${current_time}
+##### in: ${directory}
+##### input files:
+#EOT
+# foreach my $file ( split(' ', $input_file) ) {
+# print $ofh <<"EOT";
+##### ${file}
+#EOT
+# };
+# print $ofh <<"EOT";
+#####
+####################################################################
+ print $ofh <<"EOT";
+#------------------------------------------------------------------------------
+#
+# $database_file
+#
+# Copyright (c) 2001-2008 Richard Nelson. All Rights Reserved.
+# Version: ${main::program_version}
+# Time-stamp: <${main::program_date}>
+#
+# Parameter file for sendmail (sourced by /usr/share/sendmail/sendmail)
+# Make all changes herein, instead of altering /etc/init.d/sendmail.
+#
+# After making changes here, you'll need to run /usr/sbin/sendmailconfig
+# or ${main::program_name} to have the changes take effect -
+# If you change DAEMON_MODE, QUEUE_MODE, or QUEUE_INTERVAL, you'll also
+# need to run /etc/init.d/sendmail restart.
+#
+# Changes made herein will be kept across upgrades - except for comments!
+# Some comment lines have special significance ...
+#
+# **** **** **** **** DO NOT EDIT THE COMMENTS **** **** **** ****
+#
+# Supported parameters (and defaults) are listed herein.
+#
+# Notes:
+# * This setup allows sendmail to run in several modes:
+# - listener and queue runner..DAEMON_MODE="daemon".QUEUE_MODE="daemon"
+# - listener only..............DAEMON_MODE="daemon".QUEUE_MODE="none"
+# - queue runner only..........DAEMON_MODE="none"...QUEUE_MODE="daemon"
+# - *NOTHING* ?!?..............DAEMON_MODE="none"...QUEUE_MODE="none"
+#
+# * You can also run the listener from inetd:
+# - listener and queue runner..DAEMON_MODE="inetd"..QUEUE_MODE="daemon"
+# - listener only..............DAEMON_MODE="inetd"..QUEUE_MODE="none"
+#
+# * You can also run the queue runner from cron:
+# - listener and queue runner..DAEMON_MODE="....."..QUEUE_MODE="cron"
+# - queue runner only..........DAEMON_MODE="none"...QUEUE_MODE="cron"
+#
+# * _PARMS entries herein are shown in precedence order, any later _PARMS
+# field will, if applicable, override any previous _PARMS fields.
+#
+# * Values *MUST* be surrounded with double quotes ("), single quotes
+# will *NOT* work !
+#
+#------------------------------------------------------------------------------
+# SMTP Listener Configuration
+#
+# DAEMON_NETMODE="$parm_def{'DAEMON_NETMODE'}"; Keyword SMTP network mode
+# static: Do not monitor any network interfaces for changes
+# dynamic: Monitor one or more interfaces for changes
+#
+DAEMON_NETMODE="$parameter{'DAEMON_NETMODE'}";
+#
+# DAEMON_NETIF="$parm_def{'DAEMON_NETIF'}"; string SMTP interface(s)
+# This parameter defines the network interface(s) that the daemon
+# will monitor for status changes (via ppp, dhcp, ifup/down hooks).
+#
+# NOTES:
+# 1) Only list more than one interfaces if they only used for fallback,
+# otherwise the daemon will wind up ping-ponging between interfaces.
+# 2) Do not use 'lo' unless your daemon only listens on the localhost.
+#
+DAEMON_NETIF="$parameter{'DAEMON_NETIF'}";
+#
+# DAEMON_MODE="$parm_def{'DAEMON_MODE'}"; Keyword SMTP listener
+# daemon: Run as standalone daemon
+# inetd: Run from inet supervisor (forks for each mail)
+# none: No listener (ie, nullclient/smarthost)
+#
+# NOTE: If you choose "none", mail will build up in the MSP queues
+# and you will not receive any mail from external sites.
+#
+DAEMON_MODE="$parameter{'DAEMON_MODE'}";
+#
+# DAEMON_PARMS="$parm_def{'DAEMON_PARMS'}"; String Listener parms
+# Any parameters here will be ignored when run from cron.
+# Note that {QUEUE,MISC,CRON}_PARMS, if applicable, will override
+# anything declared herein.
+#
+DAEMON_PARMS="$parameter{'DAEMON_PARMS'}";
+#
+# DAEMON_HOSTSTATS="$parm_def{'DAEMON_HOSTSTATS'}"; Boolean Listener stats
+# This parameter determines whether or not host stats are collected
+# and available for the \`hoststat\` command to display. There will
+# be a (minor) performance hit, as files will be created/updated for each
+# sendmail delivery attempt. The files are fixed in size, and small,
+# but there can be many of them.
+#
+DAEMON_HOSTSTATS="$parameter{'DAEMON_HOSTSTATS'}";
+#
+# DAEMON_MAILSTATS="$parm_def{'DAEMON_MAILSTATS'}"; Boolean Listener stats
+# This parameter determines whether or not mailer stats are collected
+# and available for the \`mailstats\` command to display. There will
+# be a (minor) performance hit, as this file will be updated for each
+# item coming into, or out of, sendmail. The file is fixed in size,
+# and small, so there's no need to rotate it.
+#
+DAEMON_MAILSTATS="$parameter{'DAEMON_MAILSTATS'}";
+#
+#------------------------------------------------------------------------------
+# SMTP MTA Queue Runner Configuration
+#
+# QUEUE_MODE="$parm_def{'QUEUE_MODE'}"; Keyword SMTP queue runner
+# daemon: Run as standalone daemon
+# cron: Run from crontab
+# none: No queue runner (ie, nullclient/smarthost)
+#
+QUEUE_MODE="$parameter{'QUEUE_MODE'}";
+#
+# QUEUE_INTERVAL="$parm_def{'QUEUE_INTERVAL'}"; Timespec (digits+w|d|h|m|s)
+# Interval at which to run the MTA queues. What interval should you use?
+# The amount of time that is acceptable before retrying delivery on
+# mail that couldn't be delivered in one run, or how long an item can
+# set in the queue before having the first delivery attempt done.
+#
+# NOTE: If you leave this field blank, You get *NO* queue runners !!!
+#
+QUEUE_INTERVAL="$parameter{'QUEUE_INTERVAL'}";
+#
+# QUEUE_PARMS="$parm_def{'QUEUE_PARMS'}"; String queue parameters
+# Any parameters here are also used when run from cron.
+# Note that MISC_PARMS and CRON_PARMS, if applicable, will override
+# anything declared herein.
+#
+QUEUE_PARMS="$parameter{'QUEUE_PARMS'}";
+#
+#------------------------------------------------------------------------------
+# SMTP - MSP Queue Runner Configuration
+#
+# MSP_MODE="$parm_def{'MSP_MODE'}"; Keyword MSP queue runner mode
+# daemon: Run as standalone daemon
+# cron: Run from crontab
+# none: No queue runner (ie, nullclient/smarthost)
+#
+# NOTE: If QUEUE_MODE="cron" & MSP_MODE="none", the MSP queue will
+# be run as part of the MTA queue running process.
+#
+MSP_MODE="$parameter{'MSP_MODE'}";
+#
+# MSP_INTERVAL="$parm_def{'MSP_INTERVAL'}"; Timespec (digits+w|d|h|m|s)
+# Interval at which to run the MSP queues. What interval should you use?
+# The amount of time that is acceptable before retrying delivery on
+# mail that couldn't be accepted by the MTA, and was therefore left
+# in the message submission queue. The MTA shouldn't be down that often
+# so this can be larger than QUEUE_INTERVAL.
+#
+# NOTE: If you leave this field blank, The MSP queue will *NOT* be run !!!
+#
+MSP_INTERVAL="$parameter{'MSP_INTERVAL'}";
+#
+# MSP_PARMS="$parm_def{'MSP_PARMS'}"; String queue parameters
+# Any parameters here are also used when run from cron.
+# Note that MISC_PARMS and CRON_PARMS, if applicable, will override
+# anything declared herein.
+#
+MSP_PARMS="$parameter{'MSP_PARMS'}";
+#
+# MSP_MAILSTATS="$parm_def{'MSP_MAILSTATS'}"; Boolean Listener stats
+# This parameter determines whether or not mailer stats are collected
+# and available for the \`mailstats\` command to display. There will
+# be a (minor) performance hit, as this file will be updated for each
+# item coming into, or out of, sendmail. The file is fixed in size,
+# and small, so there's no need to rotate it.
+#
+MSP_MAILSTATS="$parameter{'MSP_MAILSTATS'}";
+#
+#------------------------------------------------------------------------------
+# Miscellaneous Confguration
+#
+# MISC_PARMS="$parm_def{'MISC_PARMS'}"; String miscellaneous parameters
+# Miscellaneous parameters - applied to any sendmail invocation.
+# Any parameters here are also used when run from cron.
+# Applied after {DAEMON,QUEUE}_PARMS, and can therefore override them
+# if need be (in which case why did use them?)
+# Note that CRON_PARMS, if applicable, will override anything
+# declared herein.
+#
+# Here is where'd you setup and debugging or special parms that you
+# want shared betwixt the possibly separate listener/queue-runner
+# processes.
+#
+MISC_PARMS="$parameter{'MISC_PARMS'}";
+#
+#------------------------------------------------------------------------------
+# Cron Job Configuration
+#
+# CRON_MAILTO="$parm_def{'CRON_MAILTO'}"; String cronjob output
+# Recipient of *rare* cronjob output. Some cronjobs will be running
+# under user `mail`, so any problems encountered would probably be missed
+# so define a user who actually (hopefully) checks email now and again.
+#
+CRON_MAILTO="$parameter{'CRON_MAILTO'}";
+#
+# CRON_PARMS="$parm_def{'CRON_PARMS'}"; String cron specific parmeters
+# Cron parameters - applied *only* when sendmail queue running is done
+# via a cronjob. Applied after QUEUE_PARMS and MISC_PARMS, and can
+# therefore override them if need be.
+#
+CRON_PARMS="$parameter{'CRON_PARMS'}";
+#
+#------------------------------------------------------------------------------
+# Other stuff
+# LOG_CMDS="$parm_def{'LOG_CMDS'}"; Binary command logging flag
+# Will cause syslog entries for many of the sendmail related commands
+# like runq, mailq, etc - you'll also see cron jobs (if enabled).
+#
+LOG_CMDS="$parameter{'LOG_CMDS'}";
+#
+# HANDS_OFF="$parm_def{'HANDS_OFF'}"; Binary Do *NOT* touch the configuration
+# Set this *ONLY* if you are going to be fully responsible for the entire
+# setup of sendmail - the directories, permissions, databases, etc. With
+# this variable set to "Yes", nothing will be done for you during updates.
+#
+# In other words, "The blood be upon your hands" if you set this...
+# My ability to help with problems will be greatly reduced !
+#
+# "Well, a pet peeve of mine is people who directly edit the
+# .cf file instead of using the m4 configuration files.
+# Don't do it! [laughs] I treat the .cf file as a binary
+# file - you should too."
+# -- Eric Allman 1999/10/18
+# http://www.dotcomeon.com/allman_sendmail_qa.html
+#
+HANDS_OFF="$parameter{'HANDS_OFF'}";
+#
+#------------------------------------------------------------------------------
+# Queue Aging Configuration
+#
+# Why would you want to age your queues? On every queue-run interval,
+# sendmail will try *every* file in the queue... If a site is down
+# for a while, considerable time can be wasted each interval in retrying
+# it. The scheme supported allows aging by time, and can move the older
+# files to another (less frequently run queue), thereby reducing overal
+# system impact - and providing better mail throughput.
+#
+# Note that this support is completely separate from QUEUE_MODE=cron,
+# you can age queues even if you're running QUEUE_MODE=daemon.
+#
+# There are four parts to the queue aging support, and these parts
+# may be repeated, to operate on multiple queues.
+#
+# 1. Interval at which to age the queues (in minutes).
+# What interval should you use? Roughly twice the normal queue
+# interval, so that messages are tried twice in each successively
+# slower queue.
+#
+# 2. Criteria (optional and defaults to interval). This is the
+# specification of which files to move. It defaults moving
+# files whose age in the queues exceeds the interval.
+# This field, if specified can be very complex - supporting
+# aging by just about anything! see qtool(8) for details.
+#
+# 3. To queue. This is the queue to which files will be moved.
+# It may be fully qualified, or relative to /var/spool/mqueue.
+#
+# 4. From queue. This is the queue from which files will be moved.
+# It may be fully qualified, or relative to /var/spool/mqueue.
+#
+# Samples:
+# AGE_DATA="[['25m', '', 'hourly', 'main']]";
+# Every 25 minutes, move any file older than 25 minutes from
+# /var/spool/mqueue/main to /var/spool/mqueue/hourly
+#
+# AGE_DATA="[['25m', '', 'hourly', 'main'],\\
+# ['125', '', 'daily', 'hourly']]";
+# Same as the above, but also move files from the hourly queue
+# to the daily queue after 125 minutes in the hourly queue.
+#
+# AGE_DATA="[['25m',\\
+# '-e \\'\$msg{message}[0] == /Deferred: 452 4.2.2 Over quota/\\'',\\
+# 'overquota', 'main']]";
+# Every 25 minutes, move all files deferred because of quota
+# violations from /var/spool/mqueue/main to
+# /var/spool/mqueue/overquota where they can be processed on
+# a different interval, or by some other means.
+#
+# If the above samples suggest Perl arrays, well, they are...
+#
+# AGE_DATA="$parm_def{'AGE_DATA'}"; Perl array Queue aging data
+#
+EOT
+ my ($ok, $var) = &get_value('AGE_DATA');
+ my $tmpval = eval $var;
+ if ($@) {
+ warn $@;
+ }
+ else {
+ $var = $tmpval;
+ };
+ if (not defined $var) {
+ print $ofh 'AGE_DATA="";',"\n";
+ }
+ elsif (not ref $var) {
+ print $ofh 'AGE_DATA="',$var,'";',"\n";
+ }
+ elsif (@{$var} == 0) {
+ print $ofh 'AGE_DATA="";',"\n";
+ }
+ else {
+ print $ofh 'AGE_DATA="[\\',"\n";
+ foreach my $entry (@{$var}) {
+ foreach my $ndx ($[ .. $#{@{$entry}}) {
+ @{$entry}[$ndx] =~ s/'/\\'/g;
+ };
+ print $ofh "['",join("', '",@{$entry}),"'],\\\n";
+ };
+ print $ofh ']";',"\n";
+ };
+ print $ofh <<"EOT";
+#
+#------------------------------------------------------------------------------
+# Dependant variables (set according to other variables)
+#
+EOT
+ foreach my $key (sort keys %parm_dependant) {
+ my ($ok, $value);
+ # Don't evaluate value, just stuff it...
+ next if ( ! $parameter{$key} );
+ ($ok, $value) = (1, $parameter{$key});
+ print $ofh "$key=",'"',$value,'";',"\n";
+ };
+ print $ofh <<"EOT";
+#
+#------------------------------------------------------------------------------
+# Hidden variables (the blood be upon your hands)
+#
+EOT
+ foreach my $key (sort keys %parm_hidden) {
+ my ($ok, $value);
+ # Don't evaluate value, just stuff it...
+ next if ( ! $parameter{$key} );
+ ($ok, $value) = (1, $parameter{$key});
+ print $ofh "$key=",'"',$value,'";',"\n";
+ };
+ print $ofh <<"EOT";
+#
+#------------------------------------------------------------------------------
+# Deprecated variables (kept for reference)
+#
+EOT
+ foreach my $key (sort keys %parm_deprecated) {
+ my ($ok, $value);
+ # Don't evaluate value, just stuff it...
+ if ( $parm_deprecated{$key} ) {
+ ($ok, $value) = (1, join('','${', $parm_deprecated{$key}, '}'));
+ }
+ elsif ( $parameter{$key} ) {
+ ($ok, $value) = (1, $parameter{$key});
+ };
+ print $ofh "$key=",'"',$value,'";',"\n";
+ };
+ print $ofh <<"EOT";
+#
+#------------------------------------------------------------------------------
+# Unknown variables (kept for reference)
+#
+EOT
+ foreach my $key (sort keys %parameter) {
+ if (! exists($parm_def{$key}) and
+ ! exists($parm_deprecated{$key})) {
+ # Don't evaluate value, just stuff it...
+ my ($ok, $value) = (1, $parameter{$key});
+ print $ofh "$key=",'"',$value,'";',"\n";
+ };
+ };
+ print $ofh <<"EOT";
+#------------------------------------------------------------------------------
+#
+
+EOT
+
+ close($ofh);
+ if ( $database_file eq $Parse_conf::Conffile ) {
+ chown '0', '0', "$database_file";
+ chmod 0644, "$database_file";
+ };
+ };
+
+__END__