about summary refs log tree commit diff
path: root/nixos/modules/system/etc/setup-etc.pl
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-07-28 11:30:31 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-07-28 11:30:49 +0200
commitf64d84698eb3f4d833e846336ff99a73331c31f7 (patch)
tree1120886b680851bc8b8f8d337af3503ecd4a3d71 /nixos/modules/system/etc/setup-etc.pl
parent3e4a382d6753a057256c7ef1e9f52ae9e07bd677 (diff)
parent30431e71608576baf880567b2894ad2a542f8d5e (diff)
downloadnixlib-f64d84698eb3f4d833e846336ff99a73331c31f7.tar
nixlib-f64d84698eb3f4d833e846336ff99a73331c31f7.tar.gz
nixlib-f64d84698eb3f4d833e846336ff99a73331c31f7.tar.bz2
nixlib-f64d84698eb3f4d833e846336ff99a73331c31f7.tar.lz
nixlib-f64d84698eb3f4d833e846336ff99a73331c31f7.tar.xz
nixlib-f64d84698eb3f4d833e846336ff99a73331c31f7.tar.zst
nixlib-f64d84698eb3f4d833e846336ff99a73331c31f7.zip
Merge remote-tracking branch 'origin/master' into staging
Conflicts:
	pkgs/applications/audio/espeak/edit.nix
	pkgs/applications/audio/lmms/default.nix
	pkgs/desktops/e18/enlightenment.nix
	pkgs/games/exult/default.nix
	pkgs/os-specific/linux/alsa-plugins/default.nix
Diffstat (limited to 'nixos/modules/system/etc/setup-etc.pl')
-rw-r--r--nixos/modules/system/etc/setup-etc.pl41
1 files changed, 31 insertions, 10 deletions
diff --git a/nixos/modules/system/etc/setup-etc.pl b/nixos/modules/system/etc/setup-etc.pl
index 8ba9a370b27a..d7e15eccefcd 100644
--- a/nixos/modules/system/etc/setup-etc.pl
+++ b/nixos/modules/system/etc/setup-etc.pl
@@ -3,6 +3,7 @@ use File::Find;
 use File::Copy;
 use File::Path;
 use File::Basename;
+use File::Slurp;
 
 my $etc = $ARGV[0] or die;
 my $static = "/etc/static";
@@ -46,35 +47,55 @@ sub cleanup {
 find(\&cleanup, "/etc");
 
 
+# Use /etc/.clean to keep track of copied files.
+my @oldCopied = read_file("/etc/.clean", chomp => 1, err_mode => 'quiet');
+open CLEAN, ">>/etc/.clean";
+
+
 # For every file in the etc tree, create a corresponding symlink in
 # /etc to /etc/static.  The indirection through /etc/static is to make
 # switching to a new configuration somewhat more atomic.
+my %created;
+my @copied;
+
 sub link {
     my $fn = substr $File::Find::name, length($etc) + 1 or next;
     my $target = "/etc/$fn";
     File::Path::make_path(dirname $target);
+    $created{$fn} = 1;
     if (-e "$_.mode") {
-        open MODE, "<$_.mode";
-        my $mode = <MODE>; chomp $mode;
-        close MODE;
+        my $mode = read_file("$_.mode"); chomp $mode;
         if ($mode eq "direct-symlink") {
             atomicSymlink readlink("$static/$fn"), $target or warn;
         } else {
-            open UID, "<$_.uid";
-            my $uid = <UID>; chomp $uid;
-            close UID;
-            open GID, "<$_.gid";
-            my $gid = <GID>; chomp $gid;
-            close GID;
-
+            my $uid = read_file("$_.uid"); chomp $uid;
+            my $gid = read_file("$_.gid"); chomp $gid;
             copy "$static/$fn", "$target.tmp" or warn;
             chown int($uid), int($gid), "$target.tmp" or warn;
             chmod oct($mode), "$target.tmp" or warn;
             rename "$target.tmp", $target or warn;
         }
+        push @copied, $fn;
+        print CLEAN "$fn\n";
     } elsif (-l "$_") {
         atomicSymlink "$static/$fn", $target or warn;
     }
 }
 
 find(\&link, $etc);
+
+
+# Delete files that were copied in a previous version but not in the
+# current.
+foreach my $fn (@oldCopied) {
+    if (!defined $created{$fn}) {
+        $fn = "/etc/$fn";
+        print STDERR "removing obsolete file ‘$fn’...\n";
+        unlink "$fn";
+    }
+}
+
+
+# Rewrite /etc/.clean.
+close CLEAN;
+write_file("/etc/.clean", map { "$_\n" } @copied);