diff --git a/demo/demo b/demo/demo index 7179ee4d6bedbde38a36bb2c38a3a1d4ca6a035d..e0b900853fd789ad86bca10178bedd18127970e7 100755 --- a/demo/demo +++ b/demo/demo @@ -38,6 +38,8 @@ def _add_interface(node, iface): return Node__add_interface(node, iface) nemu.Node._add_interface = _add_interface +execfile("fixnemu.py") + # create nodes for name in """internet=I registry=R gateway1=g1 machine1=1 machine2=2 diff --git a/demo/fixnemu.py b/demo/fixnemu.py new file mode 100644 index 0000000000000000000000000000000000000000..ab27d927ba80f23533502afe44ff60feaad7eb4e --- /dev/null +++ b/demo/fixnemu.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +# Copyright 2010, 2011 INRIA +# Copyright 2011 Martín Ferrari +# +# This file is contains patches to Nemu. +# +# Nemu is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License version 2, as published by the Free +# Software Foundation. +# +# Nemu 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# Nemu. If not, see . + +import re +from nemu.iproute import backticks, get_if_data, get_all_route_data, route + +def _get_all_route_data(): + ipdata = backticks([IP_PATH, "-o", "route", "list"]) # "table", "all" + ipdata += backticks([IP_PATH, "-o", "-f", "inet6", "route", "list"]) + + ifdata = get_if_data()[1] + ret = [] + for line in ipdata.split("\n"): + if line == "": + continue + match = re.match(r'(?:(unicast|local|broadcast|multicast|throw|' + + r'unreachable|prohibit|blackhole|nat) )?' + + r'(\S+)(?: via (\S+))? dev (\S+).*(?: metric (\d+))?', line) + if not match: + raise RuntimeError("Invalid output from `ip route': `%s'" % line) + tipe = match.group(1) or "unicast" + prefix = match.group(2) + nexthop = match.group(3) + interface = ifdata[match.group(4)] + metric = match.group(5) + if prefix == "default" or re.search(r'/0$', prefix): + prefix = None + prefix_len = 0 + else: + match = re.match(r'([0-9a-f:.]+)(?:/(\d+))?$', prefix) + prefix = match.group(1) + prefix_len = int(match.group(2) or 32) + ret.append(route(tipe, prefix, prefix_len, nexthop, interface.index, + metric)) + return ret + +get_all_route_data.func_code = _get_all_route_data.func_code