X-Git-Url: http://git.ipfire.org/?p=people%2Fpmueller%2Fipfire-2.x.git;a=blobdiff_plain;f=html%2Fcgi-bin%2Fbackup.cgi;h=e526fc30e9c06d00f15ffa11afe63a3abd177ffc;hp=0948b7751a7df41affb359e8b17c3957b07fb796;hb=26906d98239bf79d9344e8f0796d5ca40d02ee73;hpb=986e08d996eadd906ecbe6c9ac8ad48aa78bd854
diff --git a/html/cgi-bin/backup.cgi b/html/cgi-bin/backup.cgi
index 0948b7751a..e526fc30e9 100644
--- a/html/cgi-bin/backup.cgi
+++ b/html/cgi-bin/backup.cgi
@@ -1,652 +1,328 @@
#!/usr/bin/perl
-#
-# IPFire CGI's - backup.cgi: manage import/export of configuration files
-#
-# This code is distributed under the terms of the GPL
-#
-# (c) The IPFire Team
-# 2005 Franck Bourdonnec, major rewrite
-#
-# $Id: backup.cgi,v 1.2.2.15 2006/01/29 15:31:49 eoberlander Exp $
-#
-#
-
-
-# to fully troubleshot your code, uncomment diagnostics, Carp and cluck lines
-# use diagnostics; # need to add the file /usr/lib/perl5/5.8.x/pods/perldiag.pod before to work
-# next look at /var/log/httpd/error_log , http://www.perl.com/pub/a/2002/05/07/mod_perl.html may help
-#use warnings;
+###############################################################################
+# #
+# IPFire.org - A linux based firewall #
+# Copyright (C) 2005-2010 IPFire Team #
+# #
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation, either version 3 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see . #
+# #
+###############################################################################
+
use strict;
-#use Carp ();
-#local $SIG{__WARN__} = \&Carp::cluck;
+# enable only the following on debugging purpose
+#use warnings;
+#use CGI::Carp 'fatalsToBrowser';
use File::Copy;
-use Sys::Hostname;
require '/var/ipfire/general-functions.pl';
require "${General::swroot}/lang.pl";
require "${General::swroot}/header.pl";
-my $errormessage = '';
-my $warnmessage = '';
-my $setdir = '/home/httpd/html/backup'; # location where sets are stored and imported
-my $datafile = hostname() . '.dat'; # file containing data backup
-my $datefile = $datafile . '.time'; # and creation date
-
-# ask if backup crypting key exists
-my $tmpkeyfile = "$setdir/key"; # import the backup key
-
-# Get GUI values
-my %settings = ();
-&Header::getcgihash(\%settings, {'wantfile' => 1, 'filevar' => 'FH'});
-
-##
-## Backup key management
-##
-
-#
-# Export the key. root pw is required to avoid user 'noboby' uses the helper to read it and creates
-# fake backup.
-#
-if ($settings{'ACTION'} eq $Lang::tr{'backup export key'}) {
-
- my $size = 0;
- if ($settings{'PASSWORD1'} ne '' && $settings{'PASSWORD1'} ne $settings{'PASSWORD2'} ){
- $errormessage = $Lang::tr{'passwords do not match'}
- } else {
- my @lines = `/usr/local/bin/ipfirebackup -keycat $settings{'PASSWORD'}`;
- # If previous operation succeded and the key need to be crypted, redo operation with pipe to openssl
- if (@lines && $settings{'PASSWORD1'}) {
- @lines = `/usr/local/bin/ipfirebackup -keycat $settings{'PASSWORD'}|openssl enc -a -e -aes256 -salt -pass pass:$settings{'PASSWORD1'} `;
- }
- if (@lines) {
- use bytes;
- foreach (@lines) {$size += length($_)};
- print "Pragma: no-cache\n";
- print "Cache-control: no-cache\n";
- print "Connection: close\n";
- print "Content-type: application/octet-stream\n";
- print "Content-Disposition: filename=backup.key\n";
- print "Content-Length: $size\n\n";
- print @lines;
- exit (0);
- } else {
- $errormessage = $Lang::tr{'incorrect password'};
- }
- }
-}
-#
-# Import the key. Fail if key exists. This avoid creating fake backup.
-#
-if ($settings{'ACTION'} eq $Lang::tr{'backup import key'}) {
- if (ref ($settings{'FH'}) ne 'Fh') {
- $errormessage = $Lang::tr{'no cfg upload'};
- } else {
- if (copy ($settings{'FH'}, $tmpkeyfile) != 1) {
- $errormessage = $Lang::tr{'save error'};
- } else {
- # if a password is given, decrypt the key received in $tmpkeyfile file with it.
- # no error is produce if the password is wrong.
- if ($settings{'PASSWORD1'}) {
- my @lines = `openssl enc -a -d -aes256 -salt -pass pass:$settings{'PASSWORD1'} -in $tmpkeyfile`;
- open(FILE,">$tmpkeyfile");
- print FILE @lines;
- close (FILE);
- }
- $errormessage = &get_bk_error(system ('/usr/local/bin/ipfirebackup -key import')>>8);
- }
- }
-}
-#
-# Import the key. Fail if key exists. Key is extracted from a non-encrypted backup (pre 1.4.10)
-#
-if ($settings{'ACTION'} eq $Lang::tr{'backup extract key'}) {
- if (ref ($settings{'FH'}) ne 'Fh') {
- $errormessage = $Lang::tr{'no cfg upload'};
- } else {
- if (copy ($settings{'FH'}, '/tmp/tmptarfile.tgz') != 1) {
- $errormessage = $Lang::tr{'save error'};
- } else {
- system( "tar -C /tmp -xzf /tmp/tmptarfile.tgz */backup/backup.key;\
- mv -f /tmp${General::swroot}/backup/backup.key $tmpkeyfile;\
- rm -rf /tmp${General::swroot};\
- rm /tmp/tmptarfile.tgz");
- $errormessage = &get_bk_error(system ('/usr/local/bin/ipfirebackup -key import')>>8);
- }
- }
-}
-#
-# Create the key. Cannot overwrite existing key to avoid difference with exported (saved) key
-#
-if ($settings{'ACTION'} eq $Lang::tr{'backup generate key'}) {
- $errormessage = &get_bk_error(system('/usr/local/bin/ipfirebackup -key new')>>8);
-}
+my %color = ();
+my %mainsettings = ();
+my %cgiparams=();
+my %checked = ();
+my $message = "";
+my $errormessage = "";
+my @backups = "";
+my @backupisos = "";
-my $cryptkeymissing = system ('/usr/local/bin/ipfirebackup -key exist')>>8;
+$a = new CGI;
-&Header::showhttpheaders();
-if ($cryptkeymissing) { #If no key is present, force creation or import
- &Header::openpage($Lang::tr{'backup configuration'}, 1, '');
- &Header::openbigbox('100%', 'left', '', $errormessage);
- if ($errormessage) {
- &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
- print "$errormessage ";
- &Header::closebox();
- }
- &Header::openbox('100%', 'left', $Lang::tr{'backup key'});
- print <
-
-
-END
-;
- &Header::closebox();
- &Header::closebigbox();
- &Header::closepage();
- exit (0);
- }
+ close UPLOADFILE;
+ system("/usr/local/bin/backupctrl restore >/dev/null 2>&1");
}
-##
-## Media management
-##
-#
-# now build the list of removable device
-#
-
-# Read partitions sizes registered with the system
-my %partitions;
-foreach my $li (`/usr/local/bin/ipfirebackup -proc partitions`) { # use suid helper...
- # partitions{'sda1'} = 128M if /major minor blocks name/
- $partitions{$4} = &kmgt($3*1024,4) if ($li =~ /(\d+) +(\d+) +(\d+) +(.*)/);
+elsif ( $cgiparams{'ACTION'} eq "restoreaddon" )
+{
+ chomp($cgiparams{'UPLOAD'});
+ # we need to fix cause IE7 gives the full path and FF only the filename
+ my @temp = split(/\\/,$cgiparams{'UPLOAD'});
+ my $upload = $a->param("UPLOAD");
+ open UPLOADFILE, ">/tmp/".$temp[$#temp];
+ binmode $upload;
+ while ( <$upload> ) {
+ print UPLOADFILE;
+ }
+ close UPLOADFILE;
+ system("/usr/local/bin/backupctrl restoreaddon ".$temp[$#temp]." >/dev/null 2>&1");
}
-# Search usb-storage scsi device
-my %medias;
-
-foreach (`/usr/local/bin/ipfirebackup -glob '/proc/scsi/usb-storage*/*'`) {# use suid helper...
- my $m;
- foreach ( `cat $_` ) { # list each line of information for the device:
-# Host scsi0: usb-storage
-# Vendor: SWISSBIT
-# Product: Black Silver
-# Serial Number: D0ED423A4F84A31E
-# Protocol: Transparent SCSI
-# Transport: Bulk
-# GUID: 13706828d0ed423a4f84a31e
-# Attached: Yes
-
- chomp;
- my ($key,$val) = split(': ',$_,2);
- $key =~ s/^ *//; # remove front space
-
- # convert 'scsi?' key to sda, sdb,... and use it as a %medias keyhash
- if ($key =~ /Host scsi(.)/) {
- $val = $m = 'sd' . chr(97+$1);
- $key = 'Host';
+&Header::showhttpheaders();
+
+sub refreshpage{&Header::openbox( 'Waiting', 1, "" );print "
$Lang::tr{'pagerefresh'}
";&Header::closebox();}
+
+&Header::openpage($Lang::tr{'backup'}, 1, "");
+&Header::openbigbox('100%', 'left', '', $errormessage);
+
+############################################################################################################################
+################################################### Default System calls ###################################################
+
+if ( $cgiparams{'ACTION'} eq "backup" )
+{
+ if ( $cgiparams{'BACKUPLOGS'} eq "include" ) {
+ system("/usr/local/bin/backupctrl include >/dev/null 2>&1");
+ } elsif ( $cgiparams{'BACKUPLOGS'} eq "exclude" ) {
+ system("/usr/local/bin/backupctrl exclude >/dev/null 2>&1");
+ } elsif ( $cgiparams{'BACKUPLOGS'} eq "iso" ) {
+ system("/usr/local/bin/backupctrl iso >/dev/null 2>&1");
}
- $medias{$m}{$key} = $val; # save data
- }
}
-
-#
-# Switch mounted media
-#
-if ($settings{'ACTION'} eq $Lang::tr{'mount'})
+if ( $cgiparams{'ACTION'} eq "addonbackup" )
{
- # Find what is really mounted under backup. Can be local hard disk or any removable media
- my $mounted = &findmounted();
- #umount previous, even if same device already mouted.
- system ("/usr/local/bin/ipfirebackup -U $mounted") if ($mounted ne $Lang::tr{'local hard disk'});
- $errormessage = `/usr/local/bin/ipfirebackup -M $settings{'SELECT'}` if (grep (/$settings{'SELECT'}/,%partitions));
+ system("/usr/local/bin/backupctrl addonbackup $cgiparams{'ADDON'} >/dev/null 2>&1");
}
-#
-# Compute a full description of device
-#
-my $mounted = &findmounted();
-my $media_des = $mounted; # Description
-if ($mounted ne $Lang::tr{'local hard disk'}) {
- $_ = $mounted; # sda1 => sda
- tr/0-9//d;
- $media_des = "$medias{$_}{'Product'} ($media_des, $partitions{$mounted})";
+elsif ( $cgiparams{'ACTION'} eq "delete" )
+{
+ system("/usr/local/bin/backupctrl $cgiparams{'FILE'} >/dev/null 2>&1");
}
-&Header::openpage($Lang::tr{'backup configuration'}, 1, '');
-&Header::openbigbox('100%', 'left', '', $errormessage);
-if ($errormessage) {
- &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
- print "$errormessage ";
- &Header::closebox();
+############################################################################################################################
+############################################ Backups des Systems erstellen #################################################
+
+if ( $message ne "" ){
+ &Header::openbox('100%','left',$Lang::tr{'error messages'});
+ print "$message\n";
+ &Header::closebox();
}
-$warnmessage = "$Lang::tr{'capswarning'}: $warnmessage
" if ($warnmessage);
+if ( -e "/var/ipfire/backup/" ){
+ @backups = `cd /var/ipfire/backup/ && ls *.ipf 2>/dev/null`;
+}
-&Header::openbox('100%', 'left', $Lang::tr{'backup configuration'});
+if ( -e "/var/tmp/backupiso/" ){
+ @backupisos = `cd /var/tmp/backupiso/ && ls *.iso 2>/dev/null`;
+}
-#Divide the window in two : left and right
-print <
-
-
$Lang::tr{'current media'}:$media_des
-
-
$Lang::tr{'choose media'}
-
-END
-;
+&Header::openbox('100%', 'center', $Lang::tr{'backup'});
-# Left part of window
print <
-
-
$Lang::tr{'backup sets'}:
-
-
-
$Lang::tr{'name'}
-
$Lang::tr{'action'}
-
+
END
;
+&Header::closebox();
-# get list of available sets by globbing directories under $setdir
-# External device (usk key) are mounted in $setdir. -R permits finding sets in hierarchy.
-my $i = 0;
-foreach my $set (`ls -Rt1 $setdir`) {
- chop ($set); #remove ':' & newline from line
- chop ($set);
- if (-d $set && ($set =~ m!/.+/\d{8}_\d{6}! ) ) { # filter out things not sets !
- if ($i++ % 2) {
- print "
+############################################################################################################################
+############################################ Backups des Systems downloaden ################################################
-
' if ($settings{'ACTION'} eq $Lang::tr{'backup to floppy'} );
}
-
-# Return device name of what is mounted under 'backup'
-sub findmounted() {
- my $mounted = `mount|grep ' /home/httpd/html/backup '`;
- if ($mounted) { # extract device name
- $mounted =~ m!^/dev/(.*) on!; # device on mountmoint options
- return $1;
- } else { # it's the normal subdir
- return $Lang::tr{'local hard disk'};
- }
-}
-# read and return a date/time string from a time file
-sub read_timefile() {
- my $fname = shift; # name of file to read from
- my $fname2 = shift; # if first file doesn't exist, get date of this file
-
- my $dt;
- if (defined(open(FH, "<$fname"))) {
- $dt = ;
- chomp $dt;
- close(FH);
- } else {
- $dt = &get_fdate($fname2); # get file date/time
- write_timefile($fname, $dt); # write to expected time file
- }
- return $dt;
+else{
+ print "
$Lang::tr{'backup from'} $_
";
}
-# write a date/time string to a time file
-sub write_timefile() {
- my $fname = shift; # name of file to write to
- my $dt = shift; # date/time string to write
-
- if (open(FH, ">$fname")) {
- print FH "$dt\n";
- close(FH);
- }
+print <
+
+
+END
+;
}
-# move a dat file without time stamp to subdir
-sub import_set() {
- my $dt = get_fdate("$setdir/$datafile") . shift;
- &write_timefile("$setdir/$datefile", $dt);
-
- # create set directory
- my $setname = "$setdir/" . get_ddate("$setdir/$datafile");
- mkdir($setname);
-
- # move files to the new set directory
- copy_files($setdir, $setname);
- erase_files ($setdir);
+foreach (keys(%addons)){
+chomp($_);
+my $Datei = "/var/ipfire/backup/addons/backup/".$_.".ipf";
+my @Info = stat($Datei);
+my $Size = $Info[7] / 1024;
+$Size = sprintf("%2d", $Size);
+print "