From 4da9a23b53a414164cf2974b46f2e7e82ba8ec5a Mon Sep 17 00:00:00 2001 From: devdatt Date: Tue, 23 Dec 2025 00:49:03 +0530 Subject: [PATCH] netplan update --- encoder/network.php | 112 ++------------------------------------------ encoder/static.php | 87 ++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 107 deletions(-) diff --git a/encoder/network.php b/encoder/network.php index d5d1a9e..dce7b8c 100755 --- a/encoder/network.php +++ b/encoder/network.php @@ -126,125 +126,24 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { 'network' => [ 'version' => 2, 'renderer' => 'networkd', - 'ethernets' => [ - $iface => [] - ], + 'ethernets' => [], 'vlans' => [] ] ]; - function build_interface(array $d, string $key): array - { - $cfg = []; - $addresses = []; - $routes = []; - - /* ================= IPv4 ================= */ - switch ($d['mode'] ?? 'disabled') { - - case 'dhcp': - $cfg['dhcp4'] = true; - break; - - case 'static': - if (!empty($d["network_{$key}_ip"]) && !empty($d["network_{$key}_subnet"])) { - $addresses[] = - $d["network_{$key}_ip"] . '/' . $d["network_{$key}_subnet"]; - } - - if (!empty($d["network_{$key}_gateway"])) { - $routes[] = [ - 'to' => 'default', - 'via' => $d["network_{$key}_gateway"] - ]; - } - - $cfg['dhcp4'] = false; - break; - - case 'disabled': - default: - $cfg['dhcp4'] = false; - break; - } - - /* ================= IPv6 ================= */ - switch ($d['modev6'] ?? 'disabled') { - - case 'auto': // SLAAC - $cfg['accept-ra'] = true; - $cfg['dhcp6'] = false; - break; - - case 'dhcp6': - $cfg['dhcp6'] = true; - $cfg['accept-ra'] = false; - break; - - case 'static': - if (!empty($d["network_{$key}_ipv6"]) && !empty($d["network_{$key}_ipv6_prefix"])) { - $addresses[] = - $d["network_{$key}_ipv6"] . '/' . $d["network_{$key}_ipv6_prefix"]; - } - - if (!empty($d["network_{$key}_ipv6_gateway"])) { - $routes[] = [ - 'to' => '::/0', - 'via' => $d["network_{$key}_ipv6_gateway"] - ]; - } - - $cfg['dhcp6'] = false; - $cfg['accept-ra'] = false; - break; - - case 'disabled': - default: - $cfg['dhcp6'] = false; - $cfg['accept-ra'] = false; - break; - } - - /* ================= Addresses ================= */ - if ($addresses) { - $cfg['addresses'] = $addresses; - } - - /* ================= Routes ================= */ - if ($routes) { - $cfg['routes'] = $routes; - } - - /* ================= DNS ================= */ - $dns = array_values(array_filter([ - $d["network_{$key}_dns1"] ?? '', - $d["network_{$key}_dns2"] ?? '', - $d["network_{$key}_ipv6_dns1"] ?? '', - $d["network_{$key}_ipv6_dns2"] ?? '', - ])); - - if ($dns) { - $cfg['nameservers'] = [ - 'addresses' => $dns - ]; - } - return $cfg; - } - - /* ---------- VLAN detection ---------- */ $primary_vlan = trim($data['primary']['network_primary_vlan'] ?? ''); $secondary_vlan = trim($data['secondary']['network_secondary_vlan'] ?? ''); $uses_vlan = ($primary_vlan !== '' || $secondary_vlan !== ''); - /* ---------- No VLAN: apply primary only ---------- */ + /* ---------- No VLAN ---------- */ if (!$uses_vlan) { $netplan['network']['ethernets'][$iface] = build_interface($data['primary'], 'primary'); } /* ---------- VLAN mode ---------- */ else { - // base iface must exist but empty - $netplan['network']['ethernets'][$iface] = []; + // base interface must exist as {} + $netplan['network']['ethernets'][$iface] = new stdClass(); if ($primary_vlan !== '') { $vif = "{$iface}.{$primary_vlan}"; @@ -262,8 +161,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { ], build_interface($data['secondary'], 'secondary')); } } - - /* ---------- write ---------- */ + $yaml = netplan_yaml($netplan); file_put_contents('/var/www/50-cloud-init.yaml', $yaml); } diff --git a/encoder/static.php b/encoder/static.php index ce4a139..3d4719c 100755 --- a/encoder/static.php +++ b/encoder/static.php @@ -75,6 +75,93 @@ function find_first_physical_ethernet(): ?string return null; } +function build_interface(array $d, string $key): array +{ + $cfg = []; + $addresses = []; + $routes = []; + + /* ---------- IPv4 ---------- */ + switch ($d['mode'] ?? 'disabled') { + case 'dhcp': + $cfg['dhcp4'] = true; + break; + + case 'static': + if (!empty($d["network_{$key}_ip"]) && !empty($d["network_{$key}_subnet"])) { + $addresses[] = + $d["network_{$key}_ip"] . '/' . $d["network_{$key}_subnet"]; + } + if (!empty($d["network_{$key}_gateway"])) { + $routes[] = [ + 'to' => 'default', + 'via' => $d["network_{$key}_gateway"] + ]; + } + $cfg['dhcp4'] = false; + break; + + default: + $cfg['dhcp4'] = false; + } + + /* ---------- IPv6 ---------- */ + switch ($d['modev6'] ?? 'disabled') { + case 'auto': // SLAAC + $cfg['accept-ra'] = true; + $cfg['dhcp6'] = false; + break; + + case 'dhcp6': + $cfg['dhcp6'] = true; + $cfg['accept-ra'] = false; + break; + + case 'static': + if (!empty($d["network_{$key}_ipv6"]) && !empty($d["network_{$key}_ipv6_prefix"])) { + $addresses[] = + $d["network_{$key}_ipv6"] . '/' . $d["network_{$key}_ipv6_prefix"]; + } + if (!empty($d["network_{$key}_ipv6_gateway"])) { + $routes[] = [ + 'to' => '::/0', + 'via' => $d["network_{$key}_ipv6_gateway"] + ]; + } + $cfg['dhcp6'] = false; + $cfg['accept-ra'] = false; + break; + + default: + $cfg['dhcp6'] = false; + $cfg['accept-ra'] = false; + } + + if ($addresses) { + $cfg['addresses'] = $addresses; + } + + if ($routes) { + $cfg['routes'] = $routes; + } + + $dns = array_values(array_filter([ + $d["network_{$key}_dns1"] ?? '', + $d["network_{$key}_dns2"] ?? '', + $d["network_{$key}_ipv6_dns1"] ?? '', + $d["network_{$key}_ipv6_dns2"] ?? '', + ])); + + if ($dns) { + $cfg['nameservers'] = [ + 'addresses' => $dns + ]; + } + + return $cfg; +} + + function netplan_yaml(array $data, int $indent = 0): string { $yaml = '';