Source code for duct.protocol.sflow.server

"""
.. module:: server
   :synopsis: SFlow UDP server

.. moduleauthor:: Colin Alston <colin@tamvera.com>
"""
import asyncio

from duct.protocol.sflow import protocol
from duct.protocol.sflow.protocol import flows, counters


[docs] class DatagramReceiver(asyncio.DatagramProtocol): """asyncio DatagramProtocol for receiving sFlow packets""" def __init__(self): super().__init__() self.transport = None
[docs] def connection_made(self, transport): self.transport = transport
[docs] def datagram_received(self, data, addr): host, _port = addr sflow = protocol.Sflow(data, host) for sample in sflow.samples: if isinstance(sample, protocol.FlowSample): asyncio.get_event_loop().call_soon( self.process_flow_sample, sflow, sample) if isinstance(sample, protocol.CounterSample): asyncio.get_event_loop().call_soon( self.process_counter_sample, sflow, sample)
[docs] def error_received(self, exc): pass
[docs] def process_flow_sample(self, sflow, flow): """Process an incoming flow sample""" for v in flow.flows.values(): if isinstance(v, flows.HeaderSample) and v.frame: asyncio.get_event_loop().call_soon( self.receive_flow, flow, v.frame, sflow.host)
[docs] def process_counter_sample(self, sflow, counter): """Process an incoming counter sample""" for v in counter.counters.values(): if isinstance(v, counters.InterfaceCounters): asyncio.get_event_loop().call_soon( self.receive_counter, v, sflow.host) elif isinstance(v, counters.HostCounters): asyncio.get_event_loop().call_soon( self.receive_host_counter, v)
[docs] def receive_flow(self, flow, sample, host): """Called when a flow is received"""
[docs] def receive_counter(self, counter, host): """Called when a counter is received"""
[docs] def receive_host_counter(self, counter, host): """Called when a host counter is received"""