diff options
Diffstat (limited to 'debian/local/update_mk')
-rw-r--r-- | debian/local/update_mk | 765 |
1 files changed, 0 insertions, 765 deletions
diff --git a/debian/local/update_mk b/debian/local/update_mk deleted file mode 100644 index 4c433c3..0000000 --- a/debian/local/update_mk +++ /dev/null @@ -1,765 +0,0 @@ -#!/usr/bin/perl -w -#------------------------------------------------------------------------ -# -# $Sendmail: update_mk,v 8.14.2 2007-11-02 22:20:56 cowboy Exp $ -# -# Create /etc/mail/Makefile for Debian Sendmail databases -# -# Copyright 1998-2007 Richard Nelson. All Rights Reserved. -# -# Notes (to all): -# * -# -# Notes (to self): -# * Should actually put data in some files (local-host-names, etc) -# -#------------------------------------------------------------------------ -# -# Initialization of the perl environment -use strict; # be kosher -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 - -# 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; -require Parse_conf; - -# Version of this program -#($main::MYNAME = $main::0) =~ s|.*/||; -#$main::Author = "Richard Nelson"; -#$main::AuthorMail = "cowboy\@debian.org"; -#$main::Version = '$Revision: 2.00 $ '; -$main::program_name = $0; -$main::program_version = '8.14.2'; -$main::program_date = '2007-11-02 22:20:56 cowboy'; -$main::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(); - -my $Makefile_def = "/etc/mail/Makefile"; -my $Conffile = "/etc/mail/sendmail.conf"; -# List of database entries that will be created if not found -my %created_dbs; -my @created_dbs; -# A few files (like exposed-users) can be listed >1 times ! -my %created_files = (); -my $reload_stamp = "/var/run/sendmail/stampdir/reload"; - -# -#------------------------------------------------------------------------------ -# Finally, some code (almost) -#------------------------------------------------------------------------------ -# -# Argument handling... -$main::opt_help=''; -$main::opt_output_file=''; -$main::opt_input_file=''; -$main::opt_debug=''; -my @options = qw( - help|h - output-file|output_file|o:s - input-file|input_file|i:s - debug! - ); -my $result = GetOptions(@options); -if ( ! $result ) { - die "Terminating due to parameter error"; - }; -if ( $main::opt_help ) { - warn "$main::program_name $main::program_version $main::program_date\n"; - warn "$0 \n"; - warn " -help\n" if $main::opt_help; - warn " -debug\n" if $main::opt_debug; - warn " -o $main::opt_output_file\n" if $main::opt_output_file; - warn " -i $main::opt_input_file\n" if $main::opt_input_file; - exit 0; - }; - -my $Makefile = $main::opt_output_file || $Makefile_def; -${Parse_mc::database_file} = $main::opt_input_file - if $main::opt_input_file; -# $main::debug is used in Parse_mc ! -$main::debug = $main::opt_debug || $main::debug; - -# Pull in some configuration data -&Parse_conf::read_conf("$Conffile"); -my ($ok, $value) = &Parse_conf::get_value('HANDS_OFF'); -if ($value ne '0') { - exit; - }; - -# Let them know wtf is going on... -print STDOUT "Creating ${Makefile}...\n"; - -# Read the mc/m4 files -&Parse_mc::read_dbs($Parse_mc::database_file, ''); - -# Determine names with which we shall work -my @databases = &get_names(); - -# Write out the textual representation -&write_make; - -# -#------------------------------------------------------------------------------ -# Obtain list of candidate databases from sendmail.mc -#------------------------------------------------------------------------------ -sub get_names { - my @names; - - # Database types we know how to handle - my %make_types = ( - 'btree' => 1 - ,'dbm' => 1 - ,'hash' => 1 - ,'m4' => 1 - ,'newaliases' => 1 - ,'parse_mc' => 1 - ,'update_conf' => 1 - ,'update_mk' => 1 - ,'update_auth' => 1 - ,'update_tls' => 1 - ,'QUEUE_GROUP' => 1 - ,'include' => 1 - ); - - # Add any qualified databases to the list - foreach my $entry (&Parse_mc::names_dbs()) { - my ($class, $flags, $files, $options) = - &Parse_mc::entry_dbs($entry); - if ( (exists($make_types{$entry}) or - exists($make_types{$class})) - and @{$files}[0] ne '-' - and ! exists($created_dbs{$entry})) { - push @names, $entry; - push @created_dbs, $entry; - $created_dbs{$entry} = ''; - }; - }; - - return @names; - }; - -# -#------------------------------------------------------------------------------ -# Create Makefile -#------------------------------------------------------------------------------ -sub write_make { - my $ofh = new FileHandle; - - $Makefile = '&STDOUT' if ($Makefile eq '-'); - unless ( open($ofh, ">$Makefile") ) { - warn("Could not open $Makefile($!), using STDOUT.\n"); - open($ofh, ">&STDOUT"); - }; - $Makefile = '-' if ($Makefile eq '&STDOUT'); - - &write_header($ofh); - &write_target_clean($ofh); - &write_target_restart($ofh); - &write_target_sendmail($ofh); - &write_targets($ofh); - &write_files($ofh); - &write_footer($ofh); - - close $ofh; - if ($Makefile eq $Makefile_def) { - my $gid = getgrnam('smmsp'); - chown '0', $gid, $Makefile; - chmod 0754, $Makefile; - }; - }; - -# -#------------------------------------------------------------------------------ -# Write Makefile header -#------------------------------------------------------------------------------ -sub write_header { - my ($ofh) = @_; - - print $ofh <<"EOT"; -#!/usr/bin/make -f -#################################################################### -##### This file is automagically generated -- edit at your own risk -##### -##### Copyright (c) 1998-2007 Richard Nelson. All Rights Reserved. -##### -##### file: ${Makefile} Makefile for Sendmail databases -##### generated via: (${interp_pgm} ${interp_vrm}) -##### ${main::program_name} -##### version: ${main::program_version} ${main::program_date} -##### by: ${user}\@${hostname} -##### on: ${current_time} -##### in: ${directory} -##### input files: ${Parse_mc::database_file} -##### -##### Usage: -##### 1) Make all targets upto date - use one of the following: -##### A) \`(cd /etc/mail && make)\` -##### B) \`make -f ${Makefile}\` -##### C) \`${Makefile}\` -##### 2) Force update of <target> - Add <target> to one of the -##### prior commands ie, \`${Makefile} access\`. Most -##### any reasonable <target> value is accepted. -##### -#################################################################### -SHELL=/bin/sh - -# -# targets that will be routed to the /etc/init.d/sendmail script -# NOTE: newaliases and clean removed due to extant rules -# -INIT = start stop restart restart-if-running \\ - reload-if-running reload force-reload \\ - hoststat purgestat mailstats mailq runq control \\ - status debug - -.SUFFIXES: -.PRECIOUS: $Makefile - -# -# all, the default target, will update everything -# -.PHONY: all -all: sendmail $reload_stamp - -# -# route to the /etc/init.d/sendmail script -# -.PHONY: \$(INIT) -\$(INIT): FORCE - /etc/init.d/sendmail \$\@ - -EOT - }; - -# -#------------------------------------------------------------------------------ -# Write Makefile 'CLEAN' target -#------------------------------------------------------------------------------ -sub write_target_clean { - my ($ofh) = @_; - my @names; - - %created_files = (); - foreach my $entry (@databases) { - next if ($entry eq 'QUEUE_GROUP' - or $entry eq 'Makefile' - or $entry eq 'auth' - or $entry eq 'tls' - or $entry eq 'include' - ); - my ($class, $flags, $files, $options) = - &Parse_mc::entry_dbs($entry); - foreach my $file (@{$files}) { - next if ( $file eq '-' - or exists($created_files{$file}) ); - $created_files{$file} = ''; - my $dbname; - if ($class eq 'parse_mc' - or $class eq 'update_mk' - or $class eq 'm4') { - $dbname = "/etc/mail/$entry"; - } - elsif ($class eq 'update_conf') { - $dbname = "/etc/cron.d/sendmail"; - } - elsif ($class eq 'btree' - or $class eq 'hash' - or $class eq 'newaliases') { - $dbname = "$file.db"; - } - else { - $dbname = $file; - }; - push @names, $dbname; - }; - }; - - print $ofh <<"EOT"; - -# -# clean target, remove {sendmail,submit}.cf and generated databases -# -EOT - print $ofh - ".PHONY: clean\n", - "clean: FORCE\n", - "\trm -f ",join(";\n\trm -f ", @names),";\n"; - }; - -# -#------------------------------------------------------------------------------ -# Write Makefile 'RESTART' target -#------------------------------------------------------------------------------ -sub write_target_restart { - my ($ofh) = @_; - my $file; - - print $ofh <<"EOT"; - -# -# restart target, check to see if sendmail needs to be restarted -# -.PHONY: noreload norestart -noreload norestart: FORCE - \@touch $reload_stamp; - -.PHONY: should_reload should_restart -should_reload should_restart: FORCE - \@rm -f $reload_stamp; - \@\$(MAKE) -sf $Makefile $reload_stamp; - -EOT - - # Spew secondary target of actual restart - %created_files = (); - my @right; - foreach my $entry (sort &Parse_mc::restart_dbs()) { - if (! exists($created_dbs{$entry})) { - push @created_dbs, $entry; - $created_dbs{$entry} = ''; - }; - my ($class, $flags, $files, $options) = - &Parse_mc::entry_dbs($entry); - foreach my $file (@{$files}) { - next if ( $file eq '-' - or exists($created_files{$file}) ); - $created_files{$file} = ''; - my $dbname = $file; - $dbname =~ s/\.mc$/\.cf/; - push @right, "$dbname"; - }; - }; - - print $ofh "$reload_stamp: \\\n\t", - join(" \\\n\t", @right), "\n", - "\t\@if [ ! -f \$\@ ]; then \\\n", - "\t\techo 'A forced reload...'; \\\n", - "\telse \\\n", - "\t\techo 'The following file(s) have changed:'; \\\n", - "\t\techo ' \$?'; \\\n", - "\t\tfi;\n", - "\t\@echo '** ** You should issue ", - "\`/etc/init.d/sendmail reload\` ** **';\n"; - }; - -# -#------------------------------------------------------------------------------ -# Write Sendmail dependancies -#------------------------------------------------------------------------------ -sub write_target_sendmail { - my ($ofh) = @_; - - print $ofh <<"EOT"; - -# -# sendmail targets, depend upon *ALL* relevant files/databases -# -.PHONY: sendmail -sendmail: sendmail_files sendmail_dbs - -EOT - my (@smfiles, @smdbs); - - %created_files = (); - foreach my $entry (@created_dbs) { - my ($class, $flags, $files, $options) = - &Parse_mc::entry_dbs($entry); - foreach my $file (@{$files}) { - next if $file eq '-'; - next if $file eq 'ldap'; # ALIAS hack - if ($class eq 'parse_mc' or $class eq 'update_mk' - or $class eq 'm4') { - push @smfiles, "$file" - if (!exists($created_files{$file})); - $created_files{$file} = ''; - push @smdbs, "/etc/mail/$entry"; - } - elsif ($class eq 'update_conf') { - push @smdbs, "/etc/cron.d/sendmail"; - } - elsif ($class eq 'btree' or $class eq 'hash' - or $class eq 'newaliases') { - push @smfiles, "$file" - if (!exists($created_files{$file})); - $created_files{$file} = ''; - push @smdbs, "$file.db"; - } - else { - push @smfiles, "$file" - if (!exists($created_files{$file})); - $created_files{$file} = ''; - }; - }; - }; - - print $ofh ".PHONY: sendmail_files\n", - "sendmail_files: \\\n\t", - join(" \\\n\t", @smfiles), "\n\n"; - print $ofh ".PHONY: sendmail_dbs\n", - "sendmail_dbs: \\\n\t", - join(" \\\n\t", @smdbs), "\n"; - }; - -# -#------------------------------------------------------------------------------ -# Write Makefile individual targets -#------------------------------------------------------------------------------ -sub write_targets { - my ($ofh) = @_; - my $file; - - print $ofh <<"EOT"; - -# -# Individual database targets -# - -# -# Default db type is hash (Must be in /etc/mail, or -# fully qualify the dataset for this target to work) -# -%.db: % FORCE - \@echo 'Updating \$\@...'; - \@if [ -x /usr/sbin/makemap ]; then \\ - /usr/sbin/makemap hash \$\@.new.db < \$<; \\ - chown root:smmsp \$\@.new.db; \\ - chmod 0640 \$\@.new.db; \\ - mv -f \$\@.new.db \$\@; \\ - fi; -EOT - - # Spew primary target of <target> - foreach my $entry (@databases) { - my ($class, $flags, $files, $options) = - &Parse_mc::entry_dbs($entry); - my @names; - my $left = ''; - my $right = ''; - my $sleft = ''; - my $dbname = ''; - print $ofh "\n"; - - # Create short name(s) for database entries - $sleft .= "$entry "; - if ($class eq 'newaliases' - or $class eq 'parse_mc' - or $class eq 'update_mk' - or $class eq 'update_conf' - or $class eq 'update_auth' - or $class eq 'update_tls' - ) { - $sleft = 'makefile make ' if ($class eq 'update_mk'); - $sleft .= 'cron ' if ($class eq 'update_conf'); - $sleft .= "$class "; - }; - - foreach my $file (@{$files}) { - next if $file eq '-'; - next if $file eq 'ldap'; # ALIAS hack - if ($entry eq 'QUEUE_GROUP' or $entry eq 'include') { - $dbname = ''; - $sleft = lc "${entry}s"; - $left = lc "${entry}s"; - } - elsif ($class eq 'parse_mc' or $class eq 'update_mk' - or $class eq 'm4') { - $dbname = "/etc/mail/$entry"; - } - elsif ($class eq 'update_conf') { - $dbname = "/etc/cron.d/sendmail"; - } - elsif ($class eq 'btree' or $class eq 'hash' - or $class eq 'newaliases') { - $dbname = "$file.db"; - } - else { - $dbname = $file; - $file = "" - if ($class eq 'update_tls' - or $class eq 'update_auth'); - }; - $left .= "$dbname "; - $right .= " $file"; - - # Create short name(s) for database entries - if ($class ne 'parse_mc' - and $class ne 'update_mk' - and $class ne 'update_conf' - and $class ne 'update_auth' - and $class ne 'update_tls' - and $entry ne 'QUEUE_GROUP' - and $entry ne 'include' - ) { - my $dbsname = "$dbname"; - $dbsname =~ s/\/etc\/mail\///; - $sleft .= "$dbsname " if ($entry ne $dbsname); - if ($file ne $dbname) { - $dbsname =~ s/\.db//; - $sleft .= "$dbsname " if ($entry ne $dbsname); - }; - }; - }; - - # Spew out a phony entry suitable for FORCE - print $ofh '.PHONY: ', $sleft, "\n"; - print $ofh $sleft,": FORCE\n" - if ($entry ne 'QUEUE_GROUP' and $entry ne 'include'); - if ($class eq 'update_mk') { - print $ofh "\t\@touch $right;\n", - "\t\@\$(MAKE) -sf $Makefile $left;\n"; - } - elsif ($entry ne 'QUEUE_GROUP' and $entry ne 'include') { - print $ofh "\t\@rm -f $left;\n", - "\t\@\$(MAKE) -sf $Makefile $left;\n"; - }; - - # - # Spew out the whole enchilada for this database - if ($entry eq 'sendmail.cf' or $entry eq 'databases') { - my ($iclass, $iflags, $ifiles, $ioptions) = - &Parse_mc::entry_dbs('include'); - $right .= ' '; - $right .= join(' ', @{$ifiles}); - }; - print $ofh $left, ':', $right, "\n"; - next if ($entry eq 'QUEUE_GROUP' or $entry eq 'include'); - print $ofh "\t\@echo 'Updating $entry ...';\n"; - if ($class eq 'newaliases') { - print $ofh "\t\@if [ -x /usr/sbin/sendmail ]; then \\\n"; - print $ofh "\t\t/usr/sbin/sendmail -bi || true; \\\n"; - } - elsif ($class eq 'parse_mc' - or $class eq 'update_conf' - or $class eq 'update_mk' - or $class eq 'update_auth' - or $class eq 'update_tls' - ) { - print $ofh "\t\@if [ -x /usr/share/sendmail/${class} ]; then \\\n"; - print $ofh "\t\t/usr/share/sendmail/${class} || true; \\\n" - } - elsif ($class eq 'btree' or $class eq 'hash') { - print $ofh "\t\@if [ -x /usr/sbin/makemap ]; then \\\n"; - }; - foreach my $file (@{$files}) { - next if ( $file eq 'ldap' ); # ALIAS hack - my $dbname = $file; - my $newname = $file; - my $uid = 'root'; - $uid = 'smmta' if ($entry eq 'authinfo' - or $entry eq 'access_db' - or $entry eq 'QUEUE_GROUP' - or $class eq 'newaliases'); - my $mode = '0644'; - $mode = '0640' if ($entry eq 'authinfo' - or $entry eq 'access_db'); - $mode = '0640' if ($class eq 'btree' or $class eq 'hash'); - $mode = '0644' if ($class eq 'm4'); - $mode = '0754' if ($class eq 'update_mk'); - $mode = '02750' if ($entry eq 'QUEUE_GROUP'); - if ($class eq 'btree' or $class eq 'hash') { - $dbname .= '.db'; - $newname .= '.new.db'; - if (index($flags, '-o') == -1) { - print $ofh "\t\t/usr/sbin/makemap $class $newname \\\n", - "\t\t\t< $file; \\\n", - "\t\tchown $uid:smmsp $newname; \\\n", - "\t\tchmod $mode $newname; \\\n", - "\t\tmv -f $newname $dbname; \\\n"; - } - else { - print $ofh - "\t\tif [ -s $file ]; then \\\n", - "\t\t/usr/sbin/makemap $class $newname \\\n", - "\t\t\t< $file; \\\n", - "\t\tchown $uid:smmsp $newname; \\\n", - "\t\tchmod $mode $newname; \\\n", - "\t\tmv -f $newname $dbname; \\\n", - "\t\tfi; \\\n"; - }; - } - elsif ($class eq 'newaliases') { - $newname .= '.db'; - print $ofh "\t\tif [ -f $newname ]; then \\\n", - "\t\t\tchown $uid:smmsp $newname; \\\n", - "\t\t\tchmod $mode $newname; \\\n", - "\t\t\tfi; \\\n"; - } - elsif ($class eq 'parse_mc' or $class eq 'update_mk') { - $newname = "/etc/mail/$entry"; - print $ofh "\t\tchown $uid:smmsp $newname; \\\n", - "\t\tchmod $mode $newname; \\\n"; - } - elsif ($class eq 'm4') { - my $oldname = $dbname; - $dbname =~ s/\.mc$/\.cf/; - $newname =~ s/\.mc$/\.cf\.new/; - my $lead = "\t"; - my $leadh = "\t\@"; - my $lead2 = "\t\t"; - my $trail = ""; - if ($entry eq 'submit.cf') { - $lead = "\t\t"; - $leadh = "\t\t"; - $lead2 = "\t\t\t"; - $trail = "\\"; - }; - print $ofh - "\t\@rm -f ${dbname}.errors\n"; - print $ofh - "\t\@if [ -f /usr/share/sendmail/cf/feature/msp.m4 ]; ", - "then \\\n" if ($entry eq 'submit.cf'); - print $ofh - "${leadh}m4 $file > $newname \\\n", - "${lead2}2> ${dbname}.errors || true; $trail\n", - "${leadh}echo \"### ${oldname} ###\" \\\n", - "${lead2}>> $newname; $trail\n", - "${leadh}sed -e 's/^/# /' $file \\\n", - "${lead2}>> $newname; $trail\n", - "${leadh}chown $uid:smmsp $newname; $trail\n", - "${leadh}chmod $mode $newname; $trail\n", - "${leadh}mv -f $newname $dbname; $trail\n", - "${leadh}if [ -s ${dbname}.errors ]; then \\\n", - "${lead2}chown $uid:smmsp ${dbname}.errors; \\\n", - "${lead2}cat ${dbname}.errors; \\\n", - "${lead}else \\\n", - "${lead2}rm -f ${dbname}.errors; \\\n", - "${lead2}fi; $trail\n"; - print $ofh - "${lead}fi;\n" if ($entry eq 'submit.cf'); - }; - }; - if ($class eq 'newaliases' - or $class eq 'parse_mc' - or $class eq 'update_conf' - or $class eq 'update_mk' - or $class eq 'update_auth' - or $class eq 'update_tls' - or $class eq 'btree' or $class eq 'hash' - ) { - print $ofh "\t\tfi;\n"; - }; - }; - }; - -# -#------------------------------------------------------------------------------ -# Write Makefile file targets (create any missing files) -#------------------------------------------------------------------------------ -sub write_files { - my ($ofh) = @_; - - print $ofh <<"EOT"; - -# -# Individual file targets - create any requisite files -# -EOT - - %created_files = (); - foreach my $entry (@created_dbs) { - my ($class, $flags, $files, $options) = - &Parse_mc::entry_dbs($entry); - - # These are done above... - next if ($entry eq 'databases' - or $entry eq 'auth' - or $entry eq 'tls' - or $entry eq 'Makefile' - or $entry eq 'include' - ); - - foreach my $file (@{$files}) { - next if ( $file eq '-' - or exists($created_files{$file}) ); - $created_files{$file} = ''; - my $uid = 'root'; - $uid = 'smmta' if ($entry eq 'authinfo' - or $entry eq 'access_db' - or $entry eq 'QUEUE_GROUP' - or $class eq 'newaliases'); - my $mode = '0644'; - $mode = '0640' if ($entry eq 'authinfo' - or $entry eq 'access_db'); - $mode = '0640' if ($class eq 'btree' or $class eq 'hash'); - $mode = '0644' if ($class eq 'm4'); - $mode = '0754' if ($class eq 'update_mk'); - $mode = '02750' if ($entry eq 'QUEUE_GROUP'); - print $ofh "\n$file:\n", - "\t\@echo 'Creating $file';\n"; - if ($entry eq 'QUEUE_GROUP') { - print $ofh "\t\@install -d", - " -o $uid -g smmsp -m $mode $file;\n", - "\t\@chown $uid:smmsp $file;\n", - "\t\@chmod $mode $file;\n"; - } - elsif ($entry eq 'sendmail.cf') { - print $ofh "\t\@/usr/sbin/sendmailconfig", - " --no-reload;\n"; - } - elsif ($entry eq 'submit.cf') { - print $ofh "\t\@cp /usr/share/sendmail/", - "cf/debian/submit.mc \\\n", - "\t\t$file;\n", - "\t\@chown $uid:smmsp $file;\n", - "\t\@chmod $mode $file;\n"; - } - elsif ($entry eq 'access_db') { - print $ofh "\t\@cp /usr/share/sendmail/", - "examples/db/access \\\n", - "\t\t$file;\n", - "\t\@chown $uid:smmsp $file;\n", - "\t\@chmod $mode $file;\n"; - } - elsif ($file eq '/etc/mail/aliases') { - print $ofh "\t\@ln -s ../aliases /etc/mail/aliases\n"; - } - elsif ($class eq 'update_conf' - or $class eq 'update_auth' - or $class eq 'update_tls') { - print $ofh "\t\@/usr/share/sendmail/${class};\n"; - } - # FIXME: come back and create real data - # where needed (local-host-names, etc) - elsif (index($flags, '-o') == -1) { - print $ofh "\t\@touch $file;\n", - "\t\@chown $uid:smmsp $file;\n", - "\t\@chmod $mode $file;\n"; - } - elsif (index($flags, '-o') != -1) { - print $ofh "\t# Optional file...\n"; - }; - }; - }; - }; - -# -#------------------------------------------------------------------------------ -# Write Makefile footer -#------------------------------------------------------------------------------ -sub write_footer { - my ($ofh) = @_; - -print $ofh <<"EOT"; - -# -# FORCE target, allow one to override dependancies -# -.PHONY: FORCE -FORCE: ; - -EOT - }; - |