# Fixed IP address
local $fixed = &dhcpd::find("fixed-address", $h->{'members'});
$rv .= &ui_hidden("oldip", $fixed->{'values'}->[0]) if ($fixed);
-local @subnets = $new ? &list_dhcp_subnets() : ( );
+local @subnets = &list_dhcp_subnets();
+local $parsub;
+if (!$new) {
+ ($parsub) = grep { $_ eq $h->{'parent'} } @subnets;
+ }
+elsif (@subnets) {
+ $parsub = $subnets[0];
+ }
$rv .= &ui_table_row($text{'form_ip'},
&ui_textbox("ip", $fixed ? $fixed->{'values'}->[0] : undef, 20).
- (@subnets ? " ".$text{'form_subnet'}." ".
- &ui_select("subnet", $subnets[0]->{'values'}->[0],
- [ [ undef, $text{'form_nosubnet'} ],
- map { [ $_->{'values'}->[0] ] } @subnets ]) : ""));
+ " ".$text{'form_subnet'}." ".
+ &ui_select("subnet", $parsub ? $parsub->{'values'}->[0] : '',
+ [ $parsub ? ( ) : ( [ '', $text{'form_nosubnet'} ] ),
+ map { [ $_->{'values'}->[0] ] } @subnets ]));
+$rv .= &ui_hidden("oldsubnet", $parsub ? $parsub->{'values'}->[0] : '');
# MAC address
local $hard = &dhcpd::find("hardware", $h->{'members'});
sub apply_configuration
{
-local $err = &dhcpd::restart_dhcpd();
-return "DHCPD failed : $err" if ($err);
-$err = &bind8::restart_bind();
-return "BIND failed : $err" if ($err);
-return undef;
+&lock_file("$module_config_directory/apply");
+local $err;
+$err = &dhcpd::restart_dhcpd();
+if ($err) {
+ $err = "DHCPD failed : $err";
+ }
+else {
+ $err = &bind8::restart_bind();
+ if ($err) {
+ $err = "BIND failed : $err";
+ }
+ }
+&unlock_file("$module_config_directory/apply");
+return $err;
}
1;
# Get existing host object
($host) = grep { $_->{'values'}->[0] eq $in{'old'} } @hosts;
$host || &error($text{'edit_egone'});
- $par = $host->{'parent'};
+ $oldpar = $host->{'parent'};
($old) = grep { lc($_->{'name'}) eq lc($in{'old'}).'.' } @$recs;
+ if ($in{'subnet'} eq $in{'oldsubnet'}) {
+ $par = $oldpar;
+ }
+ else {
+ # Moving subnet
+ ($par) = grep { $_->{'values'}->[0] eq $in{'subnet'} }
+ &list_dhcp_subnets();
+ }
}
else {
# Create new, and work out parent
&bind8::bump_soa_record($fn, $recs);
# Save DHCP host
- &dhcpd::save_directive($par, $in{'new'} ? [ ] : [ $host ],
- [ $host ], $indent);
+ if (!$in{'new'} && $oldpar ne $par) {
+ # Move to new parent
+ &dhcpd::save_directive($oldpar, [ $host ], [ ], 0);
+ &dhcpd::save_directive($par, [ ], [ $host ], $indent);
+ }
+ else {
+ # Just save
+ &dhcpd::save_directive($par, $in{'new'} ? [ ] : [ $host ],
+ [ $host ], $indent);
+ }
}
&flush_file_lines();
&redirect("");