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 =
13 def:
14 optionalString (def.matchConfig != { }) ''
15 [Match]
16 ${attrsToSection def.matchConfig}
17 '';
18in
19{
20 linkToUnit =
21 def:
22 commonMatchText def
23 + ''
24 [Link]
25 ${attrsToSection def.linkConfig}
26 ''
27 + def.extraConfig;
28
29 netdevToUnit =
30 def:
31 commonMatchText def
32 + ''
33 [NetDev]
34 ${attrsToSection def.netdevConfig}
35 ''
36 + optionalString (def.bridgeConfig != { }) ''
37 [Bridge]
38 ${attrsToSection def.bridgeConfig}
39 ''
40 + optionalString (def.vlanConfig != { }) ''
41 [VLAN]
42 ${attrsToSection def.vlanConfig}
43 ''
44 + optionalString (def.ipvlanConfig != { }) ''
45 [IPVLAN]
46 ${attrsToSection def.ipvlanConfig}
47 ''
48 + optionalString (def.ipvtapConfig != { }) ''
49 [IPVTAP]
50 ${attrsToSection def.ipvtapConfig}
51 ''
52 + optionalString (def.macvlanConfig != { }) ''
53 [MACVLAN]
54 ${attrsToSection def.macvlanConfig}
55 ''
56 + optionalString (def.vxlanConfig != { }) ''
57 [VXLAN]
58 ${attrsToSection def.vxlanConfig}
59 ''
60 + optionalString (def.tunnelConfig != { }) ''
61 [Tunnel]
62 ${attrsToSection def.tunnelConfig}
63 ''
64 + optionalString (def.fooOverUDPConfig != { }) ''
65 [FooOverUDP]
66 ${attrsToSection def.fooOverUDPConfig}
67 ''
68 + optionalString (def.peerConfig != { }) ''
69 [Peer]
70 ${attrsToSection def.peerConfig}
71 ''
72 + optionalString (def.tunConfig != { }) ''
73 [Tun]
74 ${attrsToSection def.tunConfig}
75 ''
76 + optionalString (def.tapConfig != { }) ''
77 [Tap]
78 ${attrsToSection def.tapConfig}
79 ''
80 + optionalString (def.l2tpConfig != { }) ''
81 [L2TP]
82 ${attrsToSection def.l2tpConfig}
83 ''
84 + flip concatMapStrings def.l2tpSessions (x: ''
85 [L2TPSession]
86 ${attrsToSection x}
87 '')
88 + optionalString (def.wireguardConfig != { }) ''
89 [WireGuard]
90 ${attrsToSection def.wireguardConfig}
91 ''
92 + flip concatMapStrings def.wireguardPeers (x: ''
93 [WireGuardPeer]
94 ${attrsToSection x}
95 '')
96 + optionalString (def.bondConfig != { }) ''
97 [Bond]
98 ${attrsToSection def.bondConfig}
99 ''
100 + optionalString (def.xfrmConfig != { }) ''
101 [Xfrm]
102 ${attrsToSection def.xfrmConfig}
103 ''
104 + optionalString (def.vrfConfig != { }) ''
105 [VRF]
106 ${attrsToSection def.vrfConfig}
107 ''
108 + optionalString (def.wlanConfig != { }) ''
109 [WLAN]
110 ${attrsToSection def.wlanConfig}
111 ''
112 + optionalString (def.batmanAdvancedConfig != { }) ''
113 [BatmanAdvanced]
114 ${attrsToSection def.batmanAdvancedConfig}
115 ''
116 + def.extraConfig;
117
118 networkToUnit =
119 def:
120 commonMatchText def
121 + optionalString (def.linkConfig != { }) ''
122 [Link]
123 ${attrsToSection def.linkConfig}
124 ''
125 + ''
126 [Network]
127 ''
128 + attrsToSection def.networkConfig
129 + optionalString (def.address != [ ]) ''
130 ${concatStringsSep "\n" (map (s: "Address=${s}") def.address)}
131 ''
132 + optionalString (def.gateway != [ ]) ''
133 ${concatStringsSep "\n" (map (s: "Gateway=${s}") def.gateway)}
134 ''
135 + optionalString (def.dns != [ ]) ''
136 ${concatStringsSep "\n" (map (s: "DNS=${s}") def.dns)}
137 ''
138 + optionalString (def.ntp != [ ]) ''
139 ${concatStringsSep "\n" (map (s: "NTP=${s}") def.ntp)}
140 ''
141 + optionalString (def.bridge != [ ]) ''
142 ${concatStringsSep "\n" (map (s: "Bridge=${s}") def.bridge)}
143 ''
144 + optionalString (def.bond != [ ]) ''
145 ${concatStringsSep "\n" (map (s: "Bond=${s}") def.bond)}
146 ''
147 + optionalString (def.vrf != [ ]) ''
148 ${concatStringsSep "\n" (map (s: "VRF=${s}") def.vrf)}
149 ''
150 + optionalString (def.vlan != [ ]) ''
151 ${concatStringsSep "\n" (map (s: "VLAN=${s}") def.vlan)}
152 ''
153 + optionalString (def.macvlan != [ ]) ''
154 ${concatStringsSep "\n" (map (s: "MACVLAN=${s}") def.macvlan)}
155 ''
156 + optionalString (def.macvtap != [ ]) ''
157 ${concatStringsSep "\n" (map (s: "MACVTAP=${s}") def.macvtap)}
158 ''
159 + optionalString (def.vxlan != [ ]) ''
160 ${concatStringsSep "\n" (map (s: "VXLAN=${s}") def.vxlan)}
161 ''
162 + optionalString (def.tunnel != [ ]) ''
163 ${concatStringsSep "\n" (map (s: "Tunnel=${s}") def.tunnel)}
164 ''
165 + optionalString (def.xfrm != [ ]) ''
166 ${concatStringsSep "\n" (map (s: "Xfrm=${s}") def.xfrm)}
167 ''
168 + "\n"
169 + flip concatMapStrings def.addresses (x: ''
170 [Address]
171 ${attrsToSection x}
172 '')
173 + flip concatMapStrings def.routingPolicyRules (x: ''
174 [RoutingPolicyRule]
175 ${attrsToSection x}
176 '')
177 + flip concatMapStrings def.routes (x: ''
178 [Route]
179 ${attrsToSection x}
180 '')
181 + optionalString (def.dhcpV4Config != { }) ''
182 [DHCPv4]
183 ${attrsToSection def.dhcpV4Config}
184 ''
185 + optionalString (def.dhcpV6Config != { }) ''
186 [DHCPv6]
187 ${attrsToSection def.dhcpV6Config}
188 ''
189 + optionalString (def.dhcpPrefixDelegationConfig != { }) ''
190 [DHCPPrefixDelegation]
191 ${attrsToSection def.dhcpPrefixDelegationConfig}
192 ''
193 + optionalString (def.ipv6AcceptRAConfig != { }) ''
194 [IPv6AcceptRA]
195 ${attrsToSection def.ipv6AcceptRAConfig}
196 ''
197 + optionalString (def.dhcpServerConfig != { }) ''
198 [DHCPServer]
199 ${attrsToSection def.dhcpServerConfig}
200 ''
201 + optionalString (def.ipv6SendRAConfig != { }) ''
202 [IPv6SendRA]
203 ${attrsToSection def.ipv6SendRAConfig}
204 ''
205 + flip concatMapStrings def.ipv6PREF64Prefixes (x: ''
206 [IPv6PREF64Prefix]
207 ${attrsToSection x}
208 '')
209 + flip concatMapStrings def.ipv6Prefixes (x: ''
210 [IPv6Prefix]
211 ${attrsToSection x}
212 '')
213 + flip concatMapStrings def.ipv6RoutePrefixes (x: ''
214 [IPv6RoutePrefix]
215 ${attrsToSection x}
216 '')
217 + flip concatMapStrings def.dhcpServerStaticLeases (x: ''
218 [DHCPServerStaticLease]
219 ${attrsToSection x}
220 '')
221 + optionalString (def.bridgeConfig != { }) ''
222 [Bridge]
223 ${attrsToSection def.bridgeConfig}
224 ''
225 + flip concatMapStrings def.bridgeFDBs (x: ''
226 [BridgeFDB]
227 ${attrsToSection x}
228 '')
229 + flip concatMapStrings def.bridgeMDBs (x: ''
230 [BridgeMDB]
231 ${attrsToSection x}
232 '')
233 + optionalString (def.lldpConfig != { }) ''
234 [LLDP]
235 ${attrsToSection def.lldpConfig}
236 ''
237 + optionalString (def.canConfig != { }) ''
238 [CAN]
239 ${attrsToSection def.canConfig}
240 ''
241 + optionalString (def.ipoIBConfig != { }) ''
242 [IPoIB]
243 ${attrsToSection def.ipoIBConfig}
244 ''
245 + optionalString (def.qdiscConfig != { }) ''
246 [QDisc]
247 ${attrsToSection def.qdiscConfig}
248 ''
249 + optionalString (def.networkEmulatorConfig != { }) ''
250 [NetworkEmulator]
251 ${attrsToSection def.networkEmulatorConfig}
252 ''
253 + optionalString (def.tokenBucketFilterConfig != { }) ''
254 [TokenBucketFilter]
255 ${attrsToSection def.tokenBucketFilterConfig}
256 ''
257 + optionalString (def.pieConfig != { }) ''
258 [PIE]
259 ${attrsToSection def.pieConfig}
260 ''
261 + optionalString (def.flowQueuePIEConfig != { }) ''
262 [FlowQueuePIE]
263 ${attrsToSection def.flowQueuePIEConfig}
264 ''
265 + optionalString (def.stochasticFairBlueConfig != { }) ''
266 [StochasticFairBlue]
267 ${attrsToSection def.stochasticFairBlueConfig}
268 ''
269 + optionalString (def.stochasticFairnessQueueingConfig != { }) ''
270 [StochasticFairnessQueueing]
271 ${attrsToSection def.stochasticFairnessQueueingConfig}
272 ''
273 + optionalString (def.bfifoConfig != { }) ''
274 [BFIFO]
275 ${attrsToSection def.bfifoConfig}
276 ''
277 + optionalString (def.pfifoConfig != { }) ''
278 [PFIFO]
279 ${attrsToSection def.pfifoConfig}
280 ''
281 + optionalString (def.pfifoHeadDropConfig != { }) ''
282 [PFIFOHeadDrop]
283 ${attrsToSection def.pfifoHeadDropConfig}
284 ''
285 + optionalString (def.pfifoFastConfig != { }) ''
286 [PFIFOFast]
287 ${attrsToSection def.pfifoFastConfig}
288 ''
289 + optionalString (def.cakeConfig != { }) ''
290 [CAKE]
291 ${attrsToSection def.cakeConfig}
292 ''
293 + optionalString (def.controlledDelayConfig != { }) ''
294 [ControlledDelay]
295 ${attrsToSection def.controlledDelayConfig}
296 ''
297 + optionalString (def.deficitRoundRobinSchedulerConfig != { }) ''
298 [DeficitRoundRobinScheduler]
299 ${attrsToSection def.deficitRoundRobinSchedulerConfig}
300 ''
301 + optionalString (def.deficitRoundRobinSchedulerClassConfig != { }) ''
302 [DeficitRoundRobinSchedulerClass]
303 ${attrsToSection def.deficitRoundRobinSchedulerClassConfig}
304 ''
305 + optionalString (def.enhancedTransmissionSelectionConfig != { }) ''
306 [EnhancedTransmissionSelection]
307 ${attrsToSection def.enhancedTransmissionSelectionConfig}
308 ''
309 + optionalString (def.genericRandomEarlyDetectionConfig != { }) ''
310 [GenericRandomEarlyDetection]
311 ${attrsToSection def.genericRandomEarlyDetectionConfig}
312 ''
313 + optionalString (def.fairQueueingControlledDelayConfig != { }) ''
314 [FairQueueingControlledDelay]
315 ${attrsToSection def.fairQueueingControlledDelayConfig}
316 ''
317 + optionalString (def.fairQueueingConfig != { }) ''
318 [FairQueueing]
319 ${attrsToSection def.fairQueueingConfig}
320 ''
321 + optionalString (def.trivialLinkEqualizerConfig != { }) ''
322 [TrivialLinkEqualizer]
323 ${attrsToSection def.trivialLinkEqualizerConfig}
324 ''
325 + optionalString (def.hierarchyTokenBucketConfig != { }) ''
326 [HierarchyTokenBucket]
327 ${attrsToSection def.hierarchyTokenBucketConfig}
328 ''
329 + optionalString (def.hierarchyTokenBucketClassConfig != { }) ''
330 [HierarchyTokenBucketClass]
331 ${attrsToSection def.hierarchyTokenBucketClassConfig}
332 ''
333 + optionalString (def.heavyHitterFilterConfig != { }) ''
334 [HeavyHitterFilter]
335 ${attrsToSection def.heavyHitterFilterConfig}
336 ''
337 + optionalString (def.quickFairQueueingConfig != { }) ''
338 [QuickFairQueueing]
339 ${attrsToSection def.quickFairQueueingConfig}
340 ''
341 + optionalString (def.quickFairQueueingConfigClass != { }) ''
342 [QuickFairQueueingClass]
343 ${attrsToSection def.quickFairQueueingConfigClass}
344 ''
345 + flip concatMapStrings def.bridgeVLANs (x: ''
346 [BridgeVLAN]
347 ${attrsToSection x}
348 '')
349 + def.extraConfig;
350
351}