2017-01-17 13:45:43 +00:00
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
with lib;
|
|
|
|
|
|
|
|
let
|
|
|
|
|
|
|
|
cfg = config.services.babeld;
|
|
|
|
|
2017-11-10 10:46:11 +00:00
|
|
|
conditionalBoolToString = value: if (isBool value) then (boolToString value) else (toString value);
|
|
|
|
|
2017-01-17 13:45:43 +00:00
|
|
|
paramsString = params:
|
2017-11-10 10:46:11 +00:00
|
|
|
concatMapStringsSep " " (name: "${name} ${conditionalBoolToString (getAttr name params)}")
|
2017-01-17 13:45:43 +00:00
|
|
|
(attrNames params);
|
|
|
|
|
|
|
|
interfaceConfig = name:
|
|
|
|
let
|
|
|
|
interface = getAttr name cfg.interfaces;
|
|
|
|
in
|
|
|
|
"interface ${name} ${paramsString interface}\n";
|
|
|
|
|
|
|
|
configFile = with cfg; pkgs.writeText "babeld.conf" (
|
|
|
|
(optionalString (cfg.interfaceDefaults != null) ''
|
|
|
|
default ${paramsString cfg.interfaceDefaults}
|
|
|
|
'')
|
|
|
|
+ (concatMapStrings interfaceConfig (attrNames cfg.interfaces))
|
|
|
|
+ extraConfig);
|
|
|
|
|
|
|
|
in
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
###### interface
|
|
|
|
|
|
|
|
options = {
|
|
|
|
|
|
|
|
services.babeld = {
|
|
|
|
|
|
|
|
enable = mkOption {
|
|
|
|
default = false;
|
|
|
|
description = ''
|
|
|
|
Whether to run the babeld network routing daemon.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
interfaceDefaults = mkOption {
|
|
|
|
default = null;
|
|
|
|
description = ''
|
|
|
|
A set describing default parameters for babeld interfaces.
|
|
|
|
See <citerefentry><refentrytitle>babeld</refentrytitle><manvolnum>8</manvolnum></citerefentry> for options.
|
|
|
|
'';
|
|
|
|
type = types.nullOr (types.attrsOf types.unspecified);
|
|
|
|
example =
|
|
|
|
{
|
2017-11-10 10:47:38 +00:00
|
|
|
type = "tunnel";
|
2017-01-17 13:45:43 +00:00
|
|
|
"split-horizon" = true;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
interfaces = mkOption {
|
|
|
|
default = {};
|
|
|
|
description = ''
|
|
|
|
A set describing babeld interfaces.
|
|
|
|
See <citerefentry><refentrytitle>babeld</refentrytitle><manvolnum>8</manvolnum></citerefentry> for options.
|
|
|
|
'';
|
|
|
|
type = types.attrsOf (types.attrsOf types.unspecified);
|
|
|
|
example =
|
|
|
|
{ enp0s2 =
|
2017-11-10 10:47:38 +00:00
|
|
|
{ type = "wired";
|
2017-01-17 13:45:43 +00:00
|
|
|
"hello-interval" = 5;
|
|
|
|
"split-horizon" = "auto";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
extraConfig = mkOption {
|
|
|
|
default = "";
|
|
|
|
description = ''
|
|
|
|
Options that will be copied to babeld.conf.
|
|
|
|
See <citerefentry><refentrytitle>babeld</refentrytitle><manvolnum>8</manvolnum></citerefentry> for details.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
###### implementation
|
|
|
|
|
|
|
|
config = mkIf config.services.babeld.enable {
|
|
|
|
|
|
|
|
systemd.services.babeld = {
|
|
|
|
description = "Babel routing daemon";
|
|
|
|
after = [ "network.target" ];
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
|
|
|
serviceConfig.ExecStart = "${pkgs.babeld}/bin/babeld -c ${configFile}";
|
|
|
|
};
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|