my $DEST_DIR = "."; # Where should restored files should be placed?
my $RECURSION_LIMIT = 3; # Bound on recursive object references
+my $VERBOSE = 0; # Set to 1 to enable debugging messages
+
############################ CHECKSUM VERIFICATION ############################
# A very simple later for verifying checksums. Checksums may be used on object
# references directly, and can also be used to verify entire reconstructed
my $digester = $verifier->{DIGESTER};
my $newhash = $digester->hexdigest();
- if ($verifier->{HASH} ne $newhash) {
+ if ($VERBOSE && $verifier->{HASH} ne $newhash) {
print STDERR "Verification failure: ",
$newhash, " != ", $verifier->{HASH}, "\n";
}
next if $obj eq "";
if ($obj =~ /^@(\S+)$/) {
my $indirect = load_ref($1);
- iterate_objects($callback, $arg, $1, $recursion_level + 1);
+ iterate_objects($callback, $arg, $indirect, $recursion_level + 1);
} else {
&$callback($arg, $obj);
}
my $type = $info{type};
my $filename = uri_decode($info{name});
- print "process_file: $filename\n";
+ print "$filename\n" if $VERBOSE;
# Restore the specified file. How to do so depends upon the file type, so
# dispatch based on that.
# Restore mode, ownership, and any other metadata for the file. This is
# split out from the code above since the code is the same regardless of
# file type.
- my $atime = $info{atime} || time();
my $mtime = $info{mtime} || time();
- utime $atime, $mtime, $dest
- or warn "Unable to update atime/mtime for $dest";
-
- my $uid = $info{user} || -1;
- my $gid = $info{group} || -1;
+ utime time(), $mtime, $dest
+ or warn "Unable to update mtime for $dest";
+
+ my $uid = -1;
+ my $gid = -1;
+ if (defined $info{user}) {
+ my @items = split /\s/, $info{user};
+ $uid = $items[0] + 0 if exists $items[0];
+ }
+ if (defined $info{group}) {
+ my @items = split /\s/, $info{group};
+ $gid = $items[0] + 0 if exists $items[0];
+ }
chown $uid, $gid, $dest
or warn "Unable to change ownership for $dest";
# Recursively handle indirect metadata blocks.
if ($line =~ m/^@(\S+)$/) {
- print "Indirect: $1\n";
+ print "Indirect: $1\n" if $VERBOSE;
my $indirect = load_ref($1);
process_metadata($indirect, $recursion_level + 1);
next;
}
$OBJECT_DIR = dirname($descriptor);
-print "Source directory: $OBJECT_DIR\n";
+print "Source directory: $OBJECT_DIR\n" if $VERBOSE;
# Read the snapshot descriptor to find the root object.
open DESCRIPTOR, "<", $descriptor
or die "Cannot open backup descriptor file $descriptor: $!";
my $line = <DESCRIPTOR>;
-if ($line !~ m/^root: (\S+)$/) {
- die "Expected 'root:' specification in backup descriptor file";
+if ($line !~ m/^Root: (\S+)$/) {
+ die "Expected 'Root:' specification in backup descriptor file";
}
my $root = $1;
close DESCRIPTOR;
umask 077;
# Start processing metadata stored in the root to recreate the files.
-print "Root object: $root\n";
+print "Root object: $root\n" if $VERBOSE;
my $contents = load_ref($root);
process_metadata($contents);