01 #!/usr/local/bin/perl -w 02 use strict; 03 use File::Finder; 04 use Glib qw/TRUE FALSE/; 05 use Gtk2 '-init'; 06 use DateTime; 07 08 my $PID; 09 my $tar = "tar"; 10 my $src_dir = "/home/mschilli/test"; 11 my $ymd = DateTime->now->ymd(''); 12 13 my($stick_dir) = @ARGV; 14 15 if(! defined $stick_dir ) { 16 die "usage: $0 stick_dir"; 17 } 18 $stick_dir =~ s#^file://##; 19 20 my $dst_tarball = "$stick_dir/$ymd.tgz"; 21 22 my $NOF_FILES = scalar File::Finder 23 -> type( "f" ) 24 -> in( $src_dir ); 25 26 my $CMD = 27 "$tar zcfv $dst_tarball $src_dir"; 28 29 my $window = Gtk2::Window->new('toplevel'); 30 $window->set_border_width(10); 31 $window->set_size_request( 500, 100 ); 32 33 my $vbox = Gtk2::VBox->new( TRUE, 10 ); 34 $window->add( $vbox ); 35 36 my $pbar = Gtk2::ProgressBar->new(); 37 $pbar->set_fraction(0); 38 $pbar->set_text("Progress"); 39 $vbox->pack_start( $pbar, TRUE, TRUE, 0 ); 40 41 my $cancel = Gtk2::Button->new('Cancel'); 42 $vbox->pack_end( $cancel, 43 FALSE, FALSE, 0 ); 44 $cancel->signal_connect( clicked => 45 sub { kill 2, $PID if defined $PID; 46 Gtk2->main_quit; } ); 47 48 $window->show_all(); 49 50 my $timer = Glib::Timeout->add ( 51 10, \&start, $pbar, 52 Glib::G_PRIORITY_LOW ); 53 54 Gtk2->main; 55 56 ########################################### 57 sub start { 58 ########################################### 59 my( $pbar ) = @_; 60 61 $PID = open my $fh, "$CMD |"; 62 63 my $count = 1; 64 while( <$fh> ) { 65 chomp; 66 next if m#/$#; # skip dirs 67 68 $pbar->set_text( "Backup Progress " . 69 "($count/$NOF_FILES)" ); 70 $pbar->set_fraction($count/$NOF_FILES); 71 72 Gtk2->main_iteration while 73 Gtk2->events_pending; 74 75 $count++; 76 } 77 78 close $fh or die "$CMD failed ($!)"; 79 80 $cancel->set_label( "Success. Hooray!" ); 81 undef $PID; 82 83 return Glib::SOURCE_REMOVE; 84 }