mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-11-13 19:29:15 +01:00
the conversion procedure is simple: - find all things that look like options, ie calls to either `mkOption` or `lib.mkOption` that take an attrset. remember the attrset as the option - for all options, find a `description` attribute who's value is not a call to `mdDoc` or `lib.mdDoc` - textually convert the entire value of the attribute to MD with a few simple regexes (the set from mdize-module.sh) - if the change produced a change in the manual output, discard - if the change kept the manual unchanged, add some text to the description to make sure we've actually found an option. if the manual changes this time, keep the converted description this procedure converts 80% of nixos options to markdown. around 2000 options remain to be inspected, but most of those fail the "does not change the manual output check": currently the MD conversion process does not faithfully convert docbook tags like <code> and <package>, so any option using such tags will not be converted at all.
149 lines
4.4 KiB
Nix
149 lines
4.4 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
|
|
cfg = config.boot.initrd.network;
|
|
|
|
dhcpInterfaces = lib.attrNames (lib.filterAttrs (iface: v: v.useDHCP == true) (config.networking.interfaces or {}));
|
|
doDhcp = config.networking.useDHCP || dhcpInterfaces != [];
|
|
dhcpIfShellExpr = if config.networking.useDHCP
|
|
then "$(ls /sys/class/net/ | grep -v ^lo$)"
|
|
else lib.concatMapStringsSep " " lib.escapeShellArg dhcpInterfaces;
|
|
|
|
udhcpcScript = pkgs.writeScript "udhcp-script"
|
|
''
|
|
#! /bin/sh
|
|
if [ "$1" = bound ]; then
|
|
ip address add "$ip/$mask" dev "$interface"
|
|
if [ -n "$mtu" ]; then
|
|
ip link set mtu "$mtu" dev "$interface"
|
|
fi
|
|
if [ -n "$staticroutes" ]; then
|
|
echo "$staticroutes" \
|
|
| sed -r "s@(\S+) (\S+)@ ip route add \"\1\" via \"\2\" dev \"$interface\" ; @g" \
|
|
| sed -r "s@ via \"0\.0\.0\.0\"@@g" \
|
|
| /bin/sh
|
|
fi
|
|
if [ -n "$router" ]; then
|
|
ip route add "$router" dev "$interface" # just in case if "$router" is not within "$ip/$mask" (e.g. Hetzner Cloud)
|
|
ip route add default via "$router" dev "$interface"
|
|
fi
|
|
if [ -n "$dns" ]; then
|
|
rm -f /etc/resolv.conf
|
|
for server in $dns; do
|
|
echo "nameserver $server" >> /etc/resolv.conf
|
|
done
|
|
fi
|
|
fi
|
|
'';
|
|
|
|
udhcpcArgs = toString cfg.udhcpc.extraArgs;
|
|
|
|
in
|
|
|
|
{
|
|
|
|
options = {
|
|
|
|
boot.initrd.network.enable = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
description = ''
|
|
Add network connectivity support to initrd. The network may be
|
|
configured using the <literal>ip</literal> kernel parameter,
|
|
as described in <link
|
|
xlink:href="https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt">the
|
|
kernel documentation</link>. Otherwise, if
|
|
<option>networking.useDHCP</option> is enabled, an IP address
|
|
is acquired using DHCP.
|
|
|
|
You should add the module(s) required for your network card to
|
|
boot.initrd.availableKernelModules.
|
|
<literal>lspci -v | grep -iA8 'network\|ethernet'</literal>
|
|
will tell you which.
|
|
'';
|
|
};
|
|
|
|
boot.initrd.network.flushBeforeStage2 = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
description = lib.mdDoc ''
|
|
Whether to clear the configuration of the interfaces that were set up in
|
|
the initrd right before stage 2 takes over. Stage 2 will do the regular network
|
|
configuration based on the NixOS networking options.
|
|
'';
|
|
};
|
|
|
|
boot.initrd.network.udhcpc.extraArgs = mkOption {
|
|
default = [];
|
|
type = types.listOf types.str;
|
|
description = lib.mdDoc ''
|
|
Additional command-line arguments passed verbatim to udhcpc if
|
|
{option}`boot.initrd.network.enable` and {option}`networking.useDHCP`
|
|
are enabled.
|
|
'';
|
|
};
|
|
|
|
boot.initrd.network.postCommands = mkOption {
|
|
default = "";
|
|
type = types.lines;
|
|
description = lib.mdDoc ''
|
|
Shell commands to be executed after stage 1 of the
|
|
boot has initialised the network.
|
|
'';
|
|
};
|
|
|
|
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
boot.initrd.kernelModules = [ "af_packet" ];
|
|
|
|
boot.initrd.extraUtilsCommands = ''
|
|
copy_bin_and_libs ${pkgs.klibc}/lib/klibc/bin.static/ipconfig
|
|
'';
|
|
|
|
boot.initrd.preLVMCommands = mkBefore (
|
|
# Search for interface definitions in command line.
|
|
''
|
|
ifaces=""
|
|
for o in $(cat /proc/cmdline); do
|
|
case $o in
|
|
ip=*)
|
|
ipconfig $o && ifaces="$ifaces $(echo $o | cut -d: -f6)"
|
|
;;
|
|
esac
|
|
done
|
|
''
|
|
|
|
# Otherwise, use DHCP.
|
|
+ optionalString doDhcp ''
|
|
# Bring up all interfaces.
|
|
for iface in ${dhcpIfShellExpr}; do
|
|
echo "bringing up network interface $iface..."
|
|
ip link set "$iface" up && ifaces="$ifaces $iface"
|
|
done
|
|
|
|
# Acquire DHCP leases.
|
|
for iface in ${dhcpIfShellExpr}; do
|
|
echo "acquiring IP address via DHCP on $iface..."
|
|
udhcpc --quit --now -i $iface -O staticroutes --script ${udhcpcScript} ${udhcpcArgs}
|
|
done
|
|
''
|
|
|
|
+ cfg.postCommands);
|
|
|
|
boot.initrd.postMountCommands = mkIf cfg.flushBeforeStage2 ''
|
|
for iface in $ifaces; do
|
|
ip address flush "$iface"
|
|
ip link set "$iface" down
|
|
done
|
|
'';
|
|
|
|
};
|
|
|
|
}
|