class MyMediaFTP

Public Class Methods

cp(src, dest, debug: false) click to toggle source
# File lib/mymedia_ftp.rb, line 12
def self.cp(src, dest, debug: false)
  
  if src =~ /^ftp:\/\// then
    uri, remotepath = src.match(/^(ftp:\/\/[^\/]+)(\/[^$]+)/).captures    
    new(uri, debug: debug).cp(remotepath, dest, :inbound)
  else
    uri, remotepath = dest.match(/^(ftp:\/\/[^\/]+)(\/[^$]+)/).captures    
    new(uri, debug: debug).cp(src, remotepath, :outbound)      
  end    
  
end
ls(s, debug: false) click to toggle source
# File lib/mymedia_ftp.rb, line 24
def self.ls(s, debug: false)
  
  uri, remotepath = s.match(/^(ftp:\/\/[^\/]+)(\/[^$]*)?/).captures
  puts 'remotepath'  + remotepath.inspect if debug
  new(uri, debug: debug).ls(remotepath || '/')
  
end
new(s=nil, host: '127.0.0.1', user: 'user', password: '1234', port: 21, debug: false) click to toggle source
Calls superclass method
# File lib/mymedia_ftp.rb, line 60
def initialize(s=nil, host: '127.0.0.1', user: 'user', password: '1234', 
               port: 21, debug: false)

  if s then
    
    r = s.match(/(?<user>\w+):(?<password>\w+)@(?<host>[^:]+)(?:\:(?<port>\d+))?/)
    h = r.named_captures.map {|k,v| [k.to_sym, v]}.to_h
    puts 'h: ' + h.inspect if debug
    user, password, host = h.values.take(3)
    port = h[:port] if h[:port]
    
  end
  
  @debug = debug

  @curdir = '/'
  super()
  connect(host, port)
  login(user, password)

end
read(s, debug: false) click to toggle source
# File lib/mymedia_ftp.rb, line 32
def self.read(s, debug: false)
      
  uri, remotepath = s.match(/^(ftp:\/\/[^\/]+)(\/[^$]+)/).captures
  ftp = new(uri, debug: debug)
  p ftp if debug
  
  tmpfile = Tempfile.new('ftp')

  ftp.cp remotepath, tmpfile.path
  File.read tmpfile.path

end
rm(s, debug: false) click to toggle source
# File lib/mymedia_ftp.rb, line 45
def self.rm(s, debug: false)
      
  uri, remotepath = s.match(/^(ftp:\/\/[^\/]+)(\/[^$]+)/).captures
  new(uri, debug: debug).rm(remotepath)

end
write(s, content='', debug: false) click to toggle source
# File lib/mymedia_ftp.rb, line 52
def self.write(s, content='', debug: false)
          
  tmpfile = Tempfile.new('ftp')    
  File.write tmpfile.path, content    
  self.cp tmpfile.path, s

end

Public Instance Methods

cd(dir)
Alias for: chdir
chdir(dir) click to toggle source
Calls superclass method
# File lib/mymedia_ftp.rb, line 82
def chdir(dir)
  super(dir)
  @curdir = pwd
end
Also aliased as: cd
cp(src='', dest='', direction=:inbound, &blk) click to toggle source
# File lib/mymedia_ftp.rb, line 89
def cp(src='', dest='', direction=:inbound, &blk)

  return outbound_cp(src, dest) if direction == :outbound
  
  puts 'cp: ' + src.inspect if @debug
  chdir File.dirname(src)
  dir = File.dirname(dest)
  FileUtils.mkdir_p dir
  Dir.chdir  dir

  puts 'copying ...' if @debug
  
  files = if src =~ /[\*\?]/ then
  
    cp_files(src)
    
  else
    
    begin
      getbinaryfile src, dest
    rescue Net::FTPPermError => e
      puts 'e: ' + e.inspect
    end      
    
  end

end
delete(filename) click to toggle source
Calls superclass method
# File lib/mymedia_ftp.rb, line 117
def delete(filename)
  super(filename)
  'file deleted'
end
Also aliased as: rm
list_filenames(s=@curdir+'/*', ctimesort: false) click to toggle source
# File lib/mymedia_ftp.rb, line 122
def list_filenames(s=@curdir+'/*', ctimesort: false)
  
  if @debug
    puts 'inside list_filenames' 
    puts 's: ' + s.inspect
  end
  
  if s =~ /\*/ then
    
    src = File.dirname(s)

    raw_q = File.basename(s)
    puts 'raw_q: ' + raw_q.inspect if @debug
    
    q = raw_q.gsub('.','\.').gsub('*','.*').gsub('?','.?')\
        .sub(/[^\*\?\.]$/,'.*')
  else
    src = s
  end

  list(src).inject([]) do |r, x| 

    raw_attr, _, owner, group, filesize, month, day, time, filename = \
        x.split(/ +/,9)
    type = raw_attr[0] == 'd' ? :directory : :file
    d = Time.parse([Date.today.year, month, day, time].join(' ') )
    
    if q then
      filename[/^#{q}$/] ? r << {name: filename, type: type, filesize: filesize, ctime: d} : r
    else
      r << {name: filename, type: type, filesize: filesize, ctime: d}
    end
    r
  end

end
Also aliased as: ls
ls(s=@curdir+'/*', ctimesort: false)
Alias for: list_filenames
mv(src='', dest='') click to toggle source
# File lib/mymedia_ftp.rb, line 161
def mv(src='', dest='')

  puts 'moving ...'
  cp(src, dest) do |file, type| 
    type == :file ? delete(file) : rmdir(file)
  end

end
rm(filename)
Alias for: delete

Private Instance Methods

cp_dir(directory, &blk) click to toggle source
# File lib/mymedia_ftp.rb, line 174
def cp_dir(directory, &blk)
  
  puts 'inside cp_dir: ' + directory.inspect if @debug
  FileUtils.mkdir_p directory
  parent_dir = pwd
  chdir directory
  cp('*', directory, &blk)
  chdir parent_dir
end
cp_files(src) click to toggle source
# File lib/mymedia_ftp.rb, line 184
def cp_files(src)
  
  files = list_filenames(src)    
  
  files.each do |h|

    name, type = h[:name], h[:type]
    
    puts name
    
    if type == :file then
      begin
        getbinaryfile name, name.downcase.gsub(/ +/,'-')
      rescue Net::FTPPermError => e
        puts 'e: ' + e.inspect
      end
    else
      cp_dir(name, &blk)
    end
    blk.call(name, type) if block_given?
  end    
end
outbound_cp(src, destination='.') click to toggle source
# File lib/mymedia_ftp.rb, line 207
def outbound_cp(src, destination='.')
  
  if File.basename(destination) == '.' then
    destination.sub!(/\.$/, File.basename(src))
  end
  
  putbinaryfile(src, destination)
end