diff options
author | Wout Mertens <Wout.Mertens@gmail.com> | 2016-07-26 09:04:10 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-07-26 09:04:10 +0200 |
commit | 3bb18c68d2b767e53f3f9d90b310ede145315726 (patch) | |
tree | bd7df167a65233fd368c23a1f1a3413e8f9e8488 /nixos/modules | |
parent | 3badad811c600db9867f15a326efa69898299099 (diff) | |
parent | fe9cabedf0292a2b09de16e272b968b42c0ac7fe (diff) | |
download | nixlib-3bb18c68d2b767e53f3f9d90b310ede145315726.tar nixlib-3bb18c68d2b767e53f3f9d90b310ede145315726.tar.gz nixlib-3bb18c68d2b767e53f3f9d90b310ede145315726.tar.bz2 nixlib-3bb18c68d2b767e53f3f9d90b310ede145315726.tar.lz nixlib-3bb18c68d2b767e53f3f9d90b310ede145315726.tar.xz nixlib-3bb18c68d2b767e53f3f9d90b310ede145315726.tar.zst nixlib-3bb18c68d2b767e53f3f9d90b310ede145315726.zip |
Merge pull request #17042 from rasendubi/etc
etc: remove obsolete directories
Diffstat (limited to 'nixos/modules')
-rw-r--r-- | nixos/modules/system/etc/setup-etc.pl | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/nixos/modules/system/etc/setup-etc.pl b/nixos/modules/system/etc/setup-etc.pl index 89a49b972ff9..efda74161ff8 100644 --- a/nixos/modules/system/etc/setup-etc.pl +++ b/nixos/modules/system/etc/setup-etc.pl @@ -22,6 +22,33 @@ sub atomicSymlink { # current configuration. atomicSymlink $etc, $static or die; +# Returns 1 if the argument points to the files in /etc/static. That +# means either argument is a symlink to a file in /etc/static or a +# directory with all children being static. +sub isStatic { + my $path = shift; + + if (-l $path) { + my $target = readlink $path; + return substr($target, 0, length "/etc/static/") eq "/etc/static/"; + } + + if (-d $path) { + opendir DIR, "$path" or return 0; + my @names = readdir DIR or die; + closedir DIR; + + foreach my $name (@names) { + next if $name eq "." || $name eq ".."; + unless (isStatic("$path/$name")) { + return 0; + } + } + return 1; + } + + return 0; +} # Remove dangling symlinks that point to /etc/static. These are # configuration files that existed in a previous configuration but not @@ -63,6 +90,16 @@ sub link { my $target = "/etc/$fn"; File::Path::make_path(dirname $target); $created{$fn} = 1; + + # Rename doesn't work if target is directory. + if (-l $_ && -d $target) { + if (isStatic $target) { + rmtree $target or warn; + } else { + warn "$target directory contains user files. Symlinking may fail."; + } + } + if (-e "$_.mode") { my $mode = read_file("$_.mode"); chomp $mode; if ($mode eq "direct-symlink") { |