diff options
-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), ), ); |