Forum: Ruby FTP#mget, FTP#mput

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.
F3b7b8756d0c7f71cc7460cc33aefaee?d=identicon&s=25 Daniel Berger (Guest)
on 2006-05-09 21:23
(Received via mailing list)
Hi all,

Is there a method in Net::FTP that corresponds to ftp's mget and mput
functions?

If not, is there any chance of adding this to ftp.rb?

Thanks,

Dan


This communication is the property of Qwest and may contain confidential
or
privileged information. Unauthorized use of this communication is
strictly
prohibited and may be unlawful.  If you have received this communication
in error, please immediately notify the sender by reply e-mail and
destroy
all copies of the communication and any attachments.
Cb48ca5059faf7409a5ab3745a964696?d=identicon&s=25 unknown (Guest)
on 2006-05-09 21:29
(Received via mailing list)
On Wed, 10 May 2006, Daniel Berger wrote:

>
this grabs directories if you give it something like

ftpget ftp://host/dir/dir2/*

so it's similar to mget



#!/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

-a
Cb48ca5059faf7409a5ab3745a964696?d=identicon&s=25 unknown (Guest)
on 2006-05-09 21:33
(Received via mailing list)
On Wed, 10 May 2006, Daniel Berger wrote:

> Hi all,
>
> Is there a method in Net::FTP that corresponds to ftp's mget and mput
> functions?
>
> If not, is there any chance of adding this to ftp.rb?
>
> Thanks,
>
> Dan

this does something like mput


#!/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

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