diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/container.py | 18 | ||||
| -rwxr-xr-x | src/conf_mode/firewall.py | 3 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces-openvpn.py | 4 | ||||
| -rwxr-xr-x | src/conf_mode/protocols_eigrp.py | 2 | ||||
| -rwxr-xr-x | src/conf_mode/service_monitoring_telegraf.py | 11 | ||||
| -rwxr-xr-x | src/conf_mode/system-login.py | 14 | ||||
| -rwxr-xr-x | src/conf_mode/vpn_pptp.py | 23 | ||||
| -rw-r--r-- | src/etc/dhcp/dhclient-exit-hooks.d/03-vyatta-dhclient-hook (renamed from src/etc/dhcp/dhclient-exit-hooks.d/vyatta-dhclient-hook) | 0 | ||||
| -rwxr-xr-x | src/etc/dhcp/dhclient-exit-hooks.d/98-run-user-hooks (renamed from src/etc/dhcp/dhclient-exit-hooks.d/99-run-user-hooks) | 0 | ||||
| -rwxr-xr-x | src/etc/dhcp/dhclient-exit-hooks.d/99-ipsec-dhclient-hook (renamed from src/etc/dhcp/dhclient-exit-hooks.d/ipsec-dhclient-hook) | 0 | ||||
| -rwxr-xr-x | src/etc/opennhrp/opennhrp-script.py | 39 | ||||
| -rw-r--r-- | src/etc/systemd/system/hostapd@.service.d/override.conf | 2 | ||||
| -rwxr-xr-x | src/helpers/vyos-failover.py | 69 | ||||
| -rwxr-xr-x | src/op_mode/dynamic_dns.py | 72 | ||||
| -rwxr-xr-x | src/op_mode/openvpn.py | 25 | ||||
| -rwxr-xr-x | src/op_mode/sflow.py | 9 | 
16 files changed, 181 insertions, 110 deletions
| diff --git a/src/conf_mode/container.py b/src/conf_mode/container.py index 3827f4c70..4b7ab3444 100755 --- a/src/conf_mode/container.py +++ b/src/conf_mode/container.py @@ -26,6 +26,8 @@ from vyos.config import Config  from vyos.configdict import dict_merge  from vyos.configdict import node_changed  from vyos.configdict import is_node_changed +from vyos.configverify import verify_vrf +from vyos.ifconfig import Interface  from vyos.util import call  from vyos.util import cmd  from vyos.util import run @@ -250,6 +252,8 @@ def verify(container):              if v6_prefix > 1:                  raise ConfigError(f'Only one IPv6 prefix can be defined for network "{network}"!') +            # Verify VRF exists +            verify_vrf(network_config)      # A network attached to a container can not be deleted      if {'network_remove', 'name'} <= set(container): @@ -469,6 +473,20 @@ def apply(container):      if disabled_new:          call('systemctl daemon-reload') +    # Start network and assign it to given VRF if requested. this can only be done +    # after the containers got started as the podman network interface will +    # only be enabled by the first container and yet I do not know how to enable +    # the network interface in advance +    if 'network' in container: +        for network, network_config in container['network'].items(): +            network_name = f'podman-{network}' +            # T5147: Networks are started only as soon as there is a consumer. +            # If only a network is created in the first place, no need to assign +            # it to a VRF as there's no consumer, yet. +            if os.path.exists(f'/sys/class/net/{network_name}'): +                tmp = Interface(network_name) +                tmp.set_vrf(network_config.get('vrf', '')) +      return None  if __name__ == '__main__': diff --git a/src/conf_mode/firewall.py b/src/conf_mode/firewall.py index c41a442df..190587980 100755 --- a/src/conf_mode/firewall.py +++ b/src/conf_mode/firewall.py @@ -282,6 +282,9 @@ def verify_rule(firewall, rule_conf, ipv6):                  if rule_conf['protocol'] not in ['tcp', 'udp', 'tcp_udp']:                      raise ConfigError('Protocol must be tcp, udp, or tcp_udp when specifying a port or port-group') +            if 'port' in side_conf and dict_search_args(side_conf, 'group', 'port_group'): +                raise ConfigError(f'{side} port-group and port cannot both be defined') +      if 'log_options' in rule_conf:          if 'log' not in rule_conf or 'enable' not in rule_conf['log']:              raise ConfigError('log-options defined, but log is not enable') diff --git a/src/conf_mode/interfaces-openvpn.py b/src/conf_mode/interfaces-openvpn.py index 13d84a6fe..6f227b0d1 100755 --- a/src/conf_mode/interfaces-openvpn.py +++ b/src/conf_mode/interfaces-openvpn.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2019-2022 VyOS maintainers and contributors +# Copyright (C) 2019-2023 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 @@ -597,7 +597,7 @@ def generate_pki_files(openvpn):  def generate(openvpn):      interface = openvpn['ifname']      directory = os.path.dirname(cfg_file.format(**openvpn)) -    plugin_dir = '/usr/lib/openvpn' +    openvpn['plugin_dir'] = '/usr/lib/openvpn'      # create base config directory on demand      makedir(directory, user, group)      # enforce proper permissions on /run/openvpn diff --git a/src/conf_mode/protocols_eigrp.py b/src/conf_mode/protocols_eigrp.py index c1a1a45e1..6e75e34ff 100755 --- a/src/conf_mode/protocols_eigrp.py +++ b/src/conf_mode/protocols_eigrp.py @@ -69,8 +69,6 @@ def get_config(config=None):      # Merge policy dict into "regular" config dict      eigrp = dict_merge(tmp, eigrp) -    import pprint -    pprint.pprint(eigrp)      return eigrp  def verify(eigrp): diff --git a/src/conf_mode/service_monitoring_telegraf.py b/src/conf_mode/service_monitoring_telegraf.py index 363408679..47510ce80 100755 --- a/src/conf_mode/service_monitoring_telegraf.py +++ b/src/conf_mode/service_monitoring_telegraf.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2021-2022 VyOS maintainers and contributors +# Copyright (C) 2021-2023 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 @@ -15,6 +15,7 @@  # along with this program.  If not, see <http://www.gnu.org/licenses/>.  import os +import socket  import json  from sys import exit @@ -57,6 +58,13 @@ def get_nft_filter_chains():      return chain_list +def get_hostname() -> str: +    try: +        hostname = socket.getfqdn() +    except socket.gaierror: +        hostname = socket.gethostname() +    return hostname +  def get_config(config=None):      if config:          conf = config @@ -79,6 +87,7 @@ def get_config(config=None):      monitoring = dict_merge(default_values, monitoring)      monitoring['custom_scripts_dir'] = custom_scripts_dir +    monitoring['hostname'] = get_hostname()      monitoring['interfaces_ethernet'] = Section.interfaces('ethernet', vlan=False)      monitoring['nft_chains'] = get_nft_filter_chains() diff --git a/src/conf_mode/system-login.py b/src/conf_mode/system-login.py index d15fe399d..fbb013cf3 100755 --- a/src/conf_mode/system-login.py +++ b/src/conf_mode/system-login.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2020-2022 VyOS maintainers and contributors +# Copyright (C) 2020-2023 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 @@ -40,6 +40,7 @@ from vyos import airbag  airbag.enable()  autologout_file = "/etc/profile.d/autologout.sh" +limits_file = "/etc/security/limits.d/10-vyos.conf"  radius_config_file = "/etc/pam_radius_auth.conf"  # LOGIN_TIMEOUT from /etc/loign.defs minus 10 sec @@ -164,6 +165,9 @@ def verify(login):              if ipv6_count > 1:                  raise ConfigError('Only one IPv6 source-address can be set!') +    if 'max_login_session' in login and 'timeout' not in login: +        raise ConfigError('"login timeout" must be configured!') +      return None @@ -226,6 +230,14 @@ def generate(login):          if os.path.isfile(radius_config_file):              os.unlink(radius_config_file) +    # /etc/security/limits.d/10-vyos.conf +    if 'max_login_session' in login: +        render(limits_file, 'login/limits.j2', login, +                   permission=0o644, user='root', group='root') +    else: +        if os.path.isfile(limits_file): +            os.unlink(limits_file) +      if 'timeout' in login:          render(autologout_file, 'login/autologout.j2', login,                     permission=0o755, user='root', group='root') diff --git a/src/conf_mode/vpn_pptp.py b/src/conf_mode/vpn_pptp.py index 7550c411e..986a19972 100755 --- a/src/conf_mode/vpn_pptp.py +++ b/src/conf_mode/vpn_pptp.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2018-2020 VyOS maintainers and contributors +# Copyright (C) 2018-2023 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 @@ -44,6 +44,8 @@ default_pptp = {      'radius_nas_ip' : '',      'radius_source_address' : '',      'radius_shaper_attr' : '', +    'radius_shaper_enable': False, +    'radius_shaper_multiplier': '',      'radius_shaper_vendor': '',      'radius_dynamic_author' : '',      'chap_secrets_file': pptp_chap_secrets, # used in Jinja2 template @@ -183,15 +185,18 @@ def get_config(config=None):              pptp['radius_dynamic_author'] = dae +        # Rate limit +        if conf.exists(['rate-limit', 'attribute']): +            pptp['radius_shaper_attr'] = conf.return_value(['rate-limit', 'attribute']) +          if conf.exists(['rate-limit', 'enable']): -            pptp['radius_shaper_attr'] = 'Filter-Id' -            c_attr = ['rate-limit', 'enable', 'attribute'] -            if conf.exists(c_attr): -                pptp['radius_shaper_attr'] = conf.return_value(c_attr) - -            c_vendor = ['rate-limit', 'enable', 'vendor'] -            if conf.exists(c_vendor): -                pptp['radius_shaper_vendor'] = conf.return_value(c_vendor) +            pptp['radius_shaper_enable'] = True + +        if conf.exists(['rate-limit', 'multiplier']): +            pptp['radius_shaper_multiplier'] = conf.return_value(['rate-limit', 'multiplier']) + +        if conf.exists(['rate-limit', 'vendor']): +            pptp['radius_shaper_vendor'] = conf.return_value(['rate-limit', 'vendor'])      conf.set_level(base_path)      if conf.exists(['client-ip-pool']): diff --git a/src/etc/dhcp/dhclient-exit-hooks.d/vyatta-dhclient-hook b/src/etc/dhcp/dhclient-exit-hooks.d/03-vyatta-dhclient-hook index 49bb18372..49bb18372 100644 --- a/src/etc/dhcp/dhclient-exit-hooks.d/vyatta-dhclient-hook +++ b/src/etc/dhcp/dhclient-exit-hooks.d/03-vyatta-dhclient-hook diff --git a/src/etc/dhcp/dhclient-exit-hooks.d/99-run-user-hooks b/src/etc/dhcp/dhclient-exit-hooks.d/98-run-user-hooks index 442419d79..442419d79 100755 --- a/src/etc/dhcp/dhclient-exit-hooks.d/99-run-user-hooks +++ b/src/etc/dhcp/dhclient-exit-hooks.d/98-run-user-hooks diff --git a/src/etc/dhcp/dhclient-exit-hooks.d/ipsec-dhclient-hook b/src/etc/dhcp/dhclient-exit-hooks.d/99-ipsec-dhclient-hook index 1f1926e17..1f1926e17 100755 --- a/src/etc/dhcp/dhclient-exit-hooks.d/ipsec-dhclient-hook +++ b/src/etc/dhcp/dhclient-exit-hooks.d/99-ipsec-dhclient-hook diff --git a/src/etc/opennhrp/opennhrp-script.py b/src/etc/opennhrp/opennhrp-script.py index bf25a7331..688c7af2a 100755 --- a/src/etc/opennhrp/opennhrp-script.py +++ b/src/etc/opennhrp/opennhrp-script.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2021 VyOS maintainers and contributors +# Copyright (C) 2021-2023 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 @@ -17,7 +17,7 @@  import os  import re  import sys -import vici +import vyos.ipsec  from json import loads  from pathlib import Path @@ -51,9 +51,8 @@ def vici_get_ipsec_uniqueid(conn: str, src_nbma: str,          logger.info(              f'Resolving IKE unique ids for: conn: {conn}, '              f'src_nbma: {src_nbma}, dst_nbma: {dst_nbma}') -        session: vici.Session = vici.Session()          list_ikeid: list[str] = [] -        list_sa = session.list_sas({'ike': conn}) +        list_sa: list = vyos.ipsec.get_vici_sas_by_name(conn, None)          for sa in list_sa:              if sa[conn]['local-host'].decode('ascii') == src_nbma \                      and sa[conn]['remote-host'].decode('ascii') == dst_nbma: @@ -78,16 +77,7 @@ def vici_ike_terminate(list_ikeid: list[str]) -> bool:          return False      try: -        session = vici.Session() -        for ikeid in list_ikeid: -            logger.info(f'Terminating IKE SA with id {ikeid}') -            session_generator = session.terminate( -                {'ike-id': ikeid, 'timeout': '-1'}) -            # a dummy `for` loop is required because of requirements -            # from vici. Without a full iteration on the output, the -            # command to vici may not be executed completely -            for _ in session_generator: -                pass +        vyos.ipsec.terminate_vici_ikeid_list(list_ikeid)          return True      except Exception as err:          logger.error(f'Failed to terminate SA for IKE ids {list_ikeid}: {err}') @@ -180,19 +170,7 @@ def vici_initiate(conn: str, child_sa: str, src_addr: str,          f'Trying to initiate connection. Name: {conn}, child sa: {child_sa}, '          f'src_addr: {src_addr}, dst_addr: {dest_addr}')      try: -        session = vici.Session() -        session_generator = session.initiate({ -            'ike': conn, -            'child': child_sa, -            'timeout': '-1', -            'my-host': src_addr, -            'other-host': dest_addr -        }) -        # a dummy `for` loop is required because of requirements -        # from vici. Without a full iteration on the output, the -        # command to vici may not be executed completely -        for _ in session_generator: -            pass +        vyos.ipsec.vici_initiate(conn, child_sa, src_addr, dest_addr)          return True      except Exception as err:          logger.error(f'Unable to initiate connection {err}') @@ -218,8 +196,11 @@ def vici_terminate(conn: str, src_addr: str, dest_addr: str) -> None:              f'No active sessions found for IKE profile {conn}, '              f'local NBMA {src_addr}, remote NBMA {dest_addr}')      else: -        vici_ike_terminate(ikeid_list) - +        try: +            vyos.ipsec.terminate_vici_ikeid_list(ikeid_list) +        except Exception as err: +            logger.error( +                f'Failed to terminate SA for IKE ids {ikeid_list}: {err}')  def iface_up(interface: str) -> None:      """Proceed tunnel interface UP event diff --git a/src/etc/systemd/system/hostapd@.service.d/override.conf b/src/etc/systemd/system/hostapd@.service.d/override.conf index bb8e81d7a..926c07f94 100644 --- a/src/etc/systemd/system/hostapd@.service.d/override.conf +++ b/src/etc/systemd/system/hostapd@.service.d/override.conf @@ -1,6 +1,8 @@  [Unit]  After=  After=vyos-router.service +ConditionFileNotEmpty= +ConditionFileNotEmpty=/run/hostapd/%i.conf  [Service]  WorkingDirectory=/run/hostapd diff --git a/src/helpers/vyos-failover.py b/src/helpers/vyos-failover.py index 0de945f20..03fb42f57 100755 --- a/src/helpers/vyos-failover.py +++ b/src/helpers/vyos-failover.py @@ -30,7 +30,7 @@ my_name = Path(__file__).stem  def is_route_exists(route, gateway, interface, metric):      """Check if route with expected gateway, dev and metric exists""" -    rc, data = rc_cmd(f'sudo ip --json route show protocol failover {route} ' +    rc, data = rc_cmd(f'ip --json route show protocol failover {route} '                        f'via {gateway} dev {interface} metric {metric}')      if rc == 0:          data = json.loads(data) @@ -72,6 +72,7 @@ def get_best_route_options(route, debug=False):                    f'best_metric: {best_metric}, best_iface: {best_interface}')          return best_gateway, best_interface, best_metric +  def is_port_open(ip, port):      """      Check connection to remote host and port @@ -91,32 +92,54 @@ def is_port_open(ip, port):      finally:          s.close() -def is_target_alive(target=None, iface='', proto='icmp', port=None, debug=False): -    """ -    Host availability check by ICMP, ARP, TCP -    Return True if target checks is successful -    % is_target_alive('192.0.2.1', 'eth1', proto='arp') -    True +def is_target_alive(target_list=None, iface='', proto='icmp', port=None, debug=False): +    """Check the availability of each target in the target_list using +    the specified protocol ICMP, ARP, TCP + +    Args: +        target_list (list): A list of IP addresses or hostnames to check. +        iface (str): The name of the network interface to use for the check. +        proto (str): The protocol to use for the check. Options are 'icmp', 'arp', or 'tcp'. +        port (int): The port number to use for the TCP check. Only applicable if proto is 'tcp'. +        debug (bool): If True, print debug information during the check. + +    Returns: +        bool: True if all targets are reachable, False otherwise. + +    Example: +        % is_target_alive(['192.0.2.1', '192.0.2.5'], 'eth1', proto='arp') +        True      """      if iface != '':          iface = f'-I {iface}' -    if proto == 'icmp': -        command = f'/usr/bin/ping -q {target} {iface} -n -c 2 -W 1' -        rc, response = rc_cmd(command) -        if debug: print(f'    [ CHECK-TARGET ]: [{command}] -- return-code [RC: {rc}]') -        if rc == 0: -            return True -    elif proto == 'arp': -        command = f'/usr/bin/arping -b -c 2 -f -w 1 -i 1 {iface} {target}' -        rc, response = rc_cmd(command) -        if debug: print(f'    [ CHECK-TARGET ]: [{command}] -- return-code [RC: {rc}]') -        if rc == 0: -            return True -    elif proto == 'tcp' and port is not None: -        return True if is_port_open(target, port) else False -    else: -        return False + +    for target in target_list: +        match proto: +            case 'icmp': +                command = f'/usr/bin/ping -q {target} {iface} -n -c 2 -W 1' +                rc, response = rc_cmd(command) +                if debug: +                    print(f'    [ CHECK-TARGET ]: [{command}] -- return-code [RC: {rc}]') +                if rc != 0: +                    return False + +            case 'arp': +                command = f'/usr/bin/arping -b -c 2 -f -w 1 -i 1 {iface} {target}' +                rc, response = rc_cmd(command) +                if debug: +                    print(f'    [ CHECK-TARGET ]: [{command}] -- return-code [RC: {rc}]') +                if rc != 0: +                    return False + +            case _ if proto == 'tcp' and port is not None: +                if not is_port_open(target, port): +                    return False + +            case _: +                return False + +    return True  if __name__ == '__main__': diff --git a/src/op_mode/dynamic_dns.py b/src/op_mode/dynamic_dns.py index 263a3b6a5..2cba33cc8 100755 --- a/src/op_mode/dynamic_dns.py +++ b/src/op_mode/dynamic_dns.py @@ -16,69 +16,63 @@  import os  import argparse -import jinja2  import sys  import time +from tabulate import tabulate  from vyos.config import Config  from vyos.util import call  cache_file = r'/run/ddclient/ddclient.cache' -OUT_TMPL_SRC = """ -{% for entry in hosts %} -ip address   : {{ entry.ip }} -host-name    : {{ entry.host }} -last update  : {{ entry.time }} -update-status: {{ entry.status }} +columns = { +    'host':        'Hostname', +    'ipv4':        'IPv4 address', +    'status-ipv4': 'IPv4 status', +    'ipv6':        'IPv6 address', +    'status-ipv6': 'IPv6 status', +    'mtime':       'Last update', +} + + +def _get_formatted_host_records(host_data): +    data_entries = [] +    for entry in host_data: +        data_entries.append([entry.get(key) for key in columns.keys()]) + +    header = columns.values() +    output = tabulate(data_entries, header, numalign='left') +    return output -{% endfor %} -"""  def show_status():      # A ddclient status file must not always exist      if not os.path.exists(cache_file):          sys.exit(0) -    data = { -        'hosts': [] -    } +    data = []      with open(cache_file, 'r') as f:          for line in f:              if line.startswith('#'):                  continue -            outp = { -                'host': '', -                'ip': '', -                'time': '' -            } - -            if 'host=' in line: -                host = line.split('host=')[1] -                if host: -                    outp['host'] = host.split(',')[0] - -            if 'ip=' in line: -                ip = line.split('ip=')[1] -                if ip: -                    outp['ip'] = ip.split(',')[0] - -            if 'mtime=' in line: -                mtime = line.split('mtime=')[1] -                if mtime: -                    outp['time'] = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(int(mtime.split(',')[0], base=10))) +            props = {} +            # ddclient cache rows have properties in 'key=value' format separated by comma +            # we pick up the ones we are interested in +            for kvraw in line.split(' ')[0].split(','): +                k, v = kvraw.split('=') +                if k in columns.keys(): +                    props[k] = v -            if 'status=' in line: -                status = line.split('status=')[1] -                if status: -                    outp['status'] = status.split(',')[0] +            # Convert mtime to human readable format +            if 'mtime' in props: +                props['mtime'] = time.strftime( +                    "%Y-%m-%d %H:%M:%S", time.localtime(int(props['mtime'], base=10))) -            data['hosts'].append(outp) +            data.append(props) -    tmpl = jinja2.Template(OUT_TMPL_SRC) -    print(tmpl.render(data)) +    print(_get_formatted_host_records(data))  def update_ddns(): diff --git a/src/op_mode/openvpn.py b/src/op_mode/openvpn.py index 37fdbcbeb..d9ae965c5 100755 --- a/src/op_mode/openvpn.py +++ b/src/op_mode/openvpn.py @@ -16,6 +16,7 @@  #  # +import json  import os  import sys  import typing @@ -25,6 +26,7 @@ import vyos.opmode  from vyos.util import bytes_to_human  from vyos.util import commit_in_progress  from vyos.util import call +from vyos.util import rc_cmd  from vyos.config import Config  ArgMode = typing.Literal['client', 'server', 'site_to_site'] @@ -63,7 +65,7 @@ def _get_interface_status(mode: str, interface: str) -> dict:      }      if not os.path.exists(status_file): -        raise vyos.opmode.DataUnavailable('No information for interface {interface}') +        return data      with open(status_file, 'r') as f:          lines = f.readlines() @@ -142,6 +144,25 @@ def _get_interface_status(mode: str, interface: str) -> dict:      return data + +def _get_interface_state(iface): +    rc, out = rc_cmd(f'ip --json link show dev {iface}') +    try: +        data = json.loads(out) +    except: +        return 'DOWN' +    return data[0].get('operstate', 'DOWN') + + +def _get_interface_description(iface): +    rc, out = rc_cmd(f'ip --json link show dev {iface}') +    try: +        data = json.loads(out) +    except: +        return '' +    return data[0].get('ifalias', '') + +  def _get_raw_data(mode: str) -> list:      data: list = []      conf = Config() @@ -154,6 +175,8 @@ def _get_raw_data(mode: str) -> list:                    conf_dict[x]['mode'].replace('-', '_') == mode]      for intf in interfaces:          d = _get_interface_status(mode, intf) +        d['state'] = _get_interface_state(intf) +        d['description'] = _get_interface_description(intf)          d['local_host'] = conf_dict[intf].get('local-host', '')          d['local_port'] = conf_dict[intf].get('local-port', '')          if conf.exists(f'interfaces openvpn {intf} server client'): diff --git a/src/op_mode/sflow.py b/src/op_mode/sflow.py index ddb8bf44d..88f70d6bd 100755 --- a/src/op_mode/sflow.py +++ b/src/op_mode/sflow.py @@ -37,11 +37,12 @@ def _get_raw_sflow():          sflow, dbus_interface='net.sflow.hsflowd.telemetry')      agent_address = sflow_telemetry.GetAgent()      samples_dropped = int(sflow_telemetry.Get('dropped_samples')) -    samples_drop_events_sent = int(sflow_telemetry.Get('event_samples')) +    packet_drop_sent = int(sflow_telemetry.Get('event_samples'))      samples_packet_sent = int(sflow_telemetry.Get('flow_samples'))      samples_counter_sent = int(sflow_telemetry.Get('counter_samples'))      datagrams_sent = int(sflow_telemetry.Get('datagrams'))      rtmetric_samples = int(sflow_telemetry.Get('rtmetric_samples')) +    event_samples_suppressed = int(sflow_telemetry.Get('event_samples_suppressed'))      samples_suppressed = int(sflow_telemetry.Get('flow_samples_suppressed'))      counter_samples_suppressed = int(          sflow_telemetry.Get("counter_samples_suppressed")) @@ -53,10 +54,11 @@ def _get_raw_sflow():          'sflow_servers': servers,          'counter_samples_sent': samples_counter_sent,          'datagrams_sent': datagrams_sent, -        'samples_drop_events_sent': samples_drop_events_sent, +        'packet_drop_sent': packet_drop_sent,          'packet_samples_dropped': samples_dropped,          'packet_samples_sent': samples_packet_sent,          'rtmetric_samples': rtmetric_samples, +        'event_samples_suppressed': event_samples_suppressed,          'flow_samples_suppressed': samples_suppressed,          'counter_samples_suppressed': counter_samples_suppressed,          'hsflowd_version': version @@ -73,7 +75,8 @@ def _get_formatted_sflow(data):          ['Datagrams sent', f'{data.get("datagrams_sent")}'],          ['Packet samples sent', f'{data.get("packet_samples_sent")}'],          ['Packet samples dropped', f'{data.get("packet_samples_dropped")}'], -        ['Samples drop events sent', f'{data.get("samples_drop_events_sent")}'], +        ['Packet drops sent', f'{data.get("packet_drop_sent")}'], +        ['Packet drops suppressed', f'{data.get("event_samples_suppressed")}'],          ['Flow samples suppressed', f'{data.get("flow_samples_suppressed")}'],          ['Counter samples suppressed', f'{data.get("counter_samples_suppressed")}']      ] | 
