feat(netconf-junos): added required configuration for dhcp
This commit is contained in:
parent
1032b3225e
commit
78e54b02f1
6 changed files with 242 additions and 5 deletions
141
lib/netconf-junos/access.nix
Normal file
141
lib/netconf-junos/access.nix
Normal file
|
@ -0,0 +1,141 @@
|
|||
# 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>
|
||||
'';
|
||||
}
|
|
@ -34,11 +34,13 @@ let
|
|||
in
|
||||
{
|
||||
imports = [
|
||||
./access.nix
|
||||
./interfaces.nix
|
||||
./poe.nix
|
||||
./protocols.nix
|
||||
./system.nix
|
||||
./vlans.nix
|
||||
./routing-options.nix
|
||||
];
|
||||
|
||||
options = {
|
||||
|
@ -98,6 +100,8 @@ in
|
|||
${protocols}
|
||||
${vlans}
|
||||
${poe}
|
||||
${access}
|
||||
${routing-options}
|
||||
</configuration>
|
||||
'';
|
||||
rpc = pkgs.writeText "${name}.rpc" ''
|
||||
|
|
|
@ -97,17 +97,17 @@ let
|
|||
</ethernet-switching>
|
||||
'';
|
||||
|
||||
addr4 = map (addr: "<name>${addr}</name>") config.family.inet.addresses;
|
||||
addr4 = map (addr: "<address><name>${addr}</name></address>") config.family.inet.addresses;
|
||||
inet = optionalString config.family.inet.enable ''
|
||||
<inet>
|
||||
<address>${builtins.concatStringsSep "" addr4}</address>
|
||||
${builtins.concatStringsSep "" addr4}
|
||||
</inet>
|
||||
'';
|
||||
|
||||
addr6 = map (addr: "<name>${addr}</name>") config.family.inet6.addresses;
|
||||
addr6 = map (addr: "<address><name>${addr}</name></address>") config.family.inet6.addresses;
|
||||
inet6 = optionalString config.family.inet6.enable ''
|
||||
<inet6>
|
||||
<address>${builtins.concatStringsSep "" addr6}</address>
|
||||
${builtins.concatStringsSep "" addr6}
|
||||
</inet6>
|
||||
'';
|
||||
in
|
||||
|
|
59
lib/netconf-junos/routing-options.nix
Normal file
59
lib/netconf-junos/routing-options.nix
Normal file
|
@ -0,0 +1,59 @@
|
|||
# SPDX-FileCopyrightText: 2025 Lubin Bailly <lubin.bailly@dgnum.eu>
|
||||
#
|
||||
# SPDX-License-Identifier: EUPL-1.2
|
||||
|
||||
{ config, lib, ... }:
|
||||
let
|
||||
inherit (lib)
|
||||
concatMapStringsSep
|
||||
mkOption
|
||||
;
|
||||
inherit (lib.types)
|
||||
str
|
||||
listOf
|
||||
submodule
|
||||
;
|
||||
in
|
||||
{
|
||||
options = {
|
||||
routing-options.static.route = mkOption {
|
||||
type = listOf (submodule {
|
||||
options = {
|
||||
destination = mkOption {
|
||||
type = str;
|
||||
description = ''
|
||||
Destination network.
|
||||
'';
|
||||
};
|
||||
next-hop = mkOption {
|
||||
type = str;
|
||||
description = ''
|
||||
Gateway for this network.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
default = [ ];
|
||||
description = ''
|
||||
Static routes.
|
||||
'';
|
||||
};
|
||||
netconf.xmls.routing-options = mkOption {
|
||||
type = str;
|
||||
readOnly = true;
|
||||
visible = false;
|
||||
};
|
||||
};
|
||||
config.netconf.xmls.routing-options = ''
|
||||
<routing-options operation="replace">
|
||||
<static>
|
||||
${concatMapStringsSep "\n" (route: ''
|
||||
<route>
|
||||
<name>${route.destination}</name>
|
||||
<next-hop>${route.next-hop}</next-hop>
|
||||
</route>
|
||||
'') config.routing-options.static.route}
|
||||
</static>
|
||||
</routing-options>
|
||||
'';
|
||||
}
|
|
@ -6,20 +6,25 @@
|
|||
|
||||
let
|
||||
inherit (lib)
|
||||
concatMapAttrsStringSep
|
||||
concatMapStrings
|
||||
concatStrings
|
||||
concatStringsSep
|
||||
filter
|
||||
hasPrefix
|
||||
length
|
||||
mkOption
|
||||
optionalString
|
||||
splitString
|
||||
;
|
||||
|
||||
inherit (lib.types)
|
||||
attrsOf
|
||||
enum
|
||||
listOf
|
||||
port
|
||||
str
|
||||
submodule
|
||||
;
|
||||
in
|
||||
|
||||
|
@ -55,6 +60,20 @@ in
|
|||
description = "Port to use for netconf.";
|
||||
default = 830;
|
||||
};
|
||||
dhcp-local-server.group = mkOption {
|
||||
type = attrsOf (submodule {
|
||||
options.interfaces = mkOption {
|
||||
type = listOf str;
|
||||
description = ''
|
||||
Interfaces managed by this group.
|
||||
'';
|
||||
};
|
||||
});
|
||||
default = { };
|
||||
description = ''
|
||||
Groups of configuration for DHCP server.
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
netconf.xmls.system = mkOption {
|
||||
|
@ -75,6 +94,19 @@ in
|
|||
ed25519 = map (key: "<ssh-ed25519><name>${key}</name></ssh-ed25519>") (
|
||||
filter (hasPrefix "ssh-ed25519 ") ssh-keys
|
||||
);
|
||||
|
||||
dhcp-local = optionalString (config.system.services.dhcp-local-server.group != { }) ''
|
||||
<dhcp-local-server>
|
||||
${concatMapAttrsStringSep "\n" (name: cfg: ''
|
||||
<group>
|
||||
<name>${name}</name>
|
||||
<interface>
|
||||
${concatMapStrings (intf: "<name>${intf}</name>") cfg.interfaces}
|
||||
</interface>
|
||||
</group>
|
||||
'') config.system.services.dhcp-local-server.group}
|
||||
</dhcp-local-server>
|
||||
'';
|
||||
in
|
||||
''
|
||||
<system>
|
||||
|
@ -89,6 +121,7 @@ in
|
|||
<ssh><port>${toString config.system.services.netconf.port}</port></ssh>
|
||||
<rfc-compliant/><yang-compliant/>
|
||||
</netconf>
|
||||
${dhcp-local}
|
||||
</services>
|
||||
</system>
|
||||
'';
|
||||
|
|
|
@ -27,7 +27,7 @@ let
|
|||
];
|
||||
};
|
||||
nixpkgs = {
|
||||
version = "24.05";
|
||||
version = "unstable";
|
||||
system = "netconf";
|
||||
};
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue