/[BackupPC]/trunk/bin/BackupPC_incPartsUpdate
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/bin/BackupPC_incPartsUpdate

Parent Directory Parent Directory | Revision Log Revision Log


Revision 254 - (hide annotations)
Mon Dec 12 16:07:27 2005 UTC (18 years, 5 months ago) by dpavlin
File size: 5337 byte(s)
 r11640@llin:  dpavlin | 2005-12-12 18:07:17 +0100
 tar_check works again and creates missing md5 sum files (if needed)

1 dpavlin 157 #!/usr/local/bin/perl -w
2    
3     use strict;
4     use lib "__INSTALLDIR__/lib";
5    
6     use DBI;
7     use BackupPC::Lib;
8     use BackupPC::View;
9 dpavlin 214 use BackupPC::Attrib qw/:all/;
10 dpavlin 157 use Data::Dumper;
11     use Time::HiRes qw/time/;
12     use POSIX qw/strftime/;
13     use Cwd qw/abs_path/;
14 dpavlin 201 use File::Which;
15 dpavlin 215 use Archive::Tar::Streamed;
16 dpavlin 214 use Algorithm::Diff;
17     use Getopt::Std;
18 dpavlin 157
19 dpavlin 230 my $bpc = BackupPC::Lib->new || die "can't create BackupPC::Lib";
20     my %Conf = $bpc->Conf();
21    
22     use BackupPC::SearchLib;
23     %BackupPC::SearchLib::Conf = %Conf;
24    
25 dpavlin 218 # cludge: minimum .tar.gz size
26     my $MIN_TAR_SIZE = 80;
27    
28 dpavlin 157 my $path = abs_path($0);
29     $path =~ s#/[^/]+$#/#;
30     my $tarIncCreate = $path .= 'BackupPC_tarIncCreate';
31    
32     die "can't find $tarIncCreate: $!\n" unless (-x $tarIncCreate);
33    
34 dpavlin 201 my $bin;
35 dpavlin 254 foreach my $c (qw/gzip md5sum/) {
36 dpavlin 201 $bin->{$c} = which($c) || die "$0 needs $c, install it\n";
37     }
38    
39 dpavlin 214 my %opt;
40     getopts("cd", \%opt );
41 dpavlin 201
42 dpavlin 214 my $debug = $opt{d};
43     my $check = $opt{c} && print STDERR "NOTICE: tar archive check forced\n";
44    
45 dpavlin 157 $|=1;
46    
47     my $start_t = time();
48    
49     my $t_fmt = '%Y-%m-%d %H:%M:%S';
50    
51     my $dsn = $Conf{SearchDSN} || die "Need SearchDSN in config.pl\n";
52     my $user = $Conf{SearchUser} || '';
53    
54     my $dbh = DBI->connect($dsn, $user, "", { RaiseError => 1, AutoCommit => 0 });
55    
56     my $tar_dir = $Conf{InstallDir}.'/'.$Conf{GzipTempDir};
57    
58     die "problem with $tar_dir, check GzipTempDir in configuration\n" unless (-d $tar_dir && -w $tar_dir);
59    
60     #---- subs ----
61    
62     sub fmt_time {
63     my $t = shift || return;
64     my $out = "";
65     my ($ss,$mm,$hh) = gmtime($t);
66     $out .= "${hh}h" if ($hh);
67     $out .= sprintf("%02d:%02d", $mm,$ss);
68     return $out;
69     }
70    
71     sub curr_time {
72     return strftime($t_fmt,localtime());
73     }
74    
75 dpavlin 214 sub tar_check($$$$) {
76     my ($host,$share,$num,$filename) = @_;
77    
78     if ($debug) {
79     print STDERR " {{ CHECK: ${host}:${share}#${num} and $filename";
80     } else {
81     print " check";
82     }
83    
84 dpavlin 254 my @tar_parts;
85    
86     if (-d "$tar_dir/$filename") {
87     print STDERR " multi-part" if ($opt{d});
88     opendir(my $dir, "$tar_dir/$filename") || die "can't readdir $tar_dir/$filename: $!";
89     @tar_parts = map { my $p = $_; $p =~ s#^#${filename}/#; $p } grep { !/^\./ && !/md5/ && -f "$tar_dir/$filename/$_" } readdir($dir);
90     closedir($dir);
91     } else {
92     push @tar_parts, "${filename}.tar.gz";
93 dpavlin 214 }
94    
95 dpavlin 254 my @tar_files;
96 dpavlin 214
97 dpavlin 254 print " [parts: ",join(", ", @tar_parts),"]" if ($opt{d});
98    
99     print " reading";
100    
101     foreach my $tarfilename (@tar_parts) {
102    
103     print STDERR " $tarfilename" if ($debug);
104    
105     my $path = "$tar_dir/$tarfilename";
106     my $md5 = $path;
107     $md5 =~ s/\.tar\.gz$/.md5/ || die "can't create md5 filename from $md5";
108     if (! -e $md5) {
109     print ", creating md5";
110     system( $bin->{md5sum} . " $path > $md5") == 0 or die "can't create md5 $path: $!";
111     }
112    
113     open(my $fh, "gzip -cd $tar_dir/$tarfilename |") or die "can't open $tar_dir/$tarfilename: $!";
114     binmode($fh);
115     my $tar = Archive::Tar::Streamed->new($fh);
116    
117     while(my $entry = $tar->next) {
118     push @tar_files, $entry->name;
119     }
120 dpavlin 215 }
121 dpavlin 254
122 dpavlin 215 @tar_files = sort @tar_files;
123 dpavlin 214 print STDERR " ",($#tar_files + 1), " files" if ($debug);
124    
125     print STDERR ", database" if ($debug);
126    
127     my $sth = $dbh->prepare(qq{
128     SELECT path,type
129     FROM files
130     JOIN shares on shares.id = shareid
131     JOIN hosts on hosts.id = shares.hostid
132     WHERE hosts.name = ? and shares.name = ? and backupnum = ?
133     });
134     $sth->execute($host, $share, $num);
135     my @db_files;
136     while( my $row = $sth->fetchrow_hashref ) {
137    
138     my $path = $row->{'path'} || die "no path?";
139     $path =~ s#^/#./#;
140     $path .= '/' if ($row->{'type'} == BPC_FTYPE_DIR);
141     push @db_files, $path;
142     }
143    
144     print STDERR " ",($#db_files + 1), " files, diff" if ($debug);
145    
146     @db_files = sort @db_files;
147    
148     my $same = 1;
149     if ($#tar_files != $#db_files) {
150     $same = 0;
151     print STDERR " NUMBER" if ($debug);
152     } else {
153     my $diff = Algorithm::Diff->new(\@tar_files, \@db_files);
154     while ( $diff->Next() ) {
155     next if $diff->Same();
156     $same = 0;
157     print "< $_\n" for $diff->Items(1);
158     print "> $_\n" for $diff->Items(2);
159     }
160     }
161    
162 dpavlin 216 print " ",($same ? 'ok' : 'DIFFERENT');
163 dpavlin 214 print STDERR " }} " if ($debug);
164    
165     return $same;
166     }
167    
168    
169 dpavlin 157 #----- main
170    
171     my $sth = $dbh->prepare( qq{
172    
173     select
174 dpavlin 158 backups.id as backup_id,
175 dpavlin 157 hosts.name as host,
176     shares.name as share,
177 dpavlin 192 backups.num as num,
178 dpavlin 196 inc_size,
179     parts
180 dpavlin 157 from backups
181     join shares on backups.hostid = shares.hostid
182     and shares.id = backups.shareid
183     join hosts on shares.hostid = hosts.id
184 dpavlin 192 where not inc_deleted
185 dpavlin 157 order by backups.date
186    
187     } );
188    
189 dpavlin 213 $sth->execute();
190     my $num_backups = $sth->rows;
191     my $curr_backup = 1;
192    
193 dpavlin 157 while (my $row = $sth->fetchrow_hashref) {
194     my $tar_file = BackupPC::SearchLib::getGzipName($row->{'host'}, $row->{'share'}, $row->{'num'});
195 dpavlin 192
196 dpavlin 194 # this will return -1 if file doesn't exist
197     my $size = BackupPC::SearchLib::get_tgz_size_by_name($tar_file);
198 dpavlin 192
199 dpavlin 253 print "# size: $size backup.size: ", $row->{inc_size},"\n" if ($opt{d});
200    
201 dpavlin 254 if ( $row->{'inc_size'} != -1 && $size != -1 && $row->{'inc_size'} == $size && ( $check && tar_check($row->{'host'}, $row->{'share'}, $row->{'num'}, $tar_file) || 1) ) {
202 dpavlin 253 next;
203     }
204    
205 dpavlin 213 print curr_time, " $curr_backup/$num_backups ", $row->{'host'}, ":", $row->{'share'}, " #", $row->{'num'}, " -> $tar_file";
206     $curr_backup++;
207 dpavlin 157
208     my $t = time();
209    
210 dpavlin 194 # re-create archive?
211 dpavlin 254 my $cmd = qq{ $tarIncCreate -h "$row->{'host'}" -s "$row->{'share'}" -n $row->{'num'} -f };
212 dpavlin 253 print STDERR "## $cmd\n" if ($debug);
213 dpavlin 157
214 dpavlin 253 if (system($cmd) != 0) {
215     print STDERR " FAILED";
216 dpavlin 194 }
217 dpavlin 157
218 dpavlin 194 print ", dur: ",fmt_time(time() - $t), "\n";
219 dpavlin 158
220     $dbh->commit;
221    
222 dpavlin 157 }
223    
224     undef $sth;
225     $dbh->disconnect;

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26