1{ lib, systemdUtils }:
2
3let
4 inherit (lib)
5 concatMapStrings
6 concatStringsSep
7 flip
8 optionalString
9 ;
10
11 attrsToSection = systemdUtils.lib.attrsToSection;
12 commonMatchText = def:
13 optionalString (def.matchConfig != { }) ''
14 [Match]
15 ${attrsToSection def.matchConfig}
16 '';
17in {
18 linkToUnit = def:
19 commonMatchText def + ''
20 [Link]
21 ${attrsToSection def.linkConfig}
22 '' + def.extraConfig;
23
24 netdevToUnit = def:
25 commonMatchText def + ''
26 [NetDev]
27 ${attrsToSection def.netdevConfig}
28 '' + optionalString (def.bridgeConfig != { }) ''
29 [Bridge]
30 ${attrsToSection def.bridgeConfig}
31 '' + optionalString (def.vlanConfig != { }) ''
32 [VLAN]
33 ${attrsToSection def.vlanConfig}
34 '' + optionalString (def.ipvlanConfig != { }) ''
35 [IPVLAN]
36 ${attrsToSection def.ipvlanConfig}
37 '' + optionalString (def.ipvtapConfig != { }) ''
38 [IPVTAP]
39 ${attrsToSection def.ipvtapConfig}
40 '' + optionalString (def.macvlanConfig != { }) ''
41 [MACVLAN]
42 ${attrsToSection def.macvlanConfig}
43 '' + optionalString (def.vxlanConfig != { }) ''
44 [VXLAN]
45 ${attrsToSection def.vxlanConfig}
46 '' + optionalString (def.tunnelConfig != { }) ''
47 [Tunnel]
48 ${attrsToSection def.tunnelConfig}
49 '' + optionalString (def.fooOverUDPConfig != { }) ''
50 [FooOverUDP]
51 ${attrsToSection def.fooOverUDPConfig}
52 '' + optionalString (def.peerConfig != { }) ''
53 [Peer]
54 ${attrsToSection def.peerConfig}
55 '' + optionalString (def.tunConfig != { }) ''
56 [Tun]
57 ${attrsToSection def.tunConfig}
58 '' + optionalString (def.tapConfig != { }) ''
59 [Tap]
60 ${attrsToSection def.tapConfig}
61 '' + optionalString (def.l2tpConfig != { }) ''
62 [L2TP]
63 ${attrsToSection def.l2tpConfig}
64 '' + flip concatMapStrings def.l2tpSessions (x: ''
65 [L2TPSession]
66 ${attrsToSection x.l2tpSessionConfig}
67 '') + optionalString (def.wireguardConfig != { }) ''
68 [WireGuard]
69 ${attrsToSection def.wireguardConfig}
70 '' + flip concatMapStrings def.wireguardPeers (x: ''
71 [WireGuardPeer]
72 ${attrsToSection x.wireguardPeerConfig}
73 '') + optionalString (def.bondConfig != { }) ''
74 [Bond]
75 ${attrsToSection def.bondConfig}
76 '' + optionalString (def.xfrmConfig != { }) ''
77 [Xfrm]
78 ${attrsToSection def.xfrmConfig}
79 '' + optionalString (def.vrfConfig != { }) ''
80 [VRF]
81 ${attrsToSection def.vrfConfig}
82 '' + optionalString (def.wlanConfig != { }) ''
83 [WLAN]
84 ${attrsToSection def.wlanConfig}
85 '' + optionalString (def.batmanAdvancedConfig != { }) ''
86 [BatmanAdvanced]
87 ${attrsToSection def.batmanAdvancedConfig}
88 '' + def.extraConfig;
89
90 networkToUnit = def:
91 commonMatchText def + optionalString (def.linkConfig != { }) ''
92 [Link]
93 ${attrsToSection def.linkConfig}
94 '' + ''
95 [Network]
96 '' + attrsToSection def.networkConfig
97 + optionalString (def.address != [ ]) ''
98 ${concatStringsSep "\n" (map (s: "Address=${s}") def.address)}
99 '' + optionalString (def.gateway != [ ]) ''
100 ${concatStringsSep "\n" (map (s: "Gateway=${s}") def.gateway)}
101 '' + optionalString (def.dns != [ ]) ''
102 ${concatStringsSep "\n" (map (s: "DNS=${s}") def.dns)}
103 '' + optionalString (def.ntp != [ ]) ''
104 ${concatStringsSep "\n" (map (s: "NTP=${s}") def.ntp)}
105 '' + optionalString (def.bridge != [ ]) ''
106 ${concatStringsSep "\n" (map (s: "Bridge=${s}") def.bridge)}
107 '' + optionalString (def.bond != [ ]) ''
108 ${concatStringsSep "\n" (map (s: "Bond=${s}") def.bond)}
109 '' + optionalString (def.vrf != [ ]) ''
110 ${concatStringsSep "\n" (map (s: "VRF=${s}") def.vrf)}
111 '' + optionalString (def.vlan != [ ]) ''
112 ${concatStringsSep "\n" (map (s: "VLAN=${s}") def.vlan)}
113 '' + optionalString (def.macvlan != [ ]) ''
114 ${concatStringsSep "\n" (map (s: "MACVLAN=${s}") def.macvlan)}
115 '' + optionalString (def.macvtap != [ ]) ''
116 ${concatStringsSep "\n" (map (s: "MACVTAP=${s}") def.macvtap)}
117 '' + optionalString (def.vxlan != [ ]) ''
118 ${concatStringsSep "\n" (map (s: "VXLAN=${s}") def.vxlan)}
119 '' + optionalString (def.tunnel != [ ]) ''
120 ${concatStringsSep "\n" (map (s: "Tunnel=${s}") def.tunnel)}
121 '' + optionalString (def.xfrm != [ ]) ''
122 ${concatStringsSep "\n" (map (s: "Xfrm=${s}") def.xfrm)}
123 '' + "\n" + flip concatMapStrings def.addresses (x: ''
124 [Address]
125 ${attrsToSection x.addressConfig}
126 '') + flip concatMapStrings def.routingPolicyRules (x: ''
127 [RoutingPolicyRule]
128 ${attrsToSection x.routingPolicyRuleConfig}
129 '') + flip concatMapStrings def.routes (x: ''
130 [Route]
131 ${attrsToSection x.routeConfig}
132 '') + optionalString (def.dhcpV4Config != { }) ''
133 [DHCPv4]
134 ${attrsToSection def.dhcpV4Config}
135 '' + optionalString (def.dhcpV6Config != { }) ''
136 [DHCPv6]
137 ${attrsToSection def.dhcpV6Config}
138 '' + optionalString (def.dhcpPrefixDelegationConfig != { }) ''
139 [DHCPPrefixDelegation]
140 ${attrsToSection def.dhcpPrefixDelegationConfig}
141 '' + optionalString (def.ipv6AcceptRAConfig != { }) ''
142 [IPv6AcceptRA]
143 ${attrsToSection def.ipv6AcceptRAConfig}
144 '' + optionalString (def.dhcpServerConfig != { }) ''
145 [DHCPServer]
146 ${attrsToSection def.dhcpServerConfig}
147 '' + optionalString (def.ipv6SendRAConfig != { }) ''
148 [IPv6SendRA]
149 ${attrsToSection def.ipv6SendRAConfig}
150 '' + flip concatMapStrings def.ipv6Prefixes (x: ''
151 [IPv6Prefix]
152 ${attrsToSection x.ipv6PrefixConfig}
153 '') + flip concatMapStrings def.ipv6RoutePrefixes (x: ''
154 [IPv6RoutePrefix]
155 ${attrsToSection x.ipv6RoutePrefixConfig}
156 '') + flip concatMapStrings def.dhcpServerStaticLeases (x: ''
157 [DHCPServerStaticLease]
158 ${attrsToSection x.dhcpServerStaticLeaseConfig}
159 '') + optionalString (def.bridgeConfig != { }) ''
160 [Bridge]
161 ${attrsToSection def.bridgeConfig}
162 '' + flip concatMapStrings def.bridgeFDBs (x: ''
163 [BridgeFDB]
164 ${attrsToSection x.bridgeFDBConfig}
165 '') + flip concatMapStrings def.bridgeMDBs (x: ''
166 [BridgeMDB]
167 ${attrsToSection x.bridgeMDBConfig}
168 '') + optionalString (def.lldpConfig != { }) ''
169 [LLDP]
170 ${attrsToSection def.lldpConfig}
171 '' + optionalString (def.canConfig != { }) ''
172 [CAN]
173 ${attrsToSection def.canConfig}
174 '' + optionalString (def.ipoIBConfig != { }) ''
175 [IPoIB]
176 ${attrsToSection def.ipoIBConfig}
177 '' + optionalString (def.qdiscConfig != { }) ''
178 [QDisc]
179 ${attrsToSection def.qdiscConfig}
180 '' + optionalString (def.networkEmulatorConfig != { }) ''
181 [NetworkEmulator]
182 ${attrsToSection def.networkEmulatorConfig}
183 '' + optionalString (def.tokenBucketFilterConfig != { }) ''
184 [TokenBucketFilter]
185 ${attrsToSection def.tokenBucketFilterConfig}
186 '' + optionalString (def.pieConfig != { }) ''
187 [PIE]
188 ${attrsToSection def.pieConfig}
189 '' + optionalString (def.flowQueuePIEConfig != { }) ''
190 [FlowQueuePIE]
191 ${attrsToSection def.flowQueuePIEConfig}
192 '' + optionalString (def.stochasticFairBlueConfig != { }) ''
193 [StochasticFairBlue]
194 ${attrsToSection def.stochasticFairBlueConfig}
195 '' + optionalString (def.stochasticFairnessQueueingConfig != { }) ''
196 [StochasticFairnessQueueing]
197 ${attrsToSection def.stochasticFairnessQueueingConfig}
198 '' + optionalString (def.bfifoConfig != { }) ''
199 [BFIFO]
200 ${attrsToSection def.bfifoConfig}
201 '' + optionalString (def.pfifoConfig != { }) ''
202 [PFIFO]
203 ${attrsToSection def.pfifoConfig}
204 '' + optionalString (def.pfifoHeadDropConfig != { }) ''
205 [PFIFOHeadDrop]
206 ${attrsToSection def.pfifoHeadDropConfig}
207 '' + optionalString (def.pfifoFastConfig != { }) ''
208 [PFIFOFast]
209 ${attrsToSection def.pfifoFastConfig}
210 '' + optionalString (def.cakeConfig != { }) ''
211 [CAKE]
212 ${attrsToSection def.cakeConfig}
213 '' + optionalString (def.controlledDelayConfig != { }) ''
214 [ControlledDelay]
215 ${attrsToSection def.controlledDelayConfig}
216 '' + optionalString (def.deficitRoundRobinSchedulerConfig != { }) ''
217 [DeficitRoundRobinScheduler]
218 ${attrsToSection def.deficitRoundRobinSchedulerConfig}
219 '' + optionalString (def.deficitRoundRobinSchedulerClassConfig != { }) ''
220 [DeficitRoundRobinSchedulerClass]
221 ${attrsToSection def.deficitRoundRobinSchedulerClassConfig}
222 '' + optionalString (def.enhancedTransmissionSelectionConfig != { }) ''
223 [EnhancedTransmissionSelection]
224 ${attrsToSection def.enhancedTransmissionSelectionConfig}
225 '' + optionalString (def.genericRandomEarlyDetectionConfig != { }) ''
226 [GenericRandomEarlyDetection]
227 ${attrsToSection def.genericRandomEarlyDetectionConfig}
228 '' + optionalString (def.fairQueueingControlledDelayConfig != { }) ''
229 [FairQueueingControlledDelay]
230 ${attrsToSection def.fairQueueingControlledDelayConfig}
231 '' + optionalString (def.fairQueueingConfig != { }) ''
232 [FairQueueing]
233 ${attrsToSection def.fairQueueingConfig}
234 '' + optionalString (def.trivialLinkEqualizerConfig != { }) ''
235 [TrivialLinkEqualizer]
236 ${attrsToSection def.trivialLinkEqualizerConfig}
237 '' + optionalString (def.hierarchyTokenBucketConfig != { }) ''
238 [HierarchyTokenBucket]
239 ${attrsToSection def.hierarchyTokenBucketConfig}
240 '' + optionalString (def.hierarchyTokenBucketClassConfig != { }) ''
241 [HierarchyTokenBucketClass]
242 ${attrsToSection def.hierarchyTokenBucketClassConfig}
243 '' + optionalString (def.heavyHitterFilterConfig != { }) ''
244 [HeavyHitterFilter]
245 ${attrsToSection def.heavyHitterFilterConfig}
246 '' + optionalString (def.quickFairQueueingConfig != { }) ''
247 [QuickFairQueueing]
248 ${attrsToSection def.quickFairQueueingConfig}
249 '' + optionalString (def.quickFairQueueingConfigClass != { }) ''
250 [QuickFairQueueingClass]
251 ${attrsToSection def.quickFairQueueingConfigClass}
252 '' + flip concatMapStrings def.bridgeVLANs (x: ''
253 [BridgeVLAN]
254 ${attrsToSection x.bridgeVLANConfig}
255 '') + def.extraConfig;
256
257}