mirror of
https://github.com/webmin/webmin.git
synced 2026-06-05 21:00:22 +01:00
* Note: Resolve enabled-site link paths through ServerRoot and include disabled vhost file deletions in Apache config-test rollback coverage, with focused regressions. https://github.com/webmin/webmin/actions/runs/26125036339/job/76836427985
110 lines
3.1 KiB
Perl
Executable File
110 lines
3.1 KiB
Perl
Executable File
#!/usr/local/bin/perl
|
|
# Delete a bunch of virtual servers
|
|
|
|
require './apache-lib.pl';
|
|
&ReadParse();
|
|
@d = split(/\0/, $in{'d'});
|
|
$file_action = $in{'toggle'} ? "toggle" : undef;
|
|
&error_setup($file_action ? $text{'enable_err'} : $text{'delete_err'});
|
|
$access{'vaddr'} || &error($text{'delete_ecannot'});
|
|
$conf = &get_config();
|
|
$can_vhost_files = &can_manage_vhost_files();
|
|
@d || &error($text{'delete_enone'});
|
|
|
|
if ($file_action) {
|
|
&can_manage_vhost_files() || &error($text{'enable_elinkdir'});
|
|
foreach $d (@d) {
|
|
if ($d =~ /^file\t([^\t]+)/) {
|
|
$file = $1;
|
|
}
|
|
elsif ($d !~ /^file\t/) {
|
|
($vmembers, $vconf) = &get_virtual_config($d);
|
|
next if (!$vconf || !&can_edit_virt($vconf));
|
|
$file = $vconf->{'file'};
|
|
}
|
|
else {
|
|
next;
|
|
}
|
|
$rfile = $file ? &simplify_path(&resolve_links($file)) : undef;
|
|
$files{$rfile}++ if ($rfile && -f $rfile &&
|
|
&can_manage_vhost_state_file($rfile));
|
|
}
|
|
@files = keys %files;
|
|
@files || &error($text{'enable_enone'});
|
|
foreach $file (@files) {
|
|
$action = &vhost_file_toggle_action($file);
|
|
$err = &virtualmin_vhost_file_state_error($file, $action);
|
|
$err && &error($err);
|
|
$file_actions{$file} = $action;
|
|
}
|
|
foreach $file (@files) {
|
|
$err = $file_actions{$file} eq "enable" ?
|
|
&enable_vhost_file($file) :
|
|
&disable_vhost_file($file);
|
|
$err && &error($err);
|
|
}
|
|
&webmin_log($file_action, "vhostfile", scalar(@files));
|
|
&redirect("");
|
|
exit;
|
|
}
|
|
if (!$in{'delete'}) {
|
|
&error($text{'delete_eaction'});
|
|
}
|
|
|
|
# Get them all
|
|
foreach $d (@d) {
|
|
if ($d =~ /^file\t([^\t]+)\t(\d+)$/) {
|
|
push(@{$file_lines{$1}}, $2);
|
|
next;
|
|
}
|
|
elsif ($d =~ /^file\t/) {
|
|
next;
|
|
}
|
|
($vmembers, $vconf) = &get_virtual_config($d);
|
|
$vconf || &error($text{'delete_egone'});
|
|
&can_edit_virt($vconf) || &error(&text('delete_ecannot2',
|
|
&virtual_name($vconf)));
|
|
$can_vhost_files && &is_default_vhost($vconf) &&
|
|
&error($text{'delete_edefault'});
|
|
push(@virts, $vconf);
|
|
}
|
|
if (%file_lines) {
|
|
foreach $file (keys %file_lines) {
|
|
$rfile = &simplify_path(&resolve_links($file));
|
|
next if (!$rfile || !-f $rfile ||
|
|
!&can_manage_vhost_state_file($rfile));
|
|
@fvirts = &find_virtuals_in_file($rfile);
|
|
foreach $line (@{$file_lines{$file}}) {
|
|
($vconf) = grep { $_->{'line'} == $line } @fvirts;
|
|
$vconf || &error($text{'delete_egone'});
|
|
&can_edit_virt($vconf) ||
|
|
&error(&text('delete_ecannot2',
|
|
&virtual_name($vconf)));
|
|
&is_default_vhost($vconf) &&
|
|
&error($text{'delete_edefault'});
|
|
push(@{$file_virts{$rfile}}, $vconf);
|
|
}
|
|
}
|
|
}
|
|
@virts || %file_virts || &error($text{'delete_enone'});
|
|
|
|
# Delete their structures
|
|
&before_changing(keys %file_virts);
|
|
foreach $vconf (@virts) {
|
|
&lock_file($vconf->{'file'});
|
|
&save_directive_struct($vconf, undef, $conf, $conf);
|
|
&delete_file_if_empty($vconf->{'file'});
|
|
}
|
|
foreach $file (keys %file_virts) {
|
|
&lock_file($file);
|
|
$deleted += &delete_virtuals_from_file($file, @{$file_virts{$file}});
|
|
&unlock_file($file);
|
|
}
|
|
&flush_file_lines();
|
|
&unlock_all_files();
|
|
&update_last_config_change();
|
|
&after_changing();
|
|
$deleted += scalar(@virts);
|
|
&webmin_log("virts", "delete", $deleted);
|
|
&redirect("");
|