Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'net/ftp'
- require 'tempfile'
- module GVBus
- class FTP
- include ActionView::Helpers::NumberHelper
- def initialize(options = {})
- @options = options.merge(encoding: 'iso-8859-1')
- end
- def download(file_path)
- directory = File.dirname(file_path)
- file = File.basename(file_path)
- tempfile = Tempfile.new('gvbus_', @options)
- transferred = 0
- Rails.logger.info("Downloading => #{directory}/#{file}")
- ftp = connect_to_ftp
- ftp.chdir(directory)
- ftp.getbinaryfile(file, tempfile.path, 1024) do |data|
- transferred += data.size
- output_download_progress(transferred) if transferred % 1048576 == 0 # Every MB
- end
- output_download_progress(transferred)
- ftp.close
- Rails.logger.info('Download complete!')
- tempfile
- end
- def upload(file_path, ftp_dir, ftp_file_name = nil)
- ftp_file_name ||= File.basename(file_path)
- file = File.new(file_path)
- Rails.logger.info("Uploading => #{file_path} to #{ftp_dir}/#{ftp_file_name}")
- ftp = connect_to_ftp
- ftp.chdir(ftp_dir)
- ftp.putbinaryfile(file, ftp_file_name)
- ftp.close
- Rails.logger.info('Upload completed!')
- file.close
- true
- end
- def ftp_file(date)
- download("Dados do dia #{date.strftime('%d-%m-%Y')}/Dados_Funcionarios.txt")
- end
- def generate_sorted_file
- date = Date.yesterday
- benefits_file = ftp_file(date)
- sorted_benefits_file = Tempfile.new('gvbus_sorted_')
- system "LC_ALL='C' sort --field-separator=';' -k 2,2 -k 1,1 #{benefits_file.path} > #{sorted_benefits_file.path}"
- upload(sorted_benefits_file.path, "Dados do dia #{date.strftime('%d-%m-%Y')}", 'Dados_Funcionarios_Sorted_CNPJ.txt')
- end
- private
- def output_download_progress(size)
- size = number_to_human_size(size)
- Rails.logger.info("Downloaded #{size}")
- end
- def connect_to_ftp
- host = Rails.application.secrets.gvbus_ftp_host
- user = Rails.application.secrets.gvbus_ftp_username
- pass = Rails.application.secrets.gvbus_ftp_password
- ftp = ExtendedPassiveFTP.new(host)
- ftp.passive = true
- ftp.open_timeout = 20
- ftp.login(user, pass)
- ftp
- end
- class ExtendedPassiveFTP < Net::FTP
- def makepasv
- parse229(sendcmd('EPSV'))
- end
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement