From: Alan J. Pippin <ajp@pippins.net>
Date: Sat, 8 Mar 2008 05:47:24 +0000 (-0700)
Subject: Added script that can be used to diff files between different snapshots.
X-Git-Url: http://git.pippins.net/%24link?a=commitdiff_plain;h=cf5e9c6fa15fb2c337c5d74ef6bd92092cb2e709;p=zfs-ubuntu%2F.git

Added script that can be used to diff files between different snapshots.
---

diff --git a/zfs-diff b/zfs-diff
index 44f355c..fe857be 100755
--- a/zfs-diff
+++ b/zfs-diff
@@ -12,6 +12,7 @@ sub print_usage {
   print "\t$0 [-dhirv] <zfs shapshot name> [filename]\n\n";
   print " -d  Display the lines that are different (diff output)\n";
   print " -h  Display this usage\n";
+  print " -m  Use md5sum when checking for file differences";
   print " -i  Ignore files that don't exist in the snapshot (only necessary for recursing)\n";
   print " -r  Recursively diff every file in the snapshot (filename not required)\n";
   print " -v  Verbose mode\n\n";
@@ -43,6 +44,7 @@ GetOptions("h" => \$options{help},
            "r!" => \$options{recurse},
            "d!" => \$options{diff},
            "i!" => \$options{ignore},
+	   "m!" => \$options{md5sum},
            "v!" => \$verbose
            );
 
@@ -65,6 +67,7 @@ sub recurse_diff {
   print "Recursive diff on $zfssnap\n" if $verbose;
 
   $zfssnap =~ /(.+)\@(.+)/i;
+  if(($1 eq "") || ($2 eq "")) { die "-E- Invalid snapshot name\n"; }
   my $fsname = "/" . $1;
   my $snapname = $2;
   if(! -d $fsname && $fsname =~ /\/\S+?(\/.*)/) { $fsname = $1; }
@@ -80,8 +83,12 @@ sub recurse_diff {
   my $dir = tempdir( CLEANUP => 0 );
   my ($fh, $filename) = tempfile( DIR => $dir );
 
+  print "-> Finding files in $fspath to compare against files in $snappath\n";
   `find $fspath -name "*" -type f > $filename`;
+  print "-> Performing a diff operation on each file found\n";
 
+  my $num_files = `cat $filename | wc | awk '{print \$1}'`;
+  
   foreach my $file (<$fh>) {
     chomp($file);
     $file =~ /(.*)\/(.*)/;
@@ -93,19 +100,24 @@ sub recurse_diff {
       next;
     }
 
-    # do the md5 sums
-    my $orig = `$SSLPATH md5 $file`;
-    my $snap = `$SSLPATH md5 $diff`;
-    $orig =~ /[\s\S]+= (.+)/;
-    my $sum1 = $1;
-    $snap =~ /[\s\S]+= (.+)/;
-    my $sum2 = $1;
-    if ($sum1 ne $sum2) {
-      print "** $file is different\n";
-      print "** $orig** $snap" if $verbose;
+    if($options{md5sum}) { 
+	# do the md5 sums
+	my $orig = `$SSLPATH md5 $file`;
+	my $snap = `$SSLPATH md5 $diff`;
+	$orig =~ /[\s\S]+= (.+)/;
+	my $sum1 = $1;
+	$snap =~ /[\s\S]+= (.+)/;
+	my $sum2 = $1;
+	if ($sum1 ne $sum2) {
+	    print "** $file is different\n";
+	    print "** $orig** $snap" if $verbose;
+	}
+    } else {
+	my $differ = system("diff \"$file\" \"$diff\" > /dev/null 2>&1");
+	if($differ) { print "** $file is different\n"; }
     }
     if ($options{diff}) {
-      system("diff $file $diff");
+      system("diff \"$file\" \"$diff\"");
     }
   }
 }
@@ -134,17 +146,22 @@ sub diff_single_file {
   if(! -f $fspath) { print "-E- Cannot find source file: $fspath\n"; exit 1; }
   if(! -f $snappath) { print "-E- Cannot find source file: $snappath\n"; exit 1; }
 
-  my $orig = `$SSLPATH md5 $fspath`;
-  my $snap = `$SSLPATH md5 $snappath`;
-  $orig =~ /[\s\S]+= (.+)/;
-  my $sum1 = $1;
-  $snap =~ /[\s\S]+= (.+)/;
-  my $sum2 = $1;
-  if ($sum1 ne $sum2) {
-    print "** Files are different\n";
-    print "** $orig** $snap" if $verbose;
+  if($options{md5sum}) { 
+      my $orig = `$SSLPATH md5 $fspath`;
+      my $snap = `$SSLPATH md5 $snappath`;
+      $orig =~ /[\s\S]+= (.+)/;
+      my $sum1 = $1;
+      $snap =~ /[\s\S]+= (.+)/;
+      my $sum2 = $1;
+      if ($sum1 ne $sum2) {
+	  print "** Files are different\n";
+	  print "** $orig** $snap" if $verbose;
+      }
+  } else {
+      my $differ = system("diff \"$fspath\" \"$snappath\" > /dev/null 2>&1");
+      if($differ) { print "** Files are different\n"; }
   }
   if ($options{diff}) {
-    system("diff $fspath $snappath");
+    system("diff \"$fspath\" \"$snappath\"");
   }
 }