#! /usr/bin/perl -w # ---------------------------------------------------------------------------- # "THE BEER-WARE LICENSE" (Revision 42) # wrote this file. As long as you retain this notice you # can do whatever you want with this stuff. If we meet some day, and you think # this stuff is worth it, you can buy me a beer in return. Anton Berezin # ---------------------------------------------------------------------------- # # Version 0.1 # use strict; my $ROOT = "/data/ad2-tax/jail"; my $NAME = "jail"; $ROOT = "/"; $NAME = "main"; if ($ARGV[0]) { $ROOT = "/home/jails/$ARGV[0]"; $NAME = $ARGV[0]; } #my $ROOT = "/home/tobez/jail"; #my $NAME = "jail"; my $unknown_changes = 0; my (@files, @dirs, @unexec, %alldirs); sub process { my $name = $_[0]; return if $name =~ m|/\.\.?$|; if (-d $name) { local *DIR; opendir DIR, $name or die $!; for my $f (readdir DIR) { process("$name/$f"); } push @dirs, $name; closedir DIR; } else { push @files, $name; (my $dir = $name) =~ s|/[^/]+$||; $alldirs{$dir}++; } } open MTREE, "mtree -f /home/tobez/.mtree/mtree.local.$NAME -p $ROOT/usr/local |" or die $!; chdir "$ROOT/usr/local"; while () { next if /^\s/; if (/^(.*?) extra$/) { my $extra = $1; $extra =~ s/^\.\///; process($extra); } else { print "UNKNOWN: $_"; $unknown_changes++; } } for (@dirs) { delete $alldirs{$_}; } @unexec = keys %alldirs; sub exclude { !( /man\/man/ ) || 1; } sub remap { s|(perl5/site_perl/)([\d._]+)/|$1\%\%PERL_VER\%\%/|; s|(perl5/site_perl/\%\%PERL_VER\%\%/)mach/|$1\%\%PERL_ARCH\%\%/|; s|(perl5/site_perl/\%\%PERL_VER\%\%/)i386-freebsd/|$1\%\%PERL_ARCH\%\%/|; $_; } @files = map remap, grep exclude, @files; @dirs = map remap, grep exclude, @dirs; @unexec = map remap, grep exclude, @unexec; #lib/perl5/site_perl/5.6.0/mach/auto/Email/Valid/.packlist #lib/perl5/site_perl/5.6.0/Email/Valid.pm #@dirrm lib/perl5/site_perl/5.6.0/mach/auto/Email/Valid #@dirrm lib/perl5/site_perl/5.6.0/mach/auto/Email #@dirrm lib/perl5/site_perl/5.6.0/Email # XXX - wrong order? print map { "$_\n" } @files; # XXX - wrong order? print map { "\@dirrm $_\n#\@unexec rmdir \%D/$_ 2>/dev/null || true\n" } @dirs; # XXX - wrong order, surely! print map { "\@unexec rmdir \%D/$_ 2>/dev/null || true\n" } @unexec; if ($unknown_changes) { print STDERR "There were $unknown_changes unknown changes\n"; print STDERR "Recommend running `mtree -f mtree.local.$NAME -p $ROOT/usr/local' manually\n"; }