#!/usr/local/bin/perl
# edit_serv.cgi
# Edit or create a webmin server
use strict;
use warnings;
require './servers-lib.pl';
our (%text, %in, %config, %access, $status_error_msg);
&ReadParse();
$access{'edit'} || &error($text{'edit_ecannot'});
my $s;
if ($in{'new'}) {
&ui_print_header(undef, $text{'create_title'}, "");
my %miniserv;
&get_miniserv_config(\%miniserv);
my $ts = &this_server();
$s = { 'port' => $miniserv{'port'},
'type' => $config{'auto_type'} || $ts->{'type'}, };
}
else {
&ui_print_header(undef, $text{'edit_title'}, "");
$s = &get_server($in{'id'});
&can_use_server($s) || &error($text{'edit_ecannot'});
}
print &ui_form_start("save_serv.cgi");
print &ui_hidden("new", $in{'new'});
print &ui_hidden("id", $in{'id'});
print &ui_table_start($text{'edit_details'}, undef, 2);
print &ui_table_row($text{'edit_host'},
&ui_textbox("host", $s->{'host'}, 60));
if ($in{'new'} || $s->{'port'}) {
print &ui_table_row($text{'edit_port'},
&ui_textbox("port", $s->{'port'}, 5));
}
else {
print &ui_table_row($text{'edit_port'},
&ui_opt_textbox("port", $s->{'port'}, 5,
$text{'edit_portnone'}));
}
if ($s->{'realhost'}) {
print &ui_table_row($text{'edit_realhost'},
"$s->{'realhost'}");
}
if ($access{'forcetype'}) {
print &ui_hidden("type", $s->{'type'});
}
else {
print &ui_table_row($text{'edit_type'},
&ui_select("type", $s->{'type'},
[ map { [ $_->[0], $_->[1] ] }
sort { $a->[1] cmp $b->[1] } &get_server_types() ]));
}
print &ui_table_row($text{'edit_ssl'},
&ui_yesno_radio("ssl", int($s->{'ssl'})));
print &ui_table_row($text{'edit_desc'},
$config{'show_ip'} ?
&ui_textbox("desc", $s->{'desc'}, 40, 0, 40) :
&ui_opt_textbox("desc", $s->{'desc'}, 40, $text{'edit_desc_def'}));
if ($access{'forcegroup'}) {
# Cannot change group
foreach my $g (split(/\t/, $s->{'group'})) {
print &ui_hidden("group", $g),"\n";
}
}
else {
# Show group checkboxes, with option to add a new one
my @groups = &unique(map { split(/\t/, $_->{'group'}) }
&list_servers());
my %ingroups = map { $_, 1 } split(/\t/, $s->{'group'});
my @grid = ( );
foreach my $g (@groups) {
push(@grid, &ui_checkbox("group", $g, $g, $ingroups{$g}));
}
my $gtable = &ui_grid_table(\@grid, 4);
$gtable .= $text{'edit_new'}." ".&ui_textbox("newgroup", undef, 10);
print &ui_table_row($text{'edit_group'}, $gtable, 3);
}
my $mode = $in{'new'} ? $config{'deflink'} :
$s->{'autouser'} ? 2 :
$s->{'sameuser'} ? 3 : $s->{'user'} ? 1 : 0;
if ($access{'forcelink'}) {
print &ui_hidden("mode", $mode),"\n";
if ($mode == 1) {
print &ui_table_row($text{'edit_luser'},
&ui_textbox("wuser", $s->{'user'}, 10));
print &ui_table_row($text{'edit_lpass'},
&ui_password("wpass", $s->{'pass'}, 10));
}
}
else {
# Login mode
my $linksel = &ui_radio("mode", $mode,
[ [ 0, "$text{'edit_mode0'}
" ],
[ 1, $text{'edit_mode1'}." ".$text{'edit_user'}." ".
&ui_textbox("wuser", $mode == 1 ? $s->{'user'} : "", 10).
" ".$text{'edit_pass'}.
&ui_password("wpass", $s->{'pass'}, 10)."
" ],
[ 2, "$text{'edit_mode2'}
" ],
($access{'pass'} && !$main::session_id || $mode == 3 ?
( [ 3, "$text{'edit_mode3'}
".
(defined($main::remote_pass) ? "" :
"($text{'edit_same'})
") ] )
: ( ) ) ]);
print &ui_table_row($text{'edit_link'}, $linksel);
}
if ($access{'forcefast'}) {
# Don't allow choosing of fast mode
print &ui_hidden("fast", $in{'new'} ? $config{'deffast'}
: $s->{'fast'});
}
else {
if ($in{'new'} || $s->{'fast'} == 2) {
print &ui_table_row($text{'edit_fast'},
&ui_radio("fast", $config{'deffast'},
[ [ 1, $text{'yes'} ],
[ 2, $text{'edit_auto'} ],
[ 0, $text{'no'} ] ]));
}
else {
print &ui_table_row($text{'edit_fast'},
&ui_radio("fast", int($s->{'fast'}),
[ [ 1, $text{'yes'} ],
[ 0, $text{'no'} ] ]));
}
}
if ($s->{'user'} && $config{'show_status'}) {
sub status_error
{
$status_error_msg = join("", @_);
}
my $msg;
&remote_error_setup(\&status_error);
eval {
$SIG{'ALRM'} = sub { die "alarm\n" };
alarm(10);
&remote_foreign_require($s->{'host'}, "webmin","webmin-lib.pl");
if ($status_error_msg) {
# Failed to connect
$msg = $status_error_msg;
}
else {
# Connected - get status
$msg = &text('edit_version',
&remote_foreign_call($s->{'host'}, "webmin",
"get_webmin_version"));
}
alarm(0);
};
if ($@) {
$msg = $text{'edit_timeout'};
}
print &ui_table_row($text{'edit_status'}, $msg, 3);
}
print &ui_table_end();
print &ui_form_end([
[ "save", $text{'save'} ],
$in{'new'} ? ( ) : ( [ 'delete', $text{'delete'} ] ) ]);
&ui_print_footer("", $text{'index_return'});