Handle hostnames with upper-case letters
[webmin.git] / net / save_aifc.cgi
1 #!/usr/local/bin/perl
2 # save_aifc.cgi
3 # Save, create or delete an active interface
4
5 require './net-lib.pl';
6 &ReadParse();
7 @acts = &active_interfaces(1);
8
9 if ($in{'delete'}) {
10         # delete an interface
11         &error_setup($text{'aifc_err1'});
12         $a = $acts[$in{'idx'}];
13         &can_iface($a) || &error($text{'ifcs_ecannot_this'});
14         &deactivate_interface($a);
15         &webmin_log("delete", "aifc", $a->{'fullname'}, $a);
16         }
17 else {
18         # Validate and save inputs
19         &error_setup($text{'aifc_err2'});
20         if (!$in{'new'}) {
21                 # Editing existing interface
22                 $olda = $acts[$in{'idx'}];
23                 &can_iface($olda) || &error($text{'ifcs_ecannot_this'});
24                 $a->{'name'} = $olda->{'name'};
25                 $a->{'fullname'} = $olda->{'fullname'};
26                 $a->{'virtual'} = $olda->{'virtual'}
27                         if (defined($olda->{'virtual'}));
28                 }
29         elsif (defined($in{'virtual'})) {
30                 # creating a virtual interface
31                 $in{'virtual'} =~ /^\d+$/ ||
32                         &error($text{'aifc_evirt'});
33                 $in{'virtual'} >= $min_virtual_number ||
34                         &error(&text('aifc_evirtmin', $min_virtual_number));
35                 foreach $ea (@acts) {
36                         if ($ea->{'name'} eq $in{'name'} &&
37                             $ea->{'virtual'} eq $in{'virtual'}) {
38                                 &error(&text('aifc_evirtdup',
39                                        "$in{'name'}:$in{'virtual'}"));
40                                 }
41                         }
42                 $a->{'name'} = $in{'name'};
43                 $a->{'virtual'} = $in{'virtual'};
44                 $a->{'fullname'} = $a->{'name'}.":".$a->{'virtual'};
45                 &can_create_iface() || &error($text{'ifcs_ecannot'});
46                 &can_iface($a) || &error($text{'ifcs_ecannot'});
47                 }
48         elsif ($in{'name'} =~ /^([a-z]+\d*(\.\d+)?):(\d+)$/) {
49                 # also creating a virtual interface
50                 foreach $ea (@acts) {
51                         if ($ea->{'name'} eq $1 &&
52                             $ea->{'virtual'} eq $3) {
53                                 &error(&text('aifc_evirtdup', $in{'name'}));
54                                 }
55                         }
56                 $3 >= $min_virtual_number ||
57                         &error(&text('aifc_evirtmin', $min_virtual_number));
58                 $a->{'name'} = $1;
59                 $a->{'virtual'} = $3;
60                 $a->{'fullname'} = $a->{'name'}.":".$a->{'virtual'};
61                 &can_create_iface() || &error($text{'ifcs_ecannot'});
62                 &can_iface($a) || &error($text{'ifcs_ecannot'});
63                 }
64         elsif ($in{'name'} =~ /^[a-z]+\d*(\.\d+)?$/) {
65                 # creating a real interface
66                 foreach $ea (@acts) {
67                         if ($ea->{'name'} eq $in{'name'}) {
68                                 &error(&text('aifc_edup', $in{'name'}));
69                                 }
70                         }
71                 $a->{'name'} = $in{'name'};
72                 $a->{'fullname'} = $in{'name'};
73                 &can_create_iface() || &error($text{'ifcs_ecannot'});
74                 &can_iface($a) || &error($text{'ifcs_ecannot'});
75                 }
76         else {
77                 &error($text{'aifc_ename'});
78                 }
79
80         # Validate and store inputs
81         &check_ipaddress_any($in{'address'}) ||
82                 &error(&text('aifc_eip', $in{'address'}));
83         $a->{'address'} = $in{'address'};
84
85         # Check for address clash
86         $allow_clash = defined(&allow_interface_clash) ?
87                         &allow_interface_clash($a, 0) : 1;
88         if (!$allow_clash &&
89             ($in{'new'} || $olda->{'address'} ne $a->{'address'})) {
90                 ($clash) = grep { $_->{'address'} eq $a->{'address'} } @acts;
91                 $clash && &error(&text('aifc_eclash', $clash->{'fullname'}));
92                 }
93
94         if ($virtual_netmask && $a->{'virtual'} ne "") {
95                 # Always use this netmask for virtuals
96                 $a->{'netmask'} = $virtual_netmask;
97                 }
98         elsif (!$access{'netmask'}) {
99                 # Use default netmask
100                 $a->{'netmask'} = $in{'new'} ?
101                         $config{'def_netmask'} || "255.255.255.0" :
102                         $olda->{'netmask'};
103                 }
104         elsif (!$in{'netmask_def'}) {
105                 &check_netmask($in{'netmask'},$a->{'address'}) ||
106                         &error(&text('aifc_emask', $in{'netmask'}));
107                 $a->{'netmask'} = $in{'netmask'};
108                 }
109
110         if (!$access{'broadcast'}) {
111                 # Compute broadcast
112                 $a->{'netmask'} = $in{'new'} ?
113                         &compute_broadcast($a->{'address'}, $a->{'netmask'}) :
114                         $olda->{'broadcast'};
115                 }
116         elsif (!$in{'broadcast_def'}) {
117                 &check_ipaddress_any($in{'broadcast'}) ||
118                         &error(&text('aifc_ebroad', $in{'broadcast'}));
119                 $a->{'broadcast'} = $in{'broadcast'};
120                 }
121
122         if (!$access{'mtu'}) {
123                 # Use default MTU
124                 $a->{'mtu'} = $in{'new'} ? $config{'def_mtu'}
125                                          : $olda->{'mtu'};
126                 }
127         elsif (!$in{'mtu_def'}) {
128                 $in{'mtu'} =~ /^\d+$/ ||
129                         &error(&text('aifc_emtu', $in{'mtu'}));
130                 $a->{'mtu'} = $in{'mtu'} if ($olda->{'mtu'} ne $in{'mtu'});
131                 }
132
133         # Save active flag
134         if (!$access{'up'}) {
135                 $a->{'up'} = $in{'new'} ? 1 : $olda->{'up'};
136                 }
137         elsif ($in{'up'}) {
138                 $a->{'up'}++;
139                 }
140
141         # Save IPv6 addresses
142         if (&supports_address6($a) && $in{'mode6'} eq 'address') {
143                 # Has IPv6 addresses
144                 @address6 = ( );
145                 @netmask6 = ( );
146                 %clash6 = ( );
147                 foreach $eb (@acts) {
148                         if ($eb->{'fullname'} ne $a->{'fullname'}) {
149                                 foreach $a6 (@{$eb->{'address6'}}) {
150                                         $clash6{$a6} = $eb;
151                                         }
152                                 }
153                         }
154                 for($i=0; defined($in{'address6_'.$i}); $i++) {
155                         next if ($in{'address6_'.$i} !~ /\S/);
156                         &check_ip6address($in{'address6_'.$i}) ||
157                                 &error(&text('aifc_eaddress6', $i+1));
158                         $c = $clash6{$in{'address6_'.$i}};
159                         $c && &error(&text('aifc_eclash6', $i+1, $c->{'name'}));
160                         push(@address6, $in{'address6_'.$i});
161                         $in{'netmask6_'.$i} =~ /^\d+$/ &&
162                             $in{'netmask6_'.$i} > 0 &&
163                             $in{'netmask6_'.$i} <= 128 ||
164                                 &error(&text('aifc_enetmask6', $i+1));
165                         push(@netmask6, $in{'netmask6_'.$i});
166                         $clash6{$in{'address6_'.$i}} = $a;
167                         }
168                 @address6 || &error($text{'aifc_eaddresses6'});
169                 $a->{'address6'} = \@address6;
170                 $a->{'netmask6'} = \@netmask6;
171                 }
172         elsif (&supports_address6($a) && $in{'mode6'} eq 'none') {
173                 # IPv6 addresses disabled
174                 delete($a->{'address6'});
175                 delete($a->{'netmask6'});
176                 }
177
178         if (!$in{'ether_def'} && $a->{'virtual'} eq "" &&
179             &iface_hardware($a->{'name'})) {
180                 $in{'ether'} =~ /^[A-Fa-f0-9:]+$/ ||
181                         &error(&text('aifc_ehard', $in{'ether'}));
182                 $a->{'ether'} = $in{'ether'}
183                         if ($olda->{'ether'} ne $in{'ether'});
184                 }
185         $a->{'fullname'} = $a->{'name'}.
186                            ($a->{'virtual'} eq '' ? '' : ':'.$a->{'virtual'});
187
188         # Bring it up
189         &activate_interface($a);
190         &webmin_log($in{'new'} ? 'create' : 'modify',
191                     "aifc", $a->{'fullname'}, $a);
192         }
193 &redirect("list_ifcs.cgi?mode=active");
194