1 |
dpavlin |
232 |
#!/usr/bin/perl |
2 |
|
|
|
3 |
|
|
# try to recover pc/hostname/backups file from existing transfer logs |
4 |
|
|
|
5 |
|
|
use strict; |
6 |
|
|
#use lib "__INSTALLDIR__/lib"; |
7 |
|
|
use lib "/data/backuppc/lib"; |
8 |
|
|
|
9 |
|
|
use BackupPC::Lib; |
10 |
|
|
use BackupPC::FileZIO; |
11 |
|
|
|
12 |
|
|
use Data::Dumper; |
13 |
|
|
|
14 |
|
|
my $bpc = BackupPC::Lib->new(undef, undef, 1) or die "BackupPC::Lib->new failed\n"; |
15 |
|
|
|
16 |
|
|
my $TopDir = $bpc->TopDir(); |
17 |
|
|
my %Conf = $bpc->Conf(); |
18 |
|
|
|
19 |
|
|
my $host = shift @ARGV || die "usage: $0 hostname\n"; |
20 |
|
|
|
21 |
|
|
my $pc_dir = "$TopDir/pc/$host"; |
22 |
|
|
|
23 |
|
|
print "working in $pc_dir\n"; |
24 |
|
|
|
25 |
|
|
sub extract_num($) { |
26 |
dpavlin |
233 |
my $file = shift || die "no file?"; |
27 |
|
|
my $nr; |
28 |
|
|
if ($file =~ m/XferLOG\.(\d+)/) { |
29 |
|
|
$nr = $1; |
30 |
|
|
} else { |
31 |
|
|
die "can't extract number from $file"; |
32 |
|
|
} |
33 |
|
|
return $nr; |
34 |
dpavlin |
232 |
} |
35 |
|
|
|
36 |
|
|
my @logs = sort { |
37 |
|
|
extract_num($a) <=> extract_num($b) |
38 |
dpavlin |
233 |
} glob("$pc_dir/XferLOG.[0-9]*"); |
39 |
dpavlin |
232 |
|
40 |
|
|
print "found ", $#logs + 1, " XferLOG files for $host\n"; |
41 |
|
|
|
42 |
|
|
print "\t",join("\n\t", @logs),"\n"; |
43 |
|
|
|
44 |
|
|
my $backups_file = "$pc_dir/backups"; |
45 |
|
|
|
46 |
|
|
if (-e $backups_file) { |
47 |
|
|
|
48 |
|
|
my @old_backups = $bpc->BackupInfoRead($host); |
49 |
|
|
print "found ", $#old_backups + 1, " backups in $pc_dir/backups\n"; |
50 |
|
|
|
51 |
|
|
#print Dumper(\@old_backups); |
52 |
|
|
|
53 |
|
|
} else { |
54 |
|
|
print "WARNING: backups file $backups_file doesn't exist, creating new one\n"; |
55 |
|
|
} |
56 |
|
|
|
57 |
dpavlin |
233 |
my @new_backups; |
58 |
|
|
|
59 |
dpavlin |
232 |
foreach my $xfer_log (@logs) { |
60 |
|
|
|
61 |
|
|
my $num = extract_num($xfer_log); |
62 |
|
|
my $type = 'incr'; |
63 |
|
|
|
64 |
|
|
my $attrib_file = "$pc_dir/$num/attrib"; |
65 |
|
|
die "can't find $attrib_file: $!" unless (-e $attrib_file); |
66 |
|
|
|
67 |
|
|
my $startTime = (stat($attrib_file))[9]; # mtime |
68 |
|
|
my $endTime = (stat($attrib_file))[10]; # ctime |
69 |
|
|
my $sizeTotal = 0; |
70 |
|
|
my $nFilesTotal = 0; |
71 |
|
|
my $nFilesExist = 0; |
72 |
|
|
my $sizeExist = 0; |
73 |
|
|
|
74 |
|
|
print "working on $xfer_log $host #$num\n"; |
75 |
|
|
|
76 |
|
|
my $xfer_fh = BackupPC::FileZIO->open($xfer_log, 0, $Conf{CompressLevel}); |
77 |
|
|
while ( my $line = $xfer_fh->readLine() ) { |
78 |
|
|
chomp($line); |
79 |
dpavlin |
233 |
if ($line =~ m#^\s+(create|pool|delete|same|link)\s+(.)\s\d\d\d\s+\d+/\d+\s+(\d+)\s(.+)$#) { |
80 |
dpavlin |
232 |
my ($type,$is_dir,$size,$path) = ($1,$2,$3); |
81 |
|
|
#print "$type [$is_dir] $size $path\n"; |
82 |
|
|
|
83 |
|
|
next if ($is_dir eq 'd'); |
84 |
|
|
|
85 |
dpavlin |
233 |
if ($type eq 'pool' || $type eq 'same') { |
86 |
dpavlin |
232 |
$sizeExist += $size; |
87 |
|
|
$nFilesExist++; |
88 |
|
|
} elsif ($type ne 'delete') { |
89 |
|
|
$sizeTotal += $size; |
90 |
|
|
$nFilesTotal++; |
91 |
|
|
} |
92 |
|
|
|
93 |
|
|
} else { |
94 |
|
|
print "#SKIP:$line<-\n"; |
95 |
|
|
} |
96 |
|
|
} |
97 |
|
|
$xfer_fh->close(); |
98 |
|
|
|
99 |
|
|
my $this_backup = { |
100 |
|
|
num => $num, |
101 |
|
|
type => $type, |
102 |
|
|
startTime => $startTime, |
103 |
|
|
endTime => $endTime, |
104 |
|
|
size => $sizeTotal, |
105 |
|
|
nFiles => $nFilesTotal, |
106 |
|
|
xferErrs => 0, # bogus |
107 |
|
|
xferBadFile => 0, # bogus |
108 |
|
|
xferBadShare => 0, # bogus |
109 |
|
|
nFilesExist => $nFilesExist, |
110 |
|
|
sizeExist => $sizeExist, |
111 |
|
|
sizeExistComp => $sizeExist, # bogus |
112 |
|
|
tarErrs => 0, # bogus |
113 |
|
|
compress => $Conf{CompressLevel} , |
114 |
|
|
noFill => $type eq "incr" ? 1 : 0, |
115 |
|
|
level => $type eq "incr" ? 1 : 0, |
116 |
|
|
mangle => 1, # name mangling always on for v1.04+ |
117 |
|
|
}; |
118 |
|
|
|
119 |
dpavlin |
233 |
push @new_backups, $this_backup; |
120 |
|
|
$bpc->BackupInfoWrite($host, @new_backups); |
121 |
dpavlin |
232 |
} |
122 |
|
|
|