Forum: Ruby New thread for RUBY ftp problems . . .

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
B58c6eef325656d513d26e2c3ae6bfd9?d=identicon&s=25 Peter Bailey (peterbailey)
on 2006-05-04 16:02
I'm starting a new thread, because, my problem appears even in the
simplest try of RUBY's ftp.

Here's a simple attempt to just ftp a file over to one of our UNIX
servers here at my company. It's left hanging after the last "end" and I
have to kill the shell.


C:\workflows\graphics\OneVision\MPC\indexes\6x9>irb
irb(main):001:0> require 'net/ftp'
=> true
irb(main):002:0> ftp = Net::FTP.open('quark.bna.com') do |ftp|
irb(main):003:1* ftp.login('user','passw')
irb(main):004:1> ftp.chdir('/home/pb4072')
irb(main):005:1> ftp.putbinaryfile("lrr095.pdf")
irb(main):006:1> end

Is RUBY's ftp reliable? Or, what am I doing wrong??

Thanks.
453336cfba0446c4eb97ee925324517d?d=identicon&s=25 William Stevens (wfspoet)
on 2006-05-04 16:19
Peter Bailey wrote:
> I'm starting a new thread, because, my problem appears even in the
> simplest try of RUBY's ftp.
>
> Here's a simple attempt to just ftp a file over to one of our UNIX
> servers here at my company. It's left hanging after the last "end" and I
> have to kill the shell.
>
>
> C:\workflows\graphics\OneVision\MPC\indexes\6x9>irb
> irb(main):001:0> require 'net/ftp'
> => true
> irb(main):002:0> ftp = Net::FTP.open('quark.bna.com') do |ftp|
> irb(main):003:1* ftp.login('user','passw')
> irb(main):004:1> ftp.chdir('/home/pb4072')
> irb(main):005:1> ftp.putbinaryfile("lrr095.pdf")
> irb(main):006:1> end
>
> Is RUBY's ftp reliable? Or, what am I doing wrong??
>
> Thanks.
Peter,

I tried this sequence on my system and it worked:

thor:~ wfs$ irb
irb(main):001:0> require 'net/ftp'
=> true
irb(main):002:0> ftp = Net::FTP.open('thor') do |ftp|
irb(main):003:1* ftp.login('user','password')
irb(main):004:1> ftp.putbinaryfile('sorted.txt','sortedXmit.txt')
irb(main):005:1> end

the file I used is quite small so the code completed quickly. and I
verified that the file was transmited.

I am on Mac OS X 10.4.6 with ruby 1.8.4

Bill
Cb48ca5059faf7409a5ab3745a964696?d=identicon&s=25 unknown (Guest)
on 2006-05-04 17:15
(Received via mailing list)
On Thu, 4 May 2006, Peter Bailey wrote:

> => true
> irb(main):002:0> ftp = Net::FTP.open('quark.bna.com') do |ftp|
> irb(main):003:1* ftp.login('user','passw')
> irb(main):004:1> ftp.chdir('/home/pb4072')
> irb(main):005:1> ftp.putbinaryfile("lrr095.pdf")
> irb(main):006:1> end
>
> Is RUBY's ftp reliable? Or, what am I doing wrong??

   - you may need passive
   - you may not be logging in
   - either way you will see what's happening by doing

       ftp.debug_mode = true

here are three commandline scripts i used daily moving tens of thousands
of
files around, usage is obivous, never had an issue with any of them:

   harp:~ > ftpls cf0
   drwxrwsr-x    3 457      11111       45056 Apr 20 17:43 cf0-0
   drwxrwsr-x    2 457      11111      954368 Apr 20 17:42 cf0-1

   harp:~ > ftpput a.rb cf0://cf0-0/
   ---
   - "/cf0-0/a.rb"

   harp:~ > ftpget cf0://cf0-0/a.rb
   ---
   - "./a.rb"

note that you can also use ftp://cf0/cf0-0/a.rb syntax and that any path
with a
trailing slash on the command line is interpreted as a directory.

