Advertisement
Guest User

Untitled

a guest
Mar 16th, 2017
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.32 KB | None | 0 0
  1. require 'net/ftp'
  2. require 'tempfile'
  3.  
  4. module GVBus
  5. class FTP
  6. include ActionView::Helpers::NumberHelper
  7.  
  8. def initialize(options = {})
  9. @options = options.merge(encoding: 'iso-8859-1')
  10. end
  11.  
  12. def download(file_path)
  13. directory = File.dirname(file_path)
  14. file = File.basename(file_path)
  15.  
  16. tempfile = Tempfile.new('gvbus_', @options)
  17. transferred = 0
  18.  
  19. Rails.logger.info("Downloading => #{directory}/#{file}")
  20.  
  21. ftp = connect_to_ftp
  22. ftp.chdir(directory)
  23. ftp.getbinaryfile(file, tempfile.path, 1024) do |data|
  24. transferred += data.size
  25. output_download_progress(transferred) if transferred % 1048576 == 0 # Every MB
  26. end
  27. output_download_progress(transferred)
  28. ftp.close
  29.  
  30. Rails.logger.info('Download complete!')
  31.  
  32. tempfile
  33. end
  34.  
  35. def upload(file_path, ftp_dir, ftp_file_name = nil)
  36. ftp_file_name ||= File.basename(file_path)
  37. file = File.new(file_path)
  38.  
  39. Rails.logger.info("Uploading => #{file_path} to #{ftp_dir}/#{ftp_file_name}")
  40. ftp = connect_to_ftp
  41. ftp.chdir(ftp_dir)
  42. ftp.putbinaryfile(file, ftp_file_name)
  43. ftp.close
  44. Rails.logger.info('Upload completed!')
  45. file.close
  46. true
  47. end
  48.  
  49. def ftp_file(date)
  50. download("Dados do dia #{date.strftime('%d-%m-%Y')}/Dados_Funcionarios.txt")
  51. end
  52.  
  53. def generate_sorted_file
  54. date = Date.yesterday
  55. benefits_file = ftp_file(date)
  56.  
  57. sorted_benefits_file = Tempfile.new('gvbus_sorted_')
  58.  
  59. system "LC_ALL='C' sort --field-separator=';' -k 2,2 -k 1,1 #{benefits_file.path} > #{sorted_benefits_file.path}"
  60.  
  61. upload(sorted_benefits_file.path, "Dados do dia #{date.strftime('%d-%m-%Y')}", 'Dados_Funcionarios_Sorted_CNPJ.txt')
  62. end
  63.  
  64. private
  65.  
  66. def output_download_progress(size)
  67. size = number_to_human_size(size)
  68. Rails.logger.info("Downloaded #{size}")
  69. end
  70.  
  71. def connect_to_ftp
  72. host = Rails.application.secrets.gvbus_ftp_host
  73. user = Rails.application.secrets.gvbus_ftp_username
  74. pass = Rails.application.secrets.gvbus_ftp_password
  75.  
  76. ftp = ExtendedPassiveFTP.new(host)
  77. ftp.passive = true
  78. ftp.open_timeout = 20
  79. ftp.login(user, pass)
  80. ftp
  81. end
  82.  
  83. class ExtendedPassiveFTP < Net::FTP
  84. def makepasv
  85. parse229(sendcmd('EPSV'))
  86. end
  87. end
  88. end
  89. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement