diff options
author | Alyssa Ross <hi@alyssa.is> | 2021-09-08 17:57:14 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2021-09-13 11:31:47 +0000 |
commit | ee7984efa14902a2ddd820c937457667a4f40c6a (patch) | |
tree | c9c1d046733cefe5e21fdd8a52104175d47b2443 /nixpkgs/nixos/modules/system/etc | |
parent | ffc9d4ba381da62fd08b361bacd1e71e2a3d934d (diff) | |
parent | b3c692172e5b5241b028a98e1977f9fb12eeaf42 (diff) | |
download | nixlib-ee7984efa14902a2ddd820c937457667a4f40c6a.tar nixlib-ee7984efa14902a2ddd820c937457667a4f40c6a.tar.gz nixlib-ee7984efa14902a2ddd820c937457667a4f40c6a.tar.bz2 nixlib-ee7984efa14902a2ddd820c937457667a4f40c6a.tar.lz nixlib-ee7984efa14902a2ddd820c937457667a4f40c6a.tar.xz nixlib-ee7984efa14902a2ddd820c937457667a4f40c6a.tar.zst nixlib-ee7984efa14902a2ddd820c937457667a4f40c6a.zip |
Merge commit 'b3c692172e5b5241b028a98e1977f9fb12eeaf42'
Diffstat (limited to 'nixpkgs/nixos/modules/system/etc')
-rw-r--r-- | nixpkgs/nixos/modules/system/etc/etc.nix | 73 | ||||
-rw-r--r-- | nixpkgs/nixos/modules/system/etc/make-etc.sh | 45 |
2 files changed, 56 insertions, 62 deletions
diff --git a/nixpkgs/nixos/modules/system/etc/etc.nix b/nixpkgs/nixos/modules/system/etc/etc.nix index a450f303572e..84468ea31f74 100644 --- a/nixpkgs/nixos/modules/system/etc/etc.nix +++ b/nixpkgs/nixos/modules/system/etc/etc.nix @@ -6,23 +6,62 @@ with lib; let - etc' = filter (f: f.enable) (attrValues config.environment.etc); - - etc = pkgs.stdenvNoCC.mkDerivation { - name = "etc"; - - builder = ./make-etc.sh; - - preferLocalBuild = true; - allowSubstitutes = false; - - /* !!! Use toXML. */ - sources = map (x: x.source) etc'; - targets = map (x: x.target) etc'; - modes = map (x: x.mode) etc'; - users = map (x: x.user) etc'; - groups = map (x: x.group) etc'; - }; + # if the source is a local file, it should be imported to the store + localToStore = mapAttrs (name: value: if name == "source" then "${value}" else value); + etc' = map localToStore (filter (f: f.enable) (attrValues config.environment.etc)); + + etc = pkgs.runCommandLocal "etc" { + # This is needed for the systemd module + passthru.targets = map (x: x.target) etc'; + } /* sh */ '' + set -euo pipefail + + makeEtcEntry() { + src="$1" + target="$2" + mode="$3" + user="$4" + group="$5" + + if [[ "$src" = *'*'* ]]; then + # If the source name contains '*', perform globbing. + mkdir -p "$out/etc/$target" + for fn in $src; do + ln -s "$fn" "$out/etc/$target/" + done + else + + mkdir -p "$out/etc/$(dirname "$target")" + if ! [ -e "$out/etc/$target" ]; then + ln -s "$src" "$out/etc/$target" + else + echo "duplicate entry $target -> $src" + if [ "$(readlink "$out/etc/$target")" != "$src" ]; then + echo "mismatched duplicate entry $(readlink "$out/etc/$target") <-> $src" + ret=1 + + continue + fi + fi + + if [ "$mode" != symlink ]; then + echo "$mode" > "$out/etc/$target.mode" + echo "$user" > "$out/etc/$target.uid" + echo "$group" > "$out/etc/$target.gid" + fi + fi + } + + mkdir -p "$out/etc" + ${concatMapStringsSep "\n" (etcEntry: escapeShellArgs [ + "makeEtcEntry" + etcEntry.source + etcEntry.target + etcEntry.mode + etcEntry.user + etcEntry.group + ]) etc'} + ''; in diff --git a/nixpkgs/nixos/modules/system/etc/make-etc.sh b/nixpkgs/nixos/modules/system/etc/make-etc.sh deleted file mode 100644 index aabfb5e88a65..000000000000 --- a/nixpkgs/nixos/modules/system/etc/make-etc.sh +++ /dev/null @@ -1,45 +0,0 @@ -source $stdenv/setup - -mkdir -p $out/etc - -set -f -sources_=($sources) -targets_=($targets) -modes_=($modes) -users_=($users) -groups_=($groups) -set +f - -for ((i = 0; i < ${#targets_[@]}; i++)); do - source="${sources_[$i]}" - target="${targets_[$i]}" - - if [[ "$source" =~ '*' ]]; then - - # If the source name contains '*', perform globbing. - mkdir -p $out/etc/$target - for fn in $source; do - ln -s "$fn" $out/etc/$target/ - done - - else - - mkdir -p $out/etc/$(dirname $target) - if ! [ -e $out/etc/$target ]; then - ln -s $source $out/etc/$target - else - echo "duplicate entry $target -> $source" - if test "$(readlink $out/etc/$target)" != "$source"; then - echo "mismatched duplicate entry $(readlink $out/etc/$target) <-> $source" - exit 1 - fi - fi - - if test "${modes_[$i]}" != symlink; then - echo "${modes_[$i]}" > $out/etc/$target.mode - echo "${users_[$i]}" > $out/etc/$target.uid - echo "${groups_[$i]}" > $out/etc/$target.gid - fi - - fi -done |