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