#!/usr/bin/perl use MDK::Common; use Getopt::Long; my $first_file; my $log_file = '/var/log/kernel/warnings'; GetOptions('no-link' => \ (my $no_link), 'no-dir' => \ (my $no_dir), 'full-dirs=s', \ (my $full_dirs), 'ip=s' => \ (my $wanted_ip), 'log-file=s' => \$log_file, 'first-file=s' => \ (my $first_file), 'from-time=s', => \ (my $from_time), 'already-have=s', \ (my $already_have), ); my @skipped_dirs = ( '/usr/share/fonts', '/lib/modules/2.4.22-21mdk', '/usr/X11R6/lib/modules/extensions', '/usr/X11R6/lib/X11/fonts', '/usr/lib/kbd/keymaps', '/usr/share/locale', '/etc/skel', ); my $skipped_dirs = '/tmp/live_tree(' . join('|', map { quotemeta } @skipped_dirs) . ')/'; if ($full_dirs) { my @l = chomp_(map { MDK::Common::File::cat_or_die($_) } split(' ', $full_dirs)); $full_dirs = '/tmp/live_tree(' . join('|', map { quotemeta } @l) . ')/'; } if ($already_have) { my @l = map { chomp_(MDK::Common::File::cat_or_die($_)) } split(' ', $already_have); $already_have = '(' . join('|', map { quotemeta } @l) . ')'; } open(my $F, "tac $log_file |"); my @l; while (<$F>) { my ($time, $ip, $rfile) = /(\d+:\d+:\d+).*kernel: nfsd \((.*?)\): (.*)/ or next; if ($wanted_ip) { $wanted_ip eq $ip or next; } else { warn "choosing $ip\n"; $wanted_ip = $ip; } my $file = join('/', '', reverse split('/', $rfile)); last if $file =~ m!/tmp/live_tree/move/(devices|symlinks)!; last if $from_time && $time le $from_time; $already_have && $file =~ /^$already_have$/ and next; if ($file !~ /^$skipped_dirs/) { if (-l $file ? !$no_link : -d $file ? !$no_dir : 1) { my $s = $full_dirs && $file =~ /^$full_dirs/ ? "/tmp/live_tree$1" : $file; unshift @l, $s; } } last if $first_file && ($file eq "/tmp/live_tree$first_file" || $rfile eq $first_file); } print "$_\n" foreach sort(uniq(@l));