#!/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));