netplan_yaml
This commit is contained in:
parent
0803645bac
commit
1af9bb484c
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue