[ 'mode' => 'dhcp', 'modev6' => 'auto', 'network_primary_ip' => '', 'network_primary_gateway' => '', 'network_primary_vlan' => '', 'network_primary_dns1' => '', 'network_primary_dns2' => '', 'network_primary_ipv6' => '', 'network_primary_ipv6_prefix' => '', 'network_primary_ipv6_gateway' => '', 'network_primary_ipv6_vlan' => '', 'network_primary_ipv6_dns1' => '', 'network_primary_ipv6_dns2' => '', ], 'secondary' => [ 'mode' => 'disabled', 'modev6' => 'disabled', 'network_secondary_ip' => '', 'network_secondary_gateway' => '', 'network_secondary_vlan' => '', 'network_secondary_dns1' => '', 'network_secondary_dns2' => '', 'network_secondary_ipv6' => '', 'network_secondary_ipv6_prefix' => '', 'network_secondary_ipv6_gateway' => '', 'network_secondary_ipv6_vlan' => '', 'network_secondary_ipv6_dns1' => '', 'network_secondary_ipv6_dns2' => '', ], ]; if (file_exists($jsonFile)) { $raw = file_get_contents($jsonFile); $data = json_decode($raw, true); if (!is_array($data)) $data = $defaults; } else { $data = $defaults; } $errors = []; $success = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $get = function ($k) { return isset($_POST[$k]) ? trim((string)$_POST[$k]) : ''; }; $primary_mode = in_array($get('primary_mode'), ['dhcp', 'static', 'disabled']) ? $get('primary_mode') : 'dhcp'; $primary_modev6 = in_array($get('primary_mode'), ['auto', 'dhcpv6', 'static', 'disabled']) ? $get('primary_mode') : 'auto'; $secondary_mode = in_array($get('secondary_mode'), ['dhcp', 'static', 'disabled']) ? $get('secondary_mode') : 'dhcp'; $secondary_modev6 = in_array($get('secondary_mode'), ['auto', 'dhcpv6', 'static', 'disabled']) ? $get('secondary_mode') : 'auto'; $network_primary_ip = $get('network_primary_ip'); $network_primary_gateway = $get('network_primary_gateway'); $network_primary_vlan = $get('network_primary_vlan'); $network_primary_dns1 = $get('network_primary_dns1'); $network_primary_dns2 = $get('network_primary_dns2'); $network_primary_ipv6 = $get('network_primary_ipv6'); $network_primary_ipv6_prefix = $get('network_primary_ipv6_prefix'); $network_primary_ipv6_gateway = $get('network_primary_ipv6_gateway'); $network_primary_ipv6_vlan = $get('network_primary_ipv6_vlan'); $network_primary_ipv6_dns1 = $get('network_primary_ipv6_dns1'); $network_primary_ipv6_dns2 = $get('network_primary_ipv6_dns2'); $network_secondary_ip = $get('network_secondary_ip'); $network_secondary_subnet = $get('network_secondary_subnet'); $network_secondary_gateway = $get('network_secondary_gateway'); $network_secondary_vlan = $get('network_secondary_vlan'); $network_secondary_dns1 = $get('network_secondary_dns1'); $network_secondary_dns2 = $get('network_secondary_dns2'); $network_secondary_ipv6 = $get('network_secondary_ipv6'); $network_secondary_ipv6_prefix = $get('network_secondary_ipv6_prefix'); $network_secondary_ipv6_gateway = $get('network_secondary_ipv6_gateway'); $network_secondary_ipv6_vlan = $get('network_secondary_ipv6_vlan'); $network_secondary_ipv6_dns1 = $get('network_secondary_ipv6_dns1'); $network_secondary_ipv6_dns2 = $get('network_secondary_ipv6_dns2'); $new = [ 'primary' => [ 'mode' => $primary_mode, 'modev6' => $primary_modev6, 'network_primary_ip' => $network_primary_ip, 'network_primary_gateway' => $network_primary_gateway, 'network_primary_vlan' => $network_primary_vlan, 'network_primary_dns1' => $network_primary_dns1, 'network_primary_dns2' => $network_primary_dns2, 'network_primary_ipv6' => $network_primary_ipv6, 'network_primary_ipv6_prefix' => $network_primary_ipv6_prefix, 'network_primary_ipv6_gateway' => $network_primary_ipv6_gateway, 'network_primary_ipv6_vlan' => $network_primary_ipv6_vlan, 'network_primary_ipv6_dns1' => $network_primary_ipv6_dns1, 'network_primary_ipv6_dns2' => $network_primary_ipv6_dns2 ], 'secondary' => [ 'mode' => $secondary_mode, 'modev6' => $secondary_modev6, 'network_secondary_ip' => $network_secondary_ip, 'network_secondary_gateway' => $network_secondary_gateway, 'network_secondary_vlan' => $network_secondary_vlan, 'network_secondary_dns1' => $network_secondary_dns1, 'network_secondary_dns2' => $network_secondary_dns2, 'network_secondary_ipv6' => $network_secondary_ipv6, 'network_secondary_ipv6_prefix' => $network_secondary_ipv6_prefix, 'network_secondary_ipv6_gateway' => $network_secondary_ipv6_gateway, 'network_secondary_ipv6_vlan' => $network_secondary_ipv6_vlan, 'network_secondary_ipv6_dns1' => $network_secondary_ipv6_dns1, 'network_secondary_ipv6_dns2' => $network_secondary_ipv6_dns2 ], ]; $json = json_encode($new, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); if (file_put_contents($jsonFile, $json, LOCK_EX) === false) { $errors[] = "Failed to write {$jsonFile}. Check permissions."; } else { $data = $new; $success = 'Saved.'; foreach ($data as $block => &$fields) { foreach ($fields as $key => $value) { if (isset($_POST[$key])) { $fields[$key] = trim($_POST[$key]); } } } unset($fields); $netplan = [ 'network' => [ 'version' => 2, 'renderer' => 'networkd', 'ethernets' => [], 'vlans' => new stdClass() ] ]; /* ---------- PRIMARY ---------- */ if ( $data['primary']['mode'] !== 'disabled' || $data['primary']['modev6'] !== 'disabled' ) { $netplan['network']['ethernets'][$iface] = build_interface($data['primary'], 'primary'); /* ---------- SECONDARY ---------- */ } elseif ( $data['secondary']['mode'] !== 'disabled' || $data['secondary']['modev6'] !== 'disabled' ) { $netplan['network']['ethernets'][$iface] = build_interface($data['secondary'], 'secondary'); } foreach (['primary', 'secondary'] as $type) { if ( $data[$type]['mode'] === 'disabled' && $data[$type]['modev6'] === 'disabled' ) { continue; } $vlan = trim($data[$type]["network_{$type}_vlan"] ?? ''); if ($vlan === '') { $netplan['network']['ethernets'][$iface] = build_interface($data[$type], $type); } else { $netplan['network']['ethernets'][$iface] = new stdClass(); $netplan['network']['vlans']["{$iface}.{$vlan}"] = array_merge( ['id' => (int)$vlan, 'link' => $iface], build_interface($data[$type], $type) ); } } if (validate_config($data)) { file_put_contents('/var/www/50-cloud-init.yaml', netplan_yaml(generate_netplan($data, $iface))); } } } ?>
'; foreach ($errors as $e) echo '