#!/usr/bin/perl -w # # Copyright (c) 2000-2001 Silicon Graphics, Inc. All Rights Reserved. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation. # # This program is distributed in the hope that it would be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # # traverse the entire filesystem dumping info. # # dxm 5/10/00 use MD5; use Getopt::Std; my %opt; sub scan($) { my ($file)=@_; my ($md5)=new MD5; my (@stat); unless (@stat=lstat("$file")) { printf("%-" . ($opt{v}?65:32) . "s $file\n", "!!! could not lstat"); return; } $stat[0]=$stat[8]=""; # wipe the device and access time $md5->reset; $md5->add(join(" ",@stat)); print join(" ",@stat), "\n"; if ($opt{v}) { print $md5->hexdigest . " "; $md5->reset; } if (-l "$file") { if (!defined($link = readlink $file)) { printf("%-32s $file\n", "!!! could not readlink"); return; } $md5->add($link); } elsif (-f "$file") { if (!open(FILE, "$file")) { printf("%-32s $file\n", "!!! could not read"); return; } $md5->addfile(FILE); close (FILE); } print $md5->hexdigest . " $file\n"; } getopts('vs', \%opt); die "Usage: $0 \n" unless (@ARGV == 1); $dir=shift @ARGV; die "can't read $dir\n" unless (-r $dir); die "$dir is not a directory\n" unless (-d _); chomp($HOST = `hostname -s`); print "*** fs-walk host $HOST dir $dir\n"; @todo=$dir; while ($dir = shift @todo) { scan($dir); unless (opendir(DIR,$dir)) { printf("%-" . ($opt{v}?65:32) . "s $dir\n", "!!! could not opendir"); next; } unless (@all=readdir(DIR)) { printf("%-" . ($opt{v}?65:32) . "s $dir\n", "!!! could not readdir"); next; } closedir(DIR); @dirs=grep(-d "$dir/$_" && !-l "$dir/$_", @all); foreach (@all) { next if /^\.\.?$/; scan("$dir/$_"); } foreach (grep(!/^\.\.?$/, @dirs)) { push (@todo,"$dir/$_"); } }