X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/c21d936a4df9c7161a6eb577f1cb67611370635d..01f0d4f411f0435279bfc274437451c24f74b4d1:/svc/conntrack.in diff --git a/svc/conntrack.in b/svc/conntrack.in index bfdd7b8d..28e4b0b3 100644 --- a/svc/conntrack.in +++ b/svc/conntrack.in @@ -143,8 +143,44 @@ class InetAddress (BaseAddress): addr, port = (lambda a, p: (a, p))(*sa) return cls(addr), port +class Inet6Address (BaseAddress): + AF = S.AF_INET6 + AFNAME = 'IPv6' + NBITS = 128 + def _setaddr(me, addrstr): + pc = addrstr.find('%') + if pc == -1: + me.addr = me._addrstr_to_int(addrstr) + me.scope = 0 + else: + me.addr = me._addrstr_to_int(addrstr[:pc]) + ais = S.getaddrinfo(addrstr, 0, S.AF_INET6, S.SOCK_DGRAM, 0, + S.AI_NUMERICHOST | S.AI_NUMERICSERV) + me.scope = ais[0][4][3] + def _addrstr(me): + addrstr = me._int_to_addrstr(me.addr) + if me.scope == 0: + return addrstr + else: + name, _ = S.getnameinfo((addrstr, 0, 0, me.scope), + S.NI_NUMERICHOST | S.NI_NUMERICSERV) + return name + def _sockaddr(me, port = 0): + return (me._addrstr(), port, 0, me.scope) + @classmethod + def from_sockaddr(cls, sa): + addr, port, _, scope = (lambda a, p, f = 0, s = 0: (a, p, f, s))(*sa) + me = cls(addr) + me.scope = scope + return me, port + def _withinp(me, net): + return net.scope == 0 or me.scope == net.scope + def _eq(me, other): + return me.scope == other.scope + def parse_address(addrstr, maskstr = None): - return InetAddress(addrstr, maskstr) + if addrstr.find(':') >= 0: return Inet6Address(addrstr, maskstr) + else: return InetAddress(addrstr, maskstr) def parse_net(netstr): try: sl = netstr.index('/') @@ -161,7 +197,7 @@ def straddr(a): return a is None and '#' or str(a) ## this service are largely going to be satellite notes, I don't think ## scalability's going to be a problem. -TESTADDRS = [InetAddress('1.2.3.4')] +TESTADDRS = [InetAddress('1.2.3.4'), Inet6Address('2001::1')] CONFSYNTAX = [ ('COMMENT', RX.compile(r'^\s*($|[;#])')),