3 # Save, create or delete an active interface
5 require './net-lib.pl';
7 @acts = &active_interfaces(1);
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);
18 # Validate and save inputs
19 &error_setup($text{'aifc_err2'});
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'}));
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));
36 if ($ea->{'name'} eq $in{'name'} &&
37 $ea->{'virtual'} eq $in{'virtual'}) {
38 &error(&text('aifc_evirtdup',
39 "$in{'name'}:$in{'virtual'}"));
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'});
48 elsif ($in{'name'} =~ /^([a-z]+\d*(\.\d+)?):(\d+)$/) {
49 # also creating a virtual interface
51 if ($ea->{'name'} eq $1 &&
52 $ea->{'virtual'} eq $3) {
53 &error(&text('aifc_evirtdup', $in{'name'}));
56 $3 >= $min_virtual_number ||
57 &error(&text('aifc_evirtmin', $min_virtual_number));
60 $a->{'fullname'} = $a->{'name'}.":".$a->{'virtual'};
61 &can_create_iface() || &error($text{'ifcs_ecannot'});
62 &can_iface($a) || &error($text{'ifcs_ecannot'});
64 elsif ($in{'name'} =~ /^[a-z]+\d*(\.\d+)?$/) {
65 # creating a real interface
67 if ($ea->{'name'} eq $in{'name'}) {
68 &error(&text('aifc_edup', $in{'name'}));
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'});
77 &error($text{'aifc_ename'});
80 # Validate and store inputs
81 &check_ipaddress_any($in{'address'}) ||
82 &error(&text('aifc_eip', $in{'address'}));
83 $a->{'address'} = $in{'address'};
85 # Check for address clash
86 $allow_clash = defined(&allow_interface_clash) ?
87 &allow_interface_clash($a, 0) : 1;
89 ($in{'new'} || $olda->{'address'} ne $a->{'address'})) {
90 ($clash) = grep { $_->{'address'} eq $a->{'address'} } @acts;
91 $clash && &error(&text('aifc_eclash', $clash->{'fullname'}));
94 if ($virtual_netmask && $a->{'virtual'} ne "") {
95 # Always use this netmask for virtuals
96 $a->{'netmask'} = $virtual_netmask;
98 elsif (!$access{'netmask'}) {
100 $a->{'netmask'} = $in{'new'} ?
101 $config{'def_netmask'} || "255.255.255.0" :
104 elsif (!$in{'netmask_def'}) {
105 &check_netmask($in{'netmask'},$a->{'address'}) ||
106 &error(&text('aifc_emask', $in{'netmask'}));
107 $a->{'netmask'} = $in{'netmask'};
110 if (!$access{'broadcast'}) {
112 $a->{'netmask'} = $in{'new'} ?
113 &compute_broadcast($a->{'address'}, $a->{'netmask'}) :
114 $olda->{'broadcast'};
116 elsif (!$in{'broadcast_def'}) {
117 &check_ipaddress_any($in{'broadcast'}) ||
118 &error(&text('aifc_ebroad', $in{'broadcast'}));
119 $a->{'broadcast'} = $in{'broadcast'};
122 if (!$access{'mtu'}) {
124 $a->{'mtu'} = $in{'new'} ? $config{'def_mtu'}
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'});
134 if (!$access{'up'}) {
135 $a->{'up'} = $in{'new'} ? 1 : $olda->{'up'};
141 # Save IPv6 addresses
142 if (&supports_address6($a) && $in{'mode6'} eq 'address') {
147 foreach $eb (@acts) {
148 if ($eb->{'fullname'} ne $a->{'fullname'}) {
149 foreach $a6 (@{$eb->{'address6'}}) {
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;
168 @address6 || &error($text{'aifc_eaddresses6'});
169 $a->{'address6'} = \@address6;
170 $a->{'netmask6'} = \@netmask6;
172 elsif (&supports_address6($a) && $in{'mode6'} eq 'none') {
173 # IPv6 addresses disabled
174 delete($a->{'address6'});
175 delete($a->{'netmask6'});
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'});
185 $a->{'fullname'} = $a->{'name'}.
186 ($a->{'virtual'} eq '' ? '' : ':'.$a->{'virtual'});
189 &activate_interface($a);
190 &webmin_log($in{'new'} ? 'create' : 'modify',
191 "aifc", $a->{'fullname'}, $a);
193 &redirect("list_ifcs.cgi?mode=active");