diff options
author | Stew Benedict <stewb@mandriva.org> | 2002-08-15 21:04:01 +0000 |
---|---|---|
committer | Stew Benedict <stewb@mandriva.org> | 2002-08-15 21:04:01 +0000 |
commit | c8798da6103b835a7ac68907c193ab6e96b6a040 (patch) | |
tree | 72de95778d4263a5f34db83c7ab1749832fe73e8 | |
parent | 816fbeb04becb41dcc229f0d5a3accc565a8f808 (diff) | |
download | drakx-backup-do-not-use-c8798da6103b835a7ac68907c193ab6e96b6a040.tar drakx-backup-do-not-use-c8798da6103b835a7ac68907c193ab6e96b6a040.tar.gz drakx-backup-do-not-use-c8798da6103b835a7ac68907c193ab6e96b6a040.tar.bz2 drakx-backup-do-not-use-c8798da6103b835a7ac68907c193ab6e96b6a040.tar.xz drakx-backup-do-not-use-c8798da6103b835a7ac68907c193ab6e96b6a040.zip |
Allow non-root user to use program with personal config.
Finish multisession support.
Fix various crash scenarios in GUI in restore mode.
Fix user restore mode to restore only what is requested.
View archive contents before restore, user & sys mode.
Add explanation of config file options for non-X users.
-rwxr-xr-x | perl-install/standalone/drakbackup | 492 |
1 files changed, 341 insertions, 151 deletions
diff --git a/perl-install/standalone/drakbackup b/perl-install/standalone/drakbackup index b2f121e6b..da28b3920 100755 --- a/perl-install/standalone/drakbackup +++ b/perl-install/standalone/drakbackup @@ -148,6 +148,7 @@ if ("@ARGV" =~ /--help|-h/) { --default : save default directories. --debug : show all debug messages. --show-conf : list of files or directories to backup. +--config-info : explain configuration file options (for non-X users). --daemon : use daemon configuration. --help : show this message. --version : show version name. @@ -213,7 +214,8 @@ my $backup_bef_restore = 0; my $table; my @user_list_backuped; my @files_corrupted; -my $remove_user_before_restore = 1; +#- ack - not a great default - changed 20020814 (SB) +my $remove_user_before_restore = 0; my @file_list_to_send_by_ftp; my $results; my @net_methods = ("ftp", "rsync", "ssh", "webdav"); @@ -228,7 +230,6 @@ my @sys_files = ("/etc"); my @user_list; my @list_other = () ; my $cfg_dir = "/etc/drakxtools/drakbackup/"; -my $cfg_file = $cfg_dir . "drakbackup.conf"; my $save_path = "/var/lib/drakbackup"; my $log_buff; my $comp_mode = 0; @@ -256,12 +257,10 @@ my $tape_daemon = 0; my $webdav_daemon = 0; my $rsync_daemon = 0; my $hd_quota = 0; -#my $where_net_ftp = 0; #- 7/4/2002 SB - consolidate net methods my $where_use_net = 0; -#my $where_net_ssh = 0; my $where_net = 0; my $where_hd = 1; my $where_cd = 0; @@ -272,7 +271,6 @@ my $cd_with_install_boot = 0; my $cd_device = ''; my $host_name = ''; my $backupignore = 0; -my $auth_choice = 0; my $remember_pass = 0; my $passwd_user = ''; my $tape_device; @@ -290,11 +288,29 @@ my $xfer_keys = 0; my $user_keys = 1; my $user_home = $ENV{"HOME"}; my $backup_key = $user_home . "/.ssh/identity-drakbackup"; +my $nonroot_user = 0; +my $not_warned = 0; + +# allow not-root user with own config +if ($ENV{USER} ne 'root') { + $cfg_dir = "$user_home/.drakbackup/"; + $save_path = $cfg_dir . "backups"; + -d $save_path or mkdir_p $save_path; + $nonroot_user = 1; + $not_warned = 1; + $backup_sys = 0; + $backup_daemon = 0; + $daemon = 0; + @user_list = ("$ENV{USER}"); +} +my $cfg_file = $cfg_dir . "drakbackup.conf"; 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; } @@ -307,6 +323,70 @@ 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= Space seperated list of system directories to backup.\n"; + print "HOME_FILES= Space seperated list of user home directories to backup.\n"; + print "OTHER_FILES= Space seperated 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 "OPTION_COMP Compression option - TAR.GZ or TAR.BZ2 (tar.gz is default).\n"; + print "BROWSER_CACHE Backup web browser cache also.\n"; + print "CDRW Backup media is re-writable CD.\n"; + print "DVDR Backup media is recordable DVD (not fully supported yet).\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, disabled).\n"; + print "USE_EXPECT Use expect to do the whole scp transfer, without keys.\n"; + print " (requires perl-Expect, disabled).\n"; + print "LOGIN= Remote host login name.\n"; + print "PASSWD= Password on remote host (if REMEMBER_PASS is enabled).\n"; + print "HD_DAEMON Daemon mode backup via Hard Drive.\n"; + print " (only one daemon media should be used).\n"; + print "CD_DAEMON Daemon mode backup via CD.\n"; + print "TAPE_DAEMON Daemon mode backup via tape (requires mt-st).\n"; + print "FTP_DAEMON Daemon mode backup via ftp\n"; + print "RSYNC_DAEMON Daemon mode backup via rsync (requires rsync).\n"; + print "SSH_DAEMON Daemon mode backup via ssh (requires ssh, scp).\n"; + print "WEBDAV_DAEMON Daemon mode backup via webDAV (requires sitecopy).\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 "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 "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 backups of system files.\n"; + print "USER_INCREMENTAL_BACKUPS Do imcremental backups of user files.\n"; + print "OTHER_INCREMENTAL_BACKUPS Do incremental 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 { $backend_only = 1; build_backup_files(); @@ -500,12 +580,10 @@ sub save_conf_file { $backup_other_versions and push @cfg_list, "OTHER_INCREMENTAL_BACKUPS\n" ; $media_erase and push @cfg_list, "MEDIA_ERASE\n" ; $media_erase and push @cfg_list, "MEDIA_EJECT\n" ; + $multi_session and push @cfg_list, "MULTI_SESSION\n" ; $remember_pass and push @cfg_list, "LOGIN=$login_user\n" ; $remember_pass and push @cfg_list, "PASSWD=$passwd_user\n" ; $remember_pass and push @cfg_list, "REMEMBER_PASS\n" ; - $auth_choice or push @cfg_list, "AUTH_CHOICE=0\n" ; - if ($auth_choice == 1) { push @cfg_list, "AUTH_CHOICE=1\n" } - if ($auth_choice == 2) { push @cfg_list, "AUTH_CHOICE=2\n" } $user_keys and push @cfg_list, "USER_KEYS\n" ; $xfer_keys and push @cfg_list, "DRAK_KEYS\n" ; $use_expect and push @cfg_list, "USE_EXPECT\n" ; @@ -535,7 +613,7 @@ sub save_conf_file { } output_p($cfg_file, @cfg_list); chmod(0600, "$cfg_file"); - save_cron_files(); + save_cron_files() if ($backup_daemon); } sub read_cron_files { @@ -551,6 +629,12 @@ sub read_cron_files { } sub save_cron_files { + if ($nonroot_user) { + show_warning("Cron not available yet as non-root") if ($not_warned); + $not_warned = 0; + $backup_daemon = 0; + return(1); + } my @cron_file = ("#!/bin/sh\n", "export TERM=xterm\n", "/usr/sbin/drakbackup --daemon > /dev/null 2>&1\n"); if ($backup_daemon) { @@ -604,7 +688,6 @@ sub read_conf_file { if (/^CD_WITH_INSTALL_BOOT/) { $cd_with_install_boot = 1 } if (/^CD_DEVICE/) { s/^CD_DEVICE=//gi; $cd_device = $_ } if (/^HOST_NAME/) { s/^HOST_NAME=//gi; $host_name = $_ } - if (/^AUTH_CHOICE/) { s/^AUTH_CHOICE=//gi; $auth_choice = $_ } if (/^REMEMBER_PASS/) { $remember_pass = 1 } if (/^USER_KEYS/) { $user_keys = 1 } if (/^DRAK_KEYS/) { $xfer_keys = 1; $user_keys = 0 } @@ -616,6 +699,7 @@ sub read_conf_file { if (/^TAPE_DEVICE/) { s/TAPE_DEVICE=//gi; $tape_device = $_ } if (/^MEDIA_ERASE/) { $media_erase = 1 } if (/^MEDIA_EJECT/) { $media_eject = 1 } + if (/^MULTI_SESSION/) { $multi_session = 1 } if (/^SYS_INCREMENTAL_BACKUPS/) { $backup_sys_versions = 1 } if (/^USER_INCREMENTAL_BACKUPS/) { $backup_user_versions = 1 } if (/^OTHER_INCREMENTAL_BACKUPS/) { $backup_other_versions = 1 } @@ -890,8 +974,7 @@ sub check_for_cd { } } -sub write_on_cd { - +sub write_on_cd { my $command = "cdrecord -v dev=$cd_device -data "; #- only blank if it's the first session $command .= "blank=fast " if (($media_erase) && ($session_offset eq '')); @@ -903,6 +986,17 @@ sub write_on_cd { unlink("$save_path/drakbackup.iso"); } +sub erase_cdrw { + #- we can only hit this via interactive + $interactive = 0; + $in->ask_warn('',_("This may take a moment to erase the media.")); + cursor_wait(); + my $command = "cdrecord dev=$cd_device -blank=fast"; + spawn_progress($command, "Erasing CDRW..."); + cursor_norm(); + $interactive = 1; +} + sub spawn_progress { my ($command, $descr) = @_; my $value; @@ -1037,7 +1131,8 @@ sub build_backup_files { $tar_cmd_other = $tar_cmd; $no_critical_sys and $tar_cmd_sys .= "--exclude passwd --exclude fstab --exclude group --exclude mtab"; $what_no_browser and $tar_cmd_user .= "--exclude NewCache --exclude Cache --exclude cache"; - + $nonroot_user and $tar_cmd_user .= " --exclude .drakbackup"; + -d $save_path and @dir_content = all($save_path); grep (/^backup\_base\_sys/, @dir_content) and $base_sys_exist = 1; @@ -1302,15 +1397,15 @@ sub show_status { $table->destroy(); gtkpack($advanced_box, - $box2 = gtkpack_(new Gtk::VBox(0,10), + $table = gtkpack_(new Gtk::VBox(0,10), 1, gtkpack_(new Gtk::HBox(0,0), 1, gtktext_insert(gtkset_editable($text, 0), "$results"), 0, new Gtk::VScrollbar($text->vadj), ), ), ); - $central_widget = \$box2; - $box2->show_all(); + $central_widget = \$table; + $table->show_all(); } sub list_remove { @@ -1379,11 +1474,6 @@ sub check_list { sub fonction_env { ($central_widget, $current_widget, $previous_widget, $custom_help, $next_widget) = @_; - if ($DEBUG) { - print "central_widget = $central_widget\ncurrent_widget = $current_widget\n"; - print "previous_widget = $previous_widget\ncustom_help = $custom_help\n"; - print "next_widget = $next_widget\n"; - } } # sub redraw_during_check { @@ -1734,13 +1824,20 @@ sub advanced_where_cd { ), 0, new Gtk::VBox(0, 5), 0, gtkpack_(new Gtk::HBox(0,10), + 0, gtkset_sensitive(new Gtk::Label(_("Please check for multisession CD")), $where_cd), + 1, new Gtk::VBox(0, 5), + 0, gtkset_sensitive(my $check_multisession = new Gtk::CheckButton(), $where_cd), + ), + 0, new Gtk::VBox(0, 5), + 0, gtkpack_(new Gtk::HBox(0,10), 0, gtkset_sensitive(new Gtk::Label(_("Please check if you are using CDRW media")), $where_cd), 1, new Gtk::VBox(0, 5), 0, gtkset_sensitive(my $check_cdrw = new Gtk::CheckButton(), $where_cd), ), 0, new Gtk::VBox(0, 5), 0, gtkpack_(new Gtk::HBox(0,10), - 0, gtkset_sensitive(new Gtk::Label(_("Please check if you want to erase your RW media")), $cdrw && $where_cd), + 0, gtkset_sensitive(new Gtk::Label(_("Please check if you want to erase your RW media (1st Session)")), $cdrw && $where_cd), + 0, gtkset_sensitive(my $button_erase_now = new Gtk::Button(_(" Erase Now ")), $cdrw), 1, new Gtk::VBox(0, 5), 0, gtkset_sensitive(my $check_cdrw_erase = new Gtk::CheckButton(), $cdrw && $where_cd), ), @@ -1774,7 +1871,7 @@ sub advanced_where_cd { ); # foreach ([$check_cdrw_erase, \$media_erase], [$check_cd_with_install_boot, \$cd_with_install_boot ]) { - foreach ([$check_cdrw_erase, \$media_erase], [$check_dvdr, \$dvdr], [$check_dvdram, \$dvdram]) { + foreach ([$check_cdrw_erase, \$media_erase], [$check_dvdr, \$dvdr], [$check_dvdram, \$dvdram], [$check_multisession, \$multi_session]) { my $ref = $_->[1]; gtksignal_connect(gtkset_active($_->[0], ${$ref}), toggled => sub { ${$ref} = ${$ref} ? 0 : 1 }) } @@ -1794,6 +1891,13 @@ sub advanced_where_cd { ${$central_widget}->destroy(); $current_widget->(); }); + $button_erase_now->signal_connect('clicked', sub { + if ($cd_device ne '') { + erase_cdrw(); + } else { + $in->ask_warn('',_("No CD device defined!")); + } + }); $combo_where_cdrecord_device->entry->set_text($cd_device); $combo_where_cdrecord_device->entry->signal_connect('changed', sub { $cd_device = $combo_where_cdrecord_device->entry->get_text() }); @@ -1984,9 +2088,6 @@ sub advanced_where{ 1, gtkpack_(new Gtk::VBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtksignal_connect(my $button_where_net = new Gtk::Button(), clicked => sub { -# $box_where->destroy(); advanced_where_net(); }), -# $box_where->destroy(); advanced_where_net_ftp(); }), -# $box_where->destroy(); ${$central_widget}->destroy(); advanced_where_net_types(); }), @@ -2280,7 +2381,6 @@ sub wizard_step2 { 1, new Gtk::VBox(0, 5), ), ); -# $where_net = $where_net_ssh || $where_net_ftp; foreach ([$check_wizard_hd, \$where_hd], [$check_wizard_cd, \$where_cd], [$check_wizard_tape, \$where_tape], @@ -2291,8 +2391,6 @@ sub wizard_step2 { $where_hd = 1; if (!$where_hd && !$where_cd && !$where_net) { $next_widget = \&message_noselect_box } else { $next_widget = \&wizard_step3 } -# if(!$where_net) {$where_net_ssh = 0; $where_net_ftp = 0; } -# else {$where_net_ftp = 1;} ${$central_widget}->destroy(); wizard_step2(); }) @@ -2488,13 +2586,20 @@ sub select_user_data_to_restore { my $more_recent = (split(' ', select_most_recent_selected_of($var_tmp)))[0]; foreach (grep /^backup\_user\_$var_tmp\_/, sort @list_backup) { s/.tar.gz//gi; - s/.tar.bz2//gi; + s/.tar.bz2//gi; if ($more_recent) { if (/$more_recent/) { push @list_tmp , $_; $var_eq = 0; - } else { - $var_eq and push @list_tmp , $_; + } else { + #- only if user asked for it - previously this was restoring everything (SB) + my $tmp_name = $_; + s/backup\_user\_//gi; + foreach my $buff (@user_list_to_restore2) { + if (index($buff, $_) >= 0) { + $var_eq and push @list_tmp , $tmp_name; + } + } } } } @@ -2507,7 +2612,7 @@ sub select_user_data_to_restore { } } } - $DEBUG and print "(incremental restore) real user list to restore : $_ \n" foreach (@user_list_to_restore); + $DEBUG and print "real user list to restore: $_ \n" foreach (@user_list_to_restore); } sub select_sys_data_to_restore { @@ -2528,12 +2633,69 @@ sub select_sys_data_to_restore { $DEBUG and print "sys list to restore: $_\n " foreach (@sys_list_to_restore); } +sub show_backup_details { + my ($function, $mode, $name) = @_; + my $archive_file_detail; + my $value; + my $fixed_font = Gtk::Gdk::Font->load("-misc-fixed-medium-r-*-*-*-100-*-*-*-*-*-*"); + my $command2; + my $tarfile; + + # FIXME - only tar.gz at the moment + my $extension = ".tar.gz"; + + if ($mode eq "user") { + #- we've only got a partial filename in this case + $tarfile = "$path_to_find_restore/backup_*" . $name . $extension; + } + if ($mode eq "sys") { + #- funky string here we need to use to reconstruct the filename + my @flist = split(/[ \t,]+/, $name); + $tarfile = "$path_to_find_restore/backup_*" . $flist[2] . $extension; + } + my $command1 = "stat " . $tarfile; + $command2 = "tar -tzvf " . $tarfile; + + open TMP, "$command1 2>&1 |"; + while ($value = <TMP>) { + $archive_file_detail .= $value; + } + close TMP; + $archive_file_detail .= "\n\n"; + open TMP, "$command2 2>&1 |"; + while ($value = <TMP>) { + #- drop the permissions display for the sake of readability + $archive_file_detail .= substr($value, 11); + } + close TMP; + + my $text = new Gtk::Text(undef, undef); + my $advanced_box_archive; + $text->insert($fixed_font, undef, undef,$archive_file_detail); + gtkpack($advanced_box, + $advanced_box_archive = gtkpack_(new Gtk::VBox(0,10), + 1, gtkpack_(new Gtk::HBox(0,0), + 1, $text, + 0, new Gtk::VScrollbar($text->vadj), + ), + 0, gtkadd(gtkset_layout(new Gtk::HButtonBox, -spread), + gtksignal_connect(new Gtk::Button(_("Done")), clicked => sub { + ${$central_widget}->destroy(); + $function->() }), + ), + ) + ); + $central_widget = \$advanced_box_archive; + $up_box->show_all(); +} + sub valid_backup_test { my (@files_list) = @_; @files_corrupted = (); my $is_corrupted = 0; foreach (@files_list) { - if (system("gzip -l $path_to_find_restore/$_") > 1) { + #- let's quiet this down (SB) + if (system("gzip -l $path_to_find_restore/$_ > /dev/null 2>&1") > 1) { push @files_corrupted, $_; $is_corrupted = -1; } @@ -2554,17 +2716,17 @@ sub restore_aff_backup_problems { gtkpack($advanced_box, $do_restore = gtkpack_(new Gtk::VBox(0,10), - 0, new Gtk::VBox(0,10), - 1, gtkpack_(new Gtk::HBox(0, 15), - 1, new Gtk::VBox(0, 5), - 0, new Gtk::Pixmap($pix_warn_map, $pix_warn_mask), - 0, _("Backup files are corrupted"), - 1, new Gtk::VBox(0, 5), - ), - 0, new Gtk::VBox(0,10), - 1, createScrolledWindow($text), - ), - ); + 0, new Gtk::VBox(0,10), + 1, gtkpack_(new Gtk::HBox(0, 15), + 1, new Gtk::VBox(0, 5), + 0, new Gtk::Pixmap($pix_warn_map, $pix_warn_mask), + 0, _("Backup files are corrupted"), + 1, new Gtk::VBox(0, 5), + ), + 0, new Gtk::VBox(0,10), + 1, createScrolledWindow($text), + ), + ); button_box_restore_pbs_end(); fonction_env(\$do_restore, \&restore_aff_backup_problems, "", "restore_pbs"); $up_box->show_all(); @@ -2579,7 +2741,7 @@ sub restore_aff_result { gtkpack($advanced_box, $do_restore = gtkpack_(new Gtk::VBox(0,10), 1, new Gtk::VBox(0,10), - 0, _(" All your selectionned data have been "), + 0, _(" All of your selected data have been "), 0, _(" Successfuly Restored on %s ", $restore_path), 1, new Gtk::VBox(0,10), ), @@ -2609,32 +2771,43 @@ sub restore_backend { my $untar_cmd; my $exist_problem = 0; my $user_dir; + my $tnom; + my $username; + my $theure2; + if (grep /tar.gz$/, all($path_to_find_restore)) { $untar_cmd = 0; } else { $untar_cmd = 1; } - if ($restore_user) { - if ($backup_user_versions) { - select_user_data_to_restore(); - if (valid_backup_test(@user_list_to_restore) == -1) { - $exist_problem = 1; - restore_aff_backup_problems(); - } else { - foreach (@user_list_to_restore) { - my ($tnom, $username, $theure2) = /^(\w+\_\w+\_user_)(.*)_(\d+\_\d+.*)$/; - $DEBUG and print "user name to restore: $username, user directory: $user_dir\n"; - if ($remove_user_before_restore) { - $user_dir = return_path($username); - -d $user_dir and rm_rf($user_dir); - } - $untar_cmd or system(" tar xfz $path_to_find_restore/$_ -C $restore_path") ; - $untar_cmd and system("/usr/bin/bzip2 -cd $path_to_find_restore/$_ | tar xf -C $restore_path ") ; + + if ($restore_user) { + select_user_data_to_restore(); + if (valid_backup_test(@user_list_to_restore) == -1) { + $exist_problem = 1; + restore_aff_backup_problems(); + } else { + foreach (@user_list_to_restore) { + if ($backup_user_versions) { + ($tnom, $username, $theure2) = /^(\w+\_\w+\_user_)(.*)_(\d+\_\d+.*)$/; + } else { + ($tnom, $username, $theure2) = /^(\w+\_user_)(.*)_(\d+\_\d+.*)$/; } - } - } + + $user_dir = return_path($username); + -d $user_dir and rm_rf($user_dir) if ($remove_user_before_restore) ; + + $DEBUG and print "user name to restore: $username, user directory: $user_dir\n"; + $untar_cmd or system(" tar xfz $path_to_find_restore/$_ -C $restore_path") ; + $untar_cmd and system("/usr/bin/bzip2 -cd $path_to_find_restore/$_ | tar xf -C $restore_path ") ; + } + #- flush this out for another cycle (SB) + @user_list_to_restore2 = (); + } + } - if ($restore_sys) { + + if ($restore_sys) { if ($backup_sys_versions) { select_sys_data_to_restore(); if (valid_backup_test(@sys_list_to_restore) == -1) { @@ -2718,50 +2891,62 @@ my %check_user_to_restore; sub restore_step_user { my $retore_step_user; my @tmp_list = sort @user_backuped; - @user_backuped = @tmp_list; - + @user_backuped = @tmp_list; gtkpack($advanced_box, - $retore_step_user = gtkpack_(new Gtk::VBox(0,10), - 0, new Gtk::VBox(0,10), - 0, _("User list to restore (only the most recent date per user is important)"), - 1, createScrolledWindow(gtkpack_(new Gtk::VBox(0,0), - map { my $name; - my $var2; - my $name_complet = $_; - $name = (split(' ',$name_complet))[0]; - my @user_list_tmp; - - my $b = new Gtk::CheckButton($name_complet); - if (grep $name_complet, @user_list_to_restore2) { - gtkset_active($b, 1); - $check_user_to_restore{$name_complet}[1] = 1; - } else { - gtkset_active($b, 0); - $check_user_to_restore{$name_complet}[1] = 0; - } - $b->signal_connect(toggled => sub { - if (!$check_user_to_restore{$name_complet}[1] ) { - $check_user_to_restore{$name_complet}[1] = 1; - if (!grep (/$name/, @user_list_to_restore2)) { - push @user_list_to_restore2, $name_complet } - } else { - $check_user_to_restore{$name_complet}[1] = 0; - foreach (@user_list_to_restore2) { - $var2 = (split(' ',$_))[0]; - if ($name ne $var2) { - push @user_list_tmp, $_; - } - } - @user_list_to_restore2 = @user_list_tmp; - } - }); - $b } (@user_backuped) - ), - ), - ), - ); + $retore_step_user = gtkpack_(new Gtk::VBox(0,10), + 0, new Gtk::VBox(0,10), + 0, _("User list to restore (only the most recent date per user is important)"), + 1, createScrolledWindow(gtkpack__(new Gtk::VBox(0,0), + map { my $name; + my $var2; + my $name_complet = $_; + $name = (split(' ',$name_complet))[0]; + my @user_list_tmp; + my $restore_row = new Gtk::HBox(0,5); + my $b = new Gtk::CheckButton($name_complet); + my $details = new Gtk::Button(" Details "); + + $restore_row->pack_start($b, 1, 1, 0); + $restore_row->pack_end(new Gtk::VBox(1,5), 0, 0, 0); + $restore_row->pack_end($details, 0, 0, 0); + + if (grep $name_complet, @user_list_to_restore2) { + gtkset_active($b, 1); + $check_user_to_restore{$name_complet}[1] = 1; + } else { + gtkset_active($b, 0); + $check_user_to_restore{$name_complet}[1] = 0; + } + $b->signal_connect(toggled => sub { + if (!$check_user_to_restore{$name_complet}[1] ) { + $check_user_to_restore{$name_complet}[1] = 1; + if (!grep (/$name/, @user_list_to_restore2)) { + push @user_list_to_restore2, $name_complet } + } else { + $check_user_to_restore{$name_complet}[1] = 0; + foreach (@user_list_to_restore2) { + $var2 = (split(' ',$_))[0]; + if ($name ne $var2) { + push @user_list_tmp, $_; + } + } + @user_list_to_restore2 = @user_list_tmp; + } + }); + $details->signal_connect('clicked', sub { + #- we're only passing a portion of the filename to + #- the subroutine so we need to let it know this + ${$central_widget}->destroy(); + show_backup_details(\&restore_step_user, "user", $name); + }); + $restore_row } (@user_backuped) + ), + ), + ), + ); if ($restore_other) { fonction_env(\$retore_step_user, \&restore_step_user, "", "restore", \&restore_step_other) } - else{ fonction_env(\$retore_step_user, \&restore_step_user, "", "restore", \&restore_do) } + elsif ($restore_sys) { fonction_env(\$retore_step_user, \&restore_step_user, \&restore_step_sys, "restore", \&restore_step_other) } + else{ fonction_env(\$retore_step_user, \&restore_step_user, \&restore_step2, "restore", \&restore_do) } $up_box->show_all(); } @@ -2771,25 +2956,34 @@ sub restore_step_sys { $combo_restore_step_sys->set_popdown_strings (@sys_backuped); gtkpack($advanced_box, - $restore_step_sys = gtkpack_(new Gtk::VBox(0,10), - 1, new Gtk::VBox(0,10), - 0, my $check_backup_before = new Gtk::CheckButton(_("Backup the system files before:")), - 0, gtkpack_(new Gtk::HBox(0,10), - 1, _("please choose the date to restore"), - 0, $combo_restore_step_sys, - 0, new Gtk::HBox(0,10), - ), - 1, new Gtk::VBox(0,10), - ), - ); + $restore_step_sys = gtkpack_(new Gtk::VBox(0,10), + 1, new Gtk::VBox(0,10), + 0, my $check_backup_before = new Gtk::CheckButton(_("Backup the system files before:")), + 0, gtkpack_(new Gtk::HBox(0,10), + 1, _("please choose the date to restore"), + 0, $combo_restore_step_sys, + 0, my $details = new Gtk::Button(" Details "), + 0, new Gtk::HBox(0,10), + ), + 1, new Gtk::VBox(0,10), + + ), + ); $combo_restore_step_sys->entry->signal_connect('changed', sub { - $restore_step_sys_date = $combo_restore_step_sys->entry->get_text(); + $restore_step_sys_date = $combo_restore_step_sys->entry->get_text(); }); + $details->signal_connect('clicked', sub { + #- we're only passing a portion of the filename to + #- the subroutine so we need to let it know this + my $backup_date = $combo_restore_step_sys->entry->get_text(); + ${$central_widget}->destroy(); + show_backup_details(\&restore_step_sys, "sys", $backup_date); + }); $combo_restore_step_sys->entry->set_text($restore_step_sys_date); - fonction_env(\$restore_step_sys, \&restore_step_sys, "", "restore"); - if ($restore_user) { fonction_env(\$restore_step_sys, \&restore_step_sys, "", "restore", \&restore_step_user) } - elsif ($restore_other){ fonction_env(\$restore_step_sys, \&restore_step_sys, "", "restore", \&restore_step_other) } - else{ fonction_env(\$restore_step_sys, \&restore_step_sys, "", "restore", \&restore_do) } + fonction_env(\$restore_step_sys, \&restore_step_sys, \&restore_step2, "restore"); + if ($restore_user) { fonction_env(\$restore_step_sys, \&restore_step_sys, \&restore_step2, "restore", \&restore_step_user) } + elsif ($restore_other){ fonction_env(\$restore_step_sys, \&restore_step_sys, \&restore_step2, "restore", \&restore_step_other) } + else{ fonction_env(\$restore_step_sys, \&restore_step_sys, \&restore_step2, "restore", \&restore_do) } $up_box->show_all(); } @@ -2802,29 +2996,29 @@ sub restore_other_media_hd { gtkpack($advanced_box, $box_where_hd = gtkpack_(new Gtk::VBox(0, 6), - 0, new Gtk::HSeparator, - 0, my $check_where_hd = new Gtk::CheckButton(_("Use Hard Disk to backup") ), - 0, new Gtk::HSeparator, - 0, gtkpack_(new Gtk::HBox(0,10), - 0, gtkset_sensitive(new Gtk::Label(_("Please enter the directory to save:")), $where_hd), - 1, new Gtk::VBox(0, 6), - 0, gtkset_usize (gtkset_sensitive($save_path_entry = new Gtk::Entry(), $where_hd), 152, 20), - 0, gtkset_sensitive($button = gtksignal_connect(new Gtk::Button(), clicked => sub { - filedialog_where_hd() }), $where_hd), - ), - 0, new Gtk::VBox(0, 6), - 0, gtkpack_(new Gtk::HBox(0,10), - 0, gtkset_sensitive(new Gtk::Label(_("Please enter the maximum size\n allowed for Drakbackup")), $where_hd), - 1, new Gtk::VBox(0, 6), - 0, gtkset_usize (gtkset_sensitive(my $spinner = new Gtk::SpinButton($adj, 0, 0), $where_hd), 200, 20), - ), - 0, gtkpack_(new Gtk::HBox(0,10), - 1, new Gtk::VBox(0, 6), - 0, gtkset_sensitive(my $check_where_hd_quota = new Gtk::CheckButton(_("Use quota for backup files.")), $where_hd), - 0, new Gtk::VBox(0, 6), - ), - ), - ); + 0, new Gtk::HSeparator, + 0, my $check_where_hd = new Gtk::CheckButton(_("Use Hard Disk to backup") ), + 0, new Gtk::HSeparator, + 0, gtkpack_(new Gtk::HBox(0,10), + 0, gtkset_sensitive(new Gtk::Label(_("Please enter the directory to save:")), $where_hd), + 1, new Gtk::VBox(0, 6), + 0, gtkset_usize (gtkset_sensitive($save_path_entry = new Gtk::Entry(), $where_hd), 152, 20), + 0, gtkset_sensitive($button = gtksignal_connect(new Gtk::Button(), clicked => sub { + filedialog_where_hd() }), $where_hd), + ), + 0, new Gtk::VBox(0, 6), + 0, gtkpack_(new Gtk::HBox(0,10), + 0, gtkset_sensitive(new Gtk::Label(_("Please enter the maximum size\n allowed for Drakbackup")), $where_hd), + 1, new Gtk::VBox(0, 6), + 0, gtkset_usize (gtkset_sensitive(my $spinner = new Gtk::SpinButton($adj, 0, 0), $where_hd), 200, 20), + ), + 0, gtkpack_(new Gtk::HBox(0,10), + 1, new Gtk::VBox(0, 6), + 0, gtkset_sensitive(my $check_where_hd_quota = new Gtk::CheckButton(_("Use quota for backup files.")), $where_hd), + 0, new Gtk::VBox(0, 6), + ), + ), + ); check_list([$check_where_hd_quota, \$hd_quota]); gtksignal_connect(gtkset_active($check_where_hd, $where_hd), toggled => sub { $where_hd = $where_hd ? 0 : 1; @@ -2853,16 +3047,12 @@ sub restore_find_net { $box_where_net->destroy(); if ($previous_function) { message_underdevel(); -# advanced_where_net_ftp(\&$previous_function); } else { -# advanced_where_net_ftp(); }}), 1, gtksignal_connect(new Gtk::Button(_("Secure Connection")), clicked => sub { $box_where_net->destroy(); if ($previous_function) { -# advanced_where_net_ssh(\&$previous_function); } else { -# advanced_where_net_ssh(); }}), 1, new Gtk::VBox(0, 5), 1, new Gtk::VBox(0,10), @@ -2962,7 +3152,7 @@ sub restore_step2 { 0, gtkset_sensitive(my $restore_path_entry = new Gtk::Entry(), $restore_other_path), ), 0, gtkset_sensitive(my $check_backup_bef_restore = new Gtk::CheckButton(_("Do new backup before restore (only for incremental backups.)")), $backup_sys_versions || $backup_user_versions), - 0, gtkset_sensitive(my $check_remove_user_dir = new Gtk::CheckButton(_("Remove user directories before restore.")), $sys_exist), + 0, gtkset_sensitive(my $check_remove_user_dir = new Gtk::CheckButton(_("Remove user directories before restore.")), $user_exist), 1, new Gtk::VBox(0,10), ), ); |