diff --git a/modules/network/default.nix b/modules/network/default.nix index 9045f1d..3465932 100644 --- 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 new file mode 100644 index 0000000..ed665b3 --- /dev/null +++ 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 index 5c69908..84af526 100644 --- 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";