# File lib/dnstraverse/fingerprint.rb, line 48
    def process(ip, header, query, ruleset)
      ret = Hash.new
      answer, errstr = probe(ip, header, query)
      id = answer ? header2fp(answer.header) : errstr
      Log.debug { "query = #{query}, id = #{id}" }
      for rule in ruleset do
        raise "Missing fingerprint" unless rule.has_key?(:fingerprint)
        next unless id =~ /#{rule[:fingerprint]}/
        if rule.has_key?(:result) then
          result = rule[:result]
          for k in [:vendor, :product, :option] do
            ret[k] = result[k] if result.has_key?(k) and result[k].length > 0
          end
          case @version_style
            when :none
            ret[:version] = result[:version]
            when :append
            ver = query_version(ip, result[:qv])
            ver = query_version(ip, "version.bind") unless ver
            ret[:version] = result[:version]
            ret[:version]+= " (#{ver})" if ver
            when :override
            ver = query_version(ip, result[:qv])
            ver = query_version(ip, "version.bind") unless ver
            ret[:version] = ver ? ver : result[:version]
          end
          return ret
        end
        if rule.has_key?(:state) then
          ret[:state] = rule[:state]
          ret[:error] = "No match found"
          ret[:id] = id
          return ret
        end
        query = rule[:query] if rule.has_key?(:query)
        if rule.has_key?(:header) and rule.has_key?(:ruleset) then
          return process(ip, rule[:header], query, rule[:ruleset])
        end
        raise "Invalid ruleset -- no next step"
      end
      raise "Invalid ruleset -- fell off end"
    end