guix/scripts/find-runtime-roots.pl.in

84 lines
1.9 KiB
Perl
Executable File

#! @perl@ -w @perlFlags@
use strict;
use Nix::Utils;
use Nix::Config;
sub readProc {
return unless -d "/proc";
opendir DIR, "/proc" or return;
foreach my $name (readdir DIR) {
next unless $name =~ /^\d+$/;
my $process = "/proc/$name";
my $target;
print "$target\n" if $target = readlink "$process/exe";
print "$target\n" if $target = readlink "$process/cwd";
if (opendir FDS, "$process/fd") {
foreach my $name (readdir FDS) {
$target = readlink "$process/fd/$name";
print "$target\n" if $target && substr($target, 0, 1) eq "/";
}
closedir FDS;
}
if (open MAP, "<$process/maps") {
while (<MAP>) {
next unless /^ \s* \S+ \s+ \S+ \s+ \S+ \s+ \S+ \s+ \S+ \s+ (\/\S+) \s* $/x;
print "$1\n";
}
close MAP;
}
# Get all store paths that appear in the environment of this process.
my $re = "\Q$Nix::Config::storeDir\E\/[0-9a-z]+[0-9a-zA-Z\+\-\._\?=]*";
eval {
my $env = Nix::Utils::readFile "$process/environ";
my @matches = $env =~ /$re/g;
print "$_\n" foreach @matches;
};
eval {
my $cmdline = Nix::Utils::readFile "$process/cmdline";
my @matches = $cmdline =~ /$re/g;
print "$_\n" foreach @matches;
};
}
closedir DIR;
}
sub lsof {
return unless open LSOF, "lsof -n -w -F n 2> /dev/null |";
while (<LSOF>) {
next unless /^n (\/ .*)$/x;
print $1, "\n";
}
close LSOF;
}
readProc;
lsof;
sub printFile {
my ($fn) = @_;
if (-e $fn) {
print Nix::Utils::readFile($fn), "\n";
}
}
# This is rather NixOS-specific, so it probably shouldn't be here.
printFile "/proc/sys/kernel/modprobe";
printFile "/proc/sys/kernel/fbsplash";
printFile "/proc/sys/kernel/poweroff_cmd";