Handle hostnames with upper-case letters
[webmin.git] / servers / edit_serv.cgi
1 #!/usr/local/bin/perl
2 # edit_serv.cgi
3 # Edit or create a webmin server
4
5 use strict;
6 use warnings;
7 require './servers-lib.pl';
8 our (%text, %in, %config, %access, $status_error_msg);
9 &ReadParse();
10 $access{'edit'} || &error($text{'edit_ecannot'});
11
12 my $s;
13 if ($in{'new'}) {
14         &ui_print_header(undef, $text{'create_title'}, "");
15         my %miniserv;
16         &get_miniserv_config(\%miniserv);
17         my $ts = &this_server();
18         $s = { 'port' => $miniserv{'port'},
19                'type' => $config{'auto_type'} || $ts->{'type'}, };
20         }
21 else {
22         &ui_print_header(undef, $text{'edit_title'}, "");
23         $s = &get_server($in{'id'});
24         &can_use_server($s) || &error($text{'edit_ecannot'});
25         }
26
27 print &ui_form_start("save_serv.cgi");
28 print &ui_hidden("new", $in{'new'});
29 print &ui_hidden("id", $in{'id'});
30 print &ui_table_start($text{'edit_details'}, undef, 2);
31
32 print &ui_table_row($text{'edit_host'},
33                     &ui_textbox("host", $s->{'host'}, 60));
34
35 if ($in{'new'} || $s->{'port'}) {
36         print &ui_table_row($text{'edit_port'},
37                             &ui_textbox("port", $s->{'port'}, 5));
38         }
39 else {
40         print &ui_table_row($text{'edit_port'},
41                             &ui_opt_textbox("port", $s->{'port'}, 5,
42                                             $text{'edit_portnone'}));
43         }
44
45 if ($s->{'realhost'}) {
46         print &ui_table_row($text{'edit_realhost'},
47                             "<tt>$s->{'realhost'}</tt>");
48         }
49
50 if ($access{'forcetype'}) {
51         print &ui_hidden("type", $s->{'type'});
52         }
53 else {
54         print &ui_table_row($text{'edit_type'},
55             &ui_select("type", $s->{'type'},
56                 [ map { [ $_->[0], $_->[1] ] }
57                       sort { $a->[1] cmp $b->[1] } &get_server_types() ]));
58         }
59
60 print &ui_table_row($text{'edit_ssl'},
61                     &ui_yesno_radio("ssl", int($s->{'ssl'})));
62
63 print &ui_table_row($text{'edit_desc'},
64     $config{'show_ip'} ?
65         &ui_textbox("desc", $s->{'desc'}, 40, 0, 40) :
66         &ui_opt_textbox("desc", $s->{'desc'}, 40, $text{'edit_desc_def'}));
67
68 if ($access{'forcegroup'}) {
69         # Cannot change group
70         foreach my $g (split(/\t/, $s->{'group'})) {
71                 print &ui_hidden("group", $g),"\n";
72                 }
73         }
74 else {
75         # Show group checkboxes, with option to add a new one
76         my @groups = &unique(map { split(/\t/, $_->{'group'}) }
77                                  &list_servers());
78         my %ingroups = map { $_, 1 } split(/\t/, $s->{'group'});
79         my @grid = ( );
80         foreach my $g (@groups) {
81                 push(@grid, &ui_checkbox("group", $g, $g, $ingroups{$g}));
82                 }
83         my $gtable = &ui_grid_table(\@grid, 4);
84         $gtable .= $text{'edit_new'}." ".&ui_textbox("newgroup", undef, 10);
85         print &ui_table_row($text{'edit_group'}, $gtable, 3);
86         }
87
88 my $mode = $in{'new'} ? $config{'deflink'} :
89         $s->{'autouser'} ? 2 :
90         $s->{'sameuser'} ? 3 : $s->{'user'} ? 1 : 0;
91 if ($access{'forcelink'}) {
92         print &ui_hidden("mode", $mode),"\n";
93         if ($mode == 1) {
94                 print &ui_table_row($text{'edit_luser'},
95                                     &ui_textbox("wuser", $s->{'user'}, 10));
96                 print &ui_table_row($text{'edit_lpass'},
97                                     &ui_password("wpass", $s->{'pass'}, 10));
98                 }
99         }
100 else {
101         # Login mode
102         my $linksel = &ui_radio("mode", $mode,
103                 [ [ 0, "$text{'edit_mode0'}<br>" ],
104                   [ 1, $text{'edit_mode1'}." ".$text{'edit_user'}." ".
105                        &ui_textbox("wuser", $mode == 1 ? $s->{'user'} : "", 10).
106                        " ".$text{'edit_pass'}.
107                        &ui_password("wpass", $s->{'pass'}, 10)."<br>" ],
108                   [ 2, "$text{'edit_mode2'}<br>" ],
109                   ($access{'pass'} && !$main::session_id || $mode == 3 ?
110                     ( [ 3, "$text{'edit_mode3'}<br>".
111                            (defined($main::remote_pass) ? "" :
112                             "<font size=-1>($text{'edit_same'})</font><br>") ] )
113                     : ( ) ) ]);
114         print &ui_table_row($text{'edit_link'}, $linksel);
115         }
116
117 if ($access{'forcefast'}) {
118         # Don't allow choosing of fast mode
119         print &ui_hidden("fast", $in{'new'} ? $config{'deffast'}
120                                             : $s->{'fast'});
121         }
122 else {
123         if ($in{'new'} || $s->{'fast'} == 2) {
124                 print &ui_table_row($text{'edit_fast'},
125                         &ui_radio("fast", $config{'deffast'},
126                                 [ [ 1, $text{'yes'} ],
127                                   [ 2, $text{'edit_auto'} ],
128                                   [ 0, $text{'no'} ] ]));
129                 }
130         else {
131                 print &ui_table_row($text{'edit_fast'},
132                         &ui_radio("fast", int($s->{'fast'}),
133                                 [ [ 1, $text{'yes'} ],
134                                   [ 0, $text{'no'} ] ]));
135                 }
136         }
137
138 if ($s->{'user'} && $config{'show_status'}) {
139         sub status_error
140         {
141         $status_error_msg = join("", @_);
142         }
143         my $msg;
144         &remote_error_setup(\&status_error);
145         eval {
146                 $SIG{'ALRM'} = sub { die "alarm\n" };
147                 alarm(10);
148                 &remote_foreign_require($s->{'host'}, "webmin","webmin-lib.pl");
149                 if ($status_error_msg) {
150                         # Failed to connect
151                         $msg = $status_error_msg;
152                         }
153                 else {
154                         # Connected - get status
155                         $msg = &text('edit_version',
156                                 &remote_foreign_call($s->{'host'}, "webmin",
157                                                      "get_webmin_version"));
158                         }
159                 alarm(0);
160                 };
161         if ($@) {
162                 $msg = $text{'edit_timeout'};
163                 }
164
165         print &ui_table_row($text{'edit_status'}, $msg, 3);
166         }
167 print &ui_table_end();
168 print &ui_form_end([
169         [ "save", $text{'save'} ],
170         $in{'new'} ? ( ) : ( [ 'delete', $text{'delete'} ] ) ]);
171
172 &ui_print_footer("", $text{'index_return'});
173