141 lines
4.2 KiB
Nix
141 lines
4.2 KiB
Nix
# SPDX-FileCopyrightText: 2025 Lubin Bailly <lubin.bailly@dgnum.eu>
|
|
#
|
|
# SPDX-License-Identifier: EUPL-1.2
|
|
|
|
{ config, lib, ... }:
|
|
let
|
|
inherit (lib)
|
|
concatImapStringsSep
|
|
concatMapAttrsStringSep
|
|
concatMapStrings
|
|
mkOption
|
|
;
|
|
inherit (lib.types)
|
|
attrsOf
|
|
ints
|
|
listOf
|
|
str
|
|
submodule
|
|
;
|
|
in
|
|
{
|
|
options = {
|
|
access.address-assignment.pool = mkOption {
|
|
type = attrsOf (
|
|
submodule (
|
|
{ name, config, ... }:
|
|
{
|
|
options = {
|
|
family.inet = {
|
|
network = mkOption {
|
|
type = str;
|
|
description = ''
|
|
Network where this pool is located.
|
|
'';
|
|
};
|
|
ranges = mkOption {
|
|
type = listOf (submodule {
|
|
options = {
|
|
low = mkOption {
|
|
type = str;
|
|
description = ''
|
|
Lowest IP of this range.
|
|
'';
|
|
};
|
|
high = mkOption {
|
|
type = str;
|
|
description = ''
|
|
Highest IP of this range.
|
|
'';
|
|
};
|
|
};
|
|
});
|
|
description = ''
|
|
IP ranges in this pool.
|
|
'';
|
|
};
|
|
dhcp-attributes = {
|
|
maximum-lease-time = mkOption {
|
|
type = ints.unsigned;
|
|
description = ''
|
|
Maximum lease time for leases in this pool.
|
|
'';
|
|
};
|
|
name-server = mkOption {
|
|
type = listOf str;
|
|
default = [ ];
|
|
description = ''
|
|
DNS servers to propose.
|
|
'';
|
|
};
|
|
router = mkOption {
|
|
type = listOf str;
|
|
default = [ ];
|
|
description = ''
|
|
Router IP for default route.
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
xml = mkOption {
|
|
type = str;
|
|
readOnly = true;
|
|
visible = false;
|
|
};
|
|
};
|
|
config.xml =
|
|
let
|
|
inet-cfg = config.family.inet;
|
|
in
|
|
''
|
|
<pool>
|
|
<name>${name}</name>
|
|
<family>
|
|
<inet>
|
|
<network>${inet-cfg.network}</network>
|
|
${concatImapStringsSep "\n" (
|
|
idx:
|
|
{ low, high }:
|
|
''
|
|
<range>
|
|
<name>${name}-${toString idx}</name>
|
|
<low>${low}</low>
|
|
<high>${high}</high>
|
|
</range>
|
|
''
|
|
) inet-cfg.ranges}
|
|
<dhcp-attributes>
|
|
<maximum-lease-time>${toString inet-cfg.dhcp-attributes.maximum-lease-time}</maximum-lease-time>
|
|
${concatMapStrings (
|
|
dns: "<name-server><name>${dns}</name></name-server>"
|
|
) inet-cfg.dhcp-attributes.name-server}
|
|
${concatMapStrings (
|
|
router: "<router><name>${router}</name></router>"
|
|
) inet-cfg.dhcp-attributes.router}
|
|
</dhcp-attributes>
|
|
</inet>
|
|
</family>
|
|
</pool>
|
|
'';
|
|
}
|
|
)
|
|
);
|
|
default = { };
|
|
description = ''
|
|
Address pools for DHCP configuration.
|
|
'';
|
|
};
|
|
netconf.xmls.access = mkOption {
|
|
type = str;
|
|
visible = false;
|
|
readOnly = true;
|
|
};
|
|
};
|
|
config.netconf.xmls.access = ''
|
|
<access operation="replace">
|
|
<address-assignment>
|
|
${concatMapAttrsStringSep "\n" (_: pool: pool.xml) config.access.address-assignment.pool}
|
|
</address-assignment>
|
|
</access>
|
|
'';
|
|
}
|