class FlowTag::FlowCanvas

Public Class Methods

new(parent, flows) click to toggle source
# File lib/flowtag/flowcanvas.rb, line 79
def initialize(parent, flows)
        hostseen = {}
        hosts = []
        @selected_flows = @flows = flows
        flows.each do |k,fl|
                sip = fl[FlowDB::SIP]
                next if hostseen[sip]
                hosts.push(sip)
                hostseen[sip]=1
        end
        model = [ 
                { 
                        :name => 'Port',
                        :type => 'range',
                        :scale => '3rt',
                        :min => 0,
                        :max => 65535,
                        :ofmt => '%d',
                        #:items => [1,22,80,137,443,1024,5900,6667,31337,65335]
                },
                {
                        :name => 'Host',
                        :type => 'list',
                        :list => hosts
                }
        ]
        @pcp = Tk::ParallelCoordinates.new(parent, 500, 360, model)
        @pcp.field_separator = "|"
        @pcp.set_select_cb( proc { |tuples| cb_select(tuples) } )
        @flow_keys = {}
        @pkt_low = @byte_low = @pkt_high = @byte_high = @time_high = 0
        @time_low = 2**32
        flows.each do |k,fl|
                key = fl[FlowDB::DP].to_s+"|"+fl[FlowDB::SIP]
                skip = (@flow_keys[key]) ? true:false
                @flow_keys[key] = [] unless @flow_keys[key]
                @flow_keys[key].push(fl)
                @pkt_high = fl[FlowDB::PKTS] if fl[FlowDB::PKTS] > @pkt_high
                @byte_high = fl[FlowDB::BYTES] if fl[FlowDB::BYTES] > @byte_high
                @time_low = fl[FlowDB::ST] if fl[FlowDB::ST] < @time_low
                @time_high = fl[FlowDB::ST] if fl[FlowDB::ST] > @time_high
                next if skip
                @pcp.addtuple([fl[FlowDB::DP],fl[FlowDB::SIP]])
        end
end

Public Instance Methods

cb_select(tuples) click to toggle source
# File lib/flowtag/flowcanvas.rb, line 23
def cb_select(tuples)
        @selected_flows = []
        tuples.each do |t|
                key = t.join("|")
                @selected_flows += @flow_keys[key]
        end
        @select_cb.call @selected_flows if @select_cb
end
filter() click to toggle source
# File lib/flowtag/flowcanvas.rb, line 61
def filter
        @flow_keys.each do |key,flows|
                flows.each do |fl|
                        if fl[FlowDB::PKTS] < @pkt_low or fl[FlowDB::PKTS] > @pkt_high or 
                                fl[FlowDB::BYTES] < @byte_low or fl[FlowDB::BYTES] > @byte_high or 
                                fl[FlowDB::ST] < @time_low or fl[FlowDB::ST] > @time_high
                                @pcp.set_tuple_state(key,Tk::ParallelCoordinates::STATE_FILTERED)
                        else
                                @pcp.set_tuple_state(key,Tk::ParallelCoordinates::STATE_NORMAL)
                        end
                end
        end
end
pack(*args) click to toggle source
# File lib/flowtag/flowcanvas.rb, line 75
def pack(*args)
        @pcp.pack(*args)
end
select_flow(sip,dip,sp,dp) click to toggle source
# File lib/flowtag/flowcanvas.rb, line 32
def select_flow(sip,dip,sp,dp)
        @pcp.set_tuple_state(@cflow,Tk::ParallelCoordinates::STATE_NORMAL) if @cflow
        key = dp.to_s+"|"+sip
        @cflow = key
        @pcp.set_tuple_state(key,Tk::ParallelCoordinates::STATE_CURRENT)
end
set_byte_range(low, high) click to toggle source
# File lib/flowtag/flowcanvas.rb, line 49
def set_byte_range(low, high)
        @byte_low = low
        @byte_high = high
        filter
end
set_packet_range(low, high) click to toggle source
# File lib/flowtag/flowcanvas.rb, line 55
def set_packet_range(low, high)
        @pkt_low = low
        @pkt_high = high
        filter
end
set_select_cb(callback) click to toggle source
# File lib/flowtag/flowcanvas.rb, line 39
def set_select_cb(callback)
        @select_cb = callback
end
set_time_range(low, high) click to toggle source
# File lib/flowtag/flowcanvas.rb, line 43
def set_time_range(low, high)
        @time_low = low
        @time_high = high
        filter
end