#!/usr/bin/perl # # Copyright (C) 2001 by Sebastien DUPONT # Redistribution of this file is permitted under the terms of the GNU # Public License (GPL) ## description: # # Drakbacup is use to backup system files and user files # Drakbacup allow to restore the system (etc, var files) # from starup or on drakconf utility. # #backup name format: all the time from the / # backup_sys.tar.gz -> default system backup # backup_user_james.tar.gz -> default user backup # backup_user_seb.tar.gz # backup_other.tar.gz -> other directories # # # seems to be good idea to have a txt file where user explain the differences # between all the backup # # save only the differences... # # build iso fs with rescue. # configuration file on /etc/drakconf/drakbackup/drakbakup.conf # # todo: use .backupignore like on CVS # backend : --resore_all, --restore_sys, --restore_users # --build_cd_autoinst # --backup_now --backup_default_now # restore user: pbs with list selection # calcul disk space. # # CD: only create iso image # # WARNING: ne pas ecraser les fichiers /etc/passwd fstab # after a other install # # REQUIRE: cron if daemon # cvs if version control of /etc directory # cdrecord & mkisofs # # cdrw: /sys/dev/cdrom/info # /scsi/host0/bus0/target4/lun0 # # tar --use-compress-prog=bzip2 xf foo.tar.bz2 # # don't forget to build floppy boot # use Gtk; use lib qw(/usr/lib/libDrakX ); use interactive; use standalone; use my_gtk qw(:helpers :wrappers); use common; use strict; my $in = 'interactive'->vnew('', 'default'); $::isEmbedded = ($::XID, $::CCPID) = "@ARGV" =~ /--embedded (\w+) (\w+)/; #!$::isEmbedded && $in->isa('interactive_gtk') and $::isWizard=1; if ("@ARGV" =~ /--help|-h/) { print q(Backup and monitoring application --list : list of files or directories to backup. --default : save default directories. --build_cd : build restore iso with the currents backups files & rescue options. --build_floppy : build restore floppy. --replace : delete backup files before build new do not update. --save_dir : by default the backup files are saved in in /var/backup directory so write other directory to change to change it. --conf_file : to read other configuration file. --mdk_cc : to include on Mandrake Control Center ); exit(0); } # Backend Options. my $default = 0; my $build_cd = 0; my $build_floppy = 0; my $mode = 0; my $conf_file = 0; my @list_arg = (); my $central_widget; my $previous_widget; my $current_widget; my $interactive; my $up_box; my $advanced_box; my $box; my $box2; my $backup_choice = 0; my $cfg_file_exist = 0; my @user_and_path_list; my @all_user_list; my $list_other; my $label_cfg_file; my $mdk_cc = 0; my $DEBUG = 0; my $restore_sys = 1; my $restore_user = 1; my $restore_other = 1; my @user_backuped = (); my $sys_backuped = 0; my $other_backuped = 0; my @user_list_to_restore= (); my $retore_box2; my $cd_devive_entry; my $custom_help; my $button_box; my $button_box_tmp; my $next_widget; my $system_state; my $restore_state; my $save_path_entry; my $pbar; my $pbar1; my $pbar2; my $pbar3; # config. FILES -> Default PATH & Global variables. my @sys_files = ("/etc"); my @user_list; my @list_other = () ; my $cfg_file = "/etc/drakxtools/drakbackup/drakbackup.conf"; my $save_path = "/var/drakbackup"; my $restore_path = "/tmp"; my $option_replace = 1; my $comp_mode = 0; my $backup_sys = 1; my $backup_user = 1; my $backup_daemon = 1; my $backup_sys_versions = 0; my $what_no_browser = 1; my $cdrw = 0; my $net_proto= ''; my $host_path = ''; my $login_user = ''; my $net_daemon = 0; my $hd_daemon = 0; my $cd_daemon = 0; my $hd_quota = 0; my $where_net_ftp = 0; my $where_net_ssh = 0; my $where_net = 0; my $where_hd = 1; my $where_cd = 0; my $where_tape = 0; my $cd_time = 650; my $when_space; my $cd_with_install_boot = 0; my $cd_devive = ''; my $host_name = ''; my $backupignore = 0; my $auth_choice = 0; my $remember_pass = 0; my $passwd_user= ''; my $save_device_tape = (); foreach (@ARGV) { /--default/ and $default = 1, $mode=-1; /--build_cd/ and $build_cd = 1, $mode=-1; /--build_floppy/ and $build_floppy = 1, $mode=-1; /--replace|-r/ and $option_replace = 1, $mode=-1; /--conf_file/ and $mode = 0, next; /--list/ and $mode = 1, next; /--mdk_cc/ and $mdk_cc = 1, next; /--debug/ and $DEBUG = 1, next; $mode == 1 and push @list_arg, $_; } $build_floppy || $build_cd || $default || @list_arg || $conf_file ? backend_mod() : interactive_mode(); sub read_passwd { @user_and_path_list = map { (split(':', $_))[0] . ":" . (split(':', $_))[5] } grep {( split(':', $_))[2] > 500} split ('\n', cat_('/etc/passwd')); $DEBUG and print "user_and_path_list: ".$_."\n" foreach (@user_and_path_list); @user_list = (); @all_user_list = (); push @user_and_path_list, 'root:/root'; push @user_list, (split(':', $_))[0] foreach (@user_and_path_list); push @all_user_list, (split(':', $_))[0] foreach (@user_and_path_list); $DEBUG and print "home_files: ".$_."\n" foreach (@user_list); } sub save_conf_file { my @cfg_list = ( "SYS_FILES=@sys_files\n", "HOME_FILES=@user_list\n", "OTHER_FILES=@list_other\n", "PATH_TO_SAVE=$save_path\n", "HOST_PATH=$host_path\n", "NET_PROTO=$net_proto\n", "CD_TIME=$cd_time\n", "DAEMON_TIME_SPACE=$when_space\n", "CDRW_DEVICE=$cd_devive\n", "LOGIN=$login_user\n", "TAPE_DEVICE=$save_device_tape\n", "HOST_NAME=$host_name\n" ); $where_net_ftp and push @cfg_list, "USE_NET_FTP\n" ; $where_net_ssh and push @cfg_list, "USE_NET_SSH\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" ;} $cd_with_install_boot and push @cfg_list, "CD_WITH_INSTALL_BOOT\n" ; $net_daemon and push @cfg_list, "NET_DAEMON\n" ; $hd_daemon and push @cfg_list, "HD_DAEMON\n" ; $cd_daemon and push @cfg_list, "CD_DAEMON\n" ; $hd_quota and push @cfg_list, "HD_QUOTA\n" ; $where_hd and push @cfg_list, "USE_HD\n" ; $where_cd and push @cfg_list, "USE_CD\n" ; $where_net and push @cfg_list, "USE_NET\n" ; $cdrw and push @cfg_list, "CDRW\n"; $what_no_browser or push @cfg_list, "BROWSER_CACHE\n" ; $backup_sys_versions or push @cfg_list, "NO_SYS_VERSIONS\n" ; $option_replace and push @cfg_list, "OPTION_REPLACE\n" ; $backup_sys or push @cfg_list, "NO_SYS_FILES\n"; if ($comp_mode) { push @cfg_list, "OPTION_COMP=TAR.BZ2\n" } else { push @cfg_list, "OPTION_COMP=TAR.GZ\n" } output_p($cfg_file, @cfg_list); save_cron_files(); } sub read_cron_files { if (-f '/etc/cron.hourly/drakbackup') { $when_space = 'hourly'; } elsif (-f '/etc/cron.daily/drakbackup') { $when_space = 'daily'; } elsif (-f '/etc/cron.weekly/drakbackup') { $when_space = 'weekly';} elsif (-f '/etc/cron.monthly/drakbackup') { $when_space = 'monthly';} else {$backup_daemon = 0; } } sub save_cron_files { my @cron_file = ("#!/bin/sh\n", "\n", "/seb/cvs/gi/perl-install/standalone --default" ); if ($backup_daemon) { foreach ('hourly', 'daily', 'weekly', 'monthly'){ -f "/etc/cron.$_/drakbackup" and rm_rf("/etc/cron.$_/drakbackup"); } if ( $when_space eq _("hourly")) { output_p('/etc/cron.hourly/drakbackup', @cron_file )} elsif ( $when_space eq _("daily")) { output_p('/etc/cron.daily/drakbackup', @cron_file )} elsif ( $when_space eq _("weekly")) { output_p('/etc/cron.weekly/drakbackup', @cron_file )} elsif ( $when_space eq _("monthly")) { output_p('/etc/cron.monthly/drakbackup', @cron_file )} } else { foreach ('hourly', 'daily', 'weekly', 'monthly'){ -f "/etc/cron.$_/drakbackup" and rm_rf("/etc/cron.$_/drakbackup"); } } } sub read_conf_file { read_passwd(); if (-e $cfg_file) { open ( CONF_FILE, "<"."$cfg_file") || die; while () { next unless /\S/; next if /^#/; chomp; if (/^SYS_FILES/) { s/^SYS_FILES=//gi; @sys_files = split(' ', $_ ); } if (/^HOME_FILES/) { s/^HOME_FILES=//gi; @user_list = split(' ', $_ ); } if (/^OTHER_FILES/) { s/^OTHER_FILES=//gi; @list_other = split(' ', $_ ); } if (/^PATH_TO_SAVE/) { s/^PATH_TO_SAVE=//gi; $save_path = $_; } if (/^OPTION_REPLACE/) { $option_replace = 1; } if (/^NO_SYS_FILES/) { $backup_sys = 0;} if (/^NO_USER_FILES/) { $backup_user = 0;} if (/^OPTION_COMP/) { s/^OPTION_COMP=//gi; /TAR.GZ/ and $comp_mode = 0; /TAR.BZ2/ and $comp_mode = 1; } if (/^NO_SYS_VERSIONS/){ $backup_sys_versions = 0; } if (/^BROWSER_CACHE/) { $what_no_browser = 0; } if (/^CDRW/) { $cdrw = 1; } if (/^NET_PROTO/) { s/^NET_PROTO=//gi; $net_proto = $_; } if (/^HOST_PATH/) { s/^HOST_PATH=//gi; $host_path = $_; } if (/^NET_DAEMON/) { $net_daemon = 1; } if (/^HD_DAEMON/) { $hd_daemon = 1; } if (/^CD_DAEMON/) { $cd_daemon = 1; } if (/^HD_QUOTA/) { $hd_quota = 1; } if (/^USE_HD/) { $where_hd = 1; } if (/^USE_CD/) { $where_cd = 1; } if (/^USE_NET/) { $where_net = 1; } if (/^USE_TAPE/) { $where_tape = 1; } if (/^CD_TIME/) { s/^CD_TIME=//gi; $cd_time = $_; } if (/^DAEMON_TIME_SPACE/) { s/^DAEMON_TIME_SPACE=//gi; $when_space = $_; } if (/^CD_WITH_INSTALL_BOOT/) { $cd_with_install_boot = 1; } if (/^CDRW_DEVICE/) { s/^CDRW_DEVICE=//gi; $cd_devive = $_;} 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 (/^LOGIN/) { s/^LOGIN=//gi; $login_user = $_; $remember_pass = 1; } if (/^PASSWD/) { s/^PASSWD=//gi; $passwd_user = $_; $remember_pass = 1; } if (/^USE_NET_FTP/) { $where_net_ftp = 1; } if (/^USE_NET_SSH/) { $where_net_ssh = 1; } if (/^TAPE_DEVICE/) { s/TAPE_DEVICE=//gi; $save_device_tape = $_;} } read_cron_files(); $cfg_file_exist = 1; } else { $cfg_file_exist = 0; } close CONF_FILE; } sub backup_status { my $table; $pbar = new Gtk::ProgressBar; $pbar1 = new Gtk::ProgressBar; $pbar2 = new Gtk::ProgressBar; $pbar3 = new Gtk::ProgressBar; build_backup_button_box_end(); gtkpack($advanced_box, $table = create_packtable({ col_spacings => 10, row_spacings => 5}, [""], [""], [""], [""], [""], [""], [""], [""], [_("Backup system files")], [ $pbar, $pbar->{label} = new Gtk::Label(' ' )], [_("Backup user files") ], [$pbar1,$pbar1->{label} = new Gtk::Label(' ' ) ], [_("Backup other files")], [ $pbar2, $pbar2->{label} = new Gtk::Label(' ' ) ], [_("Total Progress")], [$pbar3,$pbar3->{label} = new Gtk::Label(' ' ) ], ), ); $custom_help = "options"; $central_widget = \$table; $up_box->show_all(); Gtk->main_iteration while Gtk->events_pending; } sub return_path { my $name = $_; foreach (@user_and_path_list) { if (grep /^$name\:/, $_) { s/^$name\://gi; return $_; } } } sub ftp_client { use Net::FTP; my $ftp = Net::FTP->new("$host_name"); $ftp->login("$login_user","$passwd_user"); $ftp->cwd("$host_path"); #$ftp->get("/ce/repertoire/ce.fichier"); $ftp->send(""); $ftp->quit; } sub build_backup_files { -d $save_path or mkdir_p($save_path); my $path_name; my $tar_cmd; my $tar_ext; my @list_other_; if ($comp_mode) { $tar_cmd = "tar cv --use-compress-program /usr/bin/bzip2 "; $tar_ext = "tar.bz2" } else { $tar_cmd = "tar cvz "; $tar_ext = "tar.gz"} if ( $option_replace ) { $comp_mode and system("cd $save_path && rm -f *.tar.gz"); $comp_mode or system("cd $save_path && rm -f *.tar.bz2"); } if ($where_hd) { print "backup_sys @sys_files\n"; $interactive and progress($pbar, 0.5, _("Backup system files...")); $backup_sys and system("$tar_cmd -f $save_path/backup_sys.$tar_ext @sys_files"); $interactive and progress($pbar, 0.5, _("Backup system files...")); $interactive and progress($pbar3, 0.3, _("Hard Disk Backup files...")); print "backup_other @list_other\n"; if (@list_other) { system("$tar_cmd -f $save_path/backup_other.$tar_ext @list_other"); foreach (@list_other) { push @list_other_, $_ . "\n"; } output_p( $save_path . '/list_other', @list_other_); } $interactive and progress($pbar1, 1, _("Backup User files...")); $interactive and progress($pbar3, 0.3, _("Hard Disk Backup Progress...")); if ($backup_user) { foreach (@user_list) { $path_name = return_path($_); print "path of user: $path_name\n"; $what_no_browser or system("$tar_cmd -f $save_path/backup_user_$_.$tar_ext $path_name"); $what_no_browser and system("$tar_cmd --exclude NewCache --exclude Cache --exclude cache -f $save_path/backup_user_$_.$tar_ext $path_name"); } } $interactive and progress($pbar2, 1, _("Backup Other files...")); $interactive and progress($pbar3, 0.4, _("Hard Disk Backup files...")); } if ($where_net_ssh) { # $res = Net::SSLeay::write($ssl, $msg); # Perl knows how long $msg is # die_if_ssl_error("ssl write"); # shutdown S, 1; # Half close --> No more output, sends EOF to server # $got = Net::SSLeay::read($ssl); # Perl returns undef on failure # die_if_ssl_error("ssl read"); # print $got; # Net::SSLeay::free ($ssl); # Tear down connection # Net::SSLeay::CTX_free ($ctx); # close S; } if ($where_net_ftp) { } if ($where_cd) { } } sub list_remove { my($widget, $list) = @_; my @to_remove; push @to_remove, $list->child_position($_) foreach($list->selection); splice @list_other, $_, 1 foreach(reverse sort @to_remove); $list->remove_items($list->selection); } sub file_ok_sel { my ( $widget, $file_selection ) = @_; my $file_name = $file_selection->get_filename(); if(!member($file_name, @list_other)) { push(@list_other, $file_name); $list_other->add(gtkshow(new Gtk::ListItem($file_name))); } } sub filedialog_where_hd { my $file_dialog; $file_dialog = gtksignal_connect(new Gtk::FileSelection(_("File Selection")), destroy => sub { $file_dialog->destroy(); } ); $file_dialog->ok_button->signal_connect(clicked => sub { $save_path_entry->set_text($file_dialog->get_filename()); $file_dialog->destroy() }); $file_dialog->cancel_button->signal_connect(clicked => sub { $file_dialog->destroy() }); $file_dialog->show(); } sub filedialog { my $file_dialog; $file_dialog = gtksignal_connect(new Gtk::FileSelection(_("File Selection")), destroy => sub { $file_dialog->destroy(); } ); $file_dialog->ok_button->signal_connect(clicked => \&file_ok_sel, $file_dialog); $file_dialog->ok_button->child->set(_("Add")); $file_dialog->cancel_button->signal_connect(clicked => sub { $file_dialog->destroy() }); $file_dialog->cancel_button->child->set(_("Close")); $file_dialog->set_filename(_("Select the files or directories and click on 'Add'")); $file_dialog->show(); } sub advanced_what_sys { my $box_what_sys; gtkpack($advanced_box, $box_what_sys = gtkpack_(new Gtk::VBox(0, 15), 1, _("\nPlease check all options that you need.\n"), 1, _("This options can backup and restore all files on your /etc directory.\n"), 0, my $check_what_sys = new Gtk::CheckButton( _("Backup your System files. (~ 2Mo)")), 0, my $check_what_versions = new Gtk::CheckButton( _("Need to restore any versions [beta]") ), 0, _("With this option you will be able to restore any version\n of your /etc directory."), 1, new Gtk::VBox(0, 15), ), ); foreach ([$check_what_sys, \$backup_sys], [$check_what_versions, \$backup_sys_versions]) { my $ref = $_->[1]; gtksignal_connect(gtkset_active($_->[0], ${$ref}), toggled => sub { ${$ref} = ${$ref} ? 0 : 1; }) } $current_widget = \&advanced_what_sys; $previous_widget =\&advanced_what; $central_widget = \$box_what_sys; $up_box->show_all(); } sub advanced_what_user { my ($previous_function) = @_, my $box_what_user; my %check_what_user; gtkpack($advanced_box, $box_what_user = gtkpack_(new Gtk::VBox(0, 15), 0, _("Please check all user that you want to include inb your backup."), 0, new Gtk::HSeparator, 1, createScrolledWindow( gtkpack(new Gtk::VBox(0,0), map { my $name = $_; my @user_list_tmp; my $b = new Gtk::CheckButton($name); if (grep /^$name$/, @user_list) { $check_what_user{$_}[1] = 1; gtkset_active($b, 1); } else { $check_what_user{$_}[1] = 0; gtkset_active($b, 0); } $b->signal_connect(toggled => sub { if ($check_what_user{$name}[1] ) { $check_what_user{$name}[1] = 0; @user_list_tmp = grep(!/^$name$/, @user_list); @user_list = @user_list_tmp; } else { $check_what_user{$name}[1] = 1; if (!member($name, @user_list) ) {push @user_list, $name;} } }); $b } (@all_user_list) ), ), 0, new Gtk::HSeparator, 0, my $check_what_browser = new Gtk::CheckButton( _(" do not include the browser cache") ), ), ); foreach ([$check_what_browser, \$what_no_browser]) { my $ref = $_->[1]; gtksignal_connect(gtkset_active($_->[0], ${$ref}), toggled => sub { ${$ref} = ${$ref} ? 0 : 1; }) } if ($previous_function) { $previous_widget =\&$previous_function; } else { $previous_widget =\&advanced_what; } $current_widget = \&advanced_what_user; $central_widget = \$box_what_user; $up_box->show_all(); } sub advanced_what_other { my $box_what_other; $list_other = new Gtk::List(); $list_other->set_selection_mode(-extended); $list_other->add(gtkshow(new Gtk::ListItem($_))) foreach (@list_other); gtkpack($advanced_box, $box_what_other = gtkpack_(new Gtk::VBox(0, 15), 1, gtkpack_(new Gtk::HBox(0,4), 1, createScrolledWindow($list_other), ), 0, gtkadd(gtkset_layout(new Gtk::HButtonBox, -spread), gtksignal_connect(new Gtk::Button(_("Add")), clicked => sub {filedialog() }), gtksignal_connect(new Gtk::Button(_("Remove Selected")), clicked => \&list_remove, $list_other), ), ), ); $current_widget = \&advanced_what_other; $previous_widget =\&advanced_what; $central_widget = \$box_what_other; $up_box->show_all(); } sub advanced_what{ my $box_what; my ($pix_user_map, $pix_user_mask) = gtkcreate_png("user"); my ($pix_other_map, $pix_other_mask) = gtkcreate_png("net_u"); my ($pix_sys_map, $pix_sys_mask) = gtkcreate_png("bootloader"); gtkpack($advanced_box, $box_what = gtkpack_(new Gtk::HBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtkpack_(new Gtk::VBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtksignal_connect(my $button_what_sys = new Gtk::Button(), clicked => sub { $box_what->destroy(); advanced_what_sys(); }), 1, gtksignal_connect(my $button_what_user = new Gtk::Button(), clicked => sub { ${$central_widget}->destroy(); advanced_what_user();}), 1, gtksignal_connect(my $button_what_other = new Gtk::Button(), clicked => sub { ${$central_widget}->destroy(); advanced_what_other(); }), 1, new Gtk::VBox(0, 5), ), 1, new Gtk::VBox(0, 5), ), ); $button_what_sys->add(gtkpack(new Gtk::HBox(0,10), new Gtk::Pixmap($pix_sys_map, $pix_sys_mask), new Gtk::Label(_(" System ")), new Gtk::HBox(0, 5) )); $button_what_user->add(gtkpack(new Gtk::HBox(0,10), new Gtk::Pixmap($pix_user_map, $pix_user_mask), new Gtk::Label(_(" Users ")), new Gtk::HBox(0, 5) )); $button_what_other->add(gtkpack(new Gtk::HBox(0,10), new Gtk::Pixmap($pix_other_map, $pix_other_mask), new Gtk::Label(_(" Other ")), new Gtk::HBox(0, 5) )); $current_widget = \&advanced_what; $previous_widget =\&advanced_box; $central_widget = \$box_what; $up_box->show_all(); } sub advanced_where_net_ftp { my ($previous_function) = @_, my $box_where_net; gtkpack($advanced_box, $box_where_net = gtkpack_(new Gtk::VBox(0, 15), 0, new Gtk::HSeparator, 0, my $check_where_net_ftp = new Gtk::CheckButton( _(" Use FTP connexion to backup") ), 0, new Gtk::HSeparator, 0, gtkpack_(new Gtk::HBox(0,10), 1, gtkset_sensitive(new Gtk::Label(_("please entrer the host name or IP.")), $where_net_ftp), 1, gtkset_sensitive(my $host_name_entry = new Gtk::Entry(), $where_net_ftp), 0, new Gtk::HBox(0,10), ), 0, gtkpack_(new Gtk::HBox(0,10), 1, gtkset_sensitive(new Gtk::Label(_("please entrer the directory\n to put the backup on this host. ")), $where_net_ftp), 1, gtkset_sensitive(my $host_path_entry = new Gtk::Entry(), $where_net_ftp), 0, new Gtk::HBox(0,10), ), 0, gtkpack_(new Gtk::HBox(0,10), 1, gtkset_sensitive(new Gtk::Label(_("please entrer your login")), $where_net_ftp), 0, gtkset_sensitive(my $login_user_entry = new Gtk::Entry(), $where_net_ftp), 0, new Gtk::HBox(0,10), ), 0, gtkpack_(new Gtk::HBox(0,10), 1, gtkset_sensitive(new Gtk::Label(_("please entrer your passord")), $where_net_ftp), 0, gtkset_sensitive(my $passwd_user_entry = new Gtk::Entry(), $where_net_ftp), 0, new Gtk::HBox(0,10), ), 0, gtkpack_(new Gtk::HBox(0,10), 0, new Gtk::HBox(0,10), 0, gtkset_sensitive(my $check_remember_pass = new Gtk::CheckButton( _(" remember this password")), $where_net_ftp), 0, new Gtk::HBox(0,10), ), ), ); $passwd_user_entry->set_visibility(0); $passwd_user_entry->set_text( $passwd_user ); $passwd_user_entry->signal_connect( 'changed', sub { $passwd_user = $passwd_user_entry->get_text()}); $host_path_entry->set_text( $host_path ); $host_name_entry->set_text( $host_name ); $login_user_entry->set_text( $login_user ); $host_name_entry->signal_connect( 'changed', sub { $host_name = $host_name_entry->get_text()}); $host_path_entry->signal_connect( 'changed', sub { $host_path = $host_path_entry->get_text()}); $login_user_entry->signal_connect( 'changed', sub { $login_user = $login_user_entry->get_text()}); foreach ([$check_remember_pass, \$remember_pass]) { my $ref = $_->[1]; gtksignal_connect(gtkset_active($_->[0], ${$ref}), toggled => sub { ${$ref} = ${$ref} ? 0 : 1; }) } gtksignal_connect(gtkset_active($check_where_net_ftp, $where_net_ftp), toggled => sub { $where_net_ftp = $where_net_ftp ? 0 : 1; ${$central_widget}->destroy(); $current_widget->(); }); if ($previous_function) { $previous_widget =\&$previous_function; } else { $previous_widget =\&advanced_where_net; } $current_widget = \&advanced_where_net_ftp; $central_widget = \$box_where_net; $up_box->show_all(); } sub advanced_where_net_ssh { my ($previous_function) = @_, my $box_where_ssh; gtkpack($advanced_box, $box_where_ssh = gtkpack_(new Gtk::VBox(0, 15), 1, _(" in few time.... "), ), ); # test si x11 #print system("xterm -fn 7x14 -bg black -fg white -e ssh-keygen -f ~/.ssh/identity-backup && scp ") . "\n"; if ($previous_function) { $previous_widget =\&$previous_function; } else { $previous_widget =\&advanced_where_net; } $current_widget = \&advanced_where_net_ssh; $central_widget = \$box_where_ssh; $up_box->show_all(); } sub advanced_where_net { my ($previous_function) = @_, my $box_where_net; gtkpack($advanced_box, $box_where_net = gtkpack_(new Gtk::HBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtkpack_(new Gtk::VBox(0, 15), 1, new Gtk::VBox(0, 5), 1, new Gtk::VBox(0,10), 1, gtksignal_connect(new Gtk::Button(_(" FTP Connexion")), clicked => sub { $box_where_net->destroy(); if ($previous_function ) { advanced_where_net_ftp(\&$previous_function); } else { advanced_where_net_ftp(); }}), 1, gtksignal_connect(new Gtk::Button(_(" Secure Connexion ")), 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), ), 1, new Gtk::VBox(0, 5), ), ); if ($previous_function) { $previous_widget =\&$previous_function; } else { $previous_widget =\&advanced_where; } $current_widget = \&advanced_where_net; $central_widget = \$box_where_net; $up_box->show_all(); } sub advanced_where_cd { my ($previous_function) = @_, my $box_where_cd; my $combo_where_cd_time = new Gtk::Combo(); $combo_where_cd_time->set_popdown_strings ("650","700", "750", "800"); gtkpack($advanced_box, $box_where_cd = gtkpack_(new Gtk::VBox(0, 6), 0, my $check_where_cd = new Gtk::CheckButton( _(" Use CD/DVDROM to backup")), 0, new Gtk::HSeparator, 0, gtkpack_(new Gtk::HBox(0,10), 1, gtkset_sensitive(new Gtk::Label(_("please choose your CD space")), $where_cd), 0, gtkset_sensitive($combo_where_cd_time, $where_cd), 0, new Gtk::VBox(0, 5), ), 0, new Gtk::VBox(0, 5), 0, gtkpack_(new Gtk::HBox(0,10), 1, gtkset_sensitive(new Gtk::Label(_(" Please check if you are using CDRW media")), $where_cd), 0, gtkset_sensitive(my $check_cdrw = new Gtk::CheckButton(), $where_cd), 0, new Gtk::VBox(0, 5), ), 0, new Gtk::VBox(0, 5), 0, gtkpack_(new Gtk::HBox(0,10), 1, gtkset_sensitive(new Gtk::Label(_(" Please check if you want to include\n install boot on your CD.")), $where_cd), 0, gtkset_sensitive(my $check_cd_with_install_boot = new Gtk::CheckButton(), $where_cd), 0, new Gtk::VBox(0, 5), ), 0, new Gtk::VBox(0, 5), 0, gtkpack_(new Gtk::HBox(0,10), 1, gtkset_sensitive(new Gtk::Label(_("please enter your CD Writer device name\n ex: 0,1,0")), $where_cd), 0, gtkset_sensitive($cd_devive_entry = new Gtk::Entry(), $where_cd), 0, new Gtk::VBox(0, 5), ), ), ); foreach ([$check_cdrw, \$cdrw], [$check_cd_with_install_boot, \$cd_with_install_boot ]) { my $ref = $_->[1]; gtksignal_connect(gtkset_active($_->[0], ${$ref}), toggled => sub { ${$ref} = ${$ref} ? 0 : 1; }) } gtksignal_connect(gtkset_active($check_where_cd, $where_cd), toggled => sub { $where_cd = $where_cd ? 0 : 1; ${$central_widget}->destroy(); $current_widget->(); }); $cd_devive_entry->set_text( $cd_devive ); $cd_devive_entry->signal_connect( 'changed', sub { $cd_devive = $cd_devive_entry->get_text(); }); $combo_where_cd_time->entry->set_text($cd_time); $combo_where_cd_time->entry->signal_connect( 'changed', sub { $cd_time = $combo_where_cd_time->entry->get_text()}); $current_widget = \&advanced_where_cd; if ($previous_function) { $previous_widget =\&$previous_function; } else { $previous_widget =\&advanced_where; } $central_widget = \$box_where_cd; $up_box->show_all(); } sub advanced_where_tape { my ($previous_function) = @_, my $box_where_tape; my $button; my $adj = new Gtk::Adjustment 550.0, 1.0, 10000.0, 1.0, 5.0, 0.0; my ($pix_fs_map, $pix_fs_mask) = gtkcreate_png("filedialog"); gtkpack($advanced_box, $box_where_tape = gtkpack_(new Gtk::VBox(0, 6), 0, new Gtk::HSeparator, 0, my $check_where_tape = new Gtk::CheckButton( _(" Use tape to backup") ), 0, new Gtk::HSeparator, 0, gtkpack_(new Gtk::HBox(0,10), 0, new Gtk::VBox(0, 6), 0, gtkset_sensitive(new Gtk::Label(_("Please entrer device name where backup ")), $where_tape ), 1, gtkset_sensitive(my $save_device_tape_entry = new Gtk::Entry(), $where_tape), 0, new Gtk::VBox(0, 6), ), 0, new Gtk::VBox(0, 6), 0, gtkpack_(new Gtk::HBox(0,10), 0, gtkset_sensitive(new Gtk::Label(_("Please entrer the maximum size\n allowed for Drakbackup ")), $where_tape), 1, gtkset_sensitive(my $spinner = new Gtk::SpinButton( $adj, 0, 0), $where_tape ), 0, new Gtk::VBox(0, 6), ), 0, gtkpack_(new Gtk::HBox(0,10), ), ), ); gtksignal_connect(gtkset_active($check_where_tape, $where_tape), toggled => sub { $where_tape = $where_tape ? 0 : 1; ${$central_widget}->destroy(); $current_widget->(); }); $save_device_tape_entry->set_text( $save_device_tape ); $save_device_tape_entry->signal_connect( 'changed', sub { $save_device_tape = $save_device_tape_entry->get_text()}); $current_widget = \&advanced_where_tape; if ($previous_function) { $previous_widget =\&$previous_function; } else { $previous_widget =\&advanced_where; } $central_widget = \$box_where_tape; $up_box->show_all(); } sub advanced_where_hd { my ($previous_function) = @_, my $box_where_hd; my $button; my $adj = new Gtk::Adjustment 550.0, 1.0, 10000.0, 1.0, 5.0, 0.0; my ($pix_fs_map, $pix_fs_mask) = gtkcreate_png("filedialog"); 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, new Gtk::VBox(0, 6), 0, gtkset_sensitive(new Gtk::Label(_("Please entrer the directory to save: ")), $where_hd ), 1, gtkset_sensitive($save_path_entry = new Gtk::Entry(), $where_hd), 0, new Gtk::VBox(0, 6), 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 entrer the maximum size allowed for Drakbackup ")), $where_hd ), 1, gtkset_sensitive(my $spinner = new Gtk::SpinButton( $adj, 0, 0), $where_hd ), 0, new Gtk::VBox(0, 6), ), 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), ), ), ); foreach ([$check_where_hd_quota, \$hd_quota]) { my $ref = $_->[1]; gtksignal_connect(gtkset_active($_->[0], ${$ref}), toggled => sub { ${$ref} = ${$ref} ? 0 : 1; }) } gtksignal_connect(gtkset_active($check_where_hd, $where_hd), toggled => sub { $where_hd = $where_hd ? 0 : 1; ${$central_widget}->destroy(); $current_widget->(); }); $button->add(gtkpack(new Gtk::HBox(0,10), new Gtk::Pixmap($pix_fs_map, $pix_fs_mask))); $save_path_entry->set_text( $save_path ); $save_path_entry->signal_connect( 'changed', sub { $save_path = $save_path_entry->get_text()}); $current_widget = \&advanced_where_hd; if ($previous_function) { $previous_widget =\&$previous_function; } else { $previous_widget =\&advanced_where; } $central_widget = \$box_where_hd; $up_box->show_all(); } sub advanced_where{ my $box_where; my ($pix_net_map, $pix_net_mask) = gtkcreate_png("net"); my ($pix_cd_map, $pix_cd_mask) = gtkcreate_png("cdrom"); my ($pix_hd_map, $pix_hd_mask) = gtkcreate_png("hd"); gtkpack($advanced_box, $box_where = gtkpack_(new Gtk::HBox(0, 15), 1, new Gtk::VBox(0, 5), 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(); }), 1, gtksignal_connect(my $button_where_cd = new Gtk::Button(), clicked => sub { ${$central_widget}->destroy(); advanced_where_cd(); }), 1, gtksignal_connect(my $button_where_hd = new Gtk::Button(), clicked => sub { ${$central_widget}->destroy(); advanced_where_hd(); }), 1, gtksignal_connect(my $button_where_tape = new Gtk::Button(), clicked => sub { ${$central_widget}->destroy(); advanced_where_tape(); }), 1, new Gtk::VBox(0, 5), ), 1, new Gtk::VBox(0, 5), ), ); $button_where_net->add(gtkpack(new Gtk::HBox(0,10), new Gtk::Pixmap($pix_net_map, $pix_net_mask), new Gtk::Label(_(" Network ")), new Gtk::HBox(0, 5) )); $button_where_cd->add(gtkpack(new Gtk::HBox(0,10), new Gtk::Pixmap($pix_cd_map, $pix_cd_mask), new Gtk::Label(_(" CDROM / DVDROM ")), new Gtk::HBox(0, 5) )); $button_where_hd->add(gtkpack(new Gtk::HBox(0,10), new Gtk::Pixmap($pix_hd_map, $pix_hd_mask), new Gtk::Label(_(" HardDrive / NFS ")), new Gtk::HBox(0, 5) )); $button_where_tape->add(gtkpack(new Gtk::HBox(0,10), new Gtk::Pixmap($pix_hd_map, $pix_hd_mask), new Gtk::Label(_(" Tape ")), new Gtk::HBox(0, 5) )); $current_widget = \&advanced_where; $previous_widget =\&advanced_box; $central_widget = \$box_where; $up_box->show_all(); } sub advanced_when{ my $box_when; my $check_where_cd_daemon; my $check_where_hd_daemon; my $check_where_net_daemon; my ($pix_time_map, $pix_time_mask) = gtkcreate_png("backup_time"); my $combo_when_space = new Gtk::Combo(); $combo_when_space->set_popdown_strings (_("hourly"),_("daily"),_("weekly"),_("monthly")); gtkpack($advanced_box, $box_when = gtkpack_(new Gtk::VBox(0, 15), 0, gtkpack_(new Gtk::HBox(0,10), 1, new Gtk::HBox(0,10), 1, new Gtk::Pixmap($pix_time_map, $pix_time_mask), 0, my $check_when_daemon = new Gtk::CheckButton( _(" Use daemon") ), 1, new Gtk::HBox(0,10), ), 0, new Gtk::HSeparator, 0, gtkpack_(new Gtk::HBox(0,10), 1, gtkset_sensitive(new Gtk::Label(_("Please choose interval \nspace between each backup ")), $backup_daemon), 0, gtkset_sensitive($combo_when_space, $backup_daemon), 1, new Gtk::HBox(0,10), ), 0, new Gtk::HBox(0,10), 0, gtkpack_(new Gtk::HBox(0,10), 1, gtkset_sensitive(new Gtk::Label(_("Please choose\nmedia to backup. ")), $backup_daemon), 0, gtkpack_(new Gtk::VBox(0,10), 0, gtkset_sensitive($check_where_cd_daemon = new Gtk::CheckButton(_(" Use CD/DVDROM with daemon")), $backup_daemon), 0, gtkset_sensitive($check_where_hd_daemon = new Gtk::CheckButton( _(" Use Hard Drive with daemon")), $backup_daemon), 0, gtkset_sensitive($check_where_net_daemon = new Gtk::CheckButton( _(" Use Network with daemon")), $backup_daemon), ), ), 0, new Gtk::HSeparator, 1, gtkset_sensitive(new Gtk::Label(_("Please be careful that cron deamon is include on your services. ")), $backup_daemon), ), ); foreach ([$check_where_cd_daemon, \$cd_daemon], [$check_where_hd_daemon, \$hd_daemon], [$check_where_net_daemon, \$net_daemon]) { my $ref = $_->[1]; gtksignal_connect(gtkset_active($_->[0], ${$ref}), toggled => sub { ${$ref} = ${$ref} ? 0 : 1; }) } gtksignal_connect(gtkset_active($check_when_daemon, $backup_daemon), toggled => sub { $backup_daemon = $backup_daemon ? 0 : 1; ${$central_widget}->destroy(); advanced_when(); }); $combo_when_space->entry->set_text( $when_space ); $combo_when_space->entry->signal_connect( 'changed', sub { $when_space = $combo_when_space->entry->get_text(); print $when_space."\n";}); $current_widget = \&advanced_when; $previous_widget =\&advanced_box; $central_widget = \$box_when; $up_box->show_all(); } sub advanced_options{ my $box_options; my ($pix_options_map, $pix_options_mask) = gtkcreate_png("backup_options"); gtkpack($advanced_box, $box_options = gtkpack_(new Gtk::VBox(0, 15), 0, gtkpack_(new Gtk::HBox(0,10), 1, new Gtk::VBox(0,10), 1, new Gtk::Pixmap($pix_options_map, $pix_options_mask), 1, _("Please choose correct options to backup. "), 1, new Gtk::VBox(0,10), ), 0, new Gtk::HSeparator, 0, gtkpack_(new Gtk::VBox(0,10), 0, my $check_tar_bz2 = new Gtk::CheckButton( _(" Use Tar and bzip2 ( very slow)") ), 0, my $check_replace = new Gtk::CheckButton( _(" Replace (no update backup files)")), 0, gtkset_sensitive(my $check_backupignore = new Gtk::CheckButton( _(" Use .backupignore files")), 0), ), ), ); foreach ([$check_tar_bz2, \$comp_mode], [$check_replace, \$option_replace], [$check_backupignore, \$backupignore]) { my $ref = $_->[1]; gtksignal_connect(gtkset_active($_->[0], ${$ref}), toggled => sub { ${$ref} = ${$ref} ? 0 : 1; }) } $custom_help = "options"; $current_widget = \&advanced_options; $previous_widget =\&advanced_box; $central_widget = \$box_options; $up_box->show_all(); } sub advanced_box{ my $box_adv; my ($pix_hd_map, $pix_hd_mask) = gtkcreate_png("backup_hd"); my ($pix_time_map, $pix_time_mask) = gtkcreate_png("backup_time"); my ($pix_net_map, $pix_net_mask) = gtkcreate_png("backup_net"); my ($pix_options_map, $pix_options_mask) = gtkcreate_png("backup_options"); gtkpack($advanced_box, $box_adv = gtkpack_(new Gtk::HBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtkpack_(new Gtk::VBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtksignal_connect(my $button_what = new Gtk::Button(), clicked => sub { ${$central_widget}->destroy(); advanced_what(); }), 1, gtksignal_connect(my $button_where = new Gtk::Button(), clicked => sub { ${$central_widget}->destroy(); advanced_where(); }), 1, gtksignal_connect(my $button_when = new Gtk::Button(), clicked => sub { ${$central_widget}->destroy(); advanced_when(); }), 1, gtksignal_connect(my $button_options = new Gtk::Button(), clicked => sub { ${$central_widget}->destroy(); advanced_options();}), 1, new Gtk::VBox(0, 5), ), 1, new Gtk::VBox(0, 5), ), ); $button_what->add(gtkpack(new Gtk::HBox(0,10), new Gtk::Pixmap($pix_hd_map, $pix_hd_mask), new Gtk::Label(_(" What ")), new Gtk::HBox(0, 5) )); $button_where->add(gtkpack(new Gtk::HBox(0,10), new Gtk::Pixmap($pix_net_map, $pix_net_mask), new Gtk::Label(_(" Where ")), new Gtk::HBox(0, 5) )); $button_when->add(gtkpack(new Gtk::HBox(0,10), new Gtk::Pixmap($pix_time_map, $pix_time_mask), new Gtk::Label(_(" When ")), new Gtk::HBox(0, 5) )); $button_options->add(gtkpack(new Gtk::HBox(0,10), new Gtk::Pixmap($pix_options_map, $pix_options_mask), new Gtk::Label(_(" More Options")), new Gtk::HBox(0, 5) )); $custom_help = ""; $previous_widget =\&interactive_mode_box; $current_widget = \&advanced_box; $central_widget = \$box_adv; $up_box->show_all(); } sub wizard_step3 { my $box2; my $text = new Gtk::Text(undef, undef); system_state(); gtktext_insert($text, $system_state); restore_button_box_main(); gtkpack($advanced_box, $box2 = gtkpack_(new Gtk::HBox(0, 15), 1, gtkpack_(new Gtk::VBox(0,10), 0, _(" Drakbackup Configuration "), 1, createScrolledWindow($text), ), ), ); wizard_button_box_end(); $custom_help = ""; $central_widget = \$box2; $current_widget = \&wizard_step3; $previous_widget =\&wizard_step2; $up_box->show_all(); } sub wizard_step2 { my $box2; gtkpack($advanced_box, $box2 = gtkpack_(new Gtk::HBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtkpack_(new Gtk::VBox(0, 15), 1, new Gtk::VBox(0, 5), 0, _("Please choose where you want to backup"), 0, gtkpack_(new Gtk::HBox(0, 15), 0, my $check_wizard_hd = new Gtk::CheckButton(_("on Hard Drive")), 1, new Gtk::VBox(0, 5), 0, gtkset_sensitive(gtksignal_connect(new Gtk::Button(_("Configure it")), clicked => sub { ${$central_widget}->destroy(); advanced_where_hd(\&wizard_step2); }), $where_hd ), ), 0, gtkpack_(new Gtk::HBox(0, 15), 0, my $check_wizard_net = new Gtk::CheckButton(_("across Network")), 1, new Gtk::VBox(0, 5), 0, gtkset_sensitive(gtksignal_connect(new Gtk::Button(_("Configure it")), clicked => sub { ${$central_widget}->destroy(); advanced_where_net(\&wizard_step2); }), $where_net ), ), 0, gtkpack_(new Gtk::HBox(0, 15), 0, my $check_wizard_cd = new Gtk::CheckButton(_("on CDROM")), 1, new Gtk::VBox(0, 5), 0, gtkset_sensitive(gtksignal_connect(new Gtk::Button(_("Configure it")), clicked => sub { ${$central_widget}->destroy(); advanced_where_cd(\&wizard_step2); }), $where_cd ), ), 0, gtkpack_(new Gtk::HBox(0, 15), 0, my $check_wizard_tape = new Gtk::CheckButton(_("on Tape Device")), 1, new Gtk::VBox(0, 5), 0, gtkset_sensitive(gtksignal_connect(new Gtk::Button(_("Configure it")), clicked => sub { ${$central_widget}->destroy(); advanced_where_tape(\&wizard_step2); }), $where_tape), ), 1, new Gtk::VBox(0, 5), ), 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_net, \$where_net], [$check_wizard_tape, \$where_tape]) { my $ref = $_->[1]; gtksignal_connect(gtkset_active($_->[0], ${$ref}), toggled => sub { ${$ref} = ${$ref} ? 0 : 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(); }) } if (!$where_hd && !$where_cd && !$where_net) { $next_widget = \&message_noselect_box; } else { $next_widget = \&wizard_step3; } wizard_button_box(); $custom_help = ""; $central_widget = \$box2; $current_widget = \&wizard_step2; $previous_widget =\&wizard; $up_box->show_all(); } sub wizard { my $box2; gtkpack($advanced_box, $box2 = gtkpack_(new Gtk::HBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtkpack_(new Gtk::VBox(0, 15), 1, new Gtk::VBox(0, 5), 0, _("Please choose that you want to backup"), 0, my $check_wizard_sys = new Gtk::CheckButton(_("Backup system")), 0, my $check_wizard_user = new Gtk::CheckButton(_("Backup Users")), 0, gtkpack_(new Gtk::HBox(0, 15), 1, new Gtk::VBox(0, 5), 0, gtksignal_connect(new Gtk::Button(_("Select user manually")), clicked => sub { ${$central_widget}->destroy(); advanced_what_user(\&wizard); }), ), 1, new Gtk::VBox(0, 5), ), 1, new Gtk::VBox(0, 5), ), ); foreach ([$check_wizard_sys, \$backup_sys], [$check_wizard_user, \$backup_user]) { my $ref = $_->[1]; gtksignal_connect(gtkset_active($_->[0], ${$ref}), toggled => sub { ${$ref} = ${$ref} ? 0 : 1; })} if (!$backup_sys && !$backup_user) { $next_widget = \&message_noselect_box; } elsif (!$backup_sys && $backup_user && !@user_list) { $next_widget = \&message_noselect_box; } else { $next_widget = \&wizard_step2; } wizard_button_box(); $custom_help = ""; $central_widget = \$box2; $current_widget = \&wizard; $previous_widget =\&interactive_mode_box; $up_box->show_all(); } sub find_backup_to_restore { my @list_backup_tmp; my @user_backuped_tmp; @user_backuped = (); -d $save_path and my @list_backup = all($save_path); if (grep /^backup_other/, @list_backup) {$other_backuped = 1;} if (grep /^backup_sys/, @list_backup) {$sys_backuped = 1;} foreach (grep /^backup_user_/, @list_backup) { chomp; s/^backup_user_//gi; s/.tar.gz$//gi; s/.tar.bz2$//gi; push @user_backuped ,$_; } } sub do_cron { } sub do_restore_backend { my $untar_cmd; if (grep /tar.gz$/, all($save_path)) { $untar_cmd = 0; } else { $untar_cmd = 1; } if ($restore_user) { $untar_cmd or system(" echo 'user: $_' && cd /tmp && tar xfz $save_path/backup_user_$_.tar.gz -C $restore_path") foreach @user_list_to_restore; # fixme verifier next line. $untar_cmd and system("echo 'user: $_' && cd /tmp && /usr/bin/bzip2 -cd $save_path/backup_user_$_.tar.bz2 | tar xf -C $restore_path ") foreach @user_list_to_restore; } if ($restore_sys) { $untar_cmd or system("echo backup_sys && cd /tmp && tar xfz $save_path/backup_sys.tar.gz -C $restore_path "); $untar_cmd and system("echo backup_sys cd /tmp && /usr/bin/bzip2 -cd $save_path/backup_sys.tar.bz2 | tar xf -C $restore_path "); } if ($restore_other) { $untar_cmd or system("echo backup_other && cd /tmp && tar xfz $save_path/backup_other.tar.gz -C $restore_path "); $untar_cmd and system("echo backup_other && cd /tmp && /usr/bin/bzip2 -cd $save_path/backup_other.tar.bz2 | tar xf -C $restore_path "); } print "End of restore\n"; } sub system_state { $system_state = (); if ($cfg_file_exist) { $system_state .= _("\n\t\t\t\t\t\t\t\t ___ Backup Sources ___ \n"); $backup_sys and $system_state .= _("\n- System Files:\n"); $backup_sys and $system_state .= _("\t\t$_\n") foreach @sys_files; $backup_user and $system_state .= _("\n- Users Files:\n"); $backup_user and $system_state .= _("\t\t$_\n") foreach @user_list; @list_other and $system_state .= _("\n- Other Files:\n"); @list_other and $system_state .= _("\t\t$_\n") foreach @list_other; $system_state .= _("\n- Path to save backups: $save_path\n"); $system_state .= _("\n- Options:\n"); $backup_sys or $system_state .= _("\tDo not include System Files\n"); if ($option_replace) { $system_state .= _("\tReplace backups (do not update)\n"); } else { $system_state .= _("\tUpdate backups (do not replace)\n"); } if ($comp_mode) { $system_state .= _("\tBackups use tar and bzip2\n "); } else { $system_state .= _("\tBackups use tar and gzip\n"); } } else {$system_state = _("No configuration please click Wizard or Advanced.\n")} } sub restore_state { $restore_state = _("List of data to restore:\n\n"); if ($restore_sys) { $restore_state .= "- Restore System Files.\n" } if ($restore_user) { $restore_state .= "- Restore Users Files: \n" ; $restore_state .= "\t\t$_\n" foreach @user_list_to_restore ; } if ($restore_other) { $restore_state .= "- Restore Other Files: \n"; -f "$save_path/list_other" and $restore_state .= "\t\t$_\n" foreach split( "\n", cat_("$save_path/list_other")); } } sub do_restore { my $do_restore; my $button_restore; my $text = new Gtk::Text(undef, undef); restore_state(); gtktext_insert($text, $restore_state); restore_button_box_main(); gtkpack($advanced_box, $do_restore = gtkpack_(new Gtk::VBox(0,10), 0, _(" Restore Configuration "), 1, createScrolledWindow($text), ), ); restore_button_box_end(); $previous_widget =\&restore_box; $custom_help = "restore"; $current_widget = \&do_restore; $central_widget = \$do_restore; $up_box->show_all(); } sub restore_step_other { my $retore_step_other; gtkpack($advanced_box, $retore_step_other = gtkpack_(new Gtk::VBox(0,10), 1, new Gtk::VBox(0,10), 1, createScrolledWindow(gtkpack(new Gtk::VBox(0,0), gtkadd(new Gtk::Frame(_("Backup of other files content.")), gtkpack(new Gtk::VBox(0,10), cat_("$save_path/list_other"), ), ), ), ), 0, my $check_restore_other_sure = new Gtk::CheckButton(_(" Sure to restore the other files .")), 1, new Gtk::VBox(0,10), ), ); foreach ([$check_restore_other_sure, \$restore_other]) { my $ref = $_->[1]; gtksignal_connect(gtkset_active($_->[0], ${$ref}), toggled => sub { ${$ref} = ${$ref} ? 0 : 1; }) } $next_widget = \&do_restore; $custom_help = "restore"; $current_widget = \&restore_step_other; $central_widget = \$retore_step_other; $up_box->show_all(); } my %check_user_to_restore; sub restore_step_user { my $retore_step_user; gtkpack($advanced_box, $retore_step_user = gtkpack_(new Gtk::VBox(0,10), 0, new Gtk::VBox(0,10), 0, _("User list to restore "), 1, createScrolledWindow( gtkpack(new Gtk::VBox(0,0), map { my $name = $_; my $b = new Gtk::CheckButton($name); if ( grep /^$name$/, @user_list_to_restore) { gtkset_active($b, 1); } else { gtkset_active($b, 0); } $b->signal_connect(toggled => sub { if ($check_user_to_restore{$name}[1] ) { $check_user_to_restore{$name}[1] = 1; if (!member($name, @user_list_to_restore) ) { push @user_list_to_restore, $name;} } else { $check_user_to_restore{$name}[1] = 0; my @user_list_tmp = grep(!/^$name$/,@user_list_to_restore ); @user_list_to_restore = @user_list_tmp; } }); $b } (@user_backuped) ), ), ), ); if ($restore_other) { $next_widget = \&restore_step_other;} else{ $next_widget = \&do_restore;} $custom_help = "restore"; $current_widget = \&restore_step_user; $central_widget = \$retore_step_user; $up_box->show_all(); } sub restore_step_sys { my $retore_step_sys; my $combo_retore_step_sys = new Gtk::Combo(); $combo_retore_step_sys->set_popdown_strings ("9 jan 2002","10 jan 2002", "11 jan 2002", "12 jan 2002"); gtkpack($advanced_box, $retore_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_retore_step_sys, 0, new Gtk::HBox(0,10), ), 1, new Gtk::VBox(0,10), ), ); if ($restore_user) { $next_widget = \&restore_step_user;} elsif ($restore_other){ $next_widget = \&restore_step_other;} else{ $next_widget = \&do_restore;} $custom_help = "restore"; $current_widget = \&restore_step_sys; $central_widget = \$retore_step_sys; $up_box->show_all(); } sub restore_step2 { my $retore_step2; gtkpack($advanced_box, $retore_step2 = gtkpack_(new Gtk::VBox(0,10), 1, new Gtk::VBox(0,10), 0, my $check_restore_sys = new Gtk::CheckButton(_("Restore system")), 0, my $check_restore_user = new Gtk::CheckButton(_("Restore Users")), 0, my $check_restore_other = new Gtk::CheckButton(_("Restore Other")), 1, new Gtk::VBox(0,10), ), ); foreach ([$check_restore_sys, \$restore_sys], [$check_restore_user, \$restore_user], [$check_restore_other, \$restore_other]) { my $ref = $_->[1]; gtksignal_connect(gtkset_active($_->[0], ${$ref}), toggled => sub { ${$ref} = ${$ref} ? 0 : 1; if (!$restore_sys && !$restore_user && !$restore_other) { $next_widget = \&message_norestore_box; } elsif ($restore_sys && $backup_sys_versions) { $next_widget = \&restore_step_sys; } elsif ($restore_user) { $next_widget = \&restore_step_user;} elsif ($restore_other){ $next_widget = \&restore_step_other;} else{ $next_widget = \&do_restore;} }) } if (!$restore_sys && !$restore_user && !$restore_other) { $next_widget = \&message_norestore_box; } elsif ($restore_sys && $backup_sys_versions) { $next_widget = \&restore_step_sys; } elsif ($restore_user) { $next_widget = \&restore_step_user;} elsif ($restore_other){ $next_widget = \&restore_step_other;} else{ $next_widget = \&do_restore;} $custom_help = "restore"; $previous_widget =\&restore_box; $current_widget = \&restore_step2; $central_widget = \$retore_step2; $up_box->show_all(); } sub restore_box { my $retore_box; my $retore_box3; my $check_restore_sys; my $check_restore_user; my $check_restore_other; find_backup_to_restore(); restore_button_box_main(); @user_list_to_restore = @user_backuped; $DEBUG and print "other_backuped : $other_backuped \nsys_backuped : $sys_backuped \nuser_backuped : @user_backuped\n"; if ($other_backuped || $sys_backuped || @user_backuped) { gtkpack($advanced_box, $retore_box = gtkpack_(new Gtk::HBox(0,1), 1, new Gtk::VBox(0,10), 1, gtkpack_(new Gtk::VBox(0,10), 1, new Gtk::VBox(0,10), 1, new Gtk::VBox(0,10), 1, gtksignal_connect(new Gtk::Button(_("Restore all last backups")), clicked => sub { $retore_box->destroy(); restore_button_box(); $restore_sys = 1; $restore_other = 1; $restore_user = 1; do_restore(); }), 1, gtksignal_connect(new Gtk::Button(_("Custom Restore")), clicked => sub { $retore_box->destroy(); restore_button_box(); restore_step2(); }), 1, new Gtk::VBox(0,10), 1, new Gtk::VBox(0,10), ), 1, new Gtk::HBox(0,10), ), ); } else { gtkpack($advanced_box, $retore_box = gtkpack_(new Gtk::HBox(0,1), message_norestorefile_box(), ), ), } $custom_help = "restore"; $current_widget = \&restore_box; $central_widget = \$retore_box; $up_box->show_all(); } sub adv_button_box { $button_box_tmp->destroy(); gtkpack($button_box, $button_box_tmp = gtkpack_(new Gtk::HButtonBox, 0, gtksignal_connect(new Gtk::Button(_(" Cancel ")), clicked => sub { ${$central_widget}->destroy(); interactive_mode_box(); }), 0, gtksignal_connect(new Gtk::Button(_(" Help ")), clicked => sub { ${$central_widget}->destroy(); adv_help(\&$current_widget,$custom_help ); }), 1, new Gtk::HBox(0, 1), 0, gtksignal_connect(new Gtk::Button(_(" Previous ")), clicked => sub { ${$central_widget}->destroy(); $previous_widget->(); }), 0, gtksignal_connect(new Gtk::Button(_(" Save ")), clicked => sub { ${$central_widget}->destroy(); save_conf_file(); $previous_widget->(); }), ), ); } sub restore_button_box_main { $button_box_tmp->destroy(); gtkpack($button_box, $button_box_tmp = gtkpack_(gtkpack(gtkset_layout(new Gtk::HButtonBox, -start), gtksignal_connect(new Gtk::Button(_(" Cancel ")), clicked => sub { ${$central_widget}->destroy(); interactive_mode_box(); }), gtksignal_connect(new Gtk::Button(_(" Help ")), clicked => sub { ${$central_widget}->destroy(); adv_help(\&$current_widget, $custom_help); }), ), ), ); } sub wizard_button_box_end { $button_box_tmp->destroy(); gtkpack($button_box, $button_box_tmp = gtkpack_(new Gtk::HButtonBox, 0, gtksignal_connect(new Gtk::Button(_(" Cancel ")), clicked => sub { ${$central_widget}->destroy(); interactive_mode_box(); }), 0, gtksignal_connect(new Gtk::Button(_(" Help ")), clicked => sub { ${$central_widget}->destroy(); adv_help(\&$current_widget,$custom_help ); }), 1, new Gtk::HBox(0, 1), 0, gtksignal_connect(new Gtk::Button(_(" Previous ")), clicked => sub { ${$central_widget}->destroy(); $previous_widget->(); }), 0, gtksignal_connect(new Gtk::Button(_(" Save ")), clicked => sub { ${$central_widget}->destroy(); save_conf_file(); interactive_mode_box(); }), ), ); } sub restore_button_box_end { $button_box_tmp->destroy(); gtkpack($button_box, $button_box_tmp = gtkpack_(new Gtk::HButtonBox, 0, gtksignal_connect(new Gtk::Button(_(" Cancel ")), clicked => sub { ${$central_widget}->destroy(); interactive_mode_box(); }), 0, gtksignal_connect(new Gtk::Button(_(" Help ")), clicked => sub { ${$central_widget}->destroy(); adv_help(\&$current_widget,$custom_help ); }), 1, new Gtk::HBox(0, 1), 0, gtksignal_connect(new Gtk::Button(_(" Previous ")), clicked => sub { ${$central_widget}->destroy(); $previous_widget->(); }), 0, gtksignal_connect(new Gtk::Button(_(" Restore ")), clicked => sub { ${$central_widget}->destroy(); do_restore_backend(); }), ), ); } sub build_backup_button_box_end { $button_box_tmp->destroy(); gtkpack($button_box, $button_box_tmp = gtkpack(gtkset_layout(new Gtk::HButtonBox, -start), gtksignal_connect(new Gtk::Button(_(" Close ")), clicked => sub { ${$central_widget}->destroy(); interactive_mode_box(); }), ), ); } sub restore_button_box { $button_box_tmp->destroy(); gtkpack($button_box, $button_box_tmp = gtkpack_(new Gtk::HButtonBox, 1, gtksignal_connect(new Gtk::Button(_(" Cancel ")), clicked => sub { ${$central_widget}->destroy(); interactive_mode_box(); }), 1, gtksignal_connect(new Gtk::Button(_(" Help ")), clicked => sub { ${$central_widget}->destroy(); adv_help(\&$current_widget,$custom_help); }), 1, new Gtk::HBox(0, 0), 0, gtksignal_connect(new Gtk::Button(_(" Previous ")), clicked => sub { ${$central_widget}->destroy(); $previous_widget->(); }), 1, gtksignal_connect(new Gtk::Button(_(" Next ")), clicked => sub { ${$central_widget}->destroy(); $next_widget->(); }), ), ); } sub wizard_button_box { $button_box_tmp->destroy(); gtkpack($button_box, $button_box_tmp = gtkpack_(new Gtk::HButtonBox, 1, gtksignal_connect(new Gtk::Button(_(" Cancel ")), clicked => sub { ${$central_widget}->destroy(); interactive_mode_box(); }), 1, gtksignal_connect(new Gtk::Button(_(" Help ")), clicked => sub { ${$central_widget}->destroy(); adv_help(\&$current_widget,$custom_help); }), 1, new Gtk::HBox(0, 0), 0, gtksignal_connect(new Gtk::Button(_(" Previous ")), clicked => sub { ${$central_widget}->destroy(); $previous_widget->(); }), 1, gtksignal_connect(new Gtk::Button(_(" Next ")), clicked => sub { ${$central_widget}->destroy(); $next_widget->(); }), ), ); } sub main_button_box { $button_box_tmp->destroy(); gtkpack($button_box, $button_box_tmp = gtkpack(gtkset_layout(new Gtk::HButtonBox, -start), gtksignal_connect(new Gtk::Button(_("close")), clicked => sub { Gtk->main_quit() }), gtksignal_connect(new Gtk::Button(_(" Help ")), clicked => sub { ${$central_widget}->destroy(); adv_help(\&interactive_mode_box) }), ), ); } sub build_backup_box_progress { # build_backup_files(); } sub message_norestorefile_box { $box2->destroy(); my ($pix_warn_map, $pix_warn_mask) = gtkcreate_png('warning'); gtkadd($advanced_box, $box2 = gtkpack_(new Gtk::HBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtkpack(new Gtk::HBox(0, 15), new Gtk::VBox(0, 5), new Gtk::Pixmap($pix_warn_map, $pix_warn_mask), _("Please Build backup before to restore it..."), new Gtk::VBox(0, 5), ), 1, new Gtk::VBox(0, 5), ), ); restore_button_box_main(); $central_widget = \$box2; $up_box->show_all(); } sub message_norestore_box { $box2->destroy(); my ($pix_warn_map, $pix_warn_mask) = gtkcreate_png('warning'); gtkadd($advanced_box, $box2 = gtkpack_(new Gtk::HBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtkpack(new Gtk::HBox(0, 15), new Gtk::VBox(0, 5), new Gtk::Pixmap($pix_warn_map, $pix_warn_mask), _(" Please check data to restore..."), new Gtk::VBox(0, 5), ), 1, new Gtk::VBox(0, 5), ), ); restore_button_box_main(); $central_widget = \$box2; $up_box->show_all(); } sub message_noselect_box { $box2->destroy(); my ($pix_warn_map, $pix_warn_mask) = gtkcreate_png('warning'); gtkadd($advanced_box, $box2 = gtkpack_(new Gtk::HBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtkpack(new Gtk::HBox(0, 15), new Gtk::VBox(0, 5), new Gtk::Pixmap($pix_warn_map, $pix_warn_mask), _(" Please check way to save..."), new Gtk::VBox(0, 5), ), 1, new Gtk::VBox(0, 5), ), ); restore_button_box_main(); $central_widget = \$box2; $up_box->show_all(); } sub message_noconf_box { $box2->destroy(); my ($pix_warn_map, $pix_warn_mask) = gtkcreate_png('warning'); gtkadd($advanced_box, $box2 = gtkpack_(new Gtk::HBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtkpack(new Gtk::HBox(0, 15), new Gtk::VBox(0, 5), new Gtk::Pixmap($pix_warn_map, $pix_warn_mask), _(" No configuration file found \nplease click Wizard or Advanced."), new Gtk::VBox(0, 5), ), 1, new Gtk::VBox(0, 5), ), ); restore_button_box_main(); $central_widget = \$box2; $up_box->show_all(); } sub build_backup_box_see_conf { my $box2; my $text = new Gtk::Text(undef, undef); system_state(); gtktext_insert($text, $system_state); restore_button_box_main(); gtkpack($advanced_box, $box2 = gtkpack_(new Gtk::HBox(0, 15), 1, gtkpack_(new Gtk::VBox(0,10), 0, _(" Drakbackup Configuration "), 1, createScrolledWindow($text), ), ), ); wizard_button_box_end(); $custom_help = ""; $central_widget = \$box2; $current_widget = \&build_backup_box_see_conf; $previous_widget =\&build_backup_box; $up_box->show_all(); } sub build_backup_box { $box2->destroy(); gtkadd($advanced_box, $box2 = gtkpack_(new Gtk::HBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtkpack_(new Gtk::VBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtksignal_connect(new Gtk::Button(_(" Backup Now from configuration file ")), clicked => sub { ${$central_widget}->destroy(); backup_status(); build_backup_files(); }), 0, new Gtk::VBox(0, 5), 1, gtksignal_connect(new Gtk::Button(_(" Backup Now on Autoboot CDROM ")), clicked => sub { ${$central_widget}->destroy(); restore_box(); }), 0, new Gtk::VBox(0, 5), 1, gtksignal_connect(new Gtk::Button(_(" View Backup Configuration. ")), clicked => sub { ${$central_widget}->destroy(); build_backup_box_see_conf(); }), 1, new Gtk::VBox(0, 5), ), 1, new Gtk::VBox(0, 5), ), ); $custom_help = "options"; restore_button_box_main(); $central_widget = \$box2; $current_widget = \&build_backup_box; $up_box->show_all(); } sub interactive_mode_box { $box2->destroy(); gtkadd($advanced_box, $box2 = gtkpack_(new Gtk::HBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtkpack_(new Gtk::VBox(0, 15), 1, new Gtk::VBox(0, 5), 1, gtksignal_connect(new Gtk::Button(_(" Advanced Configuration ")), clicked => sub { adv_button_box(); ${$central_widget}->destroy(); advanced_box(); }), 1, gtksignal_connect(new Gtk::Button(_(" Wizard Configuration ")), clicked => sub { ${$central_widget}->destroy(); read_conf_file(); wizard(); }), 1, gtksignal_connect(new Gtk::Button(_(" Backup Now ")), clicked => sub { ${$central_widget}->destroy(); # build_backup_files(); if ($cfg_file_exist) { build_backup_box();} else { message_noconf_box();} }), 1, gtksignal_connect(new Gtk::Button(_(" Restore ")), clicked => sub {${$central_widget}->destroy(); restore_box();}), 1, new Gtk::VBox(0, 5), ), 1, new Gtk::VBox(0, 5), ), ); main_button_box(); $central_widget = \$box2; $up_box->show_all(); } sub interactive_mode { $interactive = 1; my $box; my $window1 = $::isEmbedded ? new Gtk::Plug ($::XID) : new Gtk::Window -toplevel; init Gtk; $window1->signal_connect (delete_event => sub { Gtk->exit(0) }); $window1->set_position(1); $window1->set_title(_("Drakbackup")); my ($pix_u_map, $pix_u_mask) = gtkcreate_png("backup_title"); my ($pix_l_map, $pix_l_mask) = gtkcreate_png("backup_left2"); my ($pix_r_map, $pix_r_mask) = gtkcreate_png("backup_bot2"); read_conf_file(); gtkadd($window1, gtkpack(new Gtk::VBox(0,0), gtkpack(gtkset_usize($up_box = new Gtk::VBox(0, 5), 500, 420), $box = gtkpack_(new Gtk::VBox(0, 3), 0, new Gtk::Pixmap($pix_u_map, $pix_u_mask), 1, gtkpack_(new Gtk::HBox(0, 3), 0, new Gtk::Pixmap($pix_l_map, $pix_l_mask), 1, gtkpack_(new Gtk::HBox(0, 15), 0, new Gtk::HBox(0, 5), 1, $advanced_box = gtkpack_(new Gtk::HBox(0, 15), 1, $box2 = gtkpack_(new Gtk::VBox(0, 15), ), ), 0, new Gtk::HBox(0, 5), ), ), 0, new Gtk::Pixmap($pix_r_map, $pix_r_mask), 0, $button_box = gtkpack(new Gtk::VBox(0, 15), $button_box_tmp = gtkpack(new Gtk::VBox(0, 0), ), ), ), ), ), ); interactive_mode_box(); main_button_box(); $central_widget = \$box2; $window1->show_all; $window1->realize; $window1->show_all(); Gtk->main; Gtk->exit(0); } sub about { my $text = new Gtk::Text(undef, undef); my $about_box; gtkpack($up_box, $about_box = gtkpack_(new Gtk::VBox(0,10), 1, gtkpack_(new Gtk::HBox(0,0), 1, gtktext_insert(gtkset_editable($text, 1), _(" Copyright (C) 2001 by MandrakeSoft (sdupont\@mandrakesoft.com) 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 2, 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, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ")), 0, new Gtk::VScrollbar($text->vadj), ), 0, gtkadd(gtkset_layout(new Gtk::HButtonBox, -spread), gtksignal_connect(new Gtk::Button(_("OK")), clicked => sub { ${$central_widget}->destroy(); interactive_mode(); }), ), ) ); $central_widget = \$about_box; $up_box->show_all(); } sub adv_help { my ($function, $custom_help) = @_, my $text = new Gtk::Text(undef, undef); my $advanced_box_help; if ($custom_help eq "toto") { gtktext_insert($text, _("toto")); } elsif ($custom_help eq "options") { gtktext_insert($text, _("options description: In this step Drakbacup allow you to change: - the compression mode: if you check bzip2 compression, you will compress better than gzip your data (about 2-10 %). This options are not checked by default because this compression mode need more time ( about 1000% more). - the udpate mode: This options will update your backup, but this options are not really interesting because you need to decompress your backup before to update it. - the .backupignore mode: Like with cvs, Drakbackup will ignore all references included on .backupignore files in each directories. ex: \$> cat .backupignore *.o *~ ... ")); } else { gtktext_insert($text, _("description: Drakbacup is use to backup system files and user files Drakbacup allow to restore the system (etc, var files) from starup or on drakconf utility. backup name format: all the time from the / dir. system backup: backup_sys.tar.gz user backup backup_user_james.tar.gz backup_user_seb.tar.gz other directories backup_other.tar.gz build iso fs with rescue. configuration file: /etc/drakconf/drakbackup/drakbakup.conf "));} gtkpack($advanced_box, $advanced_box_help = 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(_("OK")), clicked => sub { ${$central_widget}->destroy(); $function->(); }), ), ) ); $central_widget = \$advanced_box_help; $up_box->show_all(); } sub restore_help { my $text = new Gtk::Text(undef, undef); my $about_box; gtkpack($up_box, $about_box = gtkpack_(new Gtk::VBox(0,10), 1, gtkpack_(new Gtk::HBox(0,0), 1, gtktext_insert(gtkset_editable($text, 1), _(" Description: Drakbacup Restore Mode. Drakbacup allow to restore the system (etc, var files) from starup or on drakconf utility. system backup: backup_sys.tar.gz user backup backup_user_james.tar.gz backup_user_seb.tar.gz other directories backup_other.tar.gz ")), 0, new Gtk::VScrollbar($text->vadj), ), 0, gtkadd(gtkset_layout(new Gtk::HButtonBox, -spread), gtksignal_connect(new Gtk::Button(_("OK")), clicked => sub { ${$central_widget}->destroy(); restore(); }), ), ) ); $central_widget = \$about_box; $up_box->show_all(); } sub progress { my ($progressbar, $incr, $label_text) = @_; my($new_val) = $progressbar->get_current_percentage; $new_val += $incr; if ($new_val > 1) {$new_val = 1} $progressbar->update($new_val); $progressbar->{label}->set($label_text); Gtk->main_iteration while Gtk->events_pending; } # _____________________________________________________________ OLD CODE # sub build_backup_files { # -d $save_path or mkdir_p($save_path); # my $path_name; # my @list_other_; # if ($where_hd) { # print "backup_sys @sys_files\n"; # $backup_sys and system("tar cvfz $save_path/backup_sys.tar.gz @sys_files"); # print "backup_other @list_other\n"; # if (@list_other) { # system("tar cvfz $save_path/backup_other.tar.gz @list_other"); # foreach (@list_other) { # push @list_other_, $_ . "\n"; # } # output_p( $save_path . '/list_other', @list_other_); # } # if ($backup_user) { # foreach (@user_list) { # $path_name = return_path($_); # print "path of user: $path_name\n"; # $what_no_browser or system("tar cvfz $save_path/backup_user_$_.tar.gz $path_name"); # $what_no_browser and system("tar cvz --exclude NewCache --exclude Cache --exclude cache -f $save_path/backup_user_$_.tar.gz $path_name | grep cahe"); # } # } # } # if ($where_net) { # } # if ($where_cd) { # } # } # $about_box = gtkpack_(new Gtk::VBox(0,10), # 1, gtkpack(new Gtk::HBox(0,0), # 0, gtkadd(new Gtk::HButtonBox, # gtksignal_connect(new Gtk::Button(_("Cancel")), clicked => # sub { ${$central_widget}->destroy(); # $mdk_cc and interactive_mode(); # $mdk_cc or interactive_mode_my(); # }), # gtksignal_connect(new Gtk::Button(_("Help")), clicked => # sub { save_conf_file(); ${$central_widget}->destroy(); adv_help() }), # gtksignal_connect(new Gtk::Button(_("Ok")), clicked => # sub { save_conf_file(); # ${$central_widget}->destroy(); # $mdk_cc and interactive_mode(); # $mdk_cc or interactive_mode_my(); # }), # ), # ), # ), # foreach ([$check_what_sys, \$backup_sys], # [$check_what_cvs, \$backup_sys_cvs], # [$check_what_browser, \$what_no_browser], # [$check_cdrw, \$cdrw], # [$check_where_net_daemon, \$net_daemon], # [$check_where_hd_daemon, \$hd_daemon], # [$check_where_cd_daemon, \$cd_daemon], # [$check_where_hd_quota, \$hd_quota], # [$check_where_hd, \$where_hd], # [$check_where_cd, \$where_cd], # [$check_where_net, \$where_net], # [$check_when_daemon, \$backup_daemon], # [$check_cd_with_install_boot, \$cd_with_install_boot], # [$check_tar_bz2, \$comp_mode], # [$check_replace, \$option_replace], # [$check_backupignore, \$backupignore]) { # my $ref = $_->[1]; # gtksignal_connect(gtkset_active($_->[0], ${$ref}), toggled => sub { ${$ref} = ${$ref} ? 0 : 1; }) # } # # $notebook->set_tab_pos( $rotate{ $notebook->tab_pos } ); # sub after_adv { # $interactive = 1; # my $box_cfg_state; # my $box_cgf_state_replace; # my $box_cgf_state_comp; # my $mask; # my $style; # my $box_cgf_state_sys = (""); # my $box; # init Gtk; # my $text2 = new Gtk::Text(undef, undef); # my $window1 = $::isEmbedded ? new Gtk::Plug ($::XID) : new Gtk::Window -toplevel; # $window1->signal_connect (delete_event => sub { Gtk->exit(0) }); # $window1->set_position(1); # $window1->set_title(_("Drakbackup")); # my ($pix_u_map, $pix_u_mask) = gtkcreate_png("backup_title"); # my ($pix_l_map, $pix_l_mask) = gtkcreate_png("backup_left"); # my ($pix_b_map, $pix_b_mask) = gtkcreate_png("backup_bot2"); # my ($pix_cd_map, $pix_cd_mask) = gtkcreate_png("cdrom"); # my ($pix_hd2_map, $pix_hd2_mask) = gtkcreate_png("hd"); # my ($pix_quit_map, $pix_quit_mask) = gtkcreate_png("quit"); # my $button_burn_cd = new Gtk::Button(); # $button_burn_cd->add( gtkpack(new Gtk::HBox( 0, 2), # new Gtk::Pixmap($pix_cd_map, $pix_cd_mask), # _("Burn auto\n Install CDROM") # ), # ); # my $button_do_backup = new Gtk::Button(); # $button_do_backup->add( gtkpack(new Gtk::HBox( 0, 2), # new Gtk::Pixmap($pix_hd2_map, $pix_hd2_mask), # _("Build a \nbackupn now") # ), # ); # my $button_quit = new Gtk::Button(); # $button_quit->add( gtkpack(new Gtk::HBox( 0, 2), # new Gtk::Pixmap($pix_quit_map, $pix_quit_mask), # _("Quit DrakBackup") # ), # ); # read_conf_file(); # $backup_sys or $box_cgf_state_sys = _("Do not include System Files"); # if ($option_replace) { $box_cgf_state_replace = _("Replace backups (do not update)"), # } else { $box_cgf_state_replace = _("Update backups (do not replace)"), } # if ($comp_mode) { $box_cgf_state_comp = _("Backups use tar and bzip2 "), # } else { $box_cgf_state_comp = _("Backups use tar and gzip"), } # if ($cfg_file_exist) { # my $label_cfg_file = new Gtk::Label _("Backup Sources: \n-System Files: @sys_files \n-Users Files: @user_list\n-Other Files to backup: @list_other\nPath to save backups: $save_path\nOptions:\n$box_cgf_state_replace\n$box_cgf_state_comp\n$box_cgf_state_sys\n"); # $box_cfg_state = gtkpack(new Gtk::VBox( 0, 0), # gtkset_justify( $label_cfg_file , 'left'), # ), # } else { $box_cfg_state = gtkpack(new Gtk::VBox(0,1), # _("No configuration please click Wizard or Advanced.") ), } # gtkadd($window1, # gtkpack(new Gtk::VBox(0,0), # gtkpack(gtkset_usize($up_box = new Gtk::VBox(0, 5), 500, 420), # $box = gtkpack_(new Gtk::VBox(0, 3), # 0, new Gtk::Pixmap($pix_u_map, $pix_u_mask), # 1, gtkpack_(new Gtk::HBox(0, 3), # 0, new Gtk::Pixmap($pix_l_map, $pix_l_mask), # 1, createScrolledWindow( gtkpack(new Gtk::VBox(0,0), # gtkadd(new Gtk::Frame(_("State of configuration file.")), # gtkpack(new Gtk::VBox(0,10), # $box_cfg_state, # ),),),),), # 0, new Gtk::Pixmap($pix_b_map, $pix_b_mask), # 0, gtkpack_(new Gtk::HBox(0, 0), # 1, gtkpack_(new Gtk::HBox(0, 1), # 1, gtksignal_connect($button_quit, clicked => sub { # Gtk->main_quit() }), # 1, gtksignal_connect($button_do_backup, clicked => sub { # ${$central_widget}->destroy(); }), # 1, gtksignal_connect($button_burn_cd, clicked => sub { # ${$central_widget}->destroy(); }), # ), # ), # ), # ), # ), # ); # $central_widget = \$box; # $window1->show_all; # $window1->realize; # $window1->show_all(); # Gtk->main; # Gtk->exit(0); # } # sub restore { # my $retore_box; # my $retore_box3; # my ($pix_u_map, $pix_u_mask) = gtkcreate_png("backup_title"); # my ($pix_l_map, $pix_l_mask) = gtkcreate_png("backup_left2"); # my ($pix_r_map, $pix_r_mask) = gtkcreate_png("backup_bot2"); # my $check_restore_sys; # my $check_restore_user; # my $check_restore_other; # find_backup_to_restore(); # @user_list_to_restore = @user_backuped; # if ($other_backuped || $sys_backuped || @user_backuped) { # gtkpack($up_box, # $retore_box = gtkpack_(new Gtk::VBox(0,1), # 0, gtkpng('backup_title'), # 1, gtkpack_(new Gtk::HBox(0, 0), # 0, gtkpng('backup_left2'), # 1, gtkadd(new Gtk::Frame(_("Restoration Step.")), # $retore_box2 = gtkpack(new Gtk::VBox(0,10), # $retore_box3 = gtkpack_(new Gtk::VBox(0,10), # 1, _("Please choose that you want to restore."), # 0, gtkpack_(new Gtk::HBox(0,10), # 1, new Gtk::HBox(0,10), # 1, gtkpack_(new Gtk::VBox(0,10), # 0, gtksignal_connect(new Gtk::Button(_("Restore all backups (last)")), # clicked => sub { $retore_box3->destroy(); # $restore_sys = 1; # $restore_other = 1; # $restore_user = 1; # do_restore(); }), # 0, gtksignal_connect(new Gtk::Button(_("Custom Restore")), # clicked => sub { $retore_box3->destroy(); restore_step2(); }), # ), # 1, new Gtk::HBox(0,10), # ), # 1, new Gtk::HBox(0,10), # ),),),), # 0, gtkpng('backup_bot2'), # 0, new Gtk::HSeparator, # 0, gtkpack_(new Gtk::HBox(0, 0), # 1, gtkpack_(new Gtk::HButtonBox, # 1, gtksignal_connect(new Gtk::Button(_(" Cancel ")), clicked => sub { # ${$central_widget}->destroy(); interactive_mode(); }), # 1, gtksignal_connect(new Gtk::Button(_(" Help ")), clicked => sub { # $retore_box->destroy(); restore_help();}), # 1, new Gtk::HBox(0, 0), # 1, gtksignal_connect(new Gtk::Button(_(" Next ")), clicked => sub { # $retore_box->destroy(); restore_help();}), # ), # ), # ) # ); # } else { # gtkpack($up_box, # $retore_box = gtkpack_(new Gtk::VBox(0,1), # 0, new Gtk::Pixmap($pix_u_map, $pix_u_mask), # 1, gtkpack_(new Gtk::HBox(0, 0), # 0, new Gtk::Pixmap($pix_l_map, $pix_l_mask), # 1, gtkadd(new Gtk::Frame(_("Restoration Step.")), # $retore_box2 = gtkpack(new Gtk::VBox(0,10), # $retore_box3 = gtkpack_(new Gtk::VBox(0,10), # 1, _("Please Build backup before to restore it..."), # 0, gtkpack_(new Gtk::HBox(0,10), # 1, new Gtk::HBox(0,10), # ), # 1, new Gtk::HBox(0,10), # ),),),), # 0, new Gtk::Pixmap($pix_r_map, $pix_r_mask), # 0, new Gtk::HSeparator, # 0, gtkpack_(new Gtk::HBox(0, 0), # 1, gtkpack_(new Gtk::HButtonBox, # 1, gtksignal_connect(new Gtk::Button(_(" Cancel ")), clicked => sub { # ${$central_widget}->destroy(); interactive_mode(); }), # 1, gtksignal_connect(new Gtk::Button(_(" Help ")), clicked => sub { # $retore_box->destroy(); restore_help();}), # ), # ), # ) # ); # } # $central_widget = \$retore_box; # $up_box->show_all(); # } # _____________________________________________________________ DOCS # Comment récupérer la date du jour ? # Cf perldoc -f localtime # ($seconde,$minute,$heure,$jour_du_mois,$annee, # $jour_de_la_semaine,$jour_de_l _annee,$drapeau_heure_ete) = localtime(time); # Il faut ajouter 1900 a l'année pour une date correcte ($annee+=1900) et 1 au jour du mois pour obtenir une date correcte ($jour_du_mois++). # [Perl] Comment récupérer des informations sur un fichier ? # Cf perldoc -f stat # Exemple pour récupérer mtime (date de dernière modification du fichier) # my(@etat); my($fchier)="/tmp/toto"; # # Si le fichier existe on récupère des infos dessus # if (-e $fchier) {@etat=stat($fchier); } # # On convertit avec localtime la valeur de mtime. # my($date)= localtime($etat[9]); # print $date; #Telnet : En utilisant le package Net::Telnet # use strict; # use Net::Telnet; # use CGI qw/:standard :html3 :netscape escape unescape/; # use CGI::Carp qw/fatalsToBrowser/; # my $username="alian"; # my $passwd="password"; # my $HOST="indy.alianet"; # print header; # my $t = new Net::Telnet (Timeout=>undef) or die "Can't connect:$!"; # $t->open($HOST); # $t->login($username, $passwd); # my @lines = $t->cmd("/ma/commande/a/executer"); # print join(' ',@lines);