class Ryespy::Listener::FTP

Constants

REDIS_KEY_PREFIX
SIDEKIQ_JOB_CLASS

Public Class Methods

new(opts = {}) click to toggle source
Calls superclass method Ryespy::Listener::Base::new
# File lib/ryespy/listener/ftp.rb, line 13
def initialize(opts = {})
  @ftp_config = {
    :host     => opts[:host],
    :port     => opts[:port],
    :passive  => opts[:passive],
    :username => opts[:username],
    :password => opts[:password],
  }
  
  super(opts)
end

Public Instance Methods

check(dir) click to toggle source
# File lib/ryespy/listener/ftp.rb, line 29
def check(dir)
  @logger.debug { "dir: #{dir}" }
  
  @logger.debug { "redis_key: #{redis_key(dir)}" }
  
  seen_files = @redis.hgetall(redis_key(dir))
  
  unseen_files = get_unseen_files(dir, seen_files)
  
  @logger.debug { "unseen_files: #{unseen_files}" }
  
  unseen_files.each do |filename, checksum|
    @redis.hset(redis_key(dir), filename, checksum)
    
    @notifiers.each { |n| n.notify(SIDEKIQ_JOB_CLASS, [dir, filename]) }
  end
  
  @logger.info { "#{dir} has #{unseen_files.count} new files" }
end
close() click to toggle source
# File lib/ryespy/listener/ftp.rb, line 25
def close
  @ftp.close
end

Private Instance Methods

connect_service() click to toggle source
# File lib/ryespy/listener/ftp.rb, line 51
def connect_service
  @ftp = Net::FTP.new
  
  @ftp.connect(@ftp_config[:host], @ftp_config[:port])
  
  @ftp.passive = @ftp_config[:passive]
  
  @ftp.login(@ftp_config[:username], @ftp_config[:password])
end
get_unseen_files(dir, seen_files) click to toggle source
# File lib/ryespy/listener/ftp.rb, line 71
def get_unseen_files(dir, seen_files)
  @ftp.chdir(dir)
  
  files = {}
  
  @ftp.nlst.each do |file|
    mtime = @ftp.mtime(file).to_i
    size = @ftp.size(file) rescue nil # ignore non-file error
    
    if size # exclude directories
      checksum = "#{mtime},#{size}".freeze
      
      if seen_files[file] != checksum
        files[file] = checksum
      end
    end
  end
  
  files
end
redis_key(dir) click to toggle source
# File lib/ryespy/listener/ftp.rb, line 61
def redis_key(dir)
  [
    REDIS_KEY_PREFIX,
    @ftp_config[:host],
    @ftp_config[:port],
    @ftp_config[:username],
    dir,
  ].join(':')
end