From 270426ab6e55cbd07ac0e3c07ae693dbaaa1fd3a Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Fri, 3 Dec 2021 12:15:20 +0000 Subject: [PATCH 1/4] pkgs.pkgsModule: init Having `pkgs` as a module argument is common, beyond just NixOS, making this a useful convenience for setting it. (cherry picked from commit dd6d8e3f0c38370ac8fb082ea7a3be06c949deed) --- pkgs/top-level/all-packages.nix | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index d1e2011a4cfb3..b703139bebd75 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -33245,6 +33245,20 @@ with pkgs; in c.config.system.build // c; + /* + A NixOS/home-manager/arion/... module that sets the `pkgs` module argument. + */ + pkgsModule = { lib, options, ... }: { + config = + if options?nixpkgs.pkgs then { + # legacy / nixpkgs.nix style + nixpkgs.pkgs = pkgs; + } + else { + # minimal + _module.args.pkgs = pkgs; + }; + }; /* * Run a NixOS VM network test using this evaluation of Nixpkgs. From 9809e1575bf01f845e8ff3b76b1ac7166d2ca945 Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Fri, 3 Dec 2021 12:21:16 +0000 Subject: [PATCH 2/4] nixos/etc.nix: Make independent (cherry picked from commit 56c283e5c8dfd4d8d5daa15dfa3896beef2ac012) --- nixos/modules/module-list.nix | 2 +- nixos/modules/system/etc/etc-activation.nix | 12 ++++ nixos/modules/system/etc/etc.nix | 6 +- nixos/modules/system/etc/test.nix | 70 +++++++++++++++++++++ nixos/tests/all-tests.nix | 1 + 5 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 nixos/modules/system/etc/etc-activation.nix create mode 100644 nixos/modules/system/etc/test.nix diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 643c787aa88dc..eba091d5ac23f 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -1157,7 +1157,7 @@ ./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 diff --git a/nixos/modules/system/etc/etc-activation.nix b/nixos/modules/system/etc/etc-activation.nix new file mode 100644 index 0000000000000..7801049501860 --- /dev/null +++ b/nixos/modules/system/etc/etc-activation.nix @@ -0,0 +1,12 @@ +{ config, lib, ... }: +let + inherit (lib) stringAfter; +in { + + imports = [ ./etc.nix ]; + + config = { + system.activationScripts.etc = + stringAfter [ "users" "groups" ] config.system.build.etcActivationCommands; + }; +} diff --git a/nixos/modules/system/etc/etc.nix b/nixos/modules/system/etc/etc.nix index 6cc8c341e6dfa..ed552fecec53a 100644 --- a/nixos/modules/system/etc/etc.nix +++ b/nixos/modules/system/etc/etc.nix @@ -66,6 +66,8 @@ in { + imports = [ ../build.nix ]; + ###### interface options = { @@ -188,14 +190,12 @@ in 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 ''; - }; } diff --git a/nixos/modules/system/etc/test.nix b/nixos/modules/system/etc/test.nix new file mode 100644 index 0000000000000..5e43b155038d9 --- /dev/null +++ b/nixos/modules/system/etc/test.nix @@ -0,0 +1,70 @@ +{ 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"' + ''; + +} diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index b0e7702e9b867..49fe5a7b4117c 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -140,6 +140,7 @@ in 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 {}; From f6e41af1e4a3e0bc7fb3ef2c8d163cfbc4b39fb8 Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Thu, 20 Jan 2022 15:36:43 +0100 Subject: [PATCH 3/4] fakechroot: Add tests.nixos-etc --- pkgs/tools/system/fakechroot/default.nix | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pkgs/tools/system/fakechroot/default.nix b/pkgs/tools/system/fakechroot/default.nix index 382a47039ba86..fd8fa04d21d2c 100644 --- a/pkgs/tools/system/fakechroot/default.nix +++ b/pkgs/tools/system/fakechroot/default.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, fetchFromGitHub, fetchpatch, autoreconfHook, perl }: +{ lib, stdenv, fetchFromGitHub, fetchpatch, autoreconfHook, nixosTests, perl }: stdenv.mkDerivation rec { pname = "fakechroot"; @@ -44,6 +44,13 @@ stdenv.mkDerivation rec { nativeBuildInputs = [ autoreconfHook ]; buildInputs = [ perl ]; + passthru = { + tests = { + # A lightweight *unit* test that exercises fakeroot and fakechroot together: + nixos-etc = nixosTests.etc.test-etc-fakeroot; + }; + }; + meta = with lib; { homepage = "https://github.com/dex4er/fakechroot"; description = "Give a fake chroot environment through LD_PRELOAD"; From 7de8ea8ddde93cdbd8e292be45bd1c5c4b76b2be Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Thu, 20 Jan 2022 15:36:53 +0100 Subject: [PATCH 4/4] fakeroot: Add tests.nixos-etc --- pkgs/tools/system/fakeroot/default.nix | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pkgs/tools/system/fakeroot/default.nix b/pkgs/tools/system/fakeroot/default.nix index c4d3845df8034..ad75374e30937 100644 --- a/pkgs/tools/system/fakeroot/default.nix +++ b/pkgs/tools/system/fakeroot/default.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, fetchurl, fetchpatch, getopt, libcap, gnused }: +{ lib, stdenv, fetchurl, fetchpatch, getopt, libcap, gnused, nixosTests }: stdenv.mkDerivation rec { version = "1.23"; @@ -65,6 +65,13 @@ stdenv.mkDerivation rec { patch -p1 < ${patch-wraptmpf} ''; + passthru = { + tests = { + # A lightweight *unit* test that exercises fakeroot and fakechroot together: + nixos-etc = nixosTests.etc.test-etc-fakeroot; + }; + }; + meta = { homepage = "https://salsa.debian.org/clint/fakeroot"; description = "Give a fake root environment through LD_PRELOAD";