One thing that bothered me when working with containers in NixOs is that I had to change my system configuration file when switching from wifi to ethernet or back and then run nixos-rebuild in order to keep NAT (network address translation) and therefore internet access working. I would have something like this in my config:
nat.enable = true; nat.internalInterfaces = ["ve-+"]; nat.externalInterface = "wlp3s0";
That was fine as long as I was on wifi. But every time I switched to ethernet I had to open the configuration file, find the correct spot, enter the ethernet interface name, save and run nixos-rebuild. So I pulled out the external interface name into its separate file:
nat.enable = true; nat.internalInterfaces = ["ve-+"]; nat.externalInterface = pkgs.lib.removeSuffix "\n" (builtins.readFile ./nat_if);
builtins.readFile will get the contents of the given file. They will be treated as if they had been given as a literal string. pkgs.lib.removeSuffix "\n" will ignore any newline character after the interface name.
Now it's enough to do something like
echo "enp0s31f6" > ./nat_if
and then run nixos-rebuild. And with a little shell script it comes down to one command, and I don't even have to type the interface name:
FILE=/pat/to/nat_if; ETH="enp0s31f6" WIFI="wlp3s0" FROM_IF=$(cat $FILE); if [[ $1 == "" ]]; then if [[ $FROM_IF == $WIFI ]]; then TO_IF=$ETH; else TO_IF=$WIFI; fi else TO_IF=$1; fi echo "Switching from $FROM_IF to $TO_IF" echo "Enter to continue" read echo $TO_IF > $FILE; sudo nixos-rebuild switch;
It still takes a little longer than I'd like, but it's a lot smoother than before, and it was fun to hack up.