nixos/etc.nix: Make independent

(cherry picked from commit 56c283e5c8dfd4d8d5daa15dfa3896beef2ac012)

Changed files
+87 -4
nixos
+1 -1
nixos/modules/module-list.nix
···
./system/boot/systemd-nspawn.nix
./system/boot/timesyncd.nix
./system/boot/tmp.nix
-
./system/etc/etc.nix
+
./system/etc/etc-activation.nix
./tasks/auto-upgrade.nix
./tasks/bcache.nix
./tasks/cpu-freq.nix
+12
nixos/modules/system/etc/etc-activation.nix
···
+
{ config, lib, ... }:
+
let
+
inherit (lib) stringAfter;
+
in {
+
+
imports = [ ./etc.nix ];
+
+
config = {
+
system.activationScripts.etc =
+
stringAfter [ "users" "groups" ] config.system.build.etcActivationCommands;
+
};
+
}
+3 -3
nixos/modules/system/etc/etc.nix
···
{
+
imports = [ ../build.nix ];
+
###### interface
options = {
···
config = {
system.build.etc = etc;
-
-
system.activationScripts.etc = stringAfter [ "users" "groups" ]
+
system.build.etcActivationCommands =
''
# Set up the statically computed bits of /etc.
echo "setting up /etc..."
${pkgs.perl.withPackages (p: [ p.FileSlurp ])}/bin/perl ${./setup-etc.pl} ${etc}/etc
'';
-
};
}
+70
nixos/modules/system/etc/test.nix
···
+
{ lib
+
, coreutils
+
, fakechroot
+
, fakeroot
+
, evalMinimalConfig
+
, pkgsModule
+
, runCommand
+
, util-linux
+
, vmTools
+
, writeText
+
}:
+
let
+
node = evalMinimalConfig ({ config, ... }: {
+
imports = [ pkgsModule ../etc/etc.nix ];
+
environment.etc."passwd" = {
+
text = passwdText;
+
};
+
environment.etc."hosts" = {
+
text = hostsText;
+
mode = "0751";
+
};
+
});
+
passwdText = ''
+
root:x:0:0:System administrator:/root:/run/current-system/sw/bin/bash
+
'';
+
hostsText = ''
+
127.0.0.1 localhost
+
::1 localhost
+
# testing...
+
'';
+
in
+
lib.recurseIntoAttrs {
+
test-etc-vm =
+
vmTools.runInLinuxVM (runCommand "test-etc-vm" { } ''
+
mkdir -p /etc
+
${node.config.system.build.etcActivationCommands}
+
set -x
+
[[ -L /etc/passwd ]]
+
diff /etc/passwd ${writeText "expected-passwd" passwdText}
+
[[ 751 = $(stat --format %a /etc/hosts) ]]
+
diff /etc/hosts ${writeText "expected-hosts" hostsText}
+
set +x
+
touch $out
+
'');
+
+
# fakeroot is behaving weird
+
test-etc-fakeroot =
+
runCommand "test-etc"
+
{
+
nativeBuildInputs = [
+
fakeroot
+
fakechroot
+
# for chroot
+
coreutils
+
# fakechroot needs getopt, which is provided by util-linux
+
util-linux
+
];
+
fakeRootCommands = ''
+
mkdir -p /etc
+
${node.config.system.build.etcActivationCommands}
+
diff /etc/hosts ${writeText "expected-hosts" hostsText}
+
touch $out
+
'';
+
} ''
+
mkdir fake-root
+
export FAKECHROOT_EXCLUDE_PATH=/dev:/proc:/sys:${builtins.storeDir}:$out
+
fakechroot fakeroot chroot $PWD/fake-root bash -c 'source $stdenv/setup; eval "$fakeRootCommands"'
+
'';
+
+
}
+1
nixos/tests/all-tests.nix
···
env = handleTest ./env.nix {};
ergo = handleTest ./ergo.nix {};
ergochat = handleTest ./ergochat.nix {};
+
etc = pkgs.callPackage ../modules/system/etc/test.nix { inherit evalMinimalConfig; };
etcd = handleTestOn ["x86_64-linux"] ./etcd.nix {};
etcd-cluster = handleTestOn ["x86_64-linux"] ./etcd-cluster.nix {};
etebase-server = handleTest ./etebase-server.nix {};