forked from webmin/webmin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdelete_mod.cgi
executable file
·144 lines (133 loc) · 3.9 KB
/
delete_mod.cgi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/usr/local/bin/perl
# delete_mod.cgi
# Delete a module from one or all servers, after asking for confirmation
require './cluster-usermin-lib.pl';
&ReadParse();
@servers = &list_servers();
@hosts = &list_usermin_hosts();
if ($in{'server'} < 0) {
# Find servers that have the module or theme
foreach $h (@hosts) {
foreach $m (@{$h->{'modules'}}, @{$h->{'themes'}}) {
if ($m->{'dir'} eq $in{'mod'}) {
local ($s) = grep { $_->{'id'} == $h->{'id'} }
@servers;
push(@got, $s);
$gotmap{$s} = $h;
$best = $s if (!$s->{'id'});
last;
}
}
}
$s = $best ? $best : $got[0];
}
else {
($s) = grep { $_->{'id'} == $in{'server'} } @servers;
($h) = grep { $_->{'id'} == $in{'server'} } @hosts;
@got = ( $s );
$gotmap{$s} = $h;
}
$h = $gotmap{$s};
foreach $m ($in{'type'} eq 'mod' ? @{$h->{'modules'}} : @{$h->{'themes'}}) {
$info = $m if ($m->{'dir'} eq $in{'mod'});
}
# Setup error handler for down hosts
sub del_error
{
$del_error_msg = join("", @_);
}
&remote_error_setup(\&del_error);
&remote_foreign_require($s->{'host'}, "usermin", "usermin-lib.pl");
&ui_print_header(undef, $text{'delete_title'}, "");
if ($in{'sure'}) {
# do the deletion in separate processes
print "<b>",&text("delete_header_$in{'type'}",
$info->{'desc'}),"</b><p>\n";
$p = 0;
foreach $g (@got) {
local ($rh = "READ$p", $wh = "WRITE$p");
pipe($rh, $wh);
if (!fork()) {
close($rh);
local $h = $gotmap{$g};
# Check for any dependencies on this host
foreach $m (@{$h->{'modules'}}) {
foreach $d (split(/\s+/, $m->{'depends'})) {
push(@{$ondeps{$d}}, $m);
}
}
if ($ondeps{$in{'mod'}}) {
print $wh &serialise_variable([ 0, &text('delete_edepends', join(", ", map { $_->{'desc'} } @{$ondeps{$in{'mod'}}})) ]);
exit;
}
# Delete the module
&remote_foreign_require($g->{'host'}, "usermin",
"usermin-lib.pl") if ($s ne $g);
local $desc = &remote_foreign_call($g->{'host'},
"usermin", "delete_usermin_module", $in{'mod'});
if ($del_error_msg) {
print $wh &serialise_variable([ 0, $del_error_msg ]);
}
elsif ($desc) {
print $wh &serialise_variable([ 1, $desc ]);
}
else {
print $wh &serialise_variable([ 0, $text{'delete_egone'} ]);
}
# Re-request all modules and themes from the server
local @newmods = grep { $_->{'dir'} ne $in{'mod'} }
@{$h->{'modules'}};
local @newthemes = grep { $_->{'dir'} ne $in{'mod'} }
@{$h->{'themes'}};
$h->{'modules'} = \@newmods;
$h->{'themes'} = \@newthemes;
&save_usermin_host($h);
close($wh);
exit;
}
close($wh);
$p++;
}
# Read back the results
$p = 0;
foreach $g (@got) {
local $rh = "READ$p";
local $line = <$rh>;
local $rv = &unserialise_variable($line);
close($rh);
local $d = &server_name($g);
if (!$rv->[0]) {
print &text('delete_error', $d, $rv->[1]),"<br>\n";
}
else {
print &text('delete_success', $d, $rv->[1]),"<br>\n";
}
$p++;
}
print "<p><b>$text{'delete_done'}</b><p>\n";
}
else {
# Ask if the user is sure..
$rroot = &remote_eval($s->{'host'}, "usermin",
'&get_usermin_miniserv_config(\%m); $m{"root"}');
$sz = &remote_foreign_call($s->{'host'}, "usermin", "disk_usage_kb",
"$rroot/$in{'mod'}");
print "<center>\n";
if ($in{'server'} < 0) {
print &text("delete_rusure_$in{'type'}",
"<b>$info->{'desc'}</b>", $sz),"<p>\n";
}
else {
print &text("delete_rusure2_$in{'type'}",
"<b>$info->{'desc'}</b>", $sz, &server_name($s)),"<p>\n";
}
print "<form action=delete_mod.cgi>\n";
print "<input type=hidden name=mod value=\"$in{'mod'}\">\n";
print "<input type=hidden name=type value=\"$in{'type'}\">\n";
print "<input type=hidden name=server value=\"$in{'server'}\">\n";
print "<input type=hidden name=sure value=1>\n";
print "<input type=submit value=\"$text{'delete_ok'}\"><br>\n";
print "</center></form>\n";
}
&remote_finished();
&ui_print_footer("", $text{'index_return'});