commit 00c8ea66eae7ad08a69abc48e9b54928ced75542
parent 31f0213b6fc66534125e27ebf082c133ff2cc62e
Author: Daniel Barlow <dan@telent.net>
Date: Mon, 28 Aug 2023 15:10:53 +0100
add service fir dhcp v4 client
Diffstat:
3 files changed, 65 insertions(+), 7 deletions(-)
diff --git a/modules/network/default.nix b/modules/network/default.nix
@@ -20,6 +20,14 @@ in {
description = "network interface address";
type = liminix.lib.types.serviceDefn;
};
+ dhcp = {
+ client = mkOption {
+ # this needs to move to its own service as it has
+ # busybox config
+ description = "DHCP v4 client";
+ type = liminix.lib.types.serviceDefn;
+ };
+ };
};
};
config = {
@@ -49,6 +57,12 @@ in {
type = types.ints.between 0 128;
};
};
+ dhcp.client = liminix.callService ./dhcpc.nix {
+ interface = mkOption {
+ type = liminix.lib.types.service;
+ };
+ };
+
};
};
}
diff --git a/modules/network/dhcpc.nix b/modules/network/dhcpc.nix
@@ -0,0 +1,46 @@
+{
+ liminix
+, writeAshScript
+, serviceFns
+, lib
+} :
+{ interface }:
+let
+ inherit (liminix.services) longrun;
+ name = "${interface.name}.dhcpc";
+ script = writeAshScript "dhcp-notify" { } ''
+ . ${serviceFns}
+ exec 2>&1
+ action=$1
+
+ set_address() {
+ ip address replace $ip/$mask dev $interface
+ (in_outputs ${name}
+ for i in lease mask ip router siaddr dns serverid subnet opt53 interface ; do
+ printenv $i > $i
+ done)
+ }
+ case $action in
+ deconfig)
+ ip address flush $interface
+ ip link set up dev $interface
+ ;;
+ bound)
+ # this doesn't actually replace, it adds a new address.
+ set_address
+ echo >/proc/self/fd/10
+ ;;
+ renew)
+ set_address
+ ;;
+ nak)
+ echo "received NAK on $interface"
+ ;;
+ esac
+ '';
+in longrun {
+ inherit name;
+ run = "/bin/udhcpc -f -i $(output ${interface} ifname) -x hostname:$(cat /proc/sys/kernel/hostname) -s ${script}";
+ notification-fd = 10;
+ dependencies = [ interface ];
+}
diff --git a/vanilla-configuration.nix b/vanilla-configuration.nix
@@ -1,23 +1,21 @@
{ config, pkgs, ... } :
let
- inherit (pkgs.liminix.networking) interface address udhcpc odhcpc route;
+ inherit (pkgs.liminix.networking) interface address route;
inherit (pkgs.liminix.services) oneshot longrun bundle target;
inherit (pkgs) writeText;
+ svc = config.system.service;
in rec {
imports = [
./modules/tftpboot.nix
./modules/wlan.nix
+ ./modules/network
./modules/ntp
];
services.loopback = config.hardware.networkInterfaces.lo;
services.dhcpv4 =
- let iface = interface { type = "hardware"; device = "eth1"; };
- in udhcpc iface {};
-
- services.dhcpv6 =
- let iface = interface { type = "hardware"; device = "eth1"; };
- in odhcpc iface { uid = "e7"; };
+ let iface = svc.network.link.build { ifname = "eth1"; };
+ in svc.network.dhcp.client.build { interface = iface; };
services.defaultroute4 = route {
name = "defautlrote";