diff options
42 files changed, 185 insertions, 107 deletions
| diff --git a/interface-definitions/include/version/interfaces-version.xml.i b/interface-definitions/include/version/interfaces-version.xml.i index a351515f1..e5e81d316 100644 --- a/interface-definitions/include/version/interfaces-version.xml.i +++ b/interface-definitions/include/version/interfaces-version.xml.i @@ -1,3 +1,3 @@  <!-- include start from include/version/interfaces-version.xml.i --> -<syntaxVersion component='interfaces' version='27'></syntaxVersion> +<syntaxVersion component='interfaces' version='28'></syntaxVersion>  <!-- include end --> diff --git a/interface-definitions/interfaces-tunnel.xml.in b/interface-definitions/interfaces-tunnel.xml.in index 17fe1e285..58f95dddb 100644 --- a/interface-definitions/interfaces-tunnel.xml.in +++ b/interface-definitions/interfaces-tunnel.xml.in @@ -106,24 +106,10 @@              </properties>            </leafNode>            #include <include/interface/mirror.xml.i> -          <leafNode name="multicast"> +          <leafNode name="enable-multicast">              <properties> -              <help>Multicast operation over tunnel</help> -              <completionHelp> -                <list>enable disable</list> -              </completionHelp> -              <valueHelp> -                <format>enable</format> -                <description>Enable multicast</description> -              </valueHelp> -              <valueHelp> -                <format>disable</format> -                <description>Disable multicast (default)</description> -              </valueHelp> -              <constraint> -                <regex>(enable|disable)</regex> -              </constraint> -              <constraintErrorMessage>Must be 'disable' or 'enable'</constraintErrorMessage> +              <help>Enable multicast operation over tunnel</help> +              <valueless/>              </properties>            </leafNode>            <node name="parameters"> diff --git a/op-mode-definitions/dhcp.xml.in b/op-mode-definitions/dhcp.xml.in index 419abe7ad..66584efc3 100644 --- a/op-mode-definitions/dhcp.xml.in +++ b/op-mode-definitions/dhcp.xml.in @@ -175,7 +175,7 @@              <properties>                <help>Renew DHCP client lease for specified interface</help>                <completionHelp> -                <script>${vyos_completion_dir}/list_interfaces.py</script> +                <script>${vyos_completion_dir}/list_interfaces</script>                </completionHelp>              </properties>              <command>sudo systemctl restart "dhclient@$4.service"</command> @@ -191,7 +191,7 @@              <properties>                <help>Renew DHCPv6 client lease for specified interface</help>                <completionHelp> -                <script>${vyos_completion_dir}/list_interfaces.py</script> +                <script>${vyos_completion_dir}/list_interfaces</script>                </completionHelp>              </properties>              <command>sudo systemctl restart "dhcp6c@$4.service"</command> diff --git a/op-mode-definitions/flow-accounting-op.xml.in b/op-mode-definitions/flow-accounting-op.xml.in index 7aaae5974..46dc77d05 100644 --- a/op-mode-definitions/flow-accounting-op.xml.in +++ b/op-mode-definitions/flow-accounting-op.xml.in @@ -13,7 +13,7 @@              <properties>                <help>Show flow accounting statistics for specified interface</help>                <completionHelp> -                <script>${vyos_completion_dir}/list_interfaces.py</script> +                <script>${vyos_completion_dir}/list_interfaces</script>                </completionHelp>              </properties>              <command>${vyos_op_scripts_dir}/flow_accounting_op.py --action show --interface $4</command> diff --git a/op-mode-definitions/force-arp.xml.in b/op-mode-definitions/force-arp.xml.in index f9f7c7643..05aa04e6b 100644 --- a/op-mode-definitions/force-arp.xml.in +++ b/op-mode-definitions/force-arp.xml.in @@ -19,7 +19,7 @@                  <properties>                    <help>Send gratuitous ARP reply on specified interface</help>                    <completionHelp> -                    <script>${vyos_completion_dir}/list_interfaces.py --broadcast</script> +                    <script>${vyos_completion_dir}/list_interfaces --broadcast</script>                    </completionHelp>                  </properties>                  <children> @@ -50,7 +50,7 @@                  <properties>                    <help>Send gratuitous ARP request on specified interface</help>                    <completionHelp> -                    <script>${vyos_completion_dir}/list_interfaces.py --broadcast</script> +                    <script>${vyos_completion_dir}/list_interfaces --broadcast</script>                    </completionHelp>                  </properties>                  <children> @@ -81,7 +81,7 @@                  <properties>                    <help>Send ARP for DAD detection on specified interface</help>                    <completionHelp> -                    <script>${vyos_completion_dir}/list_interfaces.py --broadcast</script> +                    <script>${vyos_completion_dir}/list_interfaces --broadcast</script>                    </completionHelp>                  </properties>                  <children> diff --git a/op-mode-definitions/force-ipv6-nd.xml.in b/op-mode-definitions/force-ipv6-nd.xml.in index 49de097f6..664fee4fb 100644 --- a/op-mode-definitions/force-ipv6-nd.xml.in +++ b/op-mode-definitions/force-ipv6-nd.xml.in @@ -11,7 +11,7 @@              <properties>                <help>IPv6 Neighbor Discovery on specified interface</help>                <completionHelp> -                <script>${vyos_completion_dir}/list_interfaces.py</script> +                <script>${vyos_completion_dir}/list_interfaces</script>                </completionHelp>              </properties>              <children> diff --git a/op-mode-definitions/force-ipv6-rd.xml.in b/op-mode-definitions/force-ipv6-rd.xml.in index 8c901af25..c81b81a49 100644 --- a/op-mode-definitions/force-ipv6-rd.xml.in +++ b/op-mode-definitions/force-ipv6-rd.xml.in @@ -11,7 +11,7 @@              <properties>                <help>IPv6 Router Discovery on specified interface</help>                <completionHelp> -                <script>${vyos_completion_dir}/list_interfaces.py</script> +                <script>${vyos_completion_dir}/list_interfaces</script>                </completionHelp>              </properties>              <command>/usr/bin/rdisc6 "$4"</command> diff --git a/op-mode-definitions/force-mtu-host.xml.in b/op-mode-definitions/force-mtu-host.xml.in index b92179f11..56241678a 100644 --- a/op-mode-definitions/force-mtu-host.xml.in +++ b/op-mode-definitions/force-mtu-host.xml.in @@ -20,7 +20,7 @@                  <properties>                    <help>Source interface</help>                    <completionHelp> -                    <script>${vyos_completion_dir}/list_interfaces.py</script> +                    <script>${vyos_completion_dir}/list_interfaces</script>                    </completionHelp>                  </properties>                  <command>${vyos_op_scripts_dir}/force_mtu_host.sh $4 $6</command> diff --git a/op-mode-definitions/generate-openvpn-config-client.xml.in b/op-mode-definitions/generate-openvpn-config-client.xml.in index baec0842b..fc8bfa346 100644 --- a/op-mode-definitions/generate-openvpn-config-client.xml.in +++ b/op-mode-definitions/generate-openvpn-config-client.xml.in @@ -16,7 +16,7 @@                  <properties>                    <help>Local interface used for connection</help>                    <completionHelp> -                    <path>interfaces openvpn</path> +                    <script>${vyos_completion_dir}/list_interfaces --type openvpn</script>                    </completionHelp>                  </properties>                  <children> diff --git a/op-mode-definitions/generate-wireguard.xml.in b/op-mode-definitions/generate-wireguard.xml.in index 6c01619be..1dcafcd8b 100644 --- a/op-mode-definitions/generate-wireguard.xml.in +++ b/op-mode-definitions/generate-wireguard.xml.in @@ -19,7 +19,7 @@                  <properties>                    <help>Local interface used for connection</help>                    <completionHelp> -                    <path>interfaces wireguard</path> +                    <script>${vyos_completion_dir}/list_interfaces --type wireguard</script>                    </completionHelp>                  </properties>                  <children> diff --git a/op-mode-definitions/include/isis-common.xml.i b/op-mode-definitions/include/isis-common.xml.i index 5674bc22f..95a171515 100644 --- a/op-mode-definitions/include/isis-common.xml.i +++ b/op-mode-definitions/include/isis-common.xml.i @@ -32,7 +32,7 @@    <properties>      <help>Show IS-IS interfaces</help>      <completionHelp> -      <script>${vyos_completion_dir}/list_interfaces.py</script> +      <script>${vyos_completion_dir}/list_interfaces</script>      </completionHelp>    </properties>    <children> @@ -49,7 +49,7 @@    <properties>      <help>Show specific IS-IS interface</help>      <completionHelp> -      <script>${vyos_completion_dir}/list_interfaces.py</script> +      <script>${vyos_completion_dir}/list_interfaces</script>      </completionHelp>    </properties>    <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> @@ -75,7 +75,7 @@        <properties>          <help>Show specific IS-IS interface</help>          <completionHelp> -          <script>${vyos_completion_dir}/list_interfaces.py</script> +          <script>${vyos_completion_dir}/list_interfaces</script>          </completionHelp>        </properties>        <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> diff --git a/op-mode-definitions/include/ospf-common.xml.i b/op-mode-definitions/include/ospf-common.xml.i index 23769c8ba..098254f4e 100644 --- a/op-mode-definitions/include/ospf-common.xml.i +++ b/op-mode-definitions/include/ospf-common.xml.i @@ -512,7 +512,7 @@    <properties>      <help>Show IPv4 OSPF information for specified interface</help>      <completionHelp> -      <script>${vyos_completion_dir}/list_interfaces.py</script> +      <script>${vyos_completion_dir}/list_interfaces</script>      </completionHelp>    </properties>    <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> @@ -536,7 +536,7 @@      <help>Show IPv4 OSPF neighbor information for specified IP address or interface</help>      <completionHelp>        <list><x.x.x.x></list> -      <script>${vyos_completion_dir}/list_interfaces.py</script> +      <script>${vyos_completion_dir}/list_interfaces</script>      </completionHelp>    </properties>    <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> diff --git a/op-mode-definitions/include/ospfv3/interface.xml.i b/op-mode-definitions/include/ospfv3/interface.xml.i index 0fb66257d..7a0b8ea48 100644 --- a/op-mode-definitions/include/ospfv3/interface.xml.i +++ b/op-mode-definitions/include/ospfv3/interface.xml.i @@ -38,7 +38,7 @@    <properties>      <help>Specific insterface to examine</help>      <completionHelp> -      <script>${vyos_completion_dir}/list_interfaces.py</script> +      <script>${vyos_completion_dir}/list_interfaces</script>      </completionHelp>    </properties>    <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> diff --git a/op-mode-definitions/ipv4-route.xml.in b/op-mode-definitions/ipv4-route.xml.in index 660b34496..17a0a4ad9 100644 --- a/op-mode-definitions/ipv4-route.xml.in +++ b/op-mode-definitions/ipv4-route.xml.in @@ -45,7 +45,7 @@                  <properties>                    <help>Reset ARP cache for interface</help>                    <completionHelp> -                    <script>${vyos_completion_dir}/list_interfaces.py</script> +                    <script>${vyos_completion_dir}/list_interfaces</script>                    </completionHelp>                  </properties>                  <command>sudo ${vyos_op_scripts_dir}/neighbor.py reset --family inet --interface "$5"</command> diff --git a/op-mode-definitions/ipv6-route.xml.in b/op-mode-definitions/ipv6-route.xml.in index 46e416a8a..5ed0b9dba 100644 --- a/op-mode-definitions/ipv6-route.xml.in +++ b/op-mode-definitions/ipv6-route.xml.in @@ -26,7 +26,7 @@                  <properties>                    <help>Show IPv6 neighbor table for specified interface</help>                    <completionHelp> -                    <script>${vyos_completion_dir}/list_interfaces.py --broadcast</script> +                    <script>${vyos_completion_dir}/list_interfaces --broadcast</script>                    </completionHelp>                  </properties>                  <command>${vyos_op_scripts_dir}/neighbor.py show --family inet6 --interface "$5"</command> @@ -71,7 +71,7 @@                  <properties>                    <help>Reset IPv6 ND cache for interface</help>                    <completionHelp> -                    <script>${vyos_completion_dir}/list_interfaces.py</script> +                    <script>${vyos_completion_dir}/list_interfaces</script>                    </completionHelp>                  </properties>                  <command>sudo ip -f inet6 neigh flush dev "$5"</command> diff --git a/op-mode-definitions/lldp.xml.in b/op-mode-definitions/lldp.xml.in index 07cafa77f..985262a89 100644 --- a/op-mode-definitions/lldp.xml.in +++ b/op-mode-definitions/lldp.xml.in @@ -17,7 +17,7 @@                  <properties>                    <help>Show LLDP for specified interface</help>                    <completionHelp> -                    <script>${vyos_completion_dir}/list_interfaces.py</script> +                    <script>${vyos_completion_dir}/list_interfaces</script>                    </completionHelp>                  </properties>                  <command>${vyos_op_scripts_dir}/lldp.py show_neighbors --interface $5</command> diff --git a/op-mode-definitions/monitor-bandwidth.xml.in b/op-mode-definitions/monitor-bandwidth.xml.in index 9af0a9e70..2da9d34f4 100644 --- a/op-mode-definitions/monitor-bandwidth.xml.in +++ b/op-mode-definitions/monitor-bandwidth.xml.in @@ -12,7 +12,7 @@              <properties>                <help>Monitor bandwidth usage on specified interface</help>                <completionHelp> -                <script>${vyos_completion_dir}/list_interfaces.py</script> +                <script>${vyos_completion_dir}/list_interfaces</script>                </completionHelp>              </properties>            </tagNode> diff --git a/op-mode-definitions/monitor-log.xml.in b/op-mode-definitions/monitor-log.xml.in index d5892398b..06b1cf129 100644 --- a/op-mode-definitions/monitor-log.xml.in +++ b/op-mode-definitions/monitor-log.xml.in @@ -48,7 +48,7 @@                      <properties>                        <help>Show DHCP client log on specific interface</help>                        <completionHelp> -                        <script>${vyos_completion_dir}/list_interfaces.py --broadcast</script> +                        <script>${vyos_completion_dir}/list_interfaces --broadcast</script>                        </completionHelp>                      </properties>                      <command>journalctl --no-hostname --follow --boot --unit "dhclient@$6.service"</command> @@ -78,7 +78,7 @@                      <properties>                        <help>Show DHCPv6 client log on specific interface</help>                        <completionHelp> -                        <script>${vyos_completion_dir}/list_interfaces.py</script> +                        <script>${vyos_completion_dir}/list_interfaces</script>                        </completionHelp>                      </properties>                      <command>journalctl --no-hostname --follow --boot --unit "dhcp6c@$6.service"</command> diff --git a/op-mode-definitions/monitor-ndp.xml.in b/op-mode-definitions/monitor-ndp.xml.in index 1ac6ce39b..26d881f1a 100644 --- a/op-mode-definitions/monitor-ndp.xml.in +++ b/op-mode-definitions/monitor-ndp.xml.in @@ -13,7 +13,7 @@              <properties>                <help>Monitor ndp protocol on specified interface</help>                <completionHelp> -                <script>${vyos_completion_dir}/list_interfaces.py</script> +                <script>${vyos_completion_dir}/list_interfaces</script>                </completionHelp>              </properties>              <children> diff --git a/op-mode-definitions/openvpn.xml.in b/op-mode-definitions/openvpn.xml.in index 0a2657398..0aa9c3209 100644 --- a/op-mode-definitions/openvpn.xml.in +++ b/op-mode-definitions/openvpn.xml.in @@ -20,7 +20,7 @@              <properties>                <help>Reset OpenVPN process on interface</help>                <completionHelp> -                <path>interfaces openvpn</path> +                <script>sudo ${vyos_completion_dir}/list_interfaces --type openvpn</script>                </completionHelp>              </properties>              <command>sudo ${vyos_op_scripts_dir}/openvpn.py reset --interface $4</command> @@ -51,7 +51,7 @@              <properties>                <help>Show OpenVPN interface information</help>                <completionHelp> -                <path>interfaces openvpn</path> +                <script>sudo ${vyos_completion_dir}/list_interfaces --type openvpn</script>                </completionHelp>              </properties>              <command>${vyos_op_scripts_dir}/interfaces.py show --intf_name=$4</command> diff --git a/op-mode-definitions/show-arp.xml.in b/op-mode-definitions/show-arp.xml.in index 3680c20c6..84170f070 100644 --- a/op-mode-definitions/show-arp.xml.in +++ b/op-mode-definitions/show-arp.xml.in @@ -12,7 +12,7 @@              <properties>                <help>Show Address Resolution Protocol (ARP) cache for specified interface</help>                <completionHelp> -                <script>${vyos_completion_dir}/list_interfaces.py --broadcast</script> +                <script>${vyos_completion_dir}/list_interfaces --broadcast</script>                </completionHelp>              </properties>              <command>${vyos_op_scripts_dir}/neighbor.py show --family inet --interface "$4"</command> diff --git a/op-mode-definitions/show-bridge.xml.in b/op-mode-definitions/show-bridge.xml.in index e7a646fdc..acf3a00c7 100644 --- a/op-mode-definitions/show-bridge.xml.in +++ b/op-mode-definitions/show-bridge.xml.in @@ -25,7 +25,7 @@          <properties>            <help>Show bridge information for a given bridge interface</help>            <completionHelp> -            <path>interfaces bridge</path> +            <script>${vyos_completion_dir}/list_interfaces --type bridge</script>            </completionHelp>          </properties>          <command>bridge -c link show | grep "master $3"</command> diff --git a/op-mode-definitions/show-interfaces-wireguard.xml.in b/op-mode-definitions/show-interfaces-wireguard.xml.in index 75b0cc88e..d045beafc 100644 --- a/op-mode-definitions/show-interfaces-wireguard.xml.in +++ b/op-mode-definitions/show-interfaces-wireguard.xml.in @@ -8,7 +8,7 @@              <properties>                <help>Show specified WireGuard interface information</help>                <completionHelp> -                <path>interfaces wireguard</path> +                <script>${vyos_completion_dir}/list_interfaces --type wireguard</script>                </completionHelp>              </properties>  	        <command>${vyos_op_scripts_dir}/interfaces.py show --intf_name="$4" --intf_type=wireguard</command> diff --git a/op-mode-definitions/show-interfaces-wireless.xml.in b/op-mode-definitions/show-interfaces-wireless.xml.in index cdd591f82..f39d402f1 100644 --- a/op-mode-definitions/show-interfaces-wireless.xml.in +++ b/op-mode-definitions/show-interfaces-wireless.xml.in @@ -28,7 +28,7 @@              <properties>                <help>Show specified wireless interface information</help>                <completionHelp> -                <path>interfaces wireless</path> +                <script>${vyos_completion_dir}/list_interfaces --type wireless</script>                </completionHelp>              </properties>              <command>${vyos_op_scripts_dir}/interfaces.py show --intf_name="$4" --intf_type=wireless</command> diff --git a/op-mode-definitions/show-ip.xml.in b/op-mode-definitions/show-ip.xml.in index a710e33d2..d5dbb7850 100644 --- a/op-mode-definitions/show-ip.xml.in +++ b/op-mode-definitions/show-ip.xml.in @@ -17,7 +17,7 @@                  <properties>                    <help>Show IPv4 neighbor table for specified interface</help>                    <completionHelp> -                    <script>${vyos_completion_dir}/list_interfaces.py --broadcast</script> +                    <script>${vyos_completion_dir}/list_interfaces --broadcast</script>                    </completionHelp>                  </properties>                  <command>${vyos_op_scripts_dir}/neighbor.py show --family inet --interface "$5"</command> diff --git a/op-mode-definitions/show-log.xml.in b/op-mode-definitions/show-log.xml.in index c626e45fb..7f6469ca9 100644 --- a/op-mode-definitions/show-log.xml.in +++ b/op-mode-definitions/show-log.xml.in @@ -66,7 +66,7 @@                      <properties>                        <help>Show DHCP client log on specific interface</help>                        <completionHelp> -                        <script>${vyos_completion_dir}/list_interfaces.py --broadcast</script> +                        <script>${vyos_completion_dir}/list_interfaces --broadcast</script>                        </completionHelp>                      </properties>                      <command>journalctl --no-hostname --boot --unit "dhclient@$6.service"</command> @@ -96,7 +96,7 @@                      <properties>                        <help>Show DHCPv6 client log on specific interface</help>                        <completionHelp> -                        <script>${vyos_completion_dir}/list_interfaces.py</script> +                        <script>${vyos_completion_dir}/list_interfaces</script>                        </completionHelp>                      </properties>                      <command>journalctl --no-hostname --boot --unit "dhcp6c@$6.service"</command> diff --git a/op-mode-definitions/show-protocols.xml.in b/op-mode-definitions/show-protocols.xml.in index 27146f90d..8f98f3a4c 100644 --- a/op-mode-definitions/show-protocols.xml.in +++ b/op-mode-definitions/show-protocols.xml.in @@ -22,7 +22,7 @@                      <properties>                        <help>Show Address Resolution Protocol (ARP) cache for specified interface</help>                        <completionHelp> -                        <script>${vyos_completion_dir}/list_interfaces.py --broadcast</script> +                        <script>${vyos_completion_dir}/list_interfaces --broadcast</script>                        </completionHelp>                      </properties>                      <command>/usr/sbin/arp -e -n -i "$6"</command> diff --git a/op-mode-definitions/snmp.xml.in b/op-mode-definitions/snmp.xml.in index a0a47da40..894005e7b 100644 --- a/op-mode-definitions/snmp.xml.in +++ b/op-mode-definitions/snmp.xml.in @@ -39,7 +39,7 @@                      <properties>                        <help>Show SNMP ifAlias for specified interface</help>                        <completionHelp> -                        <script>${vyos_completion_dir}/list_interfaces.py</script> +                        <script>${vyos_completion_dir}/list_interfaces</script>                        </completionHelp>                      </properties>                      <command>${vyos_op_scripts_dir}/snmp_ifmib.py --ifalias="$6"</command> @@ -48,7 +48,7 @@                      <properties>                        <help>Show SNMP ifDescr for specified interface</help>                        <completionHelp> -                        <script>${vyos_completion_dir}/list_interfaces.py</script> +                        <script>${vyos_completion_dir}/list_interfaces</script>                        </completionHelp>                      </properties>                      <command>${vyos_op_scripts_dir}/snmp_ifmib.py --ifdescr="$6"</command> @@ -57,7 +57,7 @@                      <properties>                        <help>Show SNMP ifDescr for specified interface</help>                        <completionHelp> -                        <script>${vyos_completion_dir}/list_interfaces.py</script> +                        <script>${vyos_completion_dir}/list_interfaces</script>                        </completionHelp>                      </properties>                      <command>${vyos_op_scripts_dir}/snmp_ifmib.py --ifindex="$6"</command> diff --git a/op-mode-definitions/wake-on-lan.xml.in b/op-mode-definitions/wake-on-lan.xml.in index 1a9b88596..7119eeb65 100644 --- a/op-mode-definitions/wake-on-lan.xml.in +++ b/op-mode-definitions/wake-on-lan.xml.in @@ -9,7 +9,7 @@          <properties>            <help>Interface where the station is connected</help>            <completionHelp> -            <script>${vyos_completion_dir}/list_interfaces.py</script> +            <script>${vyos_completion_dir}/list_interfaces</script>            </completionHelp>          </properties>          <children> diff --git a/op-mode-definitions/wireless.xml.in b/op-mode-definitions/wireless.xml.in index f8e53ad21..25809e0b8 100644 --- a/op-mode-definitions/wireless.xml.in +++ b/op-mode-definitions/wireless.xml.in @@ -21,7 +21,7 @@              <properties>                <help>Clear interface information for a given wireless interface</help>                <completionHelp> -                <path>interfaces wireless</path> +                <script>${vyos_completion_dir}/list_interfaces --type wireless</script>                </completionHelp>              </properties>              <children> diff --git a/python/vyos/ifconfig/tunnel.py b/python/vyos/ifconfig/tunnel.py index f776240a1..b7bf7d982 100644 --- a/python/vyos/ifconfig/tunnel.py +++ b/python/vyos/ifconfig/tunnel.py @@ -83,11 +83,6 @@ class TunnelIf(Interface):                  'convert': enable_to_on,                  'shellcmd': 'ip link set dev {ifname} multicast {value}',              }, -            'allmulticast': { -                'validate': lambda v: assert_list(v, ['enable', 'disable']), -                'convert': enable_to_on, -                'shellcmd': 'ip link set dev {ifname} allmulticast {value}', -            },          }      } @@ -162,14 +157,9 @@ class TunnelIf(Interface):          """ Get a synthetic MAC address. """          return self.get_mac_synthetic() -    def set_multicast(self): -        """ Set multicast """ -        if self.config.get('multicast', 'disable') == 'enable': -            cmd = 'ip link set dev {ifname} multicast on' -        else: -            cmd = 'ip link set dev {ifname} multicast off' - -        self._cmd(cmd.format(**self.config)) +    def set_multicast(self, enable): +        """ Change the MULTICAST flag on the device """ +        return self.set_interface('multicast', enable)      def update(self, config):          """ General helper function which works on a dictionary retrived by @@ -179,8 +169,10 @@ class TunnelIf(Interface):          # Adjust iproute2 tunnel parameters if necessary          self._change_options() -        # Add multicast -        self.set_multicast() +        # IP Multicast +        tmp = dict_search('enable_multicast', config) +        value = 'enable' if (tmp != None) else 'disable' +        self.set_multicast(value)          # call base class first          super().update(config) diff --git a/smoketest/scripts/cli/test_protocols_nhrp.py b/smoketest/scripts/cli/test_protocols_nhrp.py index 59252875b..7dbe836f7 100755 --- a/smoketest/scripts/cli/test_protocols_nhrp.py +++ b/smoketest/scripts/cli/test_protocols_nhrp.py @@ -54,7 +54,7 @@ class TestProtocolsNHRP(VyOSUnitTestSHIM.TestCase):          self.cli_set(tunnel_path + [tunnel_if, "address", "172.16.253.134/29"])          self.cli_set(tunnel_path + [tunnel_if, "encapsulation", tunnel_encapsulation])          self.cli_set(tunnel_path + [tunnel_if, "source-address", tunnel_source]) -        self.cli_set(tunnel_path + [tunnel_if, "multicast", "enable"]) +        self.cli_set(tunnel_path + [tunnel_if, "enable-multicast"])          self.cli_set(tunnel_path + [tunnel_if, "parameters", "ip", "key", "1"])          # NHRP diff --git a/smoketest/scripts/cli/test_vpn_ipsec.py b/smoketest/scripts/cli/test_vpn_ipsec.py index c8634dd57..61363b853 100755 --- a/smoketest/scripts/cli/test_vpn_ipsec.py +++ b/smoketest/scripts/cli/test_vpn_ipsec.py @@ -335,7 +335,7 @@ class TestVPNIPsec(VyOSUnitTestSHIM.TestCase):          self.cli_set(tunnel_path + [tunnel_if, 'address', '172.16.253.134/29'])          self.cli_set(tunnel_path + [tunnel_if, 'encapsulation', 'gre'])          self.cli_set(tunnel_path + [tunnel_if, 'source-address', '192.0.2.1']) -        self.cli_set(tunnel_path + [tunnel_if, 'multicast', 'enable']) +        self.cli_set(tunnel_path + [tunnel_if, 'enable-multicast'])          self.cli_set(tunnel_path + [tunnel_if, 'parameters', 'ip', 'key', '1'])          # NHRP diff --git a/src/conf_mode/system-login.py b/src/conf_mode/system-login.py index 74e8827ef..0a4a88bf8 100755 --- a/src/conf_mode/system-login.py +++ b/src/conf_mode/system-login.py @@ -42,6 +42,11 @@ airbag.enable()  autologout_file = "/etc/profile.d/autologout.sh"  radius_config_file = "/etc/pam_radius_auth.conf" +# LOGIN_TIMEOUT from /etc/loign.defs minus 10 sec +MAX_RADIUS_TIMEOUT: int = 50 +# MAX_RADIUS_TIMEOUT divided by 2 sec (minimum recomended timeout) +MAX_RADIUS_COUNT: int = 25 +  def get_local_users():      """Return list of dynamically allocated users (see Debian Policy Manual)"""      local_users = [] @@ -124,18 +129,27 @@ def verify(login):      if 'radius' in login:          if 'server' not in login['radius']:              raise ConfigError('No RADIUS server defined!') - +        sum_timeout: int = 0 +        radius_servers_count: int = 0          fail = True          for server, server_config in dict_search('radius.server', login).items():              if 'key' not in server_config:                  raise ConfigError(f'RADIUS server "{server}" requires key!') - -            if 'disabled' not in server_config: +            if 'disable' not in server_config: +                sum_timeout += int(server_config['timeout']) +                radius_servers_count += 1                  fail = False -                continue +          if fail:              raise ConfigError('All RADIUS servers are disabled') +        if radius_servers_count > MAX_RADIUS_COUNT: +            raise ConfigError('Number of RADIUS servers more than 25 ') + +        if sum_timeout > MAX_RADIUS_TIMEOUT: +            raise ConfigError('Sum of RADIUS servers timeouts ' +                              'has to be less or eq 50 sec') +          verify_vrf(login['radius'])          if 'source_address' in login['radius']: diff --git a/src/conf_mode/vpn_openconnect.py b/src/conf_mode/vpn_openconnect.py index bf5d3ac84..68da70d7d 100755 --- a/src/conf_mode/vpn_openconnect.py +++ b/src/conf_mode/vpn_openconnect.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2018-2022 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 @@ -47,7 +47,7 @@ def get_hash(password):      return crypt(password, mksalt(METHOD_SHA512)) -def T2665_default_dict_cleanup(origin: dict, default_values: dict) -> dict: +def _default_dict_cleanup(origin: dict, default_values: dict) -> dict:      """      https://vyos.dev/T2665      Clear unnecessary key values in merged config by dict_merge function @@ -63,7 +63,7 @@ def T2665_default_dict_cleanup(origin: dict, default_values: dict) -> dict:          del origin['authentication']['local_users']['username']['otp']          if not origin["authentication"]["local_users"]["username"]:              raise ConfigError( -                'Openconnect mode local required at least one user') +                'Openconnect authentication mode local requires at least one user')          default_ocserv_usr_values = \          default_values['authentication']['local_users']['username']['otp']          for user, params in origin['authentication']['local_users'][ @@ -82,7 +82,7 @@ def T2665_default_dict_cleanup(origin: dict, default_values: dict) -> dict:          del origin['authentication']['radius']['server']['port']          if not origin["authentication"]['radius']['server']:              raise ConfigError( -                'Openconnect authentication mode radius required at least one radius server') +                'Openconnect authentication mode radius requires at least one RADIUS server')          default_values_radius_port = \          default_values['authentication']['radius']['server']['port']          for server, params in origin['authentication']['radius'][ @@ -95,7 +95,7 @@ def T2665_default_dict_cleanup(origin: dict, default_values: dict) -> dict:          del origin['accounting']['radius']['server']['port']          if not origin["accounting"]['radius']['server']:              raise ConfigError( -                'Openconnect accounting mode radius required at least one radius server') +                'Openconnect accounting mode radius requires at least one RADIUS server')          default_values_radius_port = \              default_values['accounting']['radius']['server']['port']          for server, params in origin['accounting']['radius'][ @@ -120,7 +120,7 @@ def get_config(config=None):      default_values = defaults(base)      ocserv = dict_merge(default_values, ocserv)      # workaround a "know limitation" - https://vyos.dev/T2665 -    ocserv = T2665_default_dict_cleanup(ocserv, default_values) +    ocserv = _default_dict_cleanup(ocserv, default_values)      if ocserv:          ocserv['pki'] = conf.get_config_dict(['pki'], key_mangling=('-', '_'),                                  get_first_key=True, no_tag_node_value_mangle=True) diff --git a/src/etc/dhcp/dhclient-enter-hooks.d/99-run-user-hooks b/src/etc/dhcp/dhclient-enter-hooks.d/99-run-user-hooks new file mode 100644 index 000000000..b4b4d516d --- /dev/null +++ b/src/etc/dhcp/dhclient-enter-hooks.d/99-run-user-hooks @@ -0,0 +1,5 @@ +#!/bin/bash +DHCP_PRE_HOOKS="/config/scripts/dhcp-client/pre-hooks.d/" +if [ -d "${DHCP_PRE_HOOKS}" ] ; then +    run-parts "${DHCP_PRE_HOOKS}" +fi diff --git a/src/etc/dhcp/dhclient-exit-hooks.d/99-run-user-hooks b/src/etc/dhcp/dhclient-exit-hooks.d/99-run-user-hooks new file mode 100755 index 000000000..442419d79 --- /dev/null +++ b/src/etc/dhcp/dhclient-exit-hooks.d/99-run-user-hooks @@ -0,0 +1,5 @@ +#!/bin/bash +DHCP_POST_HOOKS="/config/scripts/dhcp-client/post-hooks.d/" +if [ -d "${DHCP_POST_HOOKS}" ] ; then +    run-parts "${DHCP_POST_HOOKS}" +fi diff --git a/src/migration-scripts/interfaces/27-to-28 b/src/migration-scripts/interfaces/27-to-28 new file mode 100755 index 000000000..6225d6414 --- /dev/null +++ b/src/migration-scripts/interfaces/27-to-28 @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +# +# 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 +# published by the Free Software Foundation. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program.  If not, see <http://www.gnu.org/licenses/>. + +# T5034: tunnel: rename "multicast enable" CLI node to "enable-multicast" +#        valueless node. + +from sys import argv + +from vyos.ethtool import Ethtool +from vyos.configtree import ConfigTree + +if (len(argv) < 1): +    print("Must specify file name!") +    exit(1) + +file_name = argv[1] +with open(file_name, 'r') as f: +    config_file = f.read() + +base = ['interfaces', 'tunnel'] +config = ConfigTree(config_file) + +if not config.exists(base): +    exit(0) + +for ifname in config.list_nodes(base): +    print(ifname) +    multicast_base = base + [ifname, 'multicast'] +    if config.exists(multicast_base): +        tmp = config.return_value(multicast_base) +        print(tmp) +        # Delete old Config node +        config.delete(multicast_base) +        if tmp == 'enable': +            config.set(base + [ifname, 'enable-multicast']) + +try: +    with open(file_name, 'w') as f: +        f.write(config.to_string()) +except OSError as e: +    print(f'Failed to save the modified config: {e}') +    exit(1) diff --git a/src/op_mode/openvpn.py b/src/op_mode/openvpn.py index d957a1d01..79130c7c0 100755 --- a/src/op_mode/openvpn.py +++ b/src/op_mode/openvpn.py @@ -173,8 +173,8 @@ def _format_openvpn(data: dict) -> str:                 'TX bytes', 'RX bytes', 'Connected Since']      out = '' -    data_out = []      for intf in list(data): +        data_out = []          l_host = data[intf]['local_host']          l_port = data[intf]['local_port']          for client in list(data[intf]['clients']): @@ -192,7 +192,9 @@ def _format_openvpn(data: dict) -> str:              data_out.append([name, remote, tunnel, local, tx_bytes,                               rx_bytes, online_since]) -        out += tabulate(data_out, headers) +        if data_out: +            out += tabulate(data_out, headers) +            out += "\n"      return out diff --git a/src/services/api/graphql/graphql/auth_token_mutation.py b/src/services/api/graphql/graphql/auth_token_mutation.py index 21ac40094..603a13758 100644 --- a/src/services/api/graphql/graphql/auth_token_mutation.py +++ b/src/services/api/graphql/graphql/auth_token_mutation.py @@ -20,6 +20,7 @@ from ariadne import ObjectType, UnionType  from graphql import GraphQLResolveInfo  from .. libs.token_auth import generate_token +from .. session.session import get_user_info  from .. import state  auth_token_mutation = ObjectType("Mutation") @@ -36,13 +37,24 @@ def auth_token_resolver(obj: Any, info: GraphQLResolveInfo, data: Dict):                    datetime.timedelta(seconds=exp_interval))      res = generate_token(user, passwd, secret, expiration) -    if res: +    try: +        res |= get_user_info(user) +    except ValueError: +        # non-existent user already caught +        pass +    if 'token' in res:          data['result'] = res          return {              "success": True,              "data": data          } +    if 'errors' in res: +        return { +            "success": False, +            "errors": res['errors'] +        } +      return {          "success": False,          "errors": ['token generation failed'] diff --git a/src/services/api/graphql/libs/token_auth.py b/src/services/api/graphql/libs/token_auth.py index 2100eba7f..8585485c9 100644 --- a/src/services/api/graphql/libs/token_auth.py +++ b/src/services/api/graphql/libs/token_auth.py @@ -29,14 +29,13 @@ def generate_token(user: str, passwd: str, secret: str, exp: int) -> dict:          payload_data = {'iss': user, 'sub': user_id, 'exp': exp}          secret = state.settings.get('secret')          if secret is None: -            return { -                    "success": False, -                    "errors": ['failed secret generation'] -                   } +            return {"errors": ['missing secret']}          token = jwt.encode(payload=payload_data, key=secret, algorithm="HS256")          users |= {user_id: user}          return {'token': token} +    else: +        return {"errors": ['failed pam authentication']}  def get_user_context(request):      context = {} diff --git a/src/services/api/graphql/session/session.py b/src/services/api/graphql/session/session.py index b2aef9bd9..3c5a062b6 100644 --- a/src/services/api/graphql/session/session.py +++ b/src/services/api/graphql/session/session.py @@ -29,6 +29,28 @@ from api.graphql.libs.op_mode import normalize_output  op_mode_include_file = os.path.join(directories['data'], 'op-mode-standardized.json') +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 get_user_info(user): +    user_info = {} +    info = get_config_dict(['system', 'login', 'user', user], +                           get_first_key=True) +    if not info: +        raise ValueError("No such user") + +    user_info['user'] = user +    user_info['full_name'] = info.get('full-name', '') + +    return user_info +  class Session:      """      Wrapper for calling configsession functions based on GraphQL requests. @@ -46,17 +68,6 @@ 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 @@ -134,10 +145,7 @@ class Session:          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', '') +            user_info = get_user_info(user)          except Exception as error:              raise error | 
