diff --git a/sendmail/CHANGELOG b/sendmail/CHANGELOG index 24fe9e092..5f59d9c00 100644 --- a/sendmail/CHANGELOG +++ b/sendmail/CHANGELOG @@ -38,4 +38,5 @@ Added an access control page option to prevent creation and editing of catchall ---- Changes since 1.430 ---- Autoreply messages containing non-ASCII characters are now properly quoted-printable encoded. ---- Changes since 1.440 ---- -Added a module config option to control if the user is prompted for confirmation before deleting queued messages. +Added a Module Config option to control if the user is prompted for confirmation before deleting queued messages. +A custom command to rebuild all maps can be specified on the Module Config page, to be used instead of makemap or newaliases. diff --git a/sendmail/access-lib.pl b/sendmail/access-lib.pl index c5a593685..b8b860f76 100644 --- a/sendmail/access-lib.pl +++ b/sendmail/access-lib.pl @@ -76,12 +76,14 @@ $_[0]->{'eline'} = scalar(@$lref)-1; &flush_file_lines($_[1]); # Add to DBM -if ($_[3] eq "dbm") { - dbmopen(%acc, $_[2], 0644); - $acc{$from} = $_[0]->{'action'}; - dbmclose(%acc); +if (!&rebuild_map_cmd($_[1])) { + if ($_[3] eq "dbm") { + dbmopen(%acc, $_[2], 0644); + $acc{$from} = $_[0]->{'action'}; + dbmclose(%acc); + } + else { &run_makemap($_[1], $_[2], $_[3]); } } -else { &run_makemap($_[1], $_[2], $_[3]); } # Add to cache $_[0]->{'num'} = scalar(@list_access_cache); @@ -104,12 +106,14 @@ splice(@$lref, $_[0]->{'line'}, $len); # Delete from DBM local $oldfrom = $_[0]->{'tag'} ? "$_[0]->{'tag'}:$_[0]->{'from'}" : $_[0]->{'from'}; -if ($_[3] eq "dbm") { - dbmopen(%acc, $_[2], 0644); - delete($acc{$oldfrom}); - dbmclose(%acc); +if (!&rebuild_map_cmd($_[1])) { + if ($_[3] eq "dbm") { + dbmopen(%acc, $_[2], 0644); + delete($acc{$oldfrom}); + dbmclose(%acc); + } + else { &run_makemap($_[1], $_[2], $_[3]); } } -else { &run_makemap($_[1], $_[2], $_[3]); } # Delete from cache local $idx = &indexof($_[0], @list_access_cache); @@ -137,13 +141,15 @@ splice(@$lref, $_[0]->{'line'}, $oldlen, @newlines); &flush_file_lines($_[2]); # Update DBM -if ($_[4] eq "dbm") { - dbmopen(%virt, $_[3], 0644); - delete($virt{$oldfrom}); - $virt{$from} = $_[1]->{'action'}; - dbmclose(%virt); +if (!&rebuild_map_cmd($_[2])) { + if ($_[4] eq "dbm") { + dbmopen(%virt, $_[3], 0644); + delete($virt{$oldfrom}); + $virt{$from} = $_[1]->{'action'}; + dbmclose(%virt); + } + else { &run_makemap($_[2], $_[3], $_[4]); } } -else { &run_makemap($_[2], $_[3], $_[4]); } # Update cache local $idx = &indexof($_[0], @list_generics_cache); diff --git a/sendmail/aliases-lib.pl b/sendmail/aliases-lib.pl index cf500493d..4eb80670d 100644 --- a/sendmail/aliases-lib.pl +++ b/sendmail/aliases-lib.pl @@ -184,7 +184,11 @@ local $str = ($_[0]->{'enabled'} ? "" : "# ") . $_[0]->{'name'} . ": " . push(@$lref, $str); $_[0]->{'eline'} = scalar(@$lref)-1; &flush_file_lines($_[1]->[0]); -&system_logged("newaliases >/dev/null 2>&1") if (!$_[2]); +if (!$_[2]) { + if (!&rebuild_map_cmd($_[1]->[0])) { + &system_logged("newaliases >/dev/null 2>&1"); + } + } # Add to the cache local $jfiles = join(",", @{$_[1]}); @@ -203,7 +207,11 @@ local $lref = &read_file_lines($_[0]->{'file'}); local $len = $_[0]->{'eline'} - $_[0]->{'line'} + 1; splice(@$lref, $_[0]->{'line'}, $len); &flush_file_lines($_[0]->{'file'}); -&system_logged("newaliases >/dev/null 2>&1") if (!$_[1]); +if (!$_[1]) { + if (!&rebuild_map_cmd($_[0]->{'file'})) { + &system_logged("newaliases >/dev/null 2>&1"); + } + } # Remove from the cache local $jfiles = join(",", @{$_[0]->{'files'}}); @@ -227,7 +235,11 @@ local $lref = &read_file_lines($_[0]->{'file'}); local $len = $_[0]->{'eline'} - $_[0]->{'line'} + 1; splice(@$lref, $_[0]->{'line'}, $len, @newlines); &flush_file_lines($_[0]->{'file'}); -&system_logged("newaliases >/dev/null 2>&1") if (!$_[2]); +if (!$_[2]) { + if (!&rebuild_map_cmd($_[0]->{'file'})) { + &system_logged("newaliases >/dev/null 2>&1"); + } + } local $jfiles = join(",", @{$_[0]->{'files'}}); local $c = $list_aliases_cache{$jfiles}; diff --git a/sendmail/config.info b/sendmail/config.info index 39165fd5c..570289de5 100644 --- a/sendmail/config.info +++ b/sendmail/config.info @@ -38,3 +38,4 @@ mail_style=Mail file directory style,4,0-mail/username,1-mail/u/username,2-mail/ mail_sync=User mail file synchronization,2,create-Create with user,delete-Delete with user,modify-Rename with user smrsh_dir=SMRSH directory,3,None queue_dirs=Extra mail queue directories,3,None +rebuild_cmd=Command to rebuild all maps,3,Use makemap command diff --git a/sendmail/domain-lib.pl b/sendmail/domain-lib.pl index 387b9daf2..71e4905a6 100644 --- a/sendmail/domain-lib.pl +++ b/sendmail/domain-lib.pl @@ -72,12 +72,14 @@ $_[0]->{'eline'} = scalar(@$lref)-1; &flush_file_lines($_[1]); # Add to DBM -if ($_[3] eq "dbm") { - dbmopen(%dom, $_[2], 0644); - $dom{$_[0]->{'from'}} = $_[0]->{'to'}; - dbmclose(%dom); +if (!&rebuild_map_cmd($_[1])) { + if ($_[3] eq "dbm") { + dbmopen(%dom, $_[2], 0644); + $dom{$_[0]->{'from'}} = $_[0]->{'to'}; + dbmclose(%dom); + } + else { &run_makemap($_[1], $_[2], $_[3]); } } -else { &run_makemap($_[1], $_[2], $_[3]); } # Add to cache $_[0]->{'num'} = scalar(@list_domains_cache); @@ -98,12 +100,14 @@ splice(@$lref, $_[0]->{'line'}, $len); &flush_file_lines($_[1]); # Delete from DBM -if ($_[3] eq "dbm") { - dbmopen(%dom, $_[2], 0644); - delete($dom{$_[0]->{'from'}}); - dbmclose(%dom); +if (!&rebuild_map_cmd($_[1])) { + if ($_[3] eq "dbm") { + dbmopen(%dom, $_[2], 0644); + delete($dom{$_[0]->{'from'}}); + dbmclose(%dom); + } + else { &run_makemap($_[1], $_[2], $_[3]); } } -else { &run_makemap($_[1], $_[2], $_[3]); } # Delete from cache local $idx = &indexof($_[0], @list_domains_cache); @@ -127,13 +131,15 @@ splice(@$lref, $_[0]->{'line'}, $oldlen, @newlines); &flush_file_lines($_[2]); # Update DBM -if ($_[4] eq "dbm") { - dbmopen(%dom, $_[3], 0644); - delete($dom{$_[0]->{'from'}}); - $dom{$_[1]->{'from'}} = $_[1]->{'to'}; - dbmclose(%dom); +if (!&rebuild_map_cmd($_[2])) { + if ($_[4] eq "dbm") { + dbmopen(%dom, $_[3], 0644); + delete($dom{$_[0]->{'from'}}); + $dom{$_[1]->{'from'}} = $_[1]->{'to'}; + dbmclose(%dom); + } + else { &run_makemap($_[2], $_[3], $_[4]); } } -else { &run_makemap($_[2], $_[3], $_[4]); } # Update cache local $idx = &indexof($_[0], @list_domains_cache); diff --git a/sendmail/generics-lib.pl b/sendmail/generics-lib.pl index 32989d6d3..dd91df184 100644 --- a/sendmail/generics-lib.pl +++ b/sendmail/generics-lib.pl @@ -72,12 +72,16 @@ $_[0]->{'eline'} = scalar(@$lref)-1; &flush_file_lines($_[1]); # Add to DBM -if ($_[3] eq "dbm") { - dbmopen(%virt, $_[2], 0644); - $virt{$_[0]->{'from'}} = $_[0]->{'to'}; - dbmclose(%virt); +if (!&rebuild_map_cmd($_[1])) { + if (!&rebuild_map_cmd($_[1])) { + if ($_[3] eq "dbm") { + dbmopen(%virt, $_[2], 0644); + $virt{$_[0]->{'from'}} = $_[0]->{'to'}; + dbmclose(%virt); + } + else { &run_makemap($_[1], $_[2], $_[3]); } + } } -else { &run_makemap($_[1], $_[2], $_[3]); } # Add to cache $_[0]->{'num'} = scalar(@list_generics_cache); @@ -98,12 +102,14 @@ splice(@$lref, $_[0]->{'line'}, $len); &flush_file_lines($_[1]); # Delete from DBM -if ($_[3] eq "dbm") { - dbmopen(%virt, $_[2], 0644); - delete($virt{$_[0]->{'from'}}); - dbmclose(%virt); +if (!&rebuild_map_cmd($_[1])) { + if ($_[3] eq "dbm") { + dbmopen(%virt, $_[2], 0644); + delete($virt{$_[0]->{'from'}}); + dbmclose(%virt); + } + else { &run_makemap($_[1], $_[2], $_[3]); } } -else { &run_makemap($_[1], $_[2], $_[3]); } # Delete from cache local $idx = &indexof($_[0], @list_generics_cache); @@ -127,13 +133,15 @@ splice(@$lref, $_[0]->{'line'}, $oldlen, @newlines); &flush_file_lines($_[2]); # Update DBM -if ($_[4] eq "dbm") { - dbmopen(%virt, $_[3], 0644); - delete($virt{$_[0]->{'from'}}); - $virt{$_[1]->{'from'}} = $_[1]->{'to'}; - dbmclose(%virt); +if (!&rebuild_map_cmd($_[2])) { + if ($_[4] eq "dbm") { + dbmopen(%virt, $_[3], 0644); + delete($virt{$_[0]->{'from'}}); + $virt{$_[1]->{'from'}} = $_[1]->{'to'}; + dbmclose(%virt); + } + else { &run_makemap($_[2], $_[3], $_[4]); } } -else { &run_makemap($_[2], $_[3], $_[4]); } # Update cache local $idx = &indexof($_[0], @list_generics_cache); diff --git a/sendmail/mailers-lib.pl b/sendmail/mailers-lib.pl index f5d392950..245ec68c1 100644 --- a/sendmail/mailers-lib.pl +++ b/sendmail/mailers-lib.pl @@ -72,12 +72,14 @@ $_[0]->{'eline'} = scalar(@$lref)-1; &flush_file_lines(); # Write to the DBM -if ($_[3] eq "dbm") { - dbmopen(%mailer, $_[2], 0644); - $mailer{$_[0]->{'domain'}} = "$_[0]->{'mailer'}:$_[0]->{'dest'}"; - dbmclose(%mailer); +if (!&rebuild_map_cmd($_[1])) { + if ($_[3] eq "dbm") { + dbmopen(%mailer, $_[2], 0644); + $mailer{$_[0]->{'domain'}} = "$_[0]->{'mailer'}:$_[0]->{'dest'}"; + dbmclose(%mailer); + } + else { &run_makemap($_[1], $_[2], $_[3]); } } -else { &run_makemap($_[1], $_[2], $_[3]); } # Update the cache $_[0]->{'num'} = scalar(@list_mailers_cache); @@ -100,13 +102,15 @@ splice(@$lref, $_[0]->{'line'}, $oldlen, @newlines); &flush_file_lines($_[2]); # Update the DBM -if ($_[3] eq "dbm") { - dbmopen(%mailer, $_[3], 0644); - delete($mailer{$_[0]->{'domain'}}); - $mailer{$_[1]->{'domain'}} = "$_[1]->{'mailer'}:$_[1]->{'dest'}"; - dbmclose(%mailer); +if (!&rebuild_map_cmd($_[2])) { + if ($_[3] eq "dbm") { + dbmopen(%mailer, $_[3], 0644); + delete($mailer{$_[0]->{'domain'}}); + $mailer{$_[1]->{'domain'}} = "$_[1]->{'mailer'}:$_[1]->{'dest'}"; + dbmclose(%mailer); + } + else { &run_makemap($_[2], $_[3], $_[4]); } } -else { &run_makemap($_[2], $_[3], $_[4]); } local $idx = &indexof($_[0], @list_mailers_cache); $_[1]->{'line'} = $_[0]->{'line'}; @@ -127,12 +131,14 @@ splice(@$lref, $_[0]->{'line'}, $len); &flush_file_lines($_[1]); # Delete f rom the DBM -if ($_[3] eq "dbm") { - dbmopen(%mailer, $_[2], 0644); - delete($mailer{$_[0]->{'domain'}}); - dbmclose(%mailer); +if (!&rebuild_map_cmd($_[1])) { + if ($_[3] eq "dbm") { + dbmopen(%mailer, $_[2], 0644); + delete($mailer{$_[0]->{'domain'}}); + dbmclose(%mailer); + } + else { &run_makemap($_[1], $_[2], $_[3]); } } -else { &run_makemap($_[1], $_[2], $_[3]); } # Update the cache local $idx = &indexof($_[0], @list_mailers_cache); diff --git a/sendmail/save_file.cgi b/sendmail/save_file.cgi index f498659a6..631172265 100755 --- a/sendmail/save_file.cgi +++ b/sendmail/save_file.cgi @@ -73,6 +73,8 @@ $in{'text'} =~ s/\r//g; &close_tempfile(FILE); &webmin_log("manual", $log, $file); -&system_logged("$post >/dev/null 2>&1") if ($post); +if (!&rebuild_map_cmd($file)) { + &system_logged("$post >/dev/null 2>&1") if ($post); + } &redirect($return); diff --git a/sendmail/sendmail-lib.pl b/sendmail/sendmail-lib.pl index addf484dc..bb131b706 100644 --- a/sendmail/sendmail-lib.pl +++ b/sendmail/sendmail-lib.pl @@ -192,11 +192,32 @@ else { } # run_makemap(textfile, dbmfile, type) +# Run makemap to rebuild some map. Calls error if it fails. sub run_makemap { local($out); -$out = &backquote_logged("$config{'makemap_path'} $_[2] $_[1] <\"$_[0]\" 2>&1"); -if ($?) { &error("makemap failed :
$out"); } +$out = &backquote_logged( + $config{'makemap_path'}." ".quotemeta($_[2])." ".quotemeta($_[1]). + " <".quotemeta($_[0])." 2>&1"); +if ($?) { &error("makemap failed :
". + &html_escape($out).""); } +} + +# rebuild_map_cmd(textfile) +# If a map rebuild command is defined, run it and return 1, otherwise return 0. +# Calls error if it fails. +sub rebuild_map_cmd +{ +local ($file) = @_; +if ($config{'rebuild_cmd'}) { + local $cmd = &substitute_template($config{'rebuild_cmd'}, + { 'map_file' => $file }); + local $out = &backquote_logged("($cmd) 2>&1"); + if ($?) { &error("Map rebuild failed :
". + &html_escape($out).""); } + return 1; + } +return 0; } # find_textfile(config, dbm) diff --git a/sendmail/virtusers-lib.pl b/sendmail/virtusers-lib.pl index ed225fa7a..7ba3d39d7 100644 --- a/sendmail/virtusers-lib.pl +++ b/sendmail/virtusers-lib.pl @@ -73,12 +73,14 @@ $_[0]->{'eline'} = scalar(@$lref)-1; &flush_file_lines($_[1]); # Add to DBM -if ($_[3] eq "dbm") { - dbmopen(%virt, $_[2], 0644); - $virt{$_[0]->{'from'}} = $_[0]->{'to'}; - dbmclose(%virt); +if (!&rebuild_map_cmd($_[1])) { + if ($_[3] eq "dbm") { + dbmopen(%virt, $_[2], 0644); + $virt{$_[0]->{'from'}} = $_[0]->{'to'}; + dbmclose(%virt); + } + else { &run_makemap($_[1], $_[2], $_[3]); } } -else { &run_makemap($_[1], $_[2], $_[3]); } # Add to cache $_[0]->{'num'} = scalar(@list_virtusers_cache); @@ -99,12 +101,14 @@ splice(@$lref, $_[0]->{'line'}, $len); &flush_file_lines($_[1]); # Delete from DBM -if ($_[3] eq "dbm") { - dbmopen(%virt, $_[2], 0644); - delete($virt{$_[0]->{'from'}}); - dbmclose(%virt); +if (!&rebuild_map_cmd($_[1])) { + if ($_[3] eq "dbm") { + dbmopen(%virt, $_[2], 0644); + delete($virt{$_[0]->{'from'}}); + dbmclose(%virt); + } + else { &run_makemap($_[1], $_[2], $_[3]); } } -else { &run_makemap($_[1], $_[2], $_[3]); } # Delete from cache local $idx = &indexof($_[0], @list_virtusers_cache); @@ -128,13 +132,15 @@ splice(@$lref, $_[0]->{'line'}, $oldlen, @newlines); &flush_file_lines($_[2]); # Update DBM -if ($_[4] eq "dbm") { - dbmopen(%virt, $_[3], 0644); - delete($virt{$_[0]->{'from'}}); - $virt{$_[1]->{'from'}} = $_[1]->{'to'}; - dbmclose(%virt); +if (!&rebuild_map_cmd($_[2])) { + if ($_[4] eq "dbm") { + dbmopen(%virt, $_[3], 0644); + delete($virt{$_[0]->{'from'}}); + $virt{$_[1]->{'from'}} = $_[1]->{'to'}; + dbmclose(%virt); + } + else { &run_makemap($_[2], $_[3], $_[4]); } } -else { &run_makemap($_[2], $_[3], $_[4]); } # Update cache local $idx = &indexof($_[0], @list_virtusers_cache);