From 11022e8d9f83e68250cfa0846919878d3d1d1ab9 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 30 Oct 2009 08:37:08 +0000 Subject: [PATCH] * Back out r17946 and 17948 because it doesn't work. I've seen it fail to update /etc twice now. It's also unnecessarily complex IMHO (see nix-dev). svn path=/nixos/trunk/; revision=18045 --- .../system/activation/activation-script.nix | 11 +-- modules/system/activation/top-level.nix | 4 +- modules/system/boot/stage-2-init.sh | 1 - modules/system/etc/etc.nix | 38 +++++++--- modules/system/etc/make-etc.sh | 76 +------------------ 5 files changed, 31 insertions(+), 99 deletions(-) diff --git a/modules/system/activation/activation-script.nix b/modules/system/activation/activation-script.nix index 2ca7dcc82e1..a62120363f2 100644 --- a/modules/system/activation/activation-script.nix +++ b/modules/system/activation/activation-script.nix @@ -11,7 +11,6 @@ let text = '' #### actionScripts snippet ${a} : # ======================================== - echo "executing activation snippet ${a} at $(${pkgs.coreutils}/bin/date)" ${v.text} ''; }); @@ -124,14 +123,8 @@ let # Set up Nix. mkdir -p /nix/etc/nix ln -sfn /etc/nix.conf /nix/etc/nix/nix.conf - stat /nix/store/ | \ - egrep \ - 'Access: [(]1775/[-drwxt]*[)] *Uid: [(][0-9 ]*/ *root[)] *Gid: [(][0-9 ]*/ *nixbld[)]' \ - > /dev/null || { - - chown root.nixbld /nix/store - chmod 1775 /nix/store - } + chown root.nixbld /nix/store + chmod 1775 /nix/store # Nix initialisation. mkdir -m 0755 -p \ diff --git a/modules/system/activation/top-level.nix b/modules/system/activation/top-level.nix index 50fbde63b88..609b11dd3d6 100644 --- a/modules/system/activation/top-level.nix +++ b/modules/system/activation/top-level.nix @@ -42,9 +42,7 @@ let # as you use, but with another kernel # !!! fix this children = map (x: ((import ../../../default.nix) - { configuration = x//{boot=((x.boot)// - {loader=x.boot.loader//{grub=x.boot.loader.grub// - {device = "";};};});};}).system) + { configuration = x//{boot=((x.boot)//{grubDevice = "";});};}).system) config.nesting.children; diff --git a/modules/system/boot/stage-2-init.sh b/modules/system/boot/stage-2-init.sh index 1089526cf6b..0cc09caebba 100644 --- a/modules/system/boot/stage-2-init.sh +++ b/modules/system/boot/stage-2-init.sh @@ -132,7 +132,6 @@ fi # Ensure that the module tools can find the kernel modules. export MODULE_DIR=@kernel@/lib/modules/ -echo "Running post-boot commands" # Run any user-specified commands. @shell@ @postBootCommands@ diff --git a/modules/system/etc/etc.nix b/modules/system/etc/etc.nix index 7246d62c160..4ae420017a5 100644 --- a/modules/system/etc/etc.nix +++ b/modules/system/etc/etc.nix @@ -41,8 +41,6 @@ let builder = ./make-etc.sh; - inherit (pkgs) coreutils; - /* !!! Use toXML. */ sources = map (x: x.source) config.environment.etc; targets = map (x: x.target) config.environment.etc; @@ -63,15 +61,33 @@ in etc = pkgs.lib.fullDepEntry '' # Set up the statically computed bits of /etc. echo "setting up /etc..." - if [ "$(readlink /etc/kill-etc)" != "${makeEtc}/bin/kill-etc" ]; then - /etc/kill-etc || true - ${makeEtc}/bin/fill-etc - echo -e "#! /bin/sh\n${makeEtc}/bin/kill-etc\n${makeEtc}/bin/fill-etc" > /etc/refill-etc - chmod 0755 /etc/refill-etc - echo "/etc is set up" - else - echo "/etc unchanged" - fi + staticEtc=/etc/static + rm -f $staticEtc + ln -s ${makeEtc}/etc $staticEtc + for i in $(cd $staticEtc && find * -type l); do + mkdir -p /etc/$(dirname $i) + rm -f /etc/$i + if test -e "$staticEtc/$i.mode"; then + # Create a regular file in /etc. + cp $staticEtc/$i /etc/$i + chown 0.0 /etc/$i + chmod "$(cat "$staticEtc/$i.mode")" /etc/$i + else + # Create a symlink in /etc. + ln -s $staticEtc/$i /etc/$i + fi + done + + # Remove dangling symlinks that point to /etc/static. These are + # configuration files that existed in a previous configuration but not + # in the current one. For efficiency, don't look under /etc/nixos + # (where all the NixOS sources live). + for i in $(find /etc/ \( -path /etc/nixos -prune \) -o -type l); do + target=$(readlink "$i") + if test "''${target:0:''${#staticEtc}}" = "$staticEtc" -a ! -e "$i"; then + rm -f "$i" + fi + done '' [ "systemConfig" "defaultPath" # path to cp, chmod, chown diff --git a/modules/system/etc/make-etc.sh b/modules/system/etc/make-etc.sh index 76ae97c6c65..f05d74b55fc 100644 --- a/modules/system/etc/make-etc.sh +++ b/modules/system/etc/make-etc.sh @@ -5,61 +5,6 @@ ensureDir $out/etc sources_=($sources) targets_=($targets) modes_=($modes) - -cat <> fill-etc.c - #include - #include - #include - #include - #include - #include - #include - #include - - struct stat statBuffer; - - void ensureDir(char* path) { - int i, j; - char pathBuffer[PATH_MAX]; - statBuffer.st_mode = 0; - for (i=0; path[i]; i++) { - if (path[i]=='/') { - pathBuffer[i]=0; - mkdir(pathBuffer ,0755); - j = i; - } - pathBuffer[i]=path[i]; - } - pathBuffer[j]=0; - if (stat(pathBuffer, &statBuffer) || ! (statBuffer.st_mode & S_IFDIR)) { - printf ("Path does not exist or not a directory: %s\n", path); - exit (EXIT_FAILURE); - } - } - - void copyAndChmod(char* path, char* target, mode_t mode) { - int pid; - pid = fork(); - if (! pid) { - execl("${coreutils}/bin/cp", "cp", path, target, NULL); - } else { - waitpid (pid, NULL, 0); - } - chmod (target, mode); - } - - int main () { - /* generated code begins */ -EOF -cat <> kill-etc.c - #include - #include - #include - - int main () { - /* generated code begins */ -EOF - for ((i = 0; i < ${#targets_[@]}; i++)); do ensureDir $out/etc/$(dirname ${targets_[$i]}) if ! test -e $out/etc/${targets_[$i]}; then @@ -68,29 +13,10 @@ for ((i = 0; i < ${#targets_[@]}; i++)); do echo "Duplicate entry ${targets_[$i]} -> ${sources_[$i]}" if test "$(readlink $out/etc/${targets_[$i]})" != "${sources_[$i]}"; then echo "Mismatched duplicate entry $(readlink $out/etc/${targets_[$i]}) <-> ${sources_[$i]}" - exit 1 + exit 1 fi fi; - echo "ensureDir(\"/etc/${targets_[$i]}\");" >> fill-etc.c if test "${modes_[$i]}" != symlink; then echo "${modes_[$i]}" > $out/etc/${targets_[$i]}.mode - - echo "copyAndChmod(\"$out/etc/${targets_[$i]}\",\"/etc/${targets_[$i]}\",${modes_[$i]});" >> fill-etc.c; - else - echo "symlink(\"$out/etc/${targets_[$i]}\",\"/etc/${targets_[$i]}\");" >> fill-etc.c; fi - - echo "unlink (\"/etc/${targets_[$i]}\");" >> kill-etc.c done - -echo "symlink(\"$out/bin/kill-etc\",\"/etc/kill-etc\");" >> fill-etc.c -echo "unlink(\"/etc/kill-etc\");" >> kill-etc.c -echo " return 0; }" >> fill-etc.c -echo " return 0; }" >> kill-etc.c -ensureDir $out/bin -ensureDir $out/share/etc-scripts/src -gcc -Wall fill-etc.c -o $out/bin/fill-etc -gcc -Wall kill-etc.c -o $out/bin/kill-etc -cp fill-etc.c $out/share/etc-scripts/src -cp kill-etc.c $out/share/etc-scripts/src -