1*41fbaed0Stron#!/usr/bin/perl 2*41fbaed0Stron 3*41fbaed0Stron# Usage: xpostdef postconf.proto >postconf.proto.new 4*41fbaed0Stron 5*41fbaed0Stron# Update parameter default values in postconf prototype file. 6*41fbaed0Stron 7*41fbaed0Stron$POSTCONF="postconf"; 8*41fbaed0Stron 9*41fbaed0Stron# Read all the default parameter values. This also provides us with 10*41fbaed0Stron# a list of all the parameters that postconf knows about. 11*41fbaed0Stron 12*41fbaed0Stronopen(POSTCONF, "$POSTCONF -d|") || die "cannot run $POSTCONF -d: !$\n"; 13*41fbaed0Stronwhile(<POSTCONF>) { 14*41fbaed0Stron chop; 15*41fbaed0Stron if (($name, $defval) = split(/\s+=\s+/, $_, 2)) { 16*41fbaed0Stron $defval =~ s/&/\&/g; 17*41fbaed0Stron $defval =~ s/</\</g; 18*41fbaed0Stron $defval =~ s/>/\>/g; 19*41fbaed0Stron $defval =~ s/\s+$//; 20*41fbaed0Stron $defaults{$name} = $defval; 21*41fbaed0Stron } else { 22*41fbaed0Stron die "unexpected $POSTCONF output: $_\n"; 23*41fbaed0Stron } 24*41fbaed0Stron} 25*41fbaed0Stronclose(POSTCONF) || die "$POSTCONF failed: $!\n"; 26*41fbaed0Stron 27*41fbaed0Stron# Censor out default values that are system or version dependent, or 28*41fbaed0Stron# that don't display well. 29*41fbaed0Stron 30*41fbaed0Stron$censored = <<EOF; 31*41fbaed0Stronalias_database 32*41fbaed0Stronalias_maps 33*41fbaed0Stroncommand_directory 34*41fbaed0Stroncommand_expansion_filter 35*41fbaed0Stronconfig_directory 36*41fbaed0Strondaemon_directory 37*41fbaed0Strondefault_database_type 38*41fbaed0Strondefault_rbl_reply 39*41fbaed0Stronexecution_directory_expansion_filter 40*41fbaed0Stronexport_environment 41*41fbaed0Stronforward_expansion_filter 42*41fbaed0Stronforward_path 43*41fbaed0Stronhtml_directory 44*41fbaed0Stronimport_environment 45*41fbaed0Stronmail_release_date 46*41fbaed0Stronmail_spool_directory 47*41fbaed0Stronmail_version 48*41fbaed0Stronmailbox_delivery_lock 49*41fbaed0Stronmailq_path 50*41fbaed0Stronmanpage_directory 51*41fbaed0Stronmydomain 52*41fbaed0Stronmyhostname 53*41fbaed0Stronmynetworks 54*41fbaed0Stronnewaliases_path 55*41fbaed0Stronparent_domain_matches_subdomains 56*41fbaed0Stronproxy_read_maps 57*41fbaed0Stronqueue_directory 58*41fbaed0Stronreadme_directory 59*41fbaed0Stronsendmail_path 60*41fbaed0Stronsmtpd_expansion_filter 61*41fbaed0Strontls_random_source 62*41fbaed0Stronvirtual_mailbox_lock 63*41fbaed0Stronmilter_connect_macros 64*41fbaed0Stronmilter_helo_macros 65*41fbaed0Stronmilter_mail_macros 66*41fbaed0Stronmilter_rcpt_macros 67*41fbaed0Stronmilter_data_macros 68*41fbaed0Stronmilter_unknown_command_macros 69*41fbaed0Stronmilter_end_of_data_macros 70*41fbaed0StronEOF 71*41fbaed0Stron 72*41fbaed0Stronfor $name (split(/\s+/, $censored)) { 73*41fbaed0Stron $defaults{$name} = "see \"postconf -d\" output"; 74*41fbaed0Stron} 75*41fbaed0Stron 76*41fbaed0Stron# Process the postconf prototype file, and update default values 77*41fbaed0Stron# with output from the postconf command. Leave alone any defaults 78*41fbaed0Stron# that postconf didn't know about. This can happen when conditional 79*41fbaed0Stron# features have been compile time disabled. 80*41fbaed0Stron 81*41fbaed0Stron$name = $defval = $text = $line = ""; 82*41fbaed0Stron 83*41fbaed0Stronwhile(<>) { 84*41fbaed0Stron if (/^%PARAM/) { 85*41fbaed0Stron 86*41fbaed0Stron # Print the updated parameter text. Keep the old default if 87*41fbaed0Stron # postconf doesn't have a suitable one. 88*41fbaed0Stron 89*41fbaed0Stron if ($name) { 90*41fbaed0Stron $defval = $defaults{$name} if (defined($defaults{$name})); 91*41fbaed0Stron print "%PARAM $name $defval\n"; 92*41fbaed0Stron } 93*41fbaed0Stron print $text; 94*41fbaed0Stron 95*41fbaed0Stron # Reset the parameter name, default, and accumulated text. 96*41fbaed0Stron 97*41fbaed0Stron $name = $defval = $text = $line = ""; 98*41fbaed0Stron 99*41fbaed0Stron # Accumulate the parameter name and default value. 100*41fbaed0Stron 101*41fbaed0Stron do { 102*41fbaed0Stron $_ =~ s/\s+$//; 103*41fbaed0Stron $line .= " " . $_; 104*41fbaed0Stron } while(($_ = <POSTCONF>) && /^../); 105*41fbaed0Stron ($junk, $class, $name, $defval) = split(/\s+/, $line, 4); 106*41fbaed0Stron } else { 107*41fbaed0Stron 108*41fbaed0Stron # Accumulate the text in the parameter definition. 109*41fbaed0Stron 110*41fbaed0Stron $_ =~ s/\s+$/\n/; 111*41fbaed0Stron $text .= $_; 112*41fbaed0Stron 113*41fbaed0Stron } 114*41fbaed0Stron} 115*41fbaed0Stron 116*41fbaed0Stron# Fix the last parameter. 117*41fbaed0Stron 118*41fbaed0Stronif ($name && $text) { 119*41fbaed0Stron $defval = $defaults{$name} if (defined($defaults{$name})); 120*41fbaed0Stron print "%PARAM $name $defval\n$text"; 121*41fbaed0Stron} 122