diff options
Diffstat (limited to 'python/vyos/interface.py')
-rw-r--r-- | python/vyos/interface.py | 150 |
1 files changed, 0 insertions, 150 deletions
diff --git a/python/vyos/interface.py b/python/vyos/interface.py deleted file mode 100644 index cc726e5cc..000000000 --- a/python/vyos/interface.py +++ /dev/null @@ -1,150 +0,0 @@ -# Copyright 2019 VyOS maintainers and contributors <maintainers@vyos.io> -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library. If not, see <http://www.gnu.org/licenses/>. - -import vyos -from vyos.config import Config -import vyos.interfaces -import vyos.ioctl -from vyos.iflag import IFlag - -import re -import json - -import subprocess -import time -from datetime import timedelta -import glob -from os.path import isfile -from tabulate import tabulate -from hurry.filesize import size,alternative - -class Interface(): - - intf = None - intf_type = None - valid = False - flags = None - - def __init__(self,intf): - self.intf = intf - self.intf_type = vyos.interfaces.get_type_of_interface(self.intf) - self.valid = (self.intf in vyos.interfaces.list_interfaces()) - if (self.valid): - self.flags = vyos.ioctl.get_interface_flags(intf) - - def up(self): - """ return whether interface is up or not """ - return self.flags & IFlag.IFF_UP - - def print_interface(self): - - if not self.valid: - print("Invalid interface [{}]".format(self.intf)) - return - - if (self.intf_type == 'wireguard'): - self.print_wireguard_interface() - - self.print_interface_stats() - - def print_interface_stats(self): - stats = self.get_interface_stats() - rx = [['bytes','packets','errors','dropped','overrun','mcast'],[stats['rx_bytes'],stats['rx_packets'],stats['rx_errors'],stats['rx_dropped'],stats['rx_over_errors'],stats['multicast']]] - tx = [['bytes','packets','errors','dropped','carrier','collisions'],[stats['tx_bytes'],stats['tx_packets'],stats['tx_errors'],stats['tx_dropped'],stats['tx_carrier_errors'],stats['collisions']]] - output = "RX: \n" - output += tabulate(rx,headers="firstrow",numalign="right",tablefmt="plain") - output += "\n\nTX: \n" - output += tabulate(tx,headers="firstrow",numalign="right",tablefmt="plain") - print(' '.join(('\n'+output.lstrip()).splitlines(True))) - - def get_interface_stats(self): - interface_stats = dict() - devices = [f for f in glob.glob("/sys/class/net/**/statistics")] - for dev_path in devices: - metrics = [f for f in glob.glob(dev_path +"/**")] - dev = re.findall(r"/sys/class/net/(.*)/statistics",dev_path)[0] - dev_dict = dict() - for metric_path in metrics: - metric = metric_path.replace(dev_path+"/","") - if isfile(metric_path): - data = open(metric_path, 'r').read()[:-1] - dev_dict[metric] = int(data) - interface_stats[dev] = dev_dict - - return interface_stats[self.intf] - - def print_wireguard_interface(self): - - wgdump = vyos.interfaces.wireguard_dump().get(self.intf,None) - - c = Config() - c.set_level("interfaces wireguard {}".format(self.intf)) - description = c.return_effective_value("description") - ips = c.return_effective_values("address") - - print ("interface: {}".format(self.intf)) - if (description): - print (" description: {}".format(description)) - - if (ips): - print (" address: {}".format(", ".join(ips))) - print (" public key: {}".format(wgdump['public_key'])) - print (" private key: (hidden)") - print (" listening port: {}".format(wgdump['listen_port'])) - print () - - for peer in c.list_effective_nodes(' peer'): - if wgdump['peers']: - pubkey = c.return_effective_value("peer {} pubkey".format(peer)) - if pubkey in wgdump['peers']: - wgpeer = wgdump['peers'][pubkey] - - print (" peer: {}".format(peer)) - print (" public key: {}".format(pubkey)) - - """ figure out if the tunnel is recently active or not """ - status = "inactive" - if (wgpeer['latest_handshake'] is None): - """ no handshake ever """ - status = "inactive" - else: - if int(wgpeer['latest_handshake']) > 0: - delta = timedelta(seconds=int(time.time() - wgpeer['latest_handshake'])) - print (" latest handshake: {}".format(delta)) - if (time.time() - int(wgpeer['latest_handshake']) < (60*5)): - """ Five minutes and the tunnel is still active """ - status = "active" - else: - """ it's been longer than 5 minutes """ - status = "inactive" - elif int(wgpeer['latest_handshake']) == 0: - """ no handshake ever """ - status = "inactive" - print (" status: {}".format(status)) - - if wgpeer['endpoint'] is not None: - print (" endpoint: {}".format(wgpeer['endpoint'])) - - if wgpeer['allowed_ips'] is not None: - print (" allowed ips: {}".format(",".join(wgpeer['allowed_ips']).replace(",",", "))) - - if wgpeer['transfer_rx'] > 0 or wgpeer['transfer_tx'] > 0: - rx_size =size(wgpeer['transfer_rx'],system=alternative) - tx_size =size(wgpeer['transfer_tx'],system=alternative) - print (" transfer: {} received, {} sent".format(rx_size,tx_size)) - - if wgpeer['persistent_keepalive'] is not None: - print (" persistent keepalive: every {} seconds".format(wgpeer['persistent_keepalive'])) - print() |