#!/usr/bin/perl # Usage: xpostdef postconf.proto >postconf.proto.new # Update parameter default values in postconf prototype file. $POSTCONF="postconf"; # Read all the default parameter values. This also provides us with # a list of all the parameters that postconf knows about. open(POSTCONF, "$POSTCONF -d|") || die "cannot run $POSTCONF -d: !$\n"; while(<POSTCONF>) { chop; if (($name, $defval) = split(/\s+=\s+/, $_, 2)) { $defval =~ s/&/\&/g; $defval =~ s/</\</g; $defval =~ s/>/\>/g; $defval =~ s/\s+$//; $defaults{$name} = $defval; } else { die "unexpected $POSTCONF output: $_\n"; } } close(POSTCONF) || die "$POSTCONF failed: $!\n"; # Censor out default values that are system or version dependent, or # that don't display well. $censored = <<EOF; alias_database alias_maps command_directory command_expansion_filter config_directory daemon_directory default_database_type default_rbl_reply execution_directory_expansion_filter export_environment forward_expansion_filter forward_path html_directory import_environment mail_release_date mail_spool_directory mail_version mailbox_delivery_lock mailq_path manpage_directory mydomain myhostname mynetworks newaliases_path parent_domain_matches_subdomains proxy_read_maps queue_directory readme_directory sendmail_path smtpd_expansion_filter tls_random_source virtual_mailbox_lock milter_connect_macros milter_helo_macros milter_mail_macros milter_rcpt_macros milter_data_macros milter_unknown_command_macros milter_end_of_data_macros EOF for $name (split(/\s+/, $censored)) { $defaults{$name} = "see \"postconf -d\" output"; } # Process the postconf prototype file, and update default values # with output from the postconf command. Leave alone any defaults # that postconf didn't know about. This can happen when conditional # features have been compile time disabled. $name = $defval = $text = $line = ""; while(<>) { if (/^%PARAM/) { # Print the updated parameter text. Keep the old default if # postconf doesn't have a suitable one. if ($name) { $defval = $defaults{$name} if (defined($defaults{$name})); print "%PARAM $name $defval\n"; } print $text; # Reset the parameter name, default, and accumulated text. $name = $defval = $text = $line = ""; # Accumulate the parameter name and default value. do { $_ =~ s/\s+$//; $line .= " " . $_; } while(($_ = <POSTCONF>) && /^../); ($junk, $class, $name, $defval) = split(/\s+/, $line, 4); } else { # Accumulate the text in the parameter definition. $_ =~ s/\s+$/\n/; $text .= $_; } } # Fix the last parameter. if ($name && $text) { $defval = $defaults{$name} if (defined($defaults{$name})); print "%PARAM $name $defval\n$text"; }