liminix/pkgs/liminix-tools/networking/default.nix

58 lines
1.8 KiB
Nix

{
callPackage
, liminix
, ifwait
, lib
}:
let
inherit (liminix.services) oneshot longrun;
inherit (lib) concatStringsSep optional;
in {
interface = { type ? "hardware", device, primary ? null, dependencies ? [] } @ args:
let ups =
[]
++ optional (type == "bridge")
"ip link add name ${device} type bridge"
++ ["${ifwait}/bin/ifwait -v ${device} present"]
++ ["ip link set up dev ${device}"]
++ optional (primary != null)
"ip link set dev ${device} master ${primary.device}";
in oneshot {
name = "${device}.link";
up = lib.concatStringsSep "\n" ups;
down = "ip link set down dev ${device}";
dependencies = dependencies ++ lib.optional (primary != null) primary;
} // {
inherit device;
};
address = interface: { family, dependencies ? [], prefixLength, address } @ args:
let inherit (builtins) toString;
in oneshot {
dependencies = [ interface ] ++ dependencies;
name = "${interface.device}.addr.${address}";
up = "ip address add ${address}/${toString prefixLength} dev ${interface.device} ";
down = "ip address del ${address}/${toString prefixLength} dev ${interface.device} ";
} // {
inherit (interface) device;
};
udhcpc = callPackage ./udhcpc.nix {};
odhcpc = interface: { ... } @ args: longrun {
name = "${interface.device}.odhcp";
run = "odhcpcd ${interface.device}";
};
pppoe = callPackage ./pppoe.nix {};
dnsmasq = callPackage ./dnsmasq.nix {};
hostapd = callPackage ./hostapd.nix {};
route = { name, target, via, dependencies }:
oneshot {
inherit name;
up = ''
ip route add ${target} via ${via}
'';
down = ''
ip route del ${target} via ${via}
'';
inherit dependencies;
};
}