Custom map rebuild command
authorJamie Cameron <jcameron@webmin.com>
Tue, 2 Dec 2008 06:32:17 +0000 (06:32 +0000)
committerJamie Cameron <jcameron@webmin.com>
Tue, 2 Dec 2008 06:32:17 +0000 (06:32 +0000)
sendmail/CHANGELOG
sendmail/access-lib.pl
sendmail/aliases-lib.pl
sendmail/config.info
sendmail/domain-lib.pl
sendmail/generics-lib.pl
sendmail/mailers-lib.pl
sendmail/save_file.cgi
sendmail/sendmail-lib.pl
sendmail/virtusers-lib.pl

index 24fe9e0..5f59d9c 100644 (file)
@@ -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.
index c5a5936..b8b860f 100644 (file)
@@ -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);
index cf50049..4eb8067 100644 (file)
@@ -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};
index 39165fd..570289d 100644 (file)
@@ -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
index 387b9da..71e4905 100644 (file)
@@ -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);
index 32989d6..dd91df1 100644 (file)
@@ -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);
index f5d3929..245ec68 100644 (file)
@@ -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);
index f498659..6311722 100755 (executable)
@@ -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);
 
index addf484..bb131b7 100644 (file)
@@ -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 : <pre>$out</pre>"); }
+$out = &backquote_logged(
+       $config{'makemap_path'}." ".quotemeta($_[2])." ".quotemeta($_[1]).
+       " <".quotemeta($_[0])." 2>&1");
+if ($?) { &error("makemap failed : <pre>".
+                &html_escape($out)."</pre>"); }
+}
+
+# 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 : <pre>".
+                        &html_escape($out)."</pre>"); }
+       return 1;
+       }
+return 0;
 }
 
 # find_textfile(config, dbm)
index ed225fa..7ba3d39 100644 (file)
@@ -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);