mirror of https://gerrit.hackerspace.pl/hscloud
76 lines
2.0 KiB
Nix
76 lines
2.0 KiB
Nix
# A small Ethernet-over-IP service implementation.
|
|
# Yes, that's the Mikrotik EoIP implementation. This one is somewhat sketchy
|
|
# (notably, it pumps huge zero-padded frames into tap), so doesn't use it for
|
|
# production. We currently only use it in the edge01.waw test framework to
|
|
# bring vlans across test VMs.
|
|
|
|
{ config, pkgs, lib, ... }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
eoip = pkgs.stdenv.mkDerivation {
|
|
pname = "eoip";
|
|
version = "20180119";
|
|
nativeBuildInputs = with pkgs; [ cmake ];
|
|
src = pkgs.fetchFromGitHub {
|
|
owner = "amphineko";
|
|
repo = "eoiptapd";
|
|
rev = "5573a905bcbc001b503308665f098e82f451dc33";
|
|
sha256 = "0np9dzcw5w6jarzdv2yh3mbzz0wgw10sjqyi6pxan4ipr75v1b8s";
|
|
};
|
|
installPhase = ''
|
|
mkdir -p $out/bin
|
|
cp eoiptapd $out/bin/eoiptapd
|
|
'';
|
|
};
|
|
|
|
cfg = config.hscloud.eoip;
|
|
|
|
in {
|
|
options.hscloud.eoip = {
|
|
interfaces = mkOption {
|
|
type = with types; attrsOf (submodule {
|
|
options = {
|
|
localV4 = mkOption {
|
|
type = types.str;
|
|
description = "Local outer IPv4 address";
|
|
};
|
|
remoteV4 = mkOption {
|
|
type = types.str;
|
|
description = "Remote outer IPv4 address";
|
|
};
|
|
id = mkOption {
|
|
type = types.int;
|
|
description = "Tunnel ID";
|
|
};
|
|
parent = mkOption {
|
|
type = types.str;
|
|
description = "Parent/outer device";
|
|
};
|
|
};
|
|
});
|
|
description = ''
|
|
EoIP interfaces to create.
|
|
'';
|
|
};
|
|
};
|
|
|
|
config.systemd.services = mapAttrs' (name: value: nameValuePair "${name}-eoip" {
|
|
wantedBy = [ "network.target" ];
|
|
wants = [
|
|
"${name}-netdev.service"
|
|
"network-addresses-${value.parent}.service"
|
|
];
|
|
after = [
|
|
"network-addresses-${value.parent}.service"
|
|
];
|
|
serviceConfig = {
|
|
Type = "simple";
|
|
ExecStart = "${eoip}/bin/eoiptapd -i ${name} -l ${value.localV4} -r ${value.remoteV4} -t ${toString value.id}";
|
|
Restart = "always";
|
|
RestartSec = "1";
|
|
};
|
|
}) cfg.interfaces;
|
|
}
|