diff options
author | Christian Poessinger <christian@poessinger.com> | 2019-08-07 10:24:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-07 10:24:40 +0200 |
commit | 445c615c4919e2b042c9f2f1b9b4a10194c23dd7 (patch) | |
tree | 57c5846c4356e8d77a52cf64a01ded0d438c4ed2 | |
parent | 9ac783472872329fe1a1683585b679a7afcc78f0 (diff) | |
parent | a7d5e9d23ab62829781c431d243f4b93c59b28a5 (diff) | |
download | vyos-1x-445c615c4919e2b042c9f2f1b9b4a10194c23dd7.tar.gz vyos-1x-445c615c4919e2b042c9f2f1b9b4a10194c23dd7.zip |
Merge pull request #97 from c-po/bridge-fixes
Bridge fixes
-rwxr-xr-x | src/conf_mode/interface-bridge.py | 58 | ||||
-rwxr-xr-x | src/migration-scripts/interfaces/0-to-1 | 120 |
2 files changed, 91 insertions, 87 deletions
diff --git a/src/conf_mode/interface-bridge.py b/src/conf_mode/interface-bridge.py index 93eb3839c..543349e7b 100755 --- a/src/conf_mode/interface-bridge.py +++ b/src/conf_mode/interface-bridge.py @@ -30,7 +30,7 @@ default_config_data = { 'address': [], 'address_remove': [], 'aging': '300', - 'br_name': '', + 'arp_cache_timeout_ms': '30000', 'description': '', 'deleted': False, 'dhcp_client_id': '', @@ -42,7 +42,7 @@ default_config_data = { 'forwarding_delay': '15', 'hello_time': '2', 'igmp_querier': 0, - 'arp_cache_timeout_ms': '30000', + 'intf': '', 'mac' : '', 'max_age': '20', 'member': [], @@ -66,17 +66,17 @@ def get_config(): # determine tagNode instance try: - bridge['br_name'] = os.environ['VYOS_TAGNODE_VALUE'] + bridge['intf'] = os.environ['VYOS_TAGNODE_VALUE'] except KeyError as E: print("Interface not specified") # Check if bridge has been removed - if not conf.exists('interfaces bridge ' + bridge['br_name']): + if not conf.exists('interfaces bridge ' + bridge['intf']): bridge['deleted'] = True return bridge # set new configuration level - conf.set_level('interfaces bridge ' + bridge['br_name']) + conf.set_level('interfaces bridge ' + bridge['intf']) # retrieve configured interface addresses if conf.exists('address'): @@ -184,7 +184,7 @@ def verify(bridge): conf = Config() for br in conf.list_nodes('interfaces bridge'): # it makes no sense to verify ourself in this case - if br == bridge['br_name']: + if br == bridge['intf']: continue for intf in bridge['member']: @@ -207,91 +207,91 @@ def apply(bridge): cmd = '' if bridge['deleted']: # bridges need to be shutdown first - cmd += 'ip link set dev "{}" down'.format(bridge['br_name']) + cmd += 'ip link set dev "{}" down'.format(bridge['intf']) cmd += ' && ' # delete bridge - cmd += 'brctl delbr "{}"'.format(bridge['br_name']) + cmd += 'brctl delbr "{}"'.format(bridge['intf']) subprocess_cmd(cmd) else: # create bridge if it does not exist - if not os.path.exists("/sys/class/net/" + bridge['br_name']): + if not os.path.exists("/sys/class/net/" + bridge['intf']): # create bridge interface - cmd += 'brctl addbr "{}"'.format(bridge['br_name']) + cmd += 'brctl addbr "{}"'.format(bridge['intf']) cmd += ' && ' # activate "UP" the interface - cmd += 'ip link set dev "{}" up'.format(bridge['br_name']) + cmd += 'ip link set dev "{}" up'.format(bridge['intf']) cmd += ' && ' # set ageing time - cmd += 'brctl setageing "{}" "{}"'.format(bridge['br_name'], bridge['aging']) + cmd += 'brctl setageing "{}" "{}"'.format(bridge['intf'], bridge['aging']) cmd += ' && ' # set bridge forward delay - cmd += 'brctl setfd "{}" "{}"'.format(bridge['br_name'], bridge['forwarding_delay']) + cmd += 'brctl setfd "{}" "{}"'.format(bridge['intf'], bridge['forwarding_delay']) cmd += ' && ' # set hello time - cmd += 'brctl sethello "{}" "{}"'.format(bridge['br_name'], bridge['hello_time']) + cmd += 'brctl sethello "{}" "{}"'.format(bridge['intf'], bridge['hello_time']) cmd += ' && ' # set max message age - cmd += 'brctl setmaxage "{}" "{}"'.format(bridge['br_name'], bridge['max_age']) + cmd += 'brctl setmaxage "{}" "{}"'.format(bridge['intf'], bridge['max_age']) cmd += ' && ' # set bridge priority - cmd += 'brctl setbridgeprio "{}" "{}"'.format(bridge['br_name'], bridge['priority']) + cmd += 'brctl setbridgeprio "{}" "{}"'.format(bridge['intf'], bridge['priority']) cmd += ' && ' # turn stp on/off - cmd += 'brctl stp "{}" "{}"'.format(bridge['br_name'], bridge['stp']) + cmd += 'brctl stp "{}" "{}"'.format(bridge['intf'], bridge['stp']) for intf in bridge['member_remove']: # remove interface from bridge cmd += ' && ' - cmd += 'brctl delif "{}" "{}"'.format(bridge['br_name'], intf) + cmd += 'brctl delif "{}" "{}"'.format(bridge['intf'], intf) for intf in bridge['member']: # add interface to bridge # but only if it is not yet member of this bridge - if not os.path.exists('/sys/devices/virtual/net/' + bridge['br_name'] + '/brif/' + intf['name']): + if not os.path.exists('/sys/devices/virtual/net/' + bridge['intf'] + '/brif/' + intf['name']): cmd += ' && ' - cmd += 'brctl addif "{}" "{}"'.format(bridge['br_name'], intf['name']) + cmd += 'brctl addif "{}" "{}"'.format(bridge['intf'], intf['name']) # set bridge port cost if intf['cost']: cmd += ' && ' - cmd += 'brctl setpathcost "{}" "{}" "{}"'.format(bridge['br_name'], intf['name'], intf['cost']) + cmd += 'brctl setpathcost "{}" "{}" "{}"'.format(bridge['intf'], intf['name'], intf['cost']) # set bridge port priority if intf['priority']: cmd += ' && ' - cmd += 'brctl setportprio "{}" "{}" "{}"'.format(bridge['br_name'], intf['name'], intf['priority']) + cmd += 'brctl setportprio "{}" "{}" "{}"'.format(bridge['intf'], intf['name'], intf['priority']) subprocess_cmd(cmd) # Change interface MAC address if bridge['mac']: - VyIfconfig.set_mac_address(bridge['br_name'], bridge['mac']) + VyIfconfig.set_mac_address(bridge['intf'], bridge['mac']) # update interface description used e.g. within SNMP - VyIfconfig.set_description(bridge['br_name'], bridge['description']) + VyIfconfig.set_description(bridge['intf'], bridge['description']) # Ignore link state changes? - VyIfconfig.set_link_detect(bridge['br_name'], bridge['disable_link_detect']) + VyIfconfig.set_link_detect(bridge['intf'], bridge['disable_link_detect']) # enable or disable IGMP querier - VyIfconfig.set_multicast_querier(bridge['br_name'], bridge['igmp_querier']) + VyIfconfig.set_multicast_querier(bridge['intf'], bridge['igmp_querier']) # ARP cache entry timeout in seconds - VyIfconfig.set_arp_cache_timeout(bridge['br_name'], bridge['arp_cache_timeout_ms']) + VyIfconfig.set_arp_cache_timeout(bridge['intf'], bridge['arp_cache_timeout_ms']) # Configure interface address(es) for addr in bridge['address_remove']: - VyIfconfig.remove_interface_address(bridge['br_name'], addr) + VyIfconfig.remove_interface_address(bridge['intf'], addr) for addr in bridge['address']: - VyIfconfig.add_interface_address(bridge['br_name'], addr) + VyIfconfig.add_interface_address(bridge['intf'], addr) return None diff --git a/src/migration-scripts/interfaces/0-to-1 b/src/migration-scripts/interfaces/0-to-1 index b8e190f2c..38f2bd8f5 100755 --- a/src/migration-scripts/interfaces/0-to-1 +++ b/src/migration-scripts/interfaces/0-to-1 @@ -21,61 +21,65 @@ with open(file_name, 'r') as f: config = ConfigTree(config_file) base = ['interfaces', 'bridge'] -# -# make stp and igmp-snooping nodes valueless -# -for br in config.list_nodes(base): - # STP: check if enabled - stp_val = config.return_value(base + [br, 'stp']) - # STP: delete node with old syntax - config.delete(base + [br, 'stp']) - # STP: set new node - if enabled - if stp_val == "true": - config.set(base + [br, 'stp'], value=None) - - # igmp-snooping: check if enabled - igmp_val = config.return_value(base + [br, 'igmp-snooping', 'querier']) - # igmp-snooping: delete node with old syntax - config.delete(base + [br, 'igmp-snooping', 'querier']) - # igmp-snooping: set new node - if enabled - if igmp_val == "enable": - config.set(base + [br, 'igmp', 'querier'], value=None) - -# -# move interface based bridge-group to actual bridge (de-nest) -# -bridge_types = ['bonding', 'ethernet', 'l2tpv3', 'openvpn', 'vxlan', 'wireless'] -for type in bridge_types: - if not config.exists(['interfaces', type]): - continue - - for intf in config.list_nodes(['interfaces', type]): - # check if bridge-group exists - if config.exists(['interfaces', type, intf, 'bridge-group']): - bridge = config.return_value(['interfaces', type, intf, 'bridge-group', 'bridge']) - - # create new bridge member interface - config.set(base + [bridge, 'member', 'interface', intf]) - # format as tag node to avoid loading problems - config.set_tag(base + [bridge, 'member', 'interface']) - - # cost: migrate if configured - if config.exists(['interfaces', type, intf, 'bridge-group', 'cost']): - cost = config.return_value(['interfaces', type, intf, 'bridge-group', 'cost']) - # set new node - config.set(base + [bridge, 'member', 'interface', intf, 'cost'], value=cost) - - if config.exists(['interfaces', type, intf, 'bridge-group', 'priority']): - priority = config.return_value(['interfaces', type, intf, 'bridge-group', 'priority']) - # set new node - config.set(base + [bridge, 'member', 'interface', intf, 'priority'], value=priority) - - # Delete the old bridge-group assigned to an interface - config.delete(['interfaces', type, intf, 'bridge-group']) - - try: - with open(file_name, 'w') as f: - f.write(config.to_string()) - except OSError as e: - print("Failed to save the modified config: {}".format(e)) - sys.exit(1) +if not config.exists(base): + # Nothing to do + sys.exit(0) +else: + # + # make stp and igmp-snooping nodes valueless + # + for br in config.list_nodes(base): + # STP: check if enabled + stp_val = config.return_value(base + [br, 'stp']) + # STP: delete node with old syntax + config.delete(base + [br, 'stp']) + # STP: set new node - if enabled + if stp_val == "true": + config.set(base + [br, 'stp'], value=None) + + # igmp-snooping: check if enabled + igmp_val = config.return_value(base + [br, 'igmp-snooping', 'querier']) + # igmp-snooping: delete node with old syntax + config.delete(base + [br, 'igmp-snooping', 'querier']) + # igmp-snooping: set new node - if enabled + if igmp_val == "enable": + config.set(base + [br, 'igmp', 'querier'], value=None) + + # + # move interface based bridge-group to actual bridge (de-nest) + # + bridge_types = ['bonding', 'ethernet', 'l2tpv3', 'openvpn', 'vxlan', 'wireless'] + for type in bridge_types: + if not config.exists(['interfaces', type]): + continue + + for intf in config.list_nodes(['interfaces', type]): + # check if bridge-group exists + if config.exists(['interfaces', type, intf, 'bridge-group']): + bridge = config.return_value(['interfaces', type, intf, 'bridge-group', 'bridge']) + + # create new bridge member interface + config.set(base + [bridge, 'member', 'interface', intf]) + # format as tag node to avoid loading problems + config.set_tag(base + [bridge, 'member', 'interface']) + + # cost: migrate if configured + if config.exists(['interfaces', type, intf, 'bridge-group', 'cost']): + cost = config.return_value(['interfaces', type, intf, 'bridge-group', 'cost']) + # set new node + config.set(base + [bridge, 'member', 'interface', intf, 'cost'], value=cost) + + if config.exists(['interfaces', type, intf, 'bridge-group', 'priority']): + priority = config.return_value(['interfaces', type, intf, 'bridge-group', 'priority']) + # set new node + config.set(base + [bridge, 'member', 'interface', intf, 'priority'], value=priority) + + # Delete the old bridge-group assigned to an interface + config.delete(['interfaces', type, intf, 'bridge-group']) + + try: + with open(file_name, 'w') as f: + f.write(config.to_string()) + except OSError as e: + print("Failed to save the modified config: {}".format(e)) + sys.exit(1) |