netplan_yaml

This commit is contained in:
devdatt 2025-12-23 12:44:00 +05:30
parent 0803645bac
commit 1af9bb484c
1 changed files with 67 additions and 21 deletions

View File

@ -84,9 +84,10 @@ function build_interface(array $cfg, string $type): array
$out['dhcp4'] = true; $out['dhcp4'] = true;
} elseif ($cfg['mode'] === 'static') { } elseif ($cfg['mode'] === 'static') {
$out['dhcp4'] = false; $out['dhcp4'] = false;
$out['addresses'] = [
$cfg["network_{$type}_ip"] // already CIDR if ($cfg["network_{$type}_ip"] !== '') {
]; $out['addresses'][] = $cfg["network_{$type}_ip"]; // already CIDR
}
if ($cfg["network_{$type}_gateway"] !== '') { if ($cfg["network_{$type}_gateway"] !== '') {
$out['gateway4'] = $cfg["network_{$type}_gateway"]; $out['gateway4'] = $cfg["network_{$type}_gateway"];
@ -115,17 +116,17 @@ function build_interface(array $cfg, string $type): array
$out['dhcp6'] = false; $out['dhcp6'] = false;
$out['accept-ra'] = false; $out['accept-ra'] = false;
if ($cfg["network_{$type}_ipv6"] !== '' && if (
$cfg["network_{$type}_ipv6_prefix"] !== '') { $cfg["network_{$type}_ipv6"] !== '' &&
$cfg["network_{$type}_ipv6_prefix"] !== ''
) {
$out['addresses'][] = $out['addresses'][] =
$cfg["network_{$type}_ipv6"] . '/' . $cfg["network_{$type}_ipv6"] . '/' .
$cfg["network_{$type}_ipv6_prefix"]; $cfg["network_{$type}_ipv6_prefix"];
} }
if ($cfg["network_{$type}_ipv6_gateway"] !== '') { if ($cfg["network_{$type}_ipv6_gateway"] !== '') {
$out['gateway6'] = $out['gateway6'] = $cfg["network_{$type}_ipv6_gateway"];
$cfg["network_{$type}_ipv6_gateway"];
} }
$dns6 = array_filter([ $dns6 = array_filter([
@ -144,37 +145,85 @@ function build_interface(array $cfg, string $type): array
return $out; return $out;
} }
function generate_netplan(array $data, string $iface): array function generate_netplan(array $data, string $iface): array
{ {
validate_config($data);
$netplan = [ $netplan = [
'network' => [ 'network' => [
'version' => 2, 'version' => 2,
'renderer' => 'networkd', 'renderer' => 'networkd',
'ethernets' => [], 'ethernets' => [
'vlans' => new stdClass() $iface => new stdClass() // base NIC only
],
'vlans' => []
] ]
]; ];
/* PRIMARY HAS PRIORITY */ /* ---------- PRIMARY ---------- */
if ( if (
$data['primary']['mode'] !== 'disabled' || $data['primary']['mode'] !== 'disabled' ||
$data['primary']['modev6'] !== 'disabled' $data['primary']['modev6'] !== 'disabled'
) { ) {
$netplan['network']['ethernets'][$iface] = $vlan = trim($data['primary']['network_primary_vlan'] ?? '');
build_interface($data['primary'], 'primary');
/* SECONDARY ONLY IF PRIMARY DISABLED */ if ($vlan !== '') {
} elseif ( $netplan['network']['vlans']["{$iface}.{$vlan}"] =
array_merge(
['id' => (int)$vlan, 'link' => $iface],
build_interface($data['primary'], 'primary')
);
}
}
/* ---------- SECONDARY ---------- */
if (
$data['secondary']['mode'] !== 'disabled' || $data['secondary']['mode'] !== 'disabled' ||
$data['secondary']['modev6'] !== 'disabled' $data['secondary']['modev6'] !== 'disabled'
) { ) {
$netplan['network']['ethernets'][$iface] = $vlan = trim($data['secondary']['network_secondary_vlan'] ?? '');
build_interface($data['secondary'], 'secondary');
if ($vlan !== '') {
$netplan['network']['vlans']["{$iface}.{$vlan}"] =
array_merge(
['id' => (int)$vlan, 'link' => $iface],
build_interface($data['secondary'], 'secondary')
);
}
}
/* Ensure vlans is a mapping */
if (empty($netplan['network']['vlans'])) {
$netplan['network']['vlans'] = new stdClass();
} }
return $netplan; return $netplan;
} }
function validate_config(array $data): void
{
$p_enabled = (
$data['primary']['mode'] !== 'disabled' ||
$data['primary']['modev6'] !== 'disabled'
);
$s_enabled = (
$data['secondary']['mode'] !== 'disabled' ||
$data['secondary']['modev6'] !== 'disabled'
);
$p_vlan = trim($data['primary']['network_primary_vlan'] ?? '');
$s_vlan = trim($data['secondary']['network_secondary_vlan'] ?? '');
/* If both enabled, at least one VLAN is mandatory */
if ($p_enabled && $s_enabled && $p_vlan === '' && $s_vlan === '') {
throw new RuntimeException(
'Invalid configuration: Primary and Secondary are enabled but no VLAN is defined.'
);
}
}
function netplan_yaml(array $data, int $indent = 0): string function netplan_yaml(array $data, int $indent = 0): string
{ {
$out = ''; $out = '';
@ -200,9 +249,7 @@ function netplan_yaml(array $data, int $indent = 0): string
if (array_keys($value) === range(0, count($value) - 1)) { if (array_keys($value) === range(0, count($value) - 1)) {
$out .= "{$pad}{$key}:\n"; $out .= "{$pad}{$key}:\n";
foreach ($value as $item) { foreach ($value as $item) {
$out .= is_bool($item) $out .= "{$pad} - {$item}\n";
? "{$pad} - " . ($item ? 'true' : 'false') . "\n"
: "{$pad} - {$item}\n";
} }
continue; continue;
} }
@ -214,7 +261,6 @@ function netplan_yaml(array $data, int $indent = 0): string
return $out; return $out;
} }
function update_service($which_service) function update_service($which_service)
{ {