---- 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.
&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);
# 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);
&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);
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]});
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'}});
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};
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
&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);
&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);
&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);
&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);
&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);
&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);
&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);
&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'};
&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);
&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);
}
# 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)
&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);
&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);
&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);