summaryrefslogtreecommitdiff
path: root/python/vyos
diff options
context:
space:
mode:
authorChristian Poessinger <christian@poessinger.com>2019-09-04 16:30:20 +0200
committerGitHub <noreply@github.com>2019-09-04 16:30:20 +0200
commit62abfc2653e5206f1af95163909e5f924002b499 (patch)
tree8102bab9334abc886469dd9e45d647f938984275 /python/vyos
parent65dd56453b451377f10c664b3baf925c4ff62756 (diff)
parent053f208b2ed9477fc70b770ab7ac884109d9a89a (diff)
downloadvyos-1x-62abfc2653e5206f1af95163909e5f924002b499.tar.gz
vyos-1x-62abfc2653e5206f1af95163909e5f924002b499.zip
Merge pull request #124 from c-po/t1614-bonding
T1614 bonding
Diffstat (limited to 'python/vyos')
-rw-r--r--python/vyos/ifconfig.py65
1 files changed, 55 insertions, 10 deletions
diff --git a/python/vyos/ifconfig.py b/python/vyos/ifconfig.py
index 1d03e4e74..449923f09 100644
--- a/python/vyos/ifconfig.py
+++ b/python/vyos/ifconfig.py
@@ -66,7 +66,7 @@ class Interface:
self._debug = True
if not os.path.exists('/sys/class/net/{}'.format(self._ifname)):
- cmd = 'ip link add dev "{}" type "{}"'.format(self._ifname, type)
+ cmd = 'ip link add dev {} type {}'.format(self._ifname, type)
self._cmd(cmd)
# per interface DHCP config files
@@ -87,7 +87,9 @@ class Interface:
def remove(self):
"""
- Remove system interface
+ Remove interface from operating system. Removing the interface
+ deconfigures all assigned IP addresses and clear possible DHCP(v6)
+ client processes.
Example:
>>> from vyos.ifconfig import Interface
@@ -102,12 +104,12 @@ class Interface:
# NOTE (Improvement):
# after interface removal no other commands should be allowed
# to be called and instead should raise an Exception:
- cmd = 'ip link del dev "{}"'.format(self._ifname)
+ cmd = 'ip link del dev {}'.format(self._ifname)
self._cmd(cmd)
def _cmd(self, command):
- self._debug_msg("{:<6} '{}'".format('cmd', command))
+ self._debug_msg("cmd '{}'".format(command))
process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
proc_stdout = process.communicate()[0].strip()
@@ -124,7 +126,7 @@ class Interface:
with open(filename, 'r') as f:
value = f.read().rstrip('\n')
- self._debug_msg("{:<6} '{}' < '{}'".format('read', value, filename))
+ self._debug_msg("read '{}' < '{}'".format(value, filename))
return value
@@ -132,7 +134,7 @@ class Interface:
"""
Provide a single primitive w/ error checking for writing to sysfs.
"""
- self._debug_msg("{:<6} '{}' > '{}'".format('write', value, filename))
+ self._debug_msg("write '{}' > '{}'".format(value, filename))
with open(filename, 'w') as f:
f.write(str(value))
@@ -214,7 +216,7 @@ class Interface:
# Assemble command executed on system. Unfortunately there is no way
# of altering the MAC address via sysfs
- cmd = 'ip link set dev "{}" address "{}"'.format(self._ifname, mac)
+ cmd = 'ip link set dev {} address {}'.format(self._ifname, mac)
self._cmd(cmd)
@@ -358,7 +360,7 @@ class Interface:
# Assemble command executed on system. Unfortunately there is no way
# to up/down an interface via sysfs
- cmd = 'ip link set dev "{}" "{}"'.format(self._ifname, state)
+ cmd = 'ip link set dev {} {}'.format(self._ifname, state)
self._cmd(cmd)
@property
@@ -922,7 +924,7 @@ class BridgeIf(Interface):
>>> BridgeIf('br0').add_port('eth0')
>>> BridgeIf('br0').add_port('eth1')
"""
- cmd = 'ip link set dev "{}" master "{}"'.format(interface, self._ifname)
+ cmd = 'ip link set dev {} master {}'.format(interface, self._ifname)
self._cmd(cmd)
@@ -934,7 +936,7 @@ class BridgeIf(Interface):
>>> from vyos.ifconfig import Interface
>>> BridgeIf('br0').del_port('eth1')
"""
- cmd = 'ip link set dev "{}" nomaster'.format(interface)
+ cmd = 'ip link set dev {} nomaster'.format(interface)
self._cmd(cmd)
@@ -964,10 +966,53 @@ class BridgeIf(Interface):
.format(self._ifname, interface), priority)
+
class EthernetIf(Interface):
def __init__(self, ifname, type=None):
super().__init__(ifname, type)
+ def add_vlan(self, vlan_id, ethertype=''):
+ """
+ A virtual LAN (VLAN) is any broadcast domain that is partitioned and
+ isolated in a computer network at the data link layer (OSI layer 2).
+ Use this function to create a new VLAN interface on a given physical
+ interface.
+
+ This function creates both 802.1q and 802.1ad (Q-in-Q) interfaces. Proto
+ parameter is used to indicate VLAN type.
+
+ A new object of type EthernetIf is returned once the interface has been
+ created.
+ """
+ vlan_ifname = self._ifname + '.' + str(vlan_id)
+ if not os.path.exists('/sys/class/net/{}'.format(vlan_ifname)):
+ self._vlan_id = int(vlan_id)
+
+ if ethertype:
+ self._ethertype = ethertype
+ ethertype='proto {}'.format(ethertype)
+
+ # create interface in the system
+ cmd = 'ip link add link {intf} name {intf}.{vlan} type vlan {proto} id {vlan}'.format(intf=self._ifname, vlan=self._vlan_id, proto=ethertype)
+ self._cmd(cmd)
+
+ # return new object mapping to the newly created interface
+ # we can now work on this object for e.g. IP address setting
+ # or interface description and so on
+ return EthernetIf(vlan_ifname)
+
+
+ def del_vlan(self, vlan_id):
+ """
+ Remove VLAN interface from operating system. Removing the interface
+ deconfigures all assigned IP addresses and clear possible DHCP(v6)
+ client processes.
+ """
+ vlan_ifname = self._ifname + '.' + str(vlan_id)
+ tmp = EthernetIf(vlan_ifname)
+ tmp.remove()
+
+
class BondIf(EthernetIf):
"""
The Linux bonding driver provides a method for aggregating multiple network