7fce5df0c56b62fdffae7831b30416db1ed19c25
[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_ids;
39
40                 my $total_size = 0;
41                 my $selected = 0;
42
43                 my $parts = 1;
44                 foreach my $key(keys(%In)) {
45                         if ($key =~ m/^fcb([0-9]+)_([0-9]+)_([0-9]+)$/gi) {
46
47                                 my ($host_id, $backup_num, $backup_id) = ($1,$2,$3);
48                                 push @selected_backup_ids, $backup_id;
49                                 my $currSize = BackupPC::Search::getGzipSizeFromBackupID($backup_id);
50                                 my $sth_size = $dbh->prepare(q{select inc_size from backups where id = ?});
51                                 $sth_size -> execute( $backup_id );
52                                 my $db_size = $sth_size->fetchrow_hashref()->{inc_size};
53
54                                 if ($db_size != $currSize) {
55                                         $cont .= "NOT EQUAL!: [fs_size:$currSize, db_size:$db_size, backup_id:$backup_id] <br />";
56                                 }
57                                 
58                                 if ($currSize > 0) {
59                                         $total_size += $currSize;
60                                 } 
61                                 $selected++;
62
63                                 my ($this_part) = $dbh->selectrow_array("select parts from backups where id = ?", undef, $backup_id);
64                                 $this_part--;
65                                 $parts += $this_part;
66                         } 
67                 }
68
69                 if ($total_size > ($Conf{ArchiveMediaSize} * $parts)) {
70                         $cont .= eval(' ${h2(Error)} ');
71                         $cont .= join(' '
72                                 , "Selected backups size", unit($total_size)
73                                 , "exceed medium size ", unit($Conf{ArchiveMediaSize})
74                         );
75                 } elsif ($total_size == 0) {
76                         $cont .= eval( q{ ${h2(Error)}});
77                         $cont .= "No backups selected.";
78                 } else {
79
80                         # create new archive
81                         my $sth = $dbh->prepare(q{
82                                 INSERT INTO archive (
83                                         id,
84                                         dvd_nr,
85                                         note,
86                                         username,
87                                         date,
88                                         total_size
89                                 ) VALUES (
90                                         nextVal('archive_id_seq'),
91                                         nextVal('dvd_nr'),
92                                         ?,
93                                         ?,
94                                         NOW(),
95                                         ?
96                                 )
97                         });
98
99                         $sth->execute($In{'note'}, $User, $total_size);
100
101                         foreach my $backup_id (@selected_backup_ids) {
102
103                                 # link backups with archive
104                                 my $sth = $dbh->prepare(q{
105                                         INSERT INTO archive_backup (
106                                                 archive_id, backup_id
107                                         ) VALUES (
108                                                 (SELECT last_value FROM archive_id_seq), ?
109                                         )
110                                 });
111
112                                 $sth->execute($backup_id);
113
114                                 $dbh->commit();
115
116                         }
117
118                         my ($dvd_nr) = $dbh->selectrow_array(qq{
119                                 select last_value from dvd_nr
120                         });
121
122                         $dvd_nr ||= 'error';
123
124                         $dbh->commit();
125
126                         my $db_size = 0;
127                         $sth = $dbh->prepare('SELECT SUM(gzip_size) AS suma FROM backups_on_dvds WHERE dvd_nr=?');
128                         $sth->execute($dvd_nr);
129                         $db_size = $sth->fetchrow_hashref()->{suma};
130                         $sth->finish();
131                         
132                         $cont .= q{
133                                 Archived following backups:
134                         } . join(", ", @selected_backup_ids) . q{
135                                 <br/>with total size of
136                         <b>} . unit($total_size)
137                         . q{</b>
138                                 to media <b>} . $dvd_nr . q{</b>
139                                 with following message:
140                                 <div style="background-color: #e0e0e0; display: inline; padding: 2px;">
141                         } . $In{'note'} . q{
142                                 </div>
143                         };
144                 }
145         }
146
147         $cont .= join(' '
148                 , "ArchiveMediaSize:", unit($Conf{ArchiveMediaSize})
149                 , "ArchiveChunkSize:", unit($Conf{ArchiveChunkSize})
150         );
151
152         Header($Lang->{Burn_media}, "", 1, "", $cont);
153
154         Trailer();
155         $dbh->disconnect();
156 }
157
158 1;