diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/dhcp_relay.py | 15 | ||||
| -rwxr-xr-x | src/conf_mode/protocols_bgp.py | 5 | ||||
| -rwxr-xr-x | src/conf_mode/qos.py | 15 | ||||
| -rwxr-xr-x | src/etc/commit/post-hooks.d/00vyos-sync | 7 | ||||
| -rw-r--r-- | src/services/api/graphql/generate/config_session_function.py | 6 | ||||
| -rw-r--r-- | src/services/api/graphql/session/session.py | 27 | 
6 files changed, 70 insertions, 5 deletions
diff --git a/src/conf_mode/dhcp_relay.py b/src/conf_mode/dhcp_relay.py index 4de2ca2f3..7e702a446 100755 --- a/src/conf_mode/dhcp_relay.py +++ b/src/conf_mode/dhcp_relay.py @@ -18,9 +18,11 @@ import os  from sys import exit +from vyos.base import Warning  from vyos.config import Config  from vyos.configdict import dict_merge  from vyos.template import render +from vyos.base import Warning  from vyos.util import call  from vyos.util import dict_search  from vyos.xml import defaults @@ -59,6 +61,19 @@ def verify(relay):          raise ConfigError('No DHCP relay server(s) configured.\n' \                            'At least one DHCP relay server required.') +    if 'interface' in relay: +        Warning('DHCP relay interface is DEPRECATED - please use upstream-interface and listen-interface instead!') +        if 'upstream_interface' in relay or 'listen_interface' in relay: +            raise ConfigError('<interface> configuration is not compatible with upstream/listen interface') +        else: +            Warning('<interface> is going to be deprecated.\n'  \ +                    'Please use <listen-interface> and <upstream-interface>') + +    if 'upstream_interface' in relay and 'listen_interface' not in relay: +        raise ConfigError('No listen-interface configured') +    if 'listen_interface' in relay and 'upstream_interface' not in relay: +        raise ConfigError('No upstream-interface configured') +      return None  def generate(relay): diff --git a/src/conf_mode/protocols_bgp.py b/src/conf_mode/protocols_bgp.py index c410258ee..4f05957fa 100755 --- a/src/conf_mode/protocols_bgp.py +++ b/src/conf_mode/protocols_bgp.py @@ -235,6 +235,11 @@ def verify(bgp):                      raise ConfigError(f'Specified peer-group "{peer_group}" for '\                                        f'neighbor "{neighbor}" does not exist!') +            if 'local_role' in peer_config: +                #Ensure Local Role has only one value. +                if len(peer_config['local_role']) > 1: +                    raise ConfigError(f'Only one local role can be specified for peer "{peer}"!') +              if 'local_as' in peer_config:                  if len(peer_config['local_as']) > 1:                      raise ConfigError(f'Only one local-as number can be specified for peer "{peer}"!') diff --git a/src/conf_mode/qos.py b/src/conf_mode/qos.py index 0418e8d82..dca713283 100755 --- a/src/conf_mode/qos.py +++ b/src/conf_mode/qos.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2022 VyOS maintainers and contributors +# Copyright (C) 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 @@ -14,12 +14,14 @@  # You should have received a copy of the GNU General Public License  # along with this program. If not, see <http://www.gnu.org/licenses/>. +import os +  from sys import exit  from netifaces import interfaces +from vyos.base import Warning  from vyos.config import Config  from vyos.configdict import dict_merge -from vyos.configverify import verify_interface_exists  from vyos.qos import CAKE  from vyos.qos import DropTail  from vyos.qos import FairQueue @@ -194,8 +196,6 @@ def verify(qos):      # we should check interface ingress/egress configuration after verifying that      # the policy name is used only once - this makes the logic easier!      for interface, interface_config in qos['interface'].items(): -        verify_interface_exists(interface) -          for direction in ['egress', 'ingress']:              # bail out early if shaper for given direction is not used at all              if direction not in interface_config: @@ -229,6 +229,13 @@ def apply(qos):          return None      for interface, interface_config in qos['interface'].items(): +        if not os.path.exists(f'/sys/class/net/{interface}'): +            # When shaper is bound to a dialup (e.g. PPPoE) interface it is +            # possible that it is yet not availbale when to QoS code runs. +            # Skip the configuration and inform the user +            Warning(f'Interface "{interface}" does not exist!') +            continue +          for direction in ['egress', 'ingress']:              # bail out early if shaper for given direction is not used at all              if direction not in interface_config: diff --git a/src/etc/commit/post-hooks.d/00vyos-sync b/src/etc/commit/post-hooks.d/00vyos-sync new file mode 100755 index 000000000..e3bde3abb --- /dev/null +++ b/src/etc/commit/post-hooks.d/00vyos-sync @@ -0,0 +1,7 @@ +#!/bin/sh +# When power is lost right after a commit modified files, the +# system can be corrupted and e.g. login is no longer possible. +# Always sync files to the backend storage after a commit. +# https://phabricator.vyos.net/T4975 +sync + diff --git a/src/services/api/graphql/generate/config_session_function.py b/src/services/api/graphql/generate/config_session_function.py index fc0dd7a87..20fc7cc1d 100644 --- a/src/services/api/graphql/generate/config_session_function.py +++ b/src/services/api/graphql/generate/config_session_function.py @@ -8,8 +8,12 @@ def show_config(path: list[str], configFormat: typing.Optional[str]):  def show(path: list[str]):      pass +def show_user_info(user: str): +    pass +  queries = {'show_config': show_config, -           'show': show} +           'show': show, +           'show_user_info': show_user_info}  def save_config_file(fileName: typing.Optional[str]):      pass diff --git a/src/services/api/graphql/session/session.py b/src/services/api/graphql/session/session.py index 0b77b1433..b2aef9bd9 100644 --- a/src/services/api/graphql/session/session.py +++ b/src/services/api/graphql/session/session.py @@ -46,6 +46,17 @@ class Session:          except Exception:              self._op_mode_list = None +    @staticmethod +    def _get_config_dict(path=[], effective=False, key_mangling=None, +                         get_first_key=False, no_multi_convert=False, +                         no_tag_node_value_mangle=False): +        config = Config() +        return config.get_config_dict(path=path, effective=effective, +                                      key_mangling=key_mangling, +                                      get_first_key=get_first_key, +                                      no_multi_convert=no_multi_convert, +                                      no_tag_node_value_mangle=no_tag_node_value_mangle) +      def show_config(self):          session = self._session          data = self._data @@ -116,6 +127,22 @@ class Session:          return res +    def show_user_info(self): +        session = self._session +        data = self._data + +        user_info = {} +        user = data['user'] +        try: +            info = self._get_config_dict(['system', 'login', 'user', user, +                                          'full-name']) +            user_info['user'] = user +            user_info['full_name'] = info.get('full-name', '') +        except Exception as error: +            raise error + +        return user_info +      def system_status(self):          import api.graphql.session.composite.system_status as system_status  | 
