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

Diff of /trunk/bin/BackupPC_burnArchiveCLI

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 174 by dpavlin, Tue Oct 11 16:59:16 2005 UTC revision 193 by dpavlin, Thu Oct 13 15:11:58 2005 UTC
# Line 1  Line 1 
1  #!/usr/local/bin/perl  #!/usr/bin/perl
2    
3  use strict;  use strict;
4  #use lib "__INSTALLDIR__/lib";  use lib "__INSTALLDIR__/lib";
 # FIXME  
 use lib "/data/backuppc/lib";  
5    
6  use DBI;  use DBI;
7  use BackupPC::Lib;  use BackupPC::Lib;
# Line 34  my $dbh = DBI->connect($dsn, $user, "", Line 32  my $dbh = DBI->connect($dsn, $user, "",
32  my $tar_dir = $Conf{InstallDir}.'/';  my $tar_dir = $Conf{InstallDir}.'/';
33  $tar_dir .= $Conf{GzipTempDir} || die "GzipTempDir isn't defined in configuration";  $tar_dir .= $Conf{GzipTempDir} || die "GzipTempDir isn't defined in configuration";
34    
35  die "problem with $tar_dir, check GzipTempDir in configuration\n" unless (-d $tar_dir && -w $tar_dir);  die "problem with $tar_dir, check GzipTempDir in configuration\n" unless (-d $tar_dir);
36    
37  my $iso_dir = $Conf{InstallDir}.'/';  my $iso_dir = $Conf{InstallDir}.'/';
38  $iso_dir .= $Conf{ISOTempDir} || die "ISOTempDir isn't defined in configuration";  $iso_dir .= $Conf{ISOTempDir} || die "ISOTempDir isn't defined in configuration";
# Line 55  sub curr_time { Line 53  sub curr_time {
53          return strftime($t_fmt,localtime());          return strftime($t_fmt,localtime());
54  }  }
55    
56    sub dumpArchive2XML($$$)
57    {
58            my ($dbh, $dvd_nr, $filename) = @_;
59            my %archive;    
60            my $output = new IO::File(">$filename");
61            my $writer = new XML::Writer(OUTPUT=>$output, NEWLINES => 1);
62    
63            $writer->pi('xml-stylesheet', 'href="archive.css" type="text/css"');
64    
65            my $files_sql = q{
66                    SELECT
67                            files.path AS path,
68                            files.date AS date,
69                            files.type AS type,
70                            files.size AS size
71                    FROM files, backups, shares
72                    WHERE files.backupnum=backups.num AND
73                            files.shareid=shares.id AND
74                            shares.hostid=backups.hostid AND
75                            backups.id=?
76            };
77    
78            my $backups_sql = q{
79                    SELECT
80                            backups.id   AS backup_id,
81                            hosts.name   AS host,
82                            backups.num  AS num,
83                            backups.date AS date,
84                            shares.name  AS share,
85                            backups.size AS backup_size,
86                            backups.inc_size AS compress_size
87                    FROM backups, archive_backup, hosts, shares
88                    WHERE archive_backup.backup_id = backups.id
89                            AND hosts.id=backups.hostid
90                            AND shares.id=backups.shareid
91                            AND archive_backup.archive_id = ?
92            };
93    
94            my $sth = $dbh->prepare("SELECT dvd_nr, total_size, note, username, date,id FROM archive WHERE dvd_nr=?");
95            $sth->execute($dvd_nr);
96            my $row = $sth->fetchrow_hashref();
97    
98            my $row_h;
99            foreach my $hide (qw/id note/) {
100                    $row_h->{$hide} = $row->{$hide} || die "no $hide";
101                    delete $row->{$hide};
102            }
103    
104            $writer->startTag("archive", %{$row});
105    
106            $writer->startTag("note");
107            $writer->characters( $row_h->{'note'} );
108            $writer->endTag("note");
109    
110            my $sth_backups = $dbh->prepare( $backups_sql );
111            $sth_backups->execute( $row_h->{'id'} );
112    
113            while (my $row = $sth_backups->fetchrow_hashref()) {
114    
115                    my $sth_files = $dbh->prepare( $files_sql);
116                    $sth_files->execute($row->{'backup_id'});
117    
118                    delete($row->{'backup_id'});
119                    $row->{'date'} = strftime($t_fmt,gmtime($row->{'date'}));
120    
121                    $writer->startTag( "backup", %{$row} );
122    
123                    while (my $row = $sth_files->fetchrow_hashref()) {
124                            # convert filetype to string
125                            $row->{'type'} = BackupPC::Attrib::fileType2Text(undef, $row->{'type'});
126                            $row->{'date'} = strftime($t_fmt,gmtime($row->{'date'}));
127                            my $path = $row->{'path'}; delete $row->{'path'};
128    
129                            $writer->startTag("file", %{$row});
130                            $writer->characters( $path );
131                            $writer->endTag("file");
132                    }
133                    $writer->endTag("backup");
134            }      
135                            
136            $writer->endTag("archive");
137            $writer->end();
138            
139    }
140    
141    
142    
143  #----- main  #----- main
144    
145  my $sth = $dbh->prepare( qq{  my $sth = $dbh->prepare( qq{
# Line 123  my @archives_to_burn = Menu(\%Menu_archi Line 208  my @archives_to_burn = Menu(\%Menu_archi
208    
209  print "\n";  print "\n";
210    
211    sub skip($) {
212            my $msg = shift;
213            print "WARNING: $msg, skipping...\n";
214            goto SKIP;
215    }
216    
217    my $sth_archive_backup = $dbh->prepare( qq{
218            select
219                    backup_id,
220                    archive_id,
221                    hosts.name as host,
222                    shares.name as share,
223                    backups.num as num
224            from archive_backup
225            join archive on archive_id = archive.id
226            join backups on backup_id = backups.id
227            join hosts on hostid = hosts.id
228            join shares on shareid = shares.id
229            where archive.dvd_nr = ?
230    });
231    
232    my $sth_archive_burned = $dbh->prepare( qq{
233            insert into archive_burned
234                    (archive_id, iso_size)
235            values ( (select id from archive where dvd_nr =?), ?)
236    });
237    
238  foreach my $arc (@archives_to_burn) {  foreach my $arc (@archives_to_burn) {
239          exit if ($arc eq ']quit[');          exit if ($arc eq ']quit[');
240    
241          my $dvd_nr = $1 if ($arc =~ m/DVD #(\d+)/);          my $dvd_nr = $1 if ($arc =~ m/DVD #(\d+)/);
242          die "BUG: can't find dvd_nr in $arc\n" unless ($dvd_nr);          die "BUG: can't find dvd_nr in $arc\n" unless ($dvd_nr);
243    
244          print "Working on DVD #$dvd_nr\n";          my $tmp_dir = "/$iso_dir/$dvd_nr";
245    
246            my $t = time();
247    
248            print "Working on DVD #$dvd_nr in $tmp_dir\n";
249    
250            my $list_file = my $iso_file = my $xml_file = "${iso_dir}/${dvd_nr}";
251            $list_file .= '.list';
252            $iso_file .= '.iso';
253            $xml_file .= '.xml';
254    
255            if (-e $iso_file) {
256                    print "ISO $iso_file allready exists\n";
257                    goto BURN;
258            }
259    
260            $sth_archive_backup->execute($dvd_nr);
261    
262            open(my $list, "> $list_file") || skip "can't open $list_file: $!";
263    
264            my $inc = 0;
265    
266            while (my $row = $sth_archive_backup->fetchrow_hashref) {
267                    my $tar_file = BackupPC::SearchLib::getGzipName($row->{'host'}, $row->{'share'}, $row->{'num'});
268                    skip "can't find increment $tar_file: $!" unless (-r "$tar_dir/$tar_file");
269                    print $list "$tar_dir/$tar_file\n";
270                    $inc++;
271    
272            }
273    
274            # add file list and note in xml
275            dumpArchive2XML($dbh, $dvd_nr, $xml_file);
276            print $list "$xml_file\n";
277    
278            # add css file for archive
279            my $css_file = $Conf{CgiImageDir} . '/archive.css';
280            if (-r $css_file) {
281                    print $list "$css_file\n";
282            } else {
283                    print "WARNING: missing $css_file, not added to iso image!\n";
284            }
285    
286            close($list);
287    
288            print "Running mkisofs now for $inc increments...\n";
289    
290            my $cmd = qq{ mkisofs -A BackupPC -gui -J -r -T --input-charset ISO-8859-2 -V $dvd_nr -o $iso_file -path-list $list_file };
291    
292            system($cmd) == 0 or skip "can't run $cmd: $?";
293    
294            my $size = (stat($iso_file))[7];
295    
296            print "Created $iso_file [$size bytes] in ", fmt_time(time() - $t), "\n";
297    
298    BURN:
299            # FIXME add call to cdrecord here!
300            $sth_archive_burned->execute($dvd_nr, $size);
301            print "Media burn for $dvd_nr recorded\n";
302    
303    SKIP:
304    
305  }  }
306    

Legend:
Removed from v.174  
changed lines
  Added in v.193

  ViewVC Help
Powered by ViewVC 1.1.26