Handle hostnames with upper-case letters
[webmin.git] / usermin / change_bind.cgi
1 #!/usr/local/bin/perl
2 # change_bind.cgi
3 # Update the binding IP address and port for miniserv
4
5 require './usermin-lib.pl';
6 $access{'bind'} || &error($text{'acl_ecannot'});
7 use Socket;
8 &ReadParse();
9 &get_usermin_miniserv_config(\%miniserv);
10 %oldminiserv = %miniserv;
11 &error_setup($text{'bind_err'});
12
13 # Validate inputs
14 for($i=0; defined($in{"ip_def_$i"}); $i++) {
15         next if (!$in{"ip_def_$i"});
16         if ($in{"ip_def_$i"} == 1) {
17                 $ip = "*";
18                 }
19         else {
20                 $ip = $in{"ip_$i"};
21                 &check_ipaddress($ip) ||
22                     $in{'ipv6'} && &check_ip6address($ip) ||
23                         &error(&text('bind_eip2', $ip));
24                 }
25         if ($in{"port_def_$i"} == 1) {
26                 $port = $in{"port_$i"};
27                 $port =~ /^\d+$/ && $port < 65536 ||
28                         &error(&text('bind_eport2', $port));
29                 }
30         else {
31                 $port = "*";
32                 }
33         push(@sockets, [ $ip, $port ]);
34         }
35 @sockets || &error($text{'bind_enone'});
36 $in{'hostname_def'} || $in{'hostname'} =~ /^[a-z0-9\.\-]+$/i ||
37         &error($text{'bind_ehostname'});
38 if ($in{'ipv6'}) {
39         eval "use Socket6";
40         $@ && &error(&webmin::text('bind_eipv6', "<tt>Socket6</tt>"));
41         }
42
43 # Update config file
44 &lock_file($usermin_miniserv_config);
45 $first = shift(@sockets);
46 $miniserv{'port'} = $first->[1];
47 if ($first->[0] eq "*") {
48         delete($miniserv{'bind'});
49         }
50 else {
51         $miniserv{'bind'} = $first->[0];
52         }
53 $miniserv{'sockets'} = join(" ", map { "$_->[0]:$_->[1]" } @sockets);
54 $miniserv{'ipv6'} = $in{'ipv6'};
55 if ($in{'listen_def'}) {
56         delete($miniserv{'listen'});
57         }
58 else {
59         $miniserv{'listen'} = $in{'listen'};
60         }
61 if ($in{'hostname_def'}) {
62         delete($miniserv{'host'});
63         }
64 else {
65         $miniserv{'host'} = $in{'hostname'};
66         }
67 &put_usermin_miniserv_config(\%miniserv);
68 &unlock_file($usermin_miniserv_config);
69
70 # Attempt to re-start miniserv
71 $SIG{'TERM'} = 'ignore';
72 &system_logged("$config{'usermin_dir'}/stop >/dev/null 2>&1 </dev/null");
73 $temp = &transname();
74 $rv = &system_logged("$config{'usermin_dir'}/start >$temp 2>&1 </dev/null");
75 $out = `cat $temp`;
76 $out =~ s/^Starting Usermin server in.*\n//;
77 $out =~ s/at.*line.*//;
78 unlink($temp);
79 if ($rv) {
80         # Failed! Roll back config and start again
81         &lock_file($usermin_miniserv_config);
82         &put_usermin_miniserv_config(\%oldminiserv);
83         &unlock_file($usermin_miniserv_config);
84         &system_logged("$config{'usermin_dir'}/start >/dev/null 2>&1 </dev/null");
85         &error(&text('bind_erestart', $out));
86         }
87 &webmin_log("bind", undef, undef, \%in);
88
89 &redirect("");
90