in reply to Looping File transfer using SFTP in TK

You probably havn't seen it yet, but I answered you in comp.lang.perl.tk

I made a fake sftp client for testing, but you can uncomment the real lines. Also, since you want to repeatedly send the same file, you didn't need the callback(unless you want to track large file progress).

#!/usr/bin/perl use strict; use warnings; use Tk; use Net::SFTP::Foreign; use threads; use threads::shared; my $user = 'jlahowet'; my $server = 'mistral.unl.edu'; my $lcl = '/home/deadpickle/Desktop/Virtual Cockpit/uavposition'; my $rmt = '/home/jlahowet/UAV/COORDS/uavposition'; my $go:shared = 0; #my $monitor:shared = 0; my $die:shared = 0; my $progress:shared = 0; my @setup = ($user, $server, $lcl, $rmt); #start thread before any Tk code my $thr = threads->new(\&sftp, @setup); #now setup Tk my $mw = MainWindow->new(); $mw->protocol('WM_DELETE_WINDOW' => sub { &clean_exit }); $mw->configure(-title => 'VIRTUAL COCKPIT:SFTP', -background =>'blue') +; $mw->geometry('+400+300'); #User entry my $usr = $mw->Frame(-relief => 'groove', -borderwidth => 3, -backgrou +nd => 'blue')->pack(-side => 'top', -fill => 'x'); my $usrlbl = $usr->Label(-text => 'Username', -background => 'blue', - +foreground => 'white')->pack(-side => 'left'); my $usreny = $usr->Entry(-width=> 10, -textvariable => \$user)->pack(- +side => 'left', -pady => 3); #Server entry my $svr = $mw->Frame(-relief => 'groove', -borderwidth => 3, -backgrou +nd => 'blue')->pack(-side => 'top', -fill => 'x'); my $svrlbl = $svr->Label(-text => 'Server', -background => 'blue', -fo +reground => 'white')->pack(-side => 'left'); my $svreny = $svr->Entry(-width=> 15, -textvariable => \$server)->pack +(-side => 'left', -pady => 3); #File locations my $loc = $mw->Frame(-relief => 'groove', -borderwidth => 3, -backgrou +nd => 'blue')->pack(-side => 'top', -fill => 'x'); my $lcllbl = $loc->Label(-text => 'Local', -background => 'blue', -for +eground => 'white')->pack(-side => 'left'); my $lcleny = $loc->Entry(-width=> 25, -textvariable => \$lcl)->pack(-s +ide => 'left', -pady => 3); my $rmtlbl = $loc->Label(-text => 'Remote', -background => 'blue', -fo +reground => 'white')->pack(-side => 'left'); my $rmteny = $loc->Entry(-width=> 25, -textvariable => \$rmt)->pack(-s +ide => 'left', -pady => 3); #Connect button my $btn = $mw->Button(-text => 'Connect', -background => 'gray', -command => \&sub1) ->pack(-side => 'bottom', -padx => 3, -pady => 3, -anchor => ' +e'); # to monitor file count, needs a timer to update # from thread my $val = 0; my $label = $mw->Label( -width => 50, -textvariable => \$val )->pack(-side => 'bottom', -padx => 3, + -pady => 3, -anchor => 'w'); my $timer = $mw->repeat(10,sub{ $val = $progress; }); MainLoop; sub sub1 { if($btn->cget(-text) eq 'Connect'){ $go = 1; $btn->configure(-text=> 'Stop'); #$monitor = 0; } else{ $go = 0; $btn->configure(-text=> 'Connect'); #$monitor = 1; } print "go = $go\n"; } sub sftp{ $|++; # setup your sftp connection my $host = $_[1]; my $usrname = $_[0]; my $port = 22; my $seconds = 20; my %args = (user=>$usrname, port=>$port, timeout=>$seconds); my $local = $_[2]; my $remote = $_[3]; # commented out to skip actual sftp use # my $sftp = Net::SFTP::Foreign->new($host, %args); my $sftp; print "sftp connected\n"; #now go into a waiting loop, where you wait for #$go to be 1 #when $go = 1, the sftp will keep sending the file #the only way to break out is to set $die=1 while(1){ if($die == 1){ goto END }; # the go loop if ( $go == 1 ){ for(;;){ # $sftp->put("$local", "$remote"); print "fake file being sent\n"; $progress++; sleep 2; if($go == 0){last} if($die == 1){ goto END }; } $go = 0; #turn off self before returning }else { sleep 1 } # sleep if $go == 0 # end of go loop } #end of while loop END: undef $sftp; print "sftp stopped thread ending\n"; } sub clean_exit{ $timer->cancel; my @running_threads = threads->list; if (scalar(@running_threads) < 1){print "\nFinished\n";exit} else{ $die = 1; $thr->join; exit; } }

I'm not really a human, but I play one on earth. Cogito ergo sum a bum

Replies are listed 'Best First'.
Re^2: Looping File transfer using SFTP in TK
by deadpickle (Pilgrim) on Apr 10, 2007 at 20:12 UTC
    Thanks for the responses, they are very helpful. What I want is for the sftp to disconnect when the Stop button is pushed. that way the script allows the user to change the variables and run the transfer again. Right now I am trying to understand how zentara's code works since it incorporates syntax I have never seen (and it seems to make it easier). One problem is that the program connects right away not allowing the user to change the variables before it is connected to the server. I moved the SFTP connection to work only when $go = 1, that way it only connects of you push connect. But you cant change the variables like username from jlahowet to something else. It wont pass the new value to the thread for some reason, any help?
      Well to save you the head-scratching( I'm familiar with it due to hours of my own head-scratching :-) ), here is how to do it so each sftp run can be different.

      I'm not really a human, but I play one on earth. Cogito ergo sum a bum
        Yah thanks alot. I got a little of that before you sent it, but definitly not all of it. The program works great, does everything I want it to do. Now all that needs to be done is to make a listbox that prints all the print statements to it. It got some of it to work but when $msg=2 and the program enters the sub lstmsg, when it gets to the listbox insert the program stops. If I take the insert out it runs just fine. How can I fix this?
      Yeah, to make a new connection each run, move the connect to inside the go loop. To use new connection info for each connection, make them shared varaibles. Like:
      my $user:shared = 'jlahowet'; + my $server:shared = 'mistral.unl.edu'; + my $lcl:shared = '/home/deadpickle/Desktop/Virtual Cockpit/uavposition +'; my $rmt:shared = '/home/jlahowet/UAV/COORDS/uavposition'; #my $thr = threads->new(\&sftp, @setup); my $thr = threads->new(\&sftp); #then in your thread-code use the shared vars instead of #using the passed in @setup array
      You already have your entry widgets to setup to automatically change the vars with -textvariable. There is one thing to watch out for: sometimes the threads will not automatically pick up changes in textvariables, you might have to manually read them, but try it first, you may get lucky.

      I'm not really a human, but I play one on earth. Cogito ergo sum a bum