liminix

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 69e6eb5a898234dad82176b3c69bbc491ac5930d
parent 9441f48819ae1b385fc340385d6d7e90c575afae
Author: Daniel Barlow <dan@telent.net>
Date:   Fri, 14 Jul 2023 16:53:36 +0100

accept attr args to pppoe service, and typecheck them

We use (abuse, arguably) the nixos module system for typechecking.  Un
the plus side, it gives us documentation of the options and their
expected types. On the downside, the error message doesn't tell us
the file in which the error was encountered.

(This is subject to change, if I can find a better way)

Diffstat:
Mexamples/rotuer.nix | 3++-
Mmodules/ppp.nix | 2+-
Mpkgs/liminix-tools/networking/pppoe.nix | 23++++++++++++++++++-----
3 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/examples/rotuer.nix b/examples/rotuer.nix @@ -191,7 +191,8 @@ in rec { services.wan = let iface = config.hardware.networkInterfaces.wan; - in config.system.service.pppoe iface { + in config.system.service.pppoe { + interface = iface; ppp-options = [ "debug" "+ipv6" "noauth" "name" secrets.l2tp.name diff --git a/modules/ppp.nix b/modules/ppp.nix @@ -6,7 +6,7 @@ let in { options = { system.service.pppoe = mkOption { - type = types.functionTo (types.functionTo types.package); + type = types.functionTo types.package; }; }; config = { diff --git a/pkgs/liminix-tools/networking/pppoe.nix b/pkgs/liminix-tools/networking/pppoe.nix @@ -8,13 +8,26 @@ } : let inherit (liminix.services) longrun; + inherit (lib) + mergeDefinitions + mkEnableOption mkOption isType types isDerivation hasAttr; + t = { + interface = mkOption { + type = types.package; # actually a service + description = "ethernet interface to run PPPoE over"; + }; + ppp-options = mkOption { + type = types.listOf types.str; + }; + }; + t' = types.submodule { options = t; }; + typeChecked = type: value: + let defs = [{ file = "pppoe.nix"; inherit value; }]; + in (lib.mergeDefinitions [ ] type defs).mergedValue; in -interface: { - synchronous ? false -, ppp-options ? [] -, ... -} @ args: +params: let + inherit (typeChecked t' params) ppp-options interface; name = "${interface.device}.pppoe"; ip-up = writeAshScript "ip-up" {} '' . ${serviceFns}