From 0803645bac0dc37ccf95755ac804bd16ecb4f7fc Mon Sep 17 00:00:00 2001 From: devdatt Date: Tue, 23 Dec 2025 12:29:56 +0530 Subject: [PATCH] netplan_yaml --- encoder/network.php | 22 +++++++++++++---- encoder/static.php | 59 ++++++++++++++++++++++++++++++++++++--------- 2 files changed, 65 insertions(+), 16 deletions(-) diff --git a/encoder/network.php b/encoder/network.php index fcfdfc4..24b94ba 100755 --- a/encoder/network.php +++ b/encoder/network.php @@ -138,13 +138,25 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { 'version' => 2, 'renderer' => 'networkd', 'ethernets' => [], + 'vlans' => new stdClass() ] ]; - if (!empty($netplan['network']['vlans'])) { - $netplan['network']['vlans'] = $netplan['network']['vlans']; - } else { - $netplan['network']['vlans'] = new stdClass(); // forces {} + /* ---------- 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) { @@ -172,7 +184,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { } } - file_put_contents('/var/www/50-cloud-init.yaml', netplan_yaml($netplan)); + file_put_contents('/var/www/50-cloud-init.yaml', netplan_yaml(generate_netplan($data, $iface))); } } diff --git a/encoder/static.php b/encoder/static.php index 965b50b..cbc4ba5 100755 --- a/encoder/static.php +++ b/encoder/static.php @@ -84,8 +84,13 @@ function build_interface(array $cfg, string $type): array $out['dhcp4'] = true; } elseif ($cfg['mode'] === 'static') { $out['dhcp4'] = false; - $out['addresses'][] = $cfg["network_{$type}_ip"]; - $out['gateway4'] = $cfg["network_{$type}_gateway"]; + $out['addresses'] = [ + $cfg["network_{$type}_ip"] // already CIDR + ]; + + if ($cfg["network_{$type}_gateway"] !== '') { + $out['gateway4'] = $cfg["network_{$type}_gateway"]; + } $dns = array_filter([ $cfg["network_{$type}_dns1"], @@ -110,11 +115,18 @@ function build_interface(array $cfg, string $type): array $out['dhcp6'] = false; $out['accept-ra'] = false; - $out['addresses'][] = - $cfg["network_{$type}_ipv6"] . '/' . - $cfg["network_{$type}_ipv6_prefix"]; + if ($cfg["network_{$type}_ipv6"] !== '' && + $cfg["network_{$type}_ipv6_prefix"] !== '') { - $out['gateway6'] = $cfg["network_{$type}_ipv6_gateway"]; + $out['addresses'][] = + $cfg["network_{$type}_ipv6"] . '/' . + $cfg["network_{$type}_ipv6_prefix"]; + } + + if ($cfg["network_{$type}_ipv6_gateway"] !== '') { + $out['gateway6'] = + $cfg["network_{$type}_ipv6_gateway"]; + } $dns6 = array_filter([ $cfg["network_{$type}_ipv6_dns1"], @@ -132,6 +144,36 @@ function build_interface(array $cfg, string $type): array return $out; } +function generate_netplan(array $data, string $iface): array +{ + $netplan = [ + 'network' => [ + 'version' => 2, + 'renderer' => 'networkd', + 'ethernets' => [], + 'vlans' => new stdClass() + ] + ]; + + /* PRIMARY HAS PRIORITY */ + if ( + $data['primary']['mode'] !== 'disabled' || + $data['primary']['modev6'] !== 'disabled' + ) { + $netplan['network']['ethernets'][$iface] = + build_interface($data['primary'], 'primary'); + + /* SECONDARY ONLY IF PRIMARY DISABLED */ + } elseif ( + $data['secondary']['mode'] !== 'disabled' || + $data['secondary']['modev6'] !== 'disabled' + ) { + $netplan['network']['ethernets'][$iface] = + build_interface($data['secondary'], 'secondary'); + } + + return $netplan; +} function netplan_yaml(array $data, int $indent = 0): string { @@ -140,25 +182,21 @@ function netplan_yaml(array $data, int $indent = 0): string foreach ($data as $key => $value) { - /* Empty map */ if ($value instanceof stdClass) { $out .= "{$pad}{$key}: {}\n"; continue; } - /* Boolean */ if (is_bool($value)) { $out .= "{$pad}{$key}: " . ($value ? 'true' : 'false') . "\n"; continue; } - /* Scalar */ if (!is_array($value)) { $out .= "{$pad}{$key}: {$value}\n"; continue; } - /* Numeric array (list) */ if (array_keys($value) === range(0, count($value) - 1)) { $out .= "{$pad}{$key}:\n"; foreach ($value as $item) { @@ -169,7 +207,6 @@ function netplan_yaml(array $data, int $indent = 0): string continue; } - /* Mapping */ $out .= "{$pad}{$key}:\n"; $out .= netplan_yaml($value, $indent + 1); }