Advertisement
Guest User

Untitled

a guest
May 4th, 2016
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.17 KB | None | 0 0
  1. #!/usr/bin/ruby
  2.  
  3. require 'date'
  4. require 'tempfile'
  5. require 'optparse'
  6. require 'rubygems'
  7. require 'zip'
  8. require 'net/ftp'
  9.  
  10. # Домен
  11. $domain = 'ftp.zakupki.gov.ru'
  12.  
  13. # Начальная часть пути. Далее идет разветвление на реестры.
  14. $base_path = '/fcs_regions/Tatarstan_Resp/'
  15.  
  16. # Логин и пароль на ftp
  17. $user = 'free'
  18. $password = 'free'
  19.  
  20. # Захардкоженые параметры
  21.  
  22. $path = nil
  23. $date_period = nil
  24. $download_path = '/tmp/'
  25. $queries = []
  26.  
  27.  
  28. # Проверяет по имени файла, подходит ли он под даты.
  29. # Файлы на ftp ООС в наименовании содержат две даты,
  30. # в формате YYYYMMDD??_YYYYMMDD??, цепляемся за них.
  31. def matches_period?(zip_name)
  32. if zip_name =~ /(20\d{6})\d\d_(20\d{6})\d\d_\d+\.xml\.zip/
  33. file_from = Date.parse($1)
  34. file_to = Date.parse($2)
  35. if ($date_period.include?(file_from) or
  36. $date_period.include?(file_to) or
  37. (file_from < $date_period.begin and file_to > $date_period.end))
  38. return true
  39. end
  40. end
  41. false
  42. end
  43.  
  44.  
  45. # Проверяет, содержит ли файл искомые подстроки.
  46. def file_content_matches?(content)
  47. $queries.any? { |q| content.upcase.include?(q.upcase) }
  48. end
  49.  
  50.  
  51. # Обрабатывает zip-файл. Возвращает список подходящих файлов.
  52. def process_zip_file(zip_file)
  53. found_files = []
  54. Zip::File.open(zip_file.path) do |zip_iter|
  55. zip_iter.each do |entry|
  56. content = entry.get_input_stream.read.force_encoding('UTF-8')
  57. if file_content_matches?(content)
  58. File.write("#{$download_path}/#{entry.name}", content)
  59. found_files << entry.name
  60. end
  61. end
  62. end
  63. found_files
  64. end
  65.  
  66.  
  67. # Парсим аргументы программы
  68. OptionParser.new do |opts|
  69. opts.banner = %{\
  70. Скрипт для поиска на FTP ЕИС xml-файлов с нужным содержимым.
  71. Использование: ruby script-name.rb ПАРАМЕТРЫ.
  72. }
  73.  
  74. opts.on('--path PATH',
  75. 'Конец директории на ftp (например, contracts/currMonth).') do |path|
  76. $path = path
  77. end
  78. opts.on('--period FROM..UNTIL',
  79. 'Интересующий временной период, разделенный `..`, например ' +
  80. '2016-01-01..2016-05-27. Опциональный.') do |period|
  81. from, thru = period.split('..')
  82. $date_period = Date.parse(from)..Date.parse(thru)
  83. end
  84. opts.on('--download PATH',
  85. 'Директория, в которую будут качаться xml-файлы. ' +
  86. "Если не задан - в #{$download_path}.") do |path|
  87. $download_path = path
  88. end
  89. opts.on('--queries one,two,three', Array,
  90. 'Искомые в файлах подстроки (регистр не важен). ' +
  91. 'Должны быть разделены запятыми.') do |qs|
  92. $queries += qs
  93. end
  94.  
  95. end.parse!
  96.  
  97. # Некоторые аргументы требуются
  98. if $path.nil? or $queries.empty?
  99. raise OptionParser::MissingArgument
  100. end
  101.  
  102.  
  103. # Начальная информация
  104. if $date_period.nil?
  105. puts "Ищем файлы в #{$path} за любой период."
  106. else
  107. puts "Ищем файлы в #{$path} за #{$date_period.begin} - #{$date_period.end}."
  108. end
  109. puts "Скачиваем в #{$download_path}, параметры поиска: #{$queries.join ', '}"
  110.  
  111.  
  112. Net::FTP.open($domain) do |ftp|
  113. ftp.passive = true
  114. ftp.login($user, $password)
  115. ftp.chdir($base_path)
  116. ftp.chdir($path)
  117. zip_files_list = ftp.nlst('*.zip')
  118. tmp_zip_file = Tempfile.new(['archive', '.zip'])
  119. begin
  120. zip_files_list.each do |zip_name|
  121. if $date_period.nil? or matches_period?(zip_name)
  122. print "Обработка #{zip_name}... ".ljust(79) + "\r"
  123. $stdout.flush
  124. ftp.getbinaryfile(zip_name, tmp_zip_file)
  125. found_files = process_zip_file(tmp_zip_file)
  126. unless found_files.empty?
  127. found_files.each do |fname|
  128. puts "-> #{fname}".ljust(80)
  129. end
  130. end
  131. end
  132. end
  133. puts ''.ljust(80)
  134. ensure
  135. tmp_zip_file.close
  136. tmp_zip_file.unlink
  137. end
  138. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement