2016-05-25 4 views
0

Я пытаюсь подражать тому, что сделал предыдущий разработчик, чтобы проанализировать XML-файл в моем приложении Rails и застрять. Из того, что я могу сказать, моя работа завершается, но ничего не публикуется, как должно быть, поэтому я предполагаю, что мой файл разбора неверен (однако он отлично работает при тестировании с необработанным файлом на моем локальном хосте). Итак, где я здесь ошибся?Работа Sidekiq, похоже, не разбора

Это Sidekiq войти выход, только чтобы подтвердить работу происходит, и не показывает никаких ошибок в обработке:

2016-05-25T13:51:04.499Z 8977 TID-oxs3s9lng ParseTestData JID-2a01971539c887cac3bf3374:1 INFO: start 
2016-05-25T13:51:04.781Z 8977 TID-oxs3s9l3g GenerateNotifications JID-2a01971539c887cac3bf3374:2 INFO: start 
2016-05-25T13:51:04.797Z 8977 TID-oxs3s9lng ParseTestData JID-2a01971539c887cac3bf3374:1 INFO: done: 0.297 sec 
2016-05-25T13:51:04.824Z 8977 TID-oxs3s9l3g GenerateNotifications JID-2a01971539c887cac3bf3374:2 INFO: done: 0.043 sec 

Это моя Sidekiq работа файл, который перебирает сжатые файлы, которые получают поданные через мой API , Файл в вопросе, что я работаю на это nmap_poodle_scan.xml:

class ParseTestData 
    include Sidekiq::Worker 

    # Order matters. Parse network hosts first to ensure we uniquely identify network hosts by their mac address. 
    PARSERS = { 
    "network_hosts.xml" => Parsers::NetworkHostParser, 
    "nmap_tcp_service_scan.xml" => Parsers::TcpServiceScanParser, 
    "nmap_shellshock_scan.xml" => Parsers::ShellshockScanParser, 
    "hydra.out" => Parsers::HydraParser, 
    "events.log" => Parsers::EventParser, 
    "nmap_poodle_scan.xml" => Parsers::PoodleScanParser 
    } 

    def perform(test_id) 
    test = Test.find(test_id) 

    gzip = if Rails.env.development? 
     Zlib::GzipReader.open(test.data.path) 
    else 
     file = Net::HTTP.get(URI.parse(test.data.url)) 
     Zlib::GzipReader.new(StringIO.new(file)) 
    end 

    # Collect entries from tarball 
    entries = {} 
    tar_extract = Gem::Package::TarReader.new(gzip) 
    tar_extract.rewind 
    tar_extract.each do |entry| 
     entries[File.basename(entry.full_name)] = entry.read 
    end 

    # Preserve parse order by using the parser hash to initiate parser executions. 
    PARSERS.each_pair do |filename, parser| 
     next unless entry = entries[filename] 
     parser.run!(test, entry) 
    end 
    end 
end 

Который хватает nmap_poodle_scan.xml:

<host starttime="1464180941" endtime="1464180941"><status state="up" reason="arp-response" reason_ttl="0"/> 
<address addr="10.10.10.1" addrtype="ipv4"/> 
<address addr="4C:E6:76:3F:2F:77" addrtype="mac" vendor="Buffalo.inc"/> 
<hostnames> 
<hostname name="DD-WRT" type="PTR"/> 
</hostnames> 
Nmap scan report for DD-WRT (10.10.10.1) 
<ports><extraports state="closed" count="996"> 
<extrareasons reason="resets" count="996"/> 
</extraports> 
<table key="CVE-2014-3566"> 
<elem key="title">SSL POODLE information leak</elem> 
<elem key="state">VULNERABLE</elem> 
<table key="ids"> 
<elem>OSVDB:113251</elem> 
<elem>CVE:CVE-2014-3566</elem> 
</table> 
<table key="description"> 
<elem> The SSL protocol 3.0, as used in OpenSSL through 1.0.1i and&#xa; other products, uses nondeterministic CBC padding, which makes it easier&#xa; for man-in-the-middle attackers to obtain cleartext data via a&#xa; padding-oracle attack, aka the &quot;POODLE&quot; issue.</elem> 
</table> 
<table key="dates"> 
<table key="disclosure"> 
<elem key="year">2014</elem> 
<elem key="month">10</elem> 
<elem key="day">14</elem> 
</table> 
</table> 
<elem key="disclosure">2014-10-14</elem> 
<table key="check_results"> 
<elem>TLS_RSA_WITH_3DES_EDE_CBC_SHA</elem> 
</table> 
<table key="refs"> 
<elem>https://www.imperialviolet.org/2014/10/14/poodle.html</elem> 
<elem>http://osvdb.org/113251</elem> 
<elem>https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566</elem> 
<elem>https://www.openssl.org/~bodo/ssl-poodle.pdf</elem> 
</table> 
</table> 
</script></port> 
</ports> 
<times srtt="4665" rttvar="556" to="100000"/> 
</host> 

Который должен представить PoodleScanParser:

module Parsers 
    class PoodleScanParser < NmapScanParser 
    def self.run!(test, content)  
     super(test, content, "//host//ports[.//elem[@key='state'][contains(text(), 'VULNERABLE')]]") do |host, network_host_test| 
     logger.info "Something cool" 
     IssueFinder.match(cve_id: "CVE-2014-3566").each do |issue| 
      Result.generate!(network_host_test.id, issue.id) 
     end 
     end 
    end 
    end 
end 

, который наследует от NmapScanParser , Этот файл парсер подтвердил, что работает отлично, так что я знаю, что это не проблема:

module Parsers 
    class NmapScanParser 

    def self.run!(test, content, xpath) 
     document = Nokogiri::XML(content) 
     document.remove_namespaces! 

     document.xpath(xpath).each do |host| 
     ip_address = host.at_xpath("address[@addrtype='ipv4']").at_xpath("@addr").value 
     vendor = host.at_xpath("address[@addrtype='mac']").at_xpath("@vendor").value rescue "Unknown" 
     hostname = host.at_xpath("hostnames/hostname").at_xpath("@name").value rescue "Hostname Unknown" 
     os = host.at_xpath("os/osmatch").at_xpath("@name").value rescue "Unknown" 
     os_vendor = host.at_xpath("os/osmatch/osclass").at_xpath("@vendor").value rescue "Unknown" 

     network_host_test = NetworkHostTest.generate!(test, ip_address: ip_address, hostname: hostname, vendor: vendor, os: os, os_vendor: os_vendor) 

     # If we didn't find a network host, that's because our network_hosts file didn't have this entry. 
     next unless network_host_test 

     yield(host, network_host_test) 
     end 
    end 

    end 
end 

Я подтвердил, что анализатор работает на моем локальном хосте с тем же добытого, как описано выше, используя обычный файл рубиновый, и работает ruby poodle_parser.rb:

require 'nokogiri' 

document = Nokogiri::XML(File.open("poodle_results.xml")) 
document.remove_namespaces! 

document.xpath("//host[.//elem/@key='state']").each do |host| 
    ip_address = host.at_xpath("address[@addrtype='ipv4']").at_xpath("@addr").value 
    result = host.at_xpath("//ports//elem[@key='state']").content 
    puts "#{ip_address} #{result}" 
end 

который выводит то, что я хотел бы ожидать в терминале:

10.10.10.1 VULNERABLE 

Итак, в конце концов, я ожидаю Result быть порождена, но это не. Я не вижу ошибок в журнале Rails на моем локальном хосте, и я не вижу ничего, указывающего на ошибку в журналах Sidekiq!


Я решил добавить logger.info строку в моей PoodleScanParser, чтобы увидеть, если Parser даже работает, как это должно быть. Предполагая, что я сделал это правильно, Parser не выглядит так, как будто он работает.

+0

Вы уверены, что sidekiq перезагружается при развертывании? Многие проблемы начинаются с того, что это предположение неверно. – msergeant

+0

@msergeant Да, я вручную перезагружаю его. – Godzilla74

+2

Попробуйте выполнить свою работу с помощью '.new.perform' вместо' .perform_async', чтобы вы могли отслеживать ее с помощью вашего предпочтительного отладчика, например, pry, а не с помощью Sidekiq. – anothermh

ответ

0

Ну, ответ не имеет ничего общего с Sidekiq, вместо этого он был выходом, на котором умирал Нокогири. Оказывается, Nmap добавлял строку, отличную от XML, в начале файла XML «Запуск Nmap 7.12». Итак, Нокигири просто умирал там.

Я предполагаю, что мораль этой истории заключается в том, чтобы убедиться, что ваш вывод XML - это то, что вы намерены сделать Нокогири!

Смежные вопросы