diff options
| -rw-r--r-- | interface-definitions/interfaces-loopback.xml | 46 | ||||
| -rwxr-xr-x | src/conf_mode/interface-loopback.py | 102 | 
2 files changed, 148 insertions, 0 deletions
| diff --git a/interface-definitions/interfaces-loopback.xml b/interface-definitions/interfaces-loopback.xml new file mode 100644 index 000000000..267731b1c --- /dev/null +++ b/interface-definitions/interfaces-loopback.xml @@ -0,0 +1,46 @@ +<?xml version="1.0"?> +<interfaceDefinition> +  <node name="interfaces"> +    <children> +      <tagNode name="loopback" owner="${vyos_conf_scripts_dir}/interface-loopback.py"> +        <properties> +          <help>Loopback interface</help> +          <priority>300</priority> +          <constraint> +            <regex>lo$</regex> +          </constraint> +          <constraintErrorMessage>Loopback interface must be named lo</constraintErrorMessage> +          <valueHelp> +            <format>lo</format> +            <description>Loopback interface</description> +          </valueHelp> +        </properties> +        <children> +          <leafNode name="address"> +            <properties> +              <help>IP address</help> +              <valueHelp> +                <format>ipv4net</format> +                <description>IPv4 address and prefix length</description> +              </valueHelp> +              <valueHelp> +                <format>ipv6net</format> +                <description>IPv6 address and prefix length</description> +              </valueHelp> +              <multi/> +            </properties> +          </leafNode> +          <leafNode name="description"> +            <properties> +              <help>Interface description</help> +              <constraint> +                <regex>^.{1,256}$</regex> +              </constraint> +              <constraintErrorMessage>Interface description too long (limit 256 characters)</constraintErrorMessage> +            </properties> +          </leafNode> +        </children> +      </tagNode> +    </children> +  </node> +</interfaceDefinition> diff --git a/src/conf_mode/interface-loopback.py b/src/conf_mode/interface-loopback.py new file mode 100755 index 000000000..445a9af64 --- /dev/null +++ b/src/conf_mode/interface-loopback.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2019 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>. +# +# + +import os +import sys +import copy + +import vyos.configinterface as VyIfconfig + +from vyos.config import Config +from vyos import ConfigError + +default_config_data = { +    'address': [], +    'address_remove': [], +    'deleted': False, +    'description': '', +} + +def diff(first, second): +    second = set(second) +    return [item for item in first if item not in second] + +def get_config(): +    loopback = copy.deepcopy(default_config_data) +    conf = Config() + +    # determine tagNode instance +    try: +        loopback['intf'] = os.environ['VYOS_TAGNODE_VALUE'] +    except KeyError as E: +        print("Interface not specified") + +    # Check if interface has been removed +    if not conf.exists('interfaces loopback ' + loopback['intf']): +        loopback['deleted'] = True + +    # set new configuration level +    conf.set_level('interfaces loopback ' + loopback['intf']) + +    # retrieve configured interface addresses +    if conf.exists('address'): +        loopback['address'] = conf.return_values('address') + +    # retrieve interface description +    if conf.exists('description'): +        loopback['description'] = conf.return_value('description') + +    # Determine interface addresses (currently effective) - to determine which +    # address is no longer valid and needs to be removed from the interface +    eff_addr = conf.return_effective_values('address') +    act_addr = conf.return_values('address') +    loopback['address_remove'] = diff(eff_addr, act_addr) + +    return loopback + +def verify(loopback): +    return None + +def generate(loopback): +    return None + +def apply(loopback): +    # Remove loopback interface +    if not loopback['deleted']: +        # update interface description used e.g. within SNMP +        VyIfconfig.set_description(loopback['intf'], loopback['description']) + +        # Configure interface address(es) +        for addr in loopback['address']: +            VyIfconfig.add_interface_address(loopback['intf'], addr) + +    # Remove interface address(es) +    for addr in loopback['address_remove']: +        VyIfconfig.remove_interface_address(loopback['intf'], addr) + +    return None + +if __name__ == '__main__': +    try: +        c = get_config() +        verify(c) +        generate(c) +        apply(c) +    except ConfigError as e: +        print(e) +        sys.exit(1) | 