here are the scripts.



     harp:~ > cat ftpls
     #!/dmsp/reference/bin/ruby
     require "net/ftp"
     require "uri"

     def uriparse uri
       unless uri =~ %r/^ftp/
         host, path = uri.split %r|:/+|o
         URI::parse "ftp://#{ host }/#{ path }"
       else
         URI::parse uri
       end
     end

     abort "#{ $0 } uri [uris]+" if ARGV.empty?
     user = ENV["FTP_USER"] || "anonymous"
     password = ENV["FTP_PASS"] || ENV["FTP_PASSWORD"] || "foo@bar.org"

     while((uri = ARGV.shift))
       uri = uriparse uri
       Net::FTP.open(uri.host) do |ftp|
         ftp.login user, password
         ftp.passive = true
         ftp.list(uri.path || "/"){|path| puts path}
       end
     end



     harp:~ > cat ftpput
     #!/dmsp/reference/bin/ruby
     require "net/ftp"
     require "uri"
     require "socket"
     require "yaml"

     def uriparse uri
       unless uri =~ %r/^ftp/
         host, path = uri.split %r|:/+|o
         URI::parse "ftp://#{ host }/#{ path }"
       else
         URI::parse uri
       end
     end

     abort "#{ $0 } src [srcs]+ dsturi" if ARGV.empty?
     user = ENV["FTP_USER"] || "anonymous"
     password = ENV["FTP_PASS"] || ENV["FTP_PASSWORD"] || "foo@bar.org"
     debug = ENV["FTP_DEBUG"]
     srcs, uri = ARGV[0..-2], ARGV[-1]

     uri = uriparse uri
     host, hostdest = uri.host, uri.path
     rpaths = []
     hostname, pid = Socket::gethostname, Process::pid

     Net::FTP.open(host) do |ftp|
       ftp.debug_mode = true if debug
       ftp.login user, password
       ftp.passive = true
       ftp.binary = true

       srcs.each do |src|
         dest =
           if hostdest =~ %r|/+\s*$|o or srcs.size > 1
             File::join(hostdest, File::basename(src))
           else
             hostdest
           end
         destdir = File::dirname dest

         destdirs = []
         d = nil
         destdirs.unshift(d) while((d = File::dirname(d || dest)) !~
%r|^\s*/+\s*$|o)

         dirname, basename = File::dirname(dest), File::basename(dest)
         tmp = File::join(dirname, ".#{ basename }.#{ hostname }.#{ pid
}.ftp")

         if debug
           state = <<-eos
           |@src <#{ src }>
           |@host <#{ host }>
           |@dest <#{ dest }>
           |@destdir <#{ destdir }>
           |@destdirs <#{ destdirs.inspect }>
           |@tmp <#{ tmp.inspect }>
           eos
           state.gsub!(%r/^\s*\|/o,'')
           puts state
         end

         destdirs.each{|d| begin; ftp.mkdir d; rescue Net::FTPPermError;
end}
         ftp.putbinaryfile src, tmp
         ftp.rename tmp, dest
         rpaths << dest
       end
     end

     y rpaths




     harp:~ > cat ftpget
     #!/dmsp/reference/bin/ruby
     require "net/ftp"
     require "uri"
     require "yaml"

     def uriparse uri
       unless uri =~ %r/^ftp/
         host, path = uri.split %r|:/+|o
         URI::parse "ftp://#{ host }/#{ path }"
       else
         URI::parse uri
       end
     end

     abort "#{ $0 } srcuri [srcuris]+ dst" if ARGV.empty?
     user = ENV["FTP_USER"] || "anonymous"
     password = ENV["FTP_PASS"] || ENV["FTP_PASSWORD"] || "foo@bar.org"
     debug = ENV["FTP_DEBUG"]

     ARGV << '.' if ARGV.size == 1
     dest = ARGV.pop
     lpaths = []

     while((src = ARGV.shift))
       src = uriparse src
       Net::FTP.open(src.host) do |ftp|
         ftp.debug_mode = true if debug
         ftp.login user, password
         ftp.passive = true
         ftp.binary = true

         paths = []

         if src.path =~ %r|\*$|o
           dir = File::dirname(src.path)
           ftp.list(src.path) do |listing|
             path = listing.split(%r/\s+/o).last
             paths << File::join(dir, path)
           end
         else
           paths << src.path
         end

         paths.each do |path|
           lpath =
             if test ?d, dest
               File::join(dest, File::basename(path))
             else
               dest
             end
           ftp.getbinaryfile path, lpath
           lpaths << lpath
         end
       end
     end

     y lpaths




good luck.

-a
This topic is locked and can not be replied to.