diff options
| -rw-r--r-- | interface-definitions/interfaces-dummy.xml | 3 | ||||
| -rw-r--r-- | python/vyos/interfaceconfig.py | 56 | ||||
| -rwxr-xr-x | src/conf_mode/interface-dummy.py | 19 | 
3 files changed, 69 insertions, 9 deletions
diff --git a/interface-definitions/interfaces-dummy.xml b/interface-definitions/interfaces-dummy.xml index 4450b69b7..c9860fe3b 100644 --- a/interface-definitions/interfaces-dummy.xml +++ b/interface-definitions/interfaces-dummy.xml @@ -28,6 +28,9 @@                  <description>IPv6 address and prefix length</description>                </valueHelp>                <multi/> +              <constraint> +                <validator name="ip-cidr"/> +              </constraint>              </properties>            </leafNode>            <leafNode name="description"> diff --git a/python/vyos/interfaceconfig.py b/python/vyos/interfaceconfig.py index 83e7c03c0..56e2d515c 100644 --- a/python/vyos/interfaceconfig.py +++ b/python/vyos/interfaceconfig.py @@ -21,6 +21,7 @@ import re  import json  import socket  import subprocess +import ipaddress  dhclient_conf_dir = r'/var/lib/dhcp/dhclient_' @@ -188,6 +189,29 @@ class Interface:          self._debug(e)        return None +  def get_addr(self, ret_prefix=None): +    """ +        universal: reads all IPs assigned to an interface and returns it in a list, +        or None if no IP address is assigned to the interface. Also may return +        in prefix format if set ret_prefix +    """ +    ips = [] +    try: +      ret = subprocess.check_output(['ip -j addr show dev ' + self._ifname], stderr=subprocess.STDOUT, shell=True).decode() +      j = json.loads(ret) +      for i in j: +        if len(i) != 0: +          for addr in i['addr_info']: +            if ret_prefix: +              ips.append(addr['local'] + "/" + str(addr['prefixlen'])) +            else: +              ips.append(addr['local']) +      return ips +    except subprocess.CalledProcessError as e: +      if self._debug(): +        self._debug(e) +      return None +    def get_ipv4_addr(self):      """          reads all IPs assigned to an interface and returns it in a list,  @@ -227,6 +251,38 @@ class Interface:          self._debug(e)        return None +  def add_addr(self, ipaddr=[]): +    """ +        universal: add ipv4/ipv6 addresses on the interface +    """ +    for ip in ipaddr: +      proto = '-4' +      if ipaddress.ip_address(ip.split(r'/')[0]).version == 6: +        proto = '-6' + +      try: +        ret = subprocess.check_output(['ip ' + proto + ' address add ' + ip + ' dev ' + self._ifname], stderr=subprocess.STDOUT, shell=True).decode() +      except subprocess.CalledProcessError as e: +        if self._debug(): +          self._debug(e) +        return None +    return True + +  def del_addr(self, ipaddr=[]): +    """ +        universal: delete ipv4/ipv6 addresses on the interface +    """ +    for ip in ipaddr: +      proto = '-4' +      if ipaddress.ip_address(ip.split(r'/')[0]).version == 6: +        proto = '-6' +      try: +        ret = subprocess.check_output(['ip ' + proto + ' address del ' + ip + ' dev ' + self._ifname], stderr=subprocess.STDOUT, shell=True).decode() +      except subprocess.CalledProcessError as e: +        if self._debug(): +          self._debug(e) +        return None +    return True    def add_ipv4_addr(self, ipaddr=[]):      """ diff --git a/src/conf_mode/interface-dummy.py b/src/conf_mode/interface-dummy.py index 8c939ce95..c7c5ac99c 100755 --- a/src/conf_mode/interface-dummy.py +++ b/src/conf_mode/interface-dummy.py @@ -20,8 +20,6 @@ import os  import sys  import copy -import vyos.configinterface as VyIfconfig -  from vyos.interfaceconfig import Interface  from vyos.config import Config  from vyos import ConfigError @@ -86,20 +84,23 @@ def generate(dummy):  def apply(dummy):      # Remove dummy interface      if dummy['deleted']: -        VyIfconfig.remove_interface(dummy['intf']) +        Interface(dummy['intf']).remove_interface()      else:          # Interface will only be added if it yet does not exist -        VyIfconfig.add_interface('dummy', dummy['intf']) +        Interface(dummy['intf'], 'dummy')          # update interface description used e.g. within SNMP -        VyIfconfig.set_description(dummy['intf'], dummy['description']) +        if dummy['description']: +            Interface(dummy['intf']).ifalias =  dummy['description']          # Configure interface address(es) -        for addr in dummy['address_remove']: -            VyIfconfig.remove_interface_address(dummy['intf'], addr) +        if len(dummy['address_remove']) > 0: +            Interface(dummy['intf']).del_addr(dummy['address_remove']) -        for addr in dummy['address']: -            VyIfconfig.add_interface_address(dummy['intf'], addr) +        if len(dummy['address']) > 0: +            # delete already existing addreses from list +            addresess = diff(dummy['address'], Interface(dummy['intf']).get_addr(1)) +            Interface(dummy['intf']).add_addr(addresess)          if dummy['disable']:              Interface(dummy['intf']).linkstate = 'down'  | 
