#!/usr/bin/env ruby

$:.unshift File.dirname(__FILE__)
$:.unshift File.join(File.dirname(__FILE__), 'lib')
$:.unshift File.join(File.dirname(__FILE__), 'third_parties')

require 'optparse'
require 'gtvs'


gtvsOpts = GTVS::Options.new

opts = OptionParser.new {|opts|
    opts.banner = "Usage: verify-from-slice [options] <trace name> <slice trace name>"
    opts.separator ""
    opts.separator "Specific options:"

    gtvsOpts.set_options(opts)

    opts.separator ""
    opts.separator "Common options:"
    opts.on_tail("-?", "--help", "Show this message") {
        puts opts
        exit
    }
}
opts.parse!(ARGV)

if ARGV.length < 1
  $stderr.puts 'Missing trace name (try --help)'
  exit 1
end
trace = ARGV.shift

if ARGV.length < 1
  $stderr.puts 'Missing slice trace name (try --help)'
  exit 1
end
slice = ARGV.shift

db = GTVS::Connection.get(gtvsOpts)
gtvs = GTVS::GTVS.new(db, trace, gtvsOpts)

sql = <<SQL
SELECT s.DstIp, s.DstPort, s.GtProtos, s.GtApps
FROM `#{slice}_FlowsAggByDstIpPort` AS s
LEFT JOIN `#{gtvs.trace}_FlowsAggByDstIpPort` AS d
ON d.DstIp = s.DstIp AND d.DstPort = s.DstPort
WHERE s.GtVerified = s.Flows AND d.GtVerified = 0
SQL

db.query(sql) {|rs|
    rs.each {|r|
        dstIp, dstPort, gtProto, gtApp = r
        if gtProto.index(',') != nil || gtApp.index(',') != nil
            $stderr.puts "Skipping flows to #{IPAddr.new_i(dstIp.to_i)}:#{dstPort}: multiple protocols/applications: `#{gtProto}`, `#{gtApp}`"
            next
        end
        aggId = "#{dstIp}_#{dstPort}"
        $stderr.puts "All flows to #{IPAddr.new_i(dstIp.to_i)}:#{dstPort} would be marked as #{gtProto}/#{gtApp}"
        gtvs.aggVerify(aggId, gtProto, gtApp)
    }
}

db.close
