summaryrefslogtreecommitdiff
path: root/python/vyos/ifconfig
diff options
context:
space:
mode:
authorChristian Poessinger <christian@poessinger.com>2020-03-31 18:01:20 +0200
committerGitHub <noreply@github.com>2020-03-31 18:01:20 +0200
commit685de4c3f9d3367a25ff1320cdacaf6427f6cc80 (patch)
tree176941850c632e37b9853ee842b41188caae7cd7 /python/vyos/ifconfig
parentc707202f440e387310f97a75b737f482c11ef72e (diff)
parent10f31524db1623bf115f88c3a432b5c37522d2e4 (diff)
downloadvyos-1x-685de4c3f9d3367a25ff1320cdacaf6427f6cc80.tar.gz
vyos-1x-685de4c3f9d3367a25ff1320cdacaf6427f6cc80.zip
Merge pull request #283 from thomas-mangin/T2057-wg-dump
ifconfig: T2057: Move code from interface.py to wireguard.py
Diffstat (limited to 'python/vyos/ifconfig')
-rw-r--r--python/vyos/ifconfig/control.py12
-rw-r--r--python/vyos/ifconfig/dhcp.py4
-rw-r--r--python/vyos/ifconfig/interface.py10
-rw-r--r--python/vyos/ifconfig/wireguard.py56
4 files changed, 70 insertions, 12 deletions
diff --git a/python/vyos/ifconfig/control.py b/python/vyos/ifconfig/control.py
index 1c9f7e284..c1a073aef 100644
--- a/python/vyos/ifconfig/control.py
+++ b/python/vyos/ifconfig/control.py
@@ -24,8 +24,18 @@ class Control(Register):
_command_get = {}
_command_set = {}
+ def __init__(self, **kargs):
+ # some commands (such as operation comands - show interfaces, etc.)
+ # need to query the interface statistics. If the interface
+ # code is used and the debugging is enabled, the screen output
+ # will include both the command but also the debugging for that command
+ # to prevent this, debugging can be explicitely disabled
+
+ # if debug is not explicitely disabled the the config, enable it
+ self.debug = kargs.get('debug', True)
+
def _debug_msg(self, msg):
- if os.path.isfile('/tmp/vyos.ifconfig.debug'):
+ if os.path.isfile('/tmp/vyos.ifconfig.debug') and self.debug:
print('DEBUG/{:<6} {}'.format(self.config['ifname'], msg))
def _popen(self, command):
diff --git a/python/vyos/ifconfig/dhcp.py b/python/vyos/ifconfig/dhcp.py
index 8d3653433..8ec8263b5 100644
--- a/python/vyos/ifconfig/dhcp.py
+++ b/python/vyos/ifconfig/dhcp.py
@@ -50,7 +50,9 @@ interface "{{ intf }}" {
class DHCP (Control):
client_base = r'/var/lib/dhcp/dhclient_'
- def __init__ (self, ifname):
+ def __init__ (self, ifname, **kargs):
+ super().__init__(**kargs)
+
# per interface DHCP config files
self._dhcp = {
4: {
diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py
index 8b41d6158..4a34f96d6 100644
--- a/python/vyos/ifconfig/interface.py
+++ b/python/vyos/ifconfig/interface.py
@@ -162,15 +162,17 @@ class Interface(DHCP):
>>> i = Interface('eth0')
"""
- DHCP.__init__(self, ifname)
-
self.config = deepcopy(self.default)
- self.config['ifname'] = ifname
-
for k in self.options:
if k in kargs:
self.config[k] = kargs[k]
+ # make sure the ifname is the first argument and not from the dict
+ self.config['ifname'] = ifname
+
+ # we must have updated config before initialising the Interface
+ super().__init__(ifname, **kargs)
+
if not os.path.exists('/sys/class/net/{}'.format(self.config['ifname'])):
if not self.config['type']:
raise Exception('interface "{}" not found'.format(self.config['ifname']))
diff --git a/python/vyos/ifconfig/wireguard.py b/python/vyos/ifconfig/wireguard.py
index 7f123f9b4..def5ab7c5 100644
--- a/python/vyos/ifconfig/wireguard.py
+++ b/python/vyos/ifconfig/wireguard.py
@@ -15,14 +15,15 @@
import os
+import time
+import subprocess
+from datetime import timedelta
-import vyos
+from vyos.config import Config
from vyos.ifconfig.interface import Interface
-from vyos.interfaces import wireguard_dump
-from datetime import timedelta
-import time
from hurry.filesize import size,alternative
+
@Interface.register
class WireGuardIf(Interface):
default = {
@@ -108,10 +109,10 @@ class WireGuardIf(Interface):
return self._cmd(cmd)
def op_show_interface(self):
- wgdump = wireguard_dump().get(
+ wgdump = self._dump().get(
self.config['ifname'], None)
- c = vyos.config.Config()
+ c = Config()
c.set_level(["interfaces", "wireguard", self.config['ifname']])
description = c.return_effective_value(["description"])
ips = c.return_effective_values(["address"])
@@ -177,3 +178,46 @@ class WireGuardIf(Interface):
wgpeer['persistent_keepalive']))
print()
super().op_show_interface_stats()
+
+ def _dump(self):
+ """Dump wireguard data in a python friendly way."""
+ last_device = None
+ output = {}
+
+ # Dump wireguard connection data
+ _f = self._cmd('wg show all dump')
+ for line in _f.split('\n'):
+ if not line:
+ # Skip empty lines and last line
+ continue
+ items = line.split('\t')
+
+ if last_device != items[0]:
+ # We are currently entering a new node
+ device, private_key, public_key, listen_port, fw_mark = items
+ last_device = device
+
+ output[device] = {
+ 'private_key': None if private_key == '(none)' else private_key,
+ 'public_key': None if public_key == '(none)' else public_key,
+ 'listen_port': int(listen_port),
+ 'fw_mark': None if fw_mark == 'off' else int(fw_mark),
+ 'peers': {},
+ }
+ else:
+ # We are entering a peer
+ device, public_key, preshared_key, endpoint, allowed_ips, latest_handshake, transfer_rx, transfer_tx, persistent_keepalive = items
+ if allowed_ips == '(none)':
+ allowed_ips = []
+ else:
+ allowed_ips = allowed_ips.split('\t')
+ output[device]['peers'][public_key] = {
+ 'preshared_key': None if preshared_key == '(none)' else preshared_key,
+ 'endpoint': None if endpoint == '(none)' else endpoint,
+ 'allowed_ips': allowed_ips,
+ 'latest_handshake': None if latest_handshake == '0' else int(latest_handshake),
+ 'transfer_rx': int(transfer_rx),
+ 'transfer_tx': int(transfer_tx),
+ 'persistent_keepalive': None if persistent_keepalive == 'off' else int(persistent_keepalive),
+ }
+ return output