Source code for ipfix.reader
#
# python-ipfix (c) 2013 Brian Trammell.
#
# Many thanks to the mPlane consortium (http://www.ict-mplane.eu) for
# its material support of this effort.
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option) any
# later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program. If not, see <http://www.gnu.org/licenses/>.
#
"""
Interface to read IPFIX Messages from a stream.
"""
from . import message
[docs]class MessageStreamReader(object):
"""
Reads records from a stream of IPFIX messages.
Uses an :class:`ipfix.message.MessageBuffer` internally, and continually reads
messages from the given stream into the buffer, iterating over records,
until the end of the stream. Use :func:`from_stream` to get an instance.
Suitable for reading from IPFIX files (see :rfc:`5655`) as well as from
UDP or TCP sockets with :class:`socketserver.StreamRequestHandler`.
When opening a stream from a file, use mode='rb'.
"""
def __init__(self, stream):
self.stream = stream
self.msg = message.MessageBuffer()
self.msgcount = 0
[docs] def namedict_iterator(self):
"""
Iterate over all records in the stream, as dicts mapping IE names
to values.
:returns: a name dictionary iterator
"""
try:
while(True):
self.msg.read_message(self.stream)
for name in self.msg.namedict_iterator():
yield name
self.msgcount += 1
except EOFError:
return
[docs] def tuple_iterator(self, ielist):
"""
Iterate over all records in the stream containing all the IEs in
the given ielist. Records are returned as tuples in ielist order.
:param ielist: an instance of :class:`ipfix.ie.InformationElementList`
listing IEs to return as a tuple
:returns: a tuple iterator for tuples in ielist order
"""
try:
while(True):
self.msg.read_message(self.stream)
for tuple_ in self.msg.tuple_iterator(ielist):
yield tuple_
self.msgcount += 1
except EOFError:
return
[docs]def from_stream(stream):
"""
Get a MessageStreamReader for a given stream
:param stream: stream to read
:return: a :class:`MessageStreamReader` wrapped around the stream.
"""
return MessageStreamReader(stream)