diff options
-rwxr-xr-x | perl-install/standalone/drakbackup | 269 |
1 files changed, 75 insertions, 194 deletions
diff --git a/perl-install/standalone/drakbackup b/perl-install/standalone/drakbackup index 379b10cb9..c473c61e6 100755 --- a/perl-install/standalone/drakbackup +++ b/perl-install/standalone/drakbackup @@ -140,11 +140,9 @@ $cfg_file = $cfg_dir . "drakbackup.conf"; my $backup_key = $user_home . "/.ssh/identity-drakbackup"; foreach (@ARGV) { - /--default/ and backend_mode(); /--daemon/ and daemon_mode(); /--show-conf/ and show_conf(); - /--config-info/ and explain_conf(); /--cd-info/ and get_cd_info(), exit(0); /--debug/ and $DEBUG = 1, next; } @@ -173,71 +171,6 @@ sub show_conf() { exit(0); } -sub explain_conf() { - print "\nConfiguration File Options: \n\n"; - print "Configuration file is located in:\n"; - print " Root Mode: /etc/drakxtools/drakbackup/drakbackup.conf.\n"; - print " User Mode: ~/.drakbackup/drakbackup.conf.\n\n"; - print "SYS_FILES Comma separated list of system directories to backup.\n"; - print "HOME_FILES Comma separated list of user home directories to backup.\n"; - print "OTHER_FILES Comma separated list of other files to backup.\n"; - print "PATH_TO_SAVE Default Hard Drive path to create backup files in.\n"; - print " Root Mode: default is /var/lib/drakbackup.\n"; - print " User Mode: default is ~/.drakbackup/backups.\n"; - print "NO_SYS_FILES Don't backup system files.\n"; - print "NO_USER_FILES Don't backup user files.\n"; - print "BACKUPIGNORE Honor .backupignore files in backup directories\n"; - print "OPTION_COMP Compression option (tar.gz, tar.bz2, tar).\n"; - print "NO_BROWSER_CACHE Skip web browser cache.\n"; - print "CDRW Backup media is re-writable CD.\n"; - print "DVDR Backup media is recordable DVD (not fully supported yet).\n"; - print "DVDRW Backup media is recordable DVD+RW.\n"; - print "DVDRAM Backup media is DVDRAM (not fully supported yet).\n"; - print "NET_PROTO Network protocol to use for remote backups: \n"; - print " ftp, rsync, ssh, or webdav.\n"; - print "HOST_NAME Remote backup host.\n"; - print "HOST_PATH Backup storage path or module on remote host.\n"; - print "REMEMBER_PASS Remember password on remote host in config file.\n"; - print "USER_KEYS Ssh keys are already setup for communicating with remote host.\n"; - print "DRAK_KEYS Use special drakbackup generated host keys.\n"; - print " (requires perl-Expect).\n"; - print "USE_EXPECT Use expect to do the whole scp transfer, without keys.\n"; - print " (requires perl-Expect).\n"; - print "LOGIN Remote host login name.\n"; - print "PASSWD Password on remote host (if REMEMBER_PASS is enabled).\n"; - print "DAEMON_MEDIA Daemon mode backup via given media.\n"; - print " (hd, cd, tape, ftp, rsync, ssh, or webdav).\n"; - print "HD_QUOTA Use quota to limit hard drive space used for backups.\n"; - print " (not supported yet).\n"; - print "USE_HD Use Hard Drive for backups (currently all modes use HD also).\n"; - print "MAX_SPACE Maximum Hard Drive Space(MB) to consume for backups. \n"; - print "USE_CD Use CD for backups.\n"; - print "USE_NET Use network for backups (driven by NET_PROTO).\n"; - print "USE_TAPE Use tape for backup.\n"; - print "DEL_HD_FILES Delete local hard drive tar files after backup to other media.\n"; - print "TAPE_NOREWIND Use non-rewinding tape device.\n"; - print "CD_TIME Length of CD media (not currently utilized).\n"; - print "DAEMON_TIME_SPACE Interval between daemon backup runs (hourly, daily, weekly)..\n"; - print "CD_WITH_INSTALL_BOOT Build a bootable restore CD (currently not utilized).\n"; - print "CD_DEVICE Cdrecord style CD device name (ie: 1,3,0).\n"; - print "USER_MAIL User to send backup results to via email.\n"; - print "SEND_MAIL Do send backup results via email.\n"; - print "TAPE_DEVICE Device to use for tape backup (ie: /dev/st0).\n"; - print "MEDIA_ERASE Erase media before new backup (applies to tape, CD).\n"; - print "MEDIA_EJECT Eject media after backup completes.\n"; - print "MULTI_SESSION Allow muliple sessions to be written to CD media.\n"; - print "SYS_INCREMENTAL_BACKUPS Do incremental or differential backups of system files.\n"; - print "USER_INCREMENTAL_BACKUPS Do incremental or differential backups of user files.\n"; - print "OTHER_INCREMENTAL_BACKUPS Do incremental or differential backups if other files.\n"; - print "SYS_DIFFERENTIAL_BACKUPS Do differential backups of system files.\n"; - print "USER_DIFFERENTIAL_BACKUPS Do differential backups of user files.\n"; - print "OTHER_DIFFERENTIAL_BACKUPS Do differential backups if other files.\n"; - print "NO_CRITICAL_SYS Do not backup critical system files:\n"; - print " passwd, fstab, group, mtab\n"; - print "CRITICAL_SYS Do backup above system files.\n"; - exit(0); -} - sub backend_mode() { build_backup_files(); exit(0); @@ -685,10 +618,10 @@ sub do_expect { if (!(-e $backup_key) && $mode eq "sendkey") { $in->ask_warn(N("Information"), N("This may take a moment to generate the keys.")); - cursor_wait(); + gtkset_mousecursor_wait(); #- not using a passphrase for the moment system("ssh-keygen -P '' -t dsa -f $backup_key"); - cursor_norm(); + gtkset_mousecursor_normal(); } my $exp = Expect->spawn($exp_command) or $in->ask_warn(N("Error"), N("Cannot spawn %s.", $exp_command)); @@ -838,10 +771,10 @@ sub erase_cdrw() { #- we can only hit this via interactive $interactive = 0; $in->ask_warn(N("Information"), N("This may take a moment to erase the media.")); - cursor_wait(); + gtkset_mousecursor_wait(); my $command = "cdrecord dev=$conf{CD_DEVICE} -blank=fast"; spawn_progress($command, "Erasing CDRW..."); - cursor_norm(); + gtkset_mousecursor_normal(); $interactive = 1; } @@ -906,13 +839,13 @@ sub build_cd() { sub get_tape_label { my ($device) = @_; - cursor_wait(); + gtkset_mousecursor_wait(); system("mt -f $device rewind"); system("tar -C $cfg_dir -xf $device"); my @volname = cat_("$cfg_dir/drakbackup.label"); unlink("$cfg_dir/drakbackup.label"); $vol_name = $volname[0]; - cursor_norm(); + gtkset_mousecursor_normal(); $vol_name; } @@ -1008,7 +941,7 @@ sub build_backup_files() { #- flush this so if the user does 2 runs in a row we don't try to send the same files @file_list_to_send_by_ftp = (); - $interactive and cursor_wait(); + $interactive and gtkset_mousecursor_wait(); read_conf_file(); $the_time = the_time(); $conf{SEND_MAIL} and complete_results(); @@ -1024,7 +957,7 @@ sub build_backup_files() { if ($used_space) { my $msg = N("Backup quota exceeded!\n%d MB used vs %d MB allocated.", $used_space, $conf{MAX_SPACE}); show_warning("f", $msg); - $interactive and cursor_norm(); + $interactive and gtkset_mousecursor_normal(); $results .= $msg; $interactive and show_status(); results_to_logfile(); @@ -1158,7 +1091,7 @@ sub build_backup_files() { if (!$filecount) { my $msg = N("No changes to backup!"); show_warning("w", $msg); - $interactive and cursor_norm(); + $interactive and gtkset_mousecursor_normal(); $interactive and interactive_mode(); results_to_logfile(); return 1; @@ -1261,7 +1194,7 @@ sub build_backup_files() { system("rm $conf{PATH_TO_SAVE}/list*$the_time.txt"); } - $interactive and cursor_norm(); + $interactive and gtkset_mousecursor_normal(); $interactive and show_status(); } @@ -1384,18 +1317,6 @@ sub check_pkg_needs() { } } -sub cursor_wait() { - # turn the cursor to a watch - $window1->window->set_cursor(new Gtk2::Gdk::Cursor("GDK_WATCH")); - gtkflush(); -} - -sub cursor_norm() { - # restore normal cursor - $window1->window->set_cursor(new Gtk2::Gdk::Cursor("GDK_LEFT_PTR")); - gtkflush(); -} - sub show_status() { my $text = new Gtk2::TextView; destroy_widget(); @@ -3426,7 +3347,7 @@ sub catalog_restore { $cat_entry = ''; return; } - cursor_wait(); + gtkset_mousecursor_wait(); @restore_files = (); $lmodel->clear; foreach my $filename (glob("$conf{PATH_TO_SAVE}/list*$cat_entry.txt")) { @@ -3437,7 +3358,7 @@ sub catalog_restore { $lmodel->append_set(undef, $s); } } - cursor_norm(); + gtkset_mousecursor_normal(); my @full_cat_entry = grep { /^$cat_entry/ } @catalog; $cat_entry = $full_cat_entry[0]; }); @@ -3630,28 +3551,38 @@ sub restore_catalog_entry { } +sub untar { + my ($cmd, $msg, $tarfile, $restorefile) = @_; + my $message = "Untarring from \n$tarfile \nto $restore_path."; + $message = "Untarring \n$restorefile from \n$tarfile \nto $restore_path." if $msg eq "files"; + my $untar_cmd = set_tar($untar_prefix, $tarfile); + my $command = "$untar_cmd $cmd"; + spawn_progress($command, $message); +} + +sub no_tarfile { + my ($tarfile) = @_; + if (!-e "$cfg_dir/restores/$tarfile") { + show_warning("f", N("%s not retrieved...", $tarfile)); + return 1; + } +} + sub restore_hd_or_cd { my ($cat_entry, $tarfile_dir, @restore_files) = @_; my $indv_files = @restore_files; - my $command; - my $wild_card = catalog_to_wildcard($cat_entry); if ($indv_files == 0) { #- full catalog specified - foreach (wildcard_to_tarfile($wild_card)) { - my $untar_cmd = set_tar($untar_prefix, $_); - $command = "$untar_cmd $tarfile_dir/$_"; - spawn_progress($command, "Untarring from \n$_ \nto $restore_path."); + foreach (wildcard_to_tarfile($wild_card)) { + untar("$tarfile_dir/$_", "all", $_, undef); } } else { #- individual files - pull from appropriate catalog foreach (@restore_files) { - my $tarfile = file_to_tarfile($_, $wild_card); - my $untar_cmd = set_tar($untar_prefix, $tarfile); - $_ = substr($_, 1); - $command = "$untar_cmd $tarfile_dir/$tarfile $_"; - spawn_progress($command, "Untarring \n$_ from \n$tarfile \nto $restore_path."); + my ($restorefile, $tarfile) = file_to_tarfile($_, $wild_card); + untar("$tarfile_dir/$tarfile $restorefile", "files", $tarfile, $restorefile); } } return 0; @@ -3660,50 +3591,23 @@ sub restore_hd_or_cd { sub restore_tape { my ($cat_entry, $dev_path, @restore_files) = @_; my $indv_files = @restore_files; - my $command; - my $wild_card = catalog_to_wildcard($cat_entry); $dev_path =~ s|/st|/nst|; if ($indv_files == 0) { #- full catalog specified foreach (wildcard_to_tarfile($wild_card)) { - my $offset = find_tape_offset($cat_entry); - $command = "mt -f $dev_path rewind"; - spawn_progress($command, "Rewinding tape on $dev_path."); - $command = "mt -f $dev_path fsf $offset"; - spawn_progress($command, "Moving forward $offset file records."); - $command = "tar -C $cfg_dir/restores -xf $dev_path"; - spawn_progress($command, "Untarring from $dev_path to work directory."); - if (-e "$cfg_dir/restores/$conf{PATH_TO_SAVE}/$_") { - my $untar_cmd = set_tar($untar_prefix, $_); - $command = "$untar_cmd $cfg_dir/restores/$conf{PATH_TO_SAVE}/$_"; - spawn_progress($command, "Untarring \n$_ \nto $restore_path."); - } else { - return 1; - } + get_file_from_tape($cat_entry, $dev_path); + return 1 if no_tarfile("$conf{PATH_TO_SAVE}/$_"); + untar("$cfg_dir/restores/$conf{PATH_TO_SAVE}/$_", "all", $_, undef); } } else { #- individual files - pull from appropriate catalog foreach (@restore_files) { - my $tarfile = file_to_tarfile($_, $wild_card); - $_ = substr($_, 1); - if (!-e "$cfg_dir/restores/$tarfile") { - my $offset = find_tape_offset($cat_entry); - $command = "mt -f $dev_path rewind"; - spawn_progress($command, "Rewinding tape on $dev_path."); - $command = "mt -f $dev_path fsf $offset"; - spawn_progress($command, "Moving forward $offset file records."); - $command = "tar -C cfg_dir/restores -xf $dev_path"; - spawn_progress($command, "Untarring from $dev_path to work directory."); - } - if (-e "$cfg_dir/restores/$tarfile") { - my $untar_cmd = set_tar($untar_prefix, $_); - $command = "$untar_cmd $cfg_dir/restores/$tarfile $_"; - spawn_progress($command, "Untarring \n$_ from \n$tarfile \nto $restore_path."); - } else { - return 1; - } + my ($restorefile, $tarfile) = file_to_tarfile($_, $wild_card); + get_file_from_tape($cat_entry, $dev_path) if !-e "$cfg_dir/restores/$tarfile"; + return 1 if no_tarfile($tarfile); + untar("$cfg_dir/restores/$tarfile $restorefile", "files", $tarfile, $restorefile); } } return 0; @@ -3714,7 +3618,6 @@ sub restore_ftp { my $ftp; my ($cat_entry, $hostname, $hostpath, $username, $userpass, @restore_files) = @_; my $indv_files = @restore_files; - my $command; $DEBUG and print "file list to retrieve: $cat_entry\n "; if ($DEBUG && $interactive) { $ftp = Net::FTP->new($hostname, Debug => 1) or return 1 } @@ -3729,31 +3632,18 @@ sub restore_ftp { #- full catalog specified foreach (wildcard_to_tarfile($wild_card)) { $ftp->get($_, "$cfg_dir/restores/$_"); - if (-e "$cfg_dir/restores/$_") { - my $untar_cmd = set_tar($untar_prefix, $_); - $command = "$untar_cmd $cfg_dir/restores/$_"; - spawn_progress($command, "Untarring \n$_ \nto $restore_path."); - } else { - show_warning("f", N("%s not retrieved...", $_)); - return 1; - } + return 1 if no_tarfile($_); + untar("$cfg_dir/restores/$_", "all", $_, undef); } } else { #- individual files - pull from appropriate catalog foreach (@restore_files) { - my $tarfile = file_to_tarfile($_, $wild_card); - $_ = substr($_, 1); + my ($restorefile, $tarfile) = file_to_tarfile($_, $wild_card); if (!-e "$cfg_dir/restores/$tarfile") { $ftp->get($tarfile, "$cfg_dir/restores/$tarfile"); } - if (-e "$cfg_dir/restores/$tarfile") { - my $untar_cmd = set_tar($untar_prefix, $tarfile); - $command = "$untar_cmd $cfg_dir/restores/$tarfile $_"; - spawn_progress($command, "Untarring \n$_ from \n$tarfile \nto $restore_path."); - } else { - show_warning("f", N("%s not retrieved...", $tarfile)); - return 1; - } + return 1 if no_tarfile($tarfile); + untar("$cfg_dir/restores/$tarfile $restorefile", "files", $tarfile, $restorefile); } } $ftp->quit; @@ -3763,54 +3653,39 @@ sub restore_ftp { sub restore_rsync_ssh_webdav { my ($cat_entry, $hostname, $hostpath, $username, $mode, @restore_files) = @_; my $indv_files = @restore_files; - my $command; my $wild_card = catalog_to_wildcard($cat_entry); if ($indv_files == 0) { #- full catalog specified foreach (wildcard_to_tarfile($wild_card)) { - if ($mode eq 'ssh') { - $command = "scp $username\@$hostname:$hostpath/$_ $cfg_dir/restores/"; - } elsif ($mode eq 'rsync') { - $command = "rsync --password-file=$cfg_dir/rsync.user $username\@$hostname" . "::" . "$hostpath/$_ $cfg_dir/restores/"; - } else { - $command = "wget http://$hostname/$hostpath/$_ -P $cfg_dir/restores/"; - } - spawn_progress($command, "Retrieving backup file \n$_ \nvia $mode."); - if (-e "$cfg_dir/restores/$_") { - my $untar_cmd = set_tar($untar_prefix, $_); - $command = "$untar_cmd $cfg_dir/restores/$_"; - spawn_progress($command, "Untarring \n$_ \nto $restore_path."); - } else { - return 1; - } + get_file_from_net($mode, $_, $hostname, $hostpath, $username); + return 1 if no_tarfile($_); + untar("$cfg_dir/restores/$_", "all", $_, undef); } } else { #- individual files - pull from appropriate catalog foreach (@restore_files) { - my $tarfile = file_to_tarfile($_, $wild_card); - $_ = substr($_, 1); - if (!-e "$cfg_dir/restores/$tarfile") { - if ($mode eq 'ssh') { - $command = "scp $username\@$hostname:$hostpath/$tarfile $cfg_dir/restores/"; - } elsif ($mode eq 'rsync') { - $command = "rsync --password-file=$cfg_dir/rsync.user $username\@$hostname" . "::" . "$hostpath/$tarfile $cfg_dir/restores/"; - } else { - $command = "wget http://$hostname/$hostpath/$tarfile -P $cfg_dir/restores/"; - } - spawn_progress($command, "Retrieving backup file \n$tarfile \nvia $mode."); - } - if (-e "$cfg_dir/restores/$tarfile") { - my $untar_cmd = set_tar($untar_prefix, $tarfile); - $command = "$untar_cmd $cfg_dir/restores/$tarfile $_"; - spawn_progress($command, "Untarring \n$_ from \n$tarfile \nto $restore_path."); - } else { - return 1; - } + my ($restorefile, $tarfile) = file_to_tarfile($_, $wild_card); + get_file_from_net($mode, $tarfile, $hostname, $hostpath, $username) if !-e "$cfg_dir/restores/$tarfile"; + return 1 if no_tarfile($tarfile); + untar("$cfg_dir/restores/$tarfile $restorefile", "files", $tarfile, $restorefile); } } return 0; } +sub get_file_from_net { + my ($mode, $tarfile, $hostname, $hostpath, $username) = @_; + my $command; + if ($mode eq 'ssh') { + $command = "scp $username\@$hostname:$hostpath/$tarfile $cfg_dir/restores/"; + } elsif ($mode eq 'rsync') { + $command = "rsync --password-file=$cfg_dir/rsync.user $username\@$hostname" . "::" . "$hostpath/$tarfile $cfg_dir/restores/"; + } else { + $command = "wget http://$hostname/$hostpath/$tarfile -P $cfg_dir/restores/"; + } + spawn_progress($command, "Retrieving backup file \n$tarfile \nvia $mode."); +} + sub catalog_to_wildcard { my ($cat_entry) = @_; my @line_data = split(':', $cat_entry); @@ -3833,10 +3708,11 @@ sub file_to_tarfile { my ($restore_file, $wildcard) = @_; my $tarfile = `grep -l $restore_file $conf{PATH_TO_SAVE}/*$wildcard.txt`; chop $tarfile; + $restore_file = substr($restore_file, 1); $tarfile = basename($tarfile); $tarfile =~ s/txt/$conf{OPTION_COMP}/; $tarfile =~ s/list/backup/; - $tarfile; + $restore_file, $tarfile; } sub find_tape_offset { @@ -3859,6 +3735,14 @@ sub find_tape_offset { } } +sub get_file_from_tape { + my ($cat_entry, $dev_path) = @_; + my $offset = find_tape_offset($cat_entry); + spawn_progress("mt -f $dev_path rewind", "Rewinding tape on $dev_path."); + spawn_progress("mt -f $dev_path fsf $offset", "Moving forward $offset file records."); + spawn_progress("tar -C cfg_dir/restores -xf $dev_path", "Untarring from $dev_path to work directory."); +} + sub restore_box() { my $retore_box; @@ -4366,7 +4250,6 @@ sub build_backup_status() { gtkflush(); } - sub build_backup_ftp_status() { $pbar = new Gtk2::ProgressBar; $pbar3 = new Gtk2::ProgressBar; @@ -4561,8 +4444,6 @@ sub interactive_mode() { $my_win->exit(0); } -################################################ HELP & ABOUT ################################################ - sub adv_help() { exec("drakhelp --id drakbackup") unless fork(); } |