Repository :
http://git.fedorahosted.org/cgit/cura-tools.git
On branch : master
---------------------------------------------------------------
commit 99fe8f2bab20c618e61d1edee01682e781c7a99f
Author: Peter Hatina <phatina(a)redhat.com>
Date: Sat Oct 6 22:35:34 2012 +0200
introduce ipv6 host address generator
---------------------------------------------------------------
cli-tools/fmci/fmci_address.py | 61 +++++++++++++++++++++++++++++++++++++++-
1 files changed, 60 insertions(+), 1 deletions(-)
diff --git a/cli-tools/fmci/fmci_address.py b/cli-tools/fmci/fmci_address.py
index 16da184..cb52493 100644
--- a/cli-tools/fmci/fmci_address.py
+++ b/cli-tools/fmci/fmci_address.py
@@ -26,6 +26,8 @@ class FmciHost(object):
def name(self):
if isinstance(self.m_host, FmciIpv4Addr):
return self.m_host.address
+ elif isinstance(self.m_host, FmciIpv6Addr):
+ return self.m_host.address
else:
return self.m_host
@@ -113,6 +115,63 @@ class FmciIpv4Addr(object):
rval.append(FmciHost(FmciIpv4Addr(addr)))
return rval
+class FmciIpv6Addr(object):
+ def __init__(self, addr):
+ self.m_addr = addr
+
+ @property
+ def address(self):
+ return self.m_addr
+
+ class FmciIpv6Member(object):
+ def __init__(self, member):
+ self.m_member = member
+
+ def enumerate(self):
+ pattern = re.compile("^{(.*)}$")
+ match = pattern.search(self.m_member)
+ member = match.group(1) if match else []
+ if not member:
+ return [self.m_member]
+ ranges = (x.split("-") for x in member.split(";"))
+ try:
+ members = []
+ for r in ranges:
+ low = int(r[0], 16)
+ high = int(r[-1], 16)
+ if low > high:
+ low, high = high, low
+ if not 0 <= low <= 65535 or not 0 <= high <= 65535:
+ return []
+ members += [str(hex(i)[2:]) for i in range(low, high + 1)]
+ except ValueError:
+ return []
+ return members
+
+ @staticmethod
+ def enumerate(pattern):
+ if pattern.count("::") > 1 or pattern.count(":::") >
0:
+ return []
+ str_members = pattern.split(":")
+ members = []
+ for m in str_members:
+ members.append(FmciIpv6Addr.FmciIpv6Member(m))
+ addresses = members[-1].enumerate()
+ if not addresses:
+ return []
+ for i in reversed(range(0, len(members) - 1)):
+ combined = []
+ members_to_combine = members[i].enumerate()
+ if not members_to_combine:
+ return []
+ for r in itertools.product(members_to_combine, addresses):
+ combined.append(":".join([r[0], r[1]]))
+ addresses = combined
+ rval = []
+ for addr in sorted(set(addresses)):
+ rval.append(FmciHost(FmciIpv6Addr(addr)))
+ return rval
+
class FmciHostGenerator(object):
PATTERN_TYPE_UNKNOWN, \
PATTERN_TYPE_FQDN, \
@@ -158,7 +217,7 @@ class FmciHostGenerator(object):
elif pattern_type == FmciHostGenerator.PATTERN_TYPE_IPV4:
rval.extend(FmciIpv4Addr.enumerate(pattern))
elif pattern_type == FmciHostGenerator.PATTERN_TYPE_IPV6:
- pass
+ rval.extend(FmciIpv6Addr.enumerate(pattern))
else:
sys.stderr.write("Unrecognized host pattern supplied!\n")
return []