save selected backup_parts for burning
[BackupPC.git] / lib / BackupPC / CGI / BurnMedia.pm
1 package BackupPC::CGI::BurnMedia;
2
3 use strict;
4 use BackupPC::CGI::Lib qw(:all);
5 use BackupPC::Search;
6 use Data::Dumper;
7 use vars qw($Cgi %In $MyURL $User $TopDir $BinDir $bpc);
8
9 sub action() {
10         my $cont = "";
11         my $title;
12         my $subtitle;
13         my @files;
14
15         $bpc->ConfigRead('_search_archive');
16         my %Conf = $bpc->Conf;
17
18         my $dbh = DBI->connect($Conf{SearchDSN}, $Conf{SearchUser}, "", { RaiseError => 1, AutoCommit => 0 } );
19
20         BackupPC::CGI::Lib::NewRequest();
21         $cont = Dumper(\%In);
22         if (!defined($In{submitBurner})) {
23                 $title = eval(q{ ${h1($Lang->{Burn_media})}});
24                 $cont = Dumper(%In);
25                 $subtitle = eval(q{ ${h2($Lang->{Burn_media_select})}});
26                 $cont = <<EOF;
27
28         $title
29         $subtitle
30         
31 EOF
32               
33                 $cont .= "Backups that have not been archived:<br>";
34                 $cont .= BackupPC::Search::displayBackupsGrid( \%In );
35             
36         } else {
37
38                 my @selected_backup_parts;
39
40                 foreach my $key(keys(%In)) {
41                         next unless $key =~ m/^fcb(\d+)/;
42                         push @selected_backup_parts, $1;
43                 }
44
45
46                 my ($total_size) = $dbh->selectrow_array( q{
47                         SELECT sum(size) FROM backup_parts
48                         WHERE id IN ( }.join(',', @selected_backup_parts).q{ )
49                 });
50
51
52                 if ($total_size > ($Conf{ArchiveMediaSize})) {
53                         $cont .= eval(' ${h2(Error)} ');
54                         $cont .= join(' '
55                                 , "Selected backups size", unit($total_size)
56                                 , "exceed medium size ", unit($Conf{ArchiveMediaSize})
57                         );
58                 } elsif ($total_size == 0) {
59                         $cont .= eval( q{ ${h2(Error)}});
60                         $cont .= "No backups selected.";
61                 } else {
62
63                         # create new archive
64                         my $sth = $dbh->prepare(q{
65                                 INSERT INTO archive (
66                                         id,
67                                         dvd_nr,
68                                         note,
69                                         username,
70                                         date,
71                                         total_size
72                                 ) VALUES (
73                                         nextVal('archive_id_seq'),
74                                         nextVal('dvd_nr'),
75                                         ?,
76                                         ?,
77                                         NOW(),
78                                         ?
79                                 )
80                         });
81
82                         $sth->execute($In{'note'}, $User, $total_size);
83
84                         my $sth = $dbh->prepare(q{
85                                 INSERT INTO archive_parts (
86                                         archive_id, backup_part_id
87                                 ) VALUES (
88                                         (SELECT last_value FROM archive_id_seq), ?
89                                 )
90                         });
91                         $sth->execute($_) foreach @selected_backup_parts;
92
93                         my ($dvd_nr) = $dbh->selectrow_array(qq{
94                                 select last_value from dvd_nr
95                         });
96
97                         die "no dvd_nr" unless $dvd_nr;
98
99                         $dbh->commit();
100
101                         $cont .= q{
102                                 Archived following backups parts:
103                         } . join(", ", @selected_backup_parts) . q{
104                                 <br/>with total size of
105                         <b>} . unit($total_size)
106                         . q{</b>
107                                 to media <b>} . $dvd_nr . q{</b>
108                                 with following message:
109                                 <div style="background-color: #e0e0e0; display: inline; padding: 2px;">
110                         } . $In{'note'} . q{
111                                 </div>
112                         };
113                 }
114         }
115
116         $cont .= join(' '
117                 , "ArchiveMediaSize:", unit($Conf{ArchiveMediaSize})
118                 , "ArchiveChunkSize:", unit($Conf{ArchiveChunkSize})
119         );
120
121         Header($Lang->{Burn_media}, "", 1, "", $cont);
122
123         Trailer();
124         $dbh->disconnect();
125 }
126
127 1;