Source code for snare.net.route

from . import addr
import re

_route_file_exp = re.compile(r'(?P<iface>\w+)\s+(?P<dst>[0-9A-F]+)\s+(?P<gw>[0-9A-F]+)\s+(?:\d+\s+){4}(?P<mask>[0-9A-F]+)')

class Route:
    def __init__(self, ip, mask, via=None, iface=None):
        if (via is None) == (iface is None):
            raise ValueError("exacty one of via and iface must be provided")

        self.dst = addr.IpNet(ip, mask)

        if via is not None:
            self.via = addr.Ip(via)
        else:
            self.via = None

        self.iface = iface

    def default(self):
        """Returns true if this is a default route (i.e. to 0.0.0.0/0)"""
        return self.dst.cidr() == '0.0.0.0/0'

    def __str__(self):
        return '{0!s} via {1!s}'.format(self.dst, self.via or self.iface)

    def __repr__(self):
        return '<{0}.{1} {2!s}>'.format(__name__, type(self).__name__, self)

def _parseword(word):
    return int.from_bytes(bytes.fromhex(word), byteorder='little')

[docs]def routes(): """Retrieve routes from the system""" result = [] with open('/proc/net/route', 'r') as file: for line in file: m = _route_file_exp.match(line) if m is None: continue dst = _parseword(m.group('dst')) mask = _parseword(m.group('mask')) gw = _parseword(m.group('gw')) iface = m.group('iface') if gw != 0: result.append(Route(dst, mask, via=gw)) else: result.append(Route(dst, mask, iface=iface)) return result