diff options
20 files changed, 437 insertions, 577 deletions
| diff --git a/data/configd-include.json b/data/configd-include.json index 1c843e9fa..2f1d39006 100644 --- a/data/configd-include.json +++ b/data/configd-include.json @@ -85,5 +85,5 @@  "vpn_l2tp.py",  "vpn_pptp.py",  "vpn_sstp.py", -"vrf.py", +"vrf.py"  ] diff --git a/interface-definitions/include/bgp/protocol-common-config.xml.i b/interface-definitions/include/bgp/protocol-common-config.xml.i index 527eaf991..bcc131f83 100644 --- a/interface-definitions/include/bgp/protocol-common-config.xml.i +++ b/interface-definitions/include/bgp/protocol-common-config.xml.i @@ -810,12 +810,6 @@              </node>            </children>          </node> -        <leafNode name="advertise-all-vni"> -          <properties> -            <help>Advertise All local VNIs</help> -            <valueless/> -          </properties> -        </leafNode>          #include <include/bgp/afi-l2vpn-common.xml.i>          <leafNode name="advertise-pip">            <properties> diff --git a/interface-definitions/protocols-bgp.xml.in b/interface-definitions/protocols-bgp.xml.in index e1a822999..78b461f9d 100644 --- a/interface-definitions/protocols-bgp.xml.in +++ b/interface-definitions/protocols-bgp.xml.in @@ -9,6 +9,20 @@          </properties>          <children>            #include <include/bgp/protocol-common-config.xml.i> +          <node name="address-family"> +            <children> +              <node name="l2vpn-evpn"> +                <children> +                  <leafNode name="advertise-all-vni"> +                    <properties> +                      <help>Advertise all local VNIs</help> +                      <valueless/> +                    </properties> +                  </leafNode> +                </children> +              </node> +            </children> +          </node>          </children>        </node>      </children> diff --git a/op-mode-definitions/include/bgp/evpn-type-1.xml.i b/op-mode-definitions/include/bgp/evpn-type-1.xml.i new file mode 100644 index 000000000..b5097c8b1 --- /dev/null +++ b/op-mode-definitions/include/bgp/evpn-type-1.xml.i @@ -0,0 +1,8 @@ +<!-- included start from bgp/evpn-type-1.xml.i --> +<leafNode name="1"> +  <properties> +    <help>EAD (Type-1) route</help> +  </properties> +  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> +</leafNode> +<!-- included end --> diff --git a/op-mode-definitions/include/bgp/evpn-type-2.xml.i b/op-mode-definitions/include/bgp/evpn-type-2.xml.i new file mode 100644 index 000000000..827298d62 --- /dev/null +++ b/op-mode-definitions/include/bgp/evpn-type-2.xml.i @@ -0,0 +1,8 @@ +<!-- included start from bgp/evpn-type-2.xml.i --> +<leafNode name="2"> +  <properties> +    <help>MAC-IP (Type-2) route</help> +  </properties> +  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> +</leafNode> +<!-- included end --> diff --git a/op-mode-definitions/include/bgp/evpn-type-3.xml.i b/op-mode-definitions/include/bgp/evpn-type-3.xml.i new file mode 100644 index 000000000..ae90b2e5c --- /dev/null +++ b/op-mode-definitions/include/bgp/evpn-type-3.xml.i @@ -0,0 +1,8 @@ +<!-- included start from bgp/evpn-type-3.xml.i --> +<leafNode name="3"> +  <properties> +    <help>Multicast (Type-3) route</help> +  </properties> +  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> +</leafNode> +<!-- included end --> diff --git a/op-mode-definitions/include/bgp/evpn-type-4.xml.i b/op-mode-definitions/include/bgp/evpn-type-4.xml.i new file mode 100644 index 000000000..7248b4753 --- /dev/null +++ b/op-mode-definitions/include/bgp/evpn-type-4.xml.i @@ -0,0 +1,8 @@ +<!-- included start from bgp/evpn-type-4.xml.i --> +<leafNode name="4"> +  <properties> +    <help>Ethernet Segment (Type-4) route</help> +  </properties> +  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> +</leafNode> +<!-- included end --> diff --git a/op-mode-definitions/include/bgp/evpn-type-5.xml.i b/op-mode-definitions/include/bgp/evpn-type-5.xml.i new file mode 100644 index 000000000..e3a72168a --- /dev/null +++ b/op-mode-definitions/include/bgp/evpn-type-5.xml.i @@ -0,0 +1,8 @@ +<!-- included start from bgp/evpn-type-5.xml.i --> +<leafNode name="5"> +  <properties> +    <help>Prefix (Type-5) route</help> +  </properties> +  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> +</leafNode> +<!-- included end --> diff --git a/op-mode-definitions/include/bgp/evpn-type-ead.xml.i b/op-mode-definitions/include/bgp/evpn-type-ead.xml.i new file mode 100644 index 000000000..452de2f9a --- /dev/null +++ b/op-mode-definitions/include/bgp/evpn-type-ead.xml.i @@ -0,0 +1,8 @@ +<!-- included start from bgp/evpn-type-ead.xml.i --> +<leafNode name="ead"> +  <properties> +    <help>EAD (Type-1) route</help> +  </properties> +  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> +</leafNode> +<!-- included end --> diff --git a/op-mode-definitions/include/bgp/evpn-type-es.xml.i b/op-mode-definitions/include/bgp/evpn-type-es.xml.i new file mode 100644 index 000000000..50c40151a --- /dev/null +++ b/op-mode-definitions/include/bgp/evpn-type-es.xml.i @@ -0,0 +1,8 @@ +<!-- included start from bgp/evpn-type-es.xml.i --> +<leafNode name="es"> +  <properties> +    <help>Ethernet Segment (Type-4) route</help> +  </properties> +  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> +</leafNode> +<!-- included end --> diff --git a/op-mode-definitions/include/bgp/evpn-type-macip.xml.i b/op-mode-definitions/include/bgp/evpn-type-macip.xml.i new file mode 100644 index 000000000..6f601eb3f --- /dev/null +++ b/op-mode-definitions/include/bgp/evpn-type-macip.xml.i @@ -0,0 +1,8 @@ +<!-- included start from bgp/evpn-type-macip.xml.i --> +<leafNode name="macip"> +  <properties> +    <help>MAC-IP (Type-2) route</help> +  </properties> +  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> +</leafNode> +<!-- included end --> diff --git a/op-mode-definitions/include/bgp/evpn-type-multicast.xml.i b/op-mode-definitions/include/bgp/evpn-type-multicast.xml.i new file mode 100644 index 000000000..5194dbb56 --- /dev/null +++ b/op-mode-definitions/include/bgp/evpn-type-multicast.xml.i @@ -0,0 +1,8 @@ +<!-- included start from bgp/evpn-type-multicast.xml.i --> +<leafNode name="multicast"> +  <properties> +    <help>Multicast (Type-3) route</help> +  </properties> +  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> +</leafNode> +<!-- included end --> diff --git a/op-mode-definitions/include/bgp/evpn-type-prefix.xml.i b/op-mode-definitions/include/bgp/evpn-type-prefix.xml.i new file mode 100644 index 000000000..d5054d86b --- /dev/null +++ b/op-mode-definitions/include/bgp/evpn-type-prefix.xml.i @@ -0,0 +1,8 @@ +<!-- included start from bgp/evpn-type-prefix.xml.i --> +<leafNode name="prefix"> +  <properties> +    <help>Prefix (Type-5) route</help> +  </properties> +  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> +</leafNode> +<!-- included end --> diff --git a/op-mode-definitions/include/bgp/show-bgp-common.xml.i b/op-mode-definitions/include/bgp/show-bgp-common.xml.i index c9a112fca..de794a879 100644 --- a/op-mode-definitions/include/bgp/show-bgp-common.xml.i +++ b/op-mode-definitions/include/bgp/show-bgp-common.xml.i @@ -171,66 +171,16 @@                  <help>Specify Route type</help>                </properties>                <children> -                <leafNode name="1"> -                  <properties> -                    <help>EAD (Type-1) route</help> -                  </properties> -                  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> -                </leafNode> -                <leafNode name="2"> -                  <properties> -                    <help>MAC-IP (Type-2) route</help> -                  </properties> -                  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> -                </leafNode> -                <leafNode name="3"> -                  <properties> -                    <help>Multicast (Type-3) route</help> -                  </properties> -                  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> -                </leafNode> -                <leafNode name="4"> -                  <properties> -                    <help>Ethernet Segment (Type-4) route</help> -                  </properties> -                  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> -                </leafNode> -                <leafNode name="5"> -                  <properties> -                    <help>Prefix (Type-5) route</help> -                  </properties> -                  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> -                </leafNode> -                <leafNode name="ead"> -                  <properties> -                    <help>EAD (Type-1) route</help> -                  </properties> -                  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> -                </leafNode> -                <leafNode name="es"> -                  <properties> -                    <help>Ethernet Segment (Type-4) route</help> -                  </properties> -                  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> -                </leafNode> -                <leafNode name="macip"> -                  <properties> -                    <help>MAC-IP (Type-2) route</help> -                  </properties> -                  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> -                </leafNode> -                <leafNode name="multicast"> -                  <properties> -                    <help>Multicast (Type-3) route</help> -                  </properties> -                  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> -                </leafNode> -                <leafNode name="prefix"> -                  <properties> -                    <help>Prefix (Type-5) route</help> -                  </properties> -                  <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> -                </leafNode> +                #include <include/bgp/evpn-type-1.xml.i> +                #include <include/bgp/evpn-type-2.xml.i> +                #include <include/bgp/evpn-type-3.xml.i> +                #include <include/bgp/evpn-type-4.xml.i> +                #include <include/bgp/evpn-type-5.xml.i> +                #include <include/bgp/evpn-type-ead.xml.i> +                #include <include/bgp/evpn-type-es.xml.i> +                #include <include/bgp/evpn-type-macip.xml.i> +                #include <include/bgp/evpn-type-multicast.xml.i> +                #include <include/bgp/evpn-type-prefix.xml.i>                </children>              </node>              #include <include/vni-tagnode-all.xml.i> diff --git a/op-mode-definitions/show-bgp.xml.in b/op-mode-definitions/show-bgp.xml.in index 974147621..3c212614c 100644 --- a/op-mode-definitions/show-bgp.xml.in +++ b/op-mode-definitions/show-bgp.xml.in @@ -51,6 +51,33 @@              </properties>              <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command>            </leafNode> +          #include <include/vni-tagnode-all.xml.i> +          <tagNode name="vni"> +            <children> +              <tagNode name="vtep"> +                <properties> +                  <help>Remote VTEP IP address</help> +                  <completionHelp> +                    <list><x.x.x.x></list> +                  </completionHelp> +                </properties> +                <command>${vyos_op_scripts_dir}/vtysh_wrapper.sh $@</command> +              </tagNode> +              <node name="type"> +                <properties> +                  <help>Display number of prefixes for all afi/safi</help> +                </properties> +                <children> +                  #include <include/bgp/evpn-type-1.xml.i> +                  #include <include/bgp/evpn-type-2.xml.i> +                  #include <include/bgp/evpn-type-3.xml.i> +                  #include <include/bgp/evpn-type-ead.xml.i> +                  #include <include/bgp/evpn-type-macip.xml.i> +                  #include <include/bgp/evpn-type-multicast.xml.i> +                </children> +              </node> +            </children> +          </tagNode>            <leafNode name="vrf">              <properties>                <help>Show BGP VRF information</help> diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py index fc33430eb..f62b9f7d2 100644 --- a/python/vyos/ifconfig/interface.py +++ b/python/vyos/ifconfig/interface.py @@ -1709,6 +1709,14 @@ class VLANIf(Interface):          if self.exists(f'{self.ifname}'):              return +        # If source_interface or vlan_id was not explicitly defined (e.g. when +        # calling  VLANIf('eth0.1').remove() we can define source_interface and +        # vlan_id here, as it's quiet obvious that it would be eth0 in that case. +        if 'source_interface' not in self.config: +            self.config['source_interface'] = '.'.join(self.ifname.split('.')[:-1]) +        if 'vlan_id' not in self.config: +            self.config['vlan_id'] = self.ifname.split('.')[-1] +          cmd = 'ip link add link {source_interface} name {ifname} type vlan id {vlan_id}'          if 'protocol' in self.config:              cmd += ' protocol {protocol}' diff --git a/smoketest/scripts/cli/test_protocols_isis.py b/smoketest/scripts/cli/test_protocols_isis.py index 61e29c449..f1a030e77 100755 --- a/smoketest/scripts/cli/test_protocols_isis.py +++ b/smoketest/scripts/cli/test_protocols_isis.py @@ -119,39 +119,6 @@ class TestProtocolsISIS(VyOSUnitTestSHIM.TestCase):          self.cli_delete(['vrf', 'name', vrf])          self.cli_delete(['interfaces', 'ethernet', vrf_iface, 'vrf']) -    def test_isis_03_zebra_route_map(self): -        # Implemented because of T3328 -        route_map = 'foo-isis-in' - -        self.cli_set(['policy', 'route-map', route_map, 'rule', '10', 'action', 'permit']) - -        self.isis_base_config() -        self.cli_set(base_path + ['redistribute', 'ipv4', 'connected', 'level-2', 'route-map', route_map]) -        self.cli_set(base_path + ['route-map', route_map]) -        self.cli_set(base_path + ['level', 'level-2']) - -        # commit changes -        self.cli_commit() - -        # Verify FRR configuration -        zebra_route_map = f'ip protocol isis route-map {route_map}' -        frrconfig = self.getFRRconfig(zebra_route_map, daemon='zebra') -        self.assertIn(zebra_route_map, frrconfig) - -        tmp = self.getFRRconfig(f'router isis {domain}', daemon='isisd') -        self.assertIn(' is-type level-2-only', tmp) - -        # Remove the route-map again -        self.cli_delete(base_path + ['route-map']) -        # commit changes -        self.cli_commit() - -        # Verify FRR configuration -        frrconfig = self.getFRRconfig(zebra_route_map, daemon='zebra') -        self.assertNotIn(zebra_route_map, frrconfig) - -        self.cli_delete(['policy', 'route-map', route_map]) -      def test_isis_04_default_information(self):          metric = '50'          route_map = 'default-foo-' @@ -293,7 +260,7 @@ class TestProtocolsISIS(VyOSUnitTestSHIM.TestCase):          self.cli_set(base_path + ['segment-routing', 'prefix', prefix_three, 'absolute', 'explicit-null'])          self.cli_set(base_path + ['segment-routing', 'prefix', prefix_four, 'absolute', 'value', prefix_four_value])          self.cli_set(base_path + ['segment-routing', 'prefix', prefix_four, 'absolute', 'no-php-flag']) -         +          # Commit all changes          self.cli_commit() @@ -315,16 +282,16 @@ class TestProtocolsISIS(VyOSUnitTestSHIM.TestCase):          self.cli_set(base_path + ['net', net])          self.cli_set(base_path + ['interface', interface])          self.cli_set(base_path + ['ldp-sync', 'holddown', holddown]) -         +          # Commit main ISIS changes          self.cli_commit() -         +          # Verify main ISIS changes          tmp = self.getFRRconfig(f'router isis {domain}', daemon='isisd')          self.assertIn(f' net {net}', tmp)          self.assertIn(f' mpls ldp-sync', tmp)          self.assertIn(f' mpls ldp-sync holddown {holddown}', tmp) -         +          for interface in self._interfaces:              self.cli_set(base_path + ['interface', interface, 'ldp-sync', 'holddown', holddown]) @@ -337,13 +304,13 @@ class TestProtocolsISIS(VyOSUnitTestSHIM.TestCase):              self.assertIn(f' ip router isis {domain}', tmp)              self.assertIn(f' ipv6 router isis {domain}', tmp)              self.assertIn(f' isis mpls ldp-sync holddown {holddown}', tmp) -             +          for interface in self._interfaces:              self.cli_set(base_path + ['interface', interface, 'ldp-sync', 'disable']) -             +              # Commit interface changes for disable              self.cli_commit() -             +              # Verify interface changes for disable              tmp = self.getFRRconfig(f'interface {interface}', daemon='isisd')              self.assertIn(f'interface {interface}', tmp) diff --git a/smoketest/scripts/cli/test_protocols_ospf.py b/smoketest/scripts/cli/test_protocols_ospf.py index d4c85f2b2..6fe6dd979 100755 --- a/smoketest/scripts/cli/test_protocols_ospf.py +++ b/smoketest/scripts/cli/test_protocols_ospf.py @@ -300,26 +300,6 @@ class TestProtocolsOSPF(VyOSUnitTestSHIM.TestCase):              self.assertIn(f' no ip ospf passive', config)              self.assertIn(f' bandwidth {bandwidth}', config) -    def test_ospf_10_zebra_route_map(self): -        # Implemented because of T3328 -        self.cli_set(base_path + ['route-map', route_map]) -        # commit changes -        self.cli_commit() - -        # Verify FRR configuration -        zebra_route_map = f'ip protocol ospf route-map {route_map}' -        frrconfig = self.getFRRconfig(zebra_route_map) -        self.assertIn(zebra_route_map, frrconfig) - -        # Remove the route-map again -        self.cli_delete(base_path + ['route-map']) -        # commit changes -        self.cli_commit() - -        # Verify FRR configuration -        frrconfig = self.getFRRconfig(zebra_route_map) -        self.assertNotIn(zebra_route_map, frrconfig) -      def test_ospf_11_interface_area(self):          area = '0'          interfaces = Section.interfaces('ethernet') @@ -441,16 +421,16 @@ class TestProtocolsOSPF(VyOSUnitTestSHIM.TestCase):          self.cli_set(base_path + ['interface', interface])          self.cli_set(base_path + ['ldp-sync', 'holddown', holddown]) -         +          # Commit main OSPF changes          self.cli_commit() -         +          # Verify main OSPF changes          frrconfig = self.getFRRconfig('router ospf')          self.assertIn(f'router ospf', frrconfig)          self.assertIn(f' timers throttle spf 200 1000 10000', frrconfig)          self.assertIn(f' mpls ldp-sync holddown {holddown}', frrconfig) -         +          for interface in interfaces:              self.cli_set(base_path + ['interface', interface, 'ldp-sync', 'holddown', holddown]) @@ -463,13 +443,13 @@ class TestProtocolsOSPF(VyOSUnitTestSHIM.TestCase):              self.assertIn(f' ip ospf dead-interval 40', config)              self.assertIn(f' ip ospf mpls ldp-sync', config)              self.assertIn(f' ip ospf mpls ldp-sync holddown {holddown}', config) -             +          for interface in interfaces:              self.cli_set(base_path + ['interface', interface, 'ldp-sync', 'disable']) -             +              # Commit interface changes for disable              self.cli_commit() -             +              # Verify interface changes for disable              config = self.getFRRconfig(f'interface {interface}')              self.assertIn(f'interface {interface}', config) diff --git a/smoketest/scripts/cli/test_protocols_static.py b/smoketest/scripts/cli/test_protocols_static.py index 19efe7786..bc023f3f2 100755 --- a/smoketest/scripts/cli/test_protocols_static.py +++ b/smoketest/scripts/cli/test_protocols_static.py @@ -433,30 +433,5 @@ class TestProtocolsStatic(VyOSUnitTestSHIM.TestCase):                      self.assertIn(tmp, frrconfig) -    def test_04_static_zebra_route_map(self): -        # Implemented because of T3328 -        route_map = 'foo-static-in' -        self.cli_set(['policy', 'route-map', route_map, 'rule', '10', 'action', 'permit']) - -        self.cli_set(base_path + ['route-map', route_map]) -        # commit changes -        self.cli_commit() - -        # Verify FRR configuration -        zebra_route_map = f'ip protocol static route-map {route_map}' -        frrconfig = self.getFRRconfig(zebra_route_map) -        self.assertIn(zebra_route_map, frrconfig) - -        # Remove the route-map again -        self.cli_delete(base_path + ['route-map']) -        # commit changes -        self.cli_commit() - -        # Verify FRR configuration -        frrconfig = self.getFRRconfig(zebra_route_map) -        self.assertNotIn(zebra_route_map, frrconfig) - -        self.cli_delete(['policy', 'route-map', route_map]) -  if __name__ == '__main__':      unittest.main(verbosity=2) diff --git a/src/op_mode/show_techsupport_report.py b/src/op_mode/show_techsupport_report.py index 13ed9a3c1..782004144 100644 --- a/src/op_mode/show_techsupport_report.py +++ b/src/op_mode/show_techsupport_report.py @@ -14,425 +14,290 @@  # You should have received a copy of the GNU General Public License  # along with this program.  If not, see <http://www.gnu.org/licenses/>. -from vyos.util import call  import os +from typing import List +from vyos.util import rc_cmd +from vyos.ifconfig import Section +from vyos.ifconfig import Interface -def header(cmd): -    print(16 * '-' + '\n' + cmd + '\n' + 16 * '-') -    return - - -# get intefaces info -interfaces_list = os.popen('ls /sys/class/net/ | grep eth').read().split() -bridges_list = os.popen('ls /sys/class/net/ | grep br').read().split() - -###################### THE PART OF CONFIGURATION ###################### - -cmd_list_conf = [ -    "VyOS Version and Package Changes%/opt/vyatta/bin/vyatta-op-cmd-wrapper show version all", -    "Configuration File%cat /opt/vyatta/etc/config/config.boot", -    "Running configuration%/opt/vyatta/bin/vyatta-op-cmd-wrapper show configuration", -    "Package Repository Configuration File%cat /etc/apt/sources.list", -    "User Startup Scripts%cat /etc/rc.local", -    "Quagga Configuration%vtysh -c 'show run'" -] - - -def CONFIGURATION(cmd): -    for command_line in cmd: -        line = command_line.split('%') -        head = line[0] -        command = line[1] -        header(head) -        call(command) -    return - - -###################### THE PART OF INTERFACES ###################### - -cmd_list_int = [ -    "Interfaces%/opt/vyatta/bin/vyatta-op-cmd-wrapper show interfaces", -    "Ethernet", -    "Interface statistics%ip -s link show", -    "Physical Interface statistics for%ethtool -S", -    "Physical Interface Details for %/opt/vyatta/bin/vyatta-op-cmd-wrapper show interfaces ethernet%ethtool -k $eth", -    "ARP Table (Total entries)%/opt/vyatta/bin/vyatta-op-cmd-wrapper show arp", -    "Number of incomplete entries in ARP table%show arp | grep incomplete | wc -l", -    "Bridges" -] - - -def INTERFACES(cmd): -    for command_line in cmd: -        line = command_line.split('%') -        head = line[0] -        if command_line.startswith("Ethernet"): -            header(command_line) -        elif command_line.startswith("Physical Interface statistics"): -            for command_interface in interfaces_list: -                header(f'{head} {command_interface}') -                call(f'{line[1]} {command_interface}') -        elif command_line.startswith("Physical Interface Details"): -            for command_interface in interfaces_list: -                header(f'{head} {command_interface}') -                call(f'{line[1]} {command_interface} physical') -                call(f'{line[2]} {command_interface}') -        elif command_line.startswith("Bridges"): -            header(command_line) -            for command_interface in bridges_list: -                header(f'Information for {command_interface}') -                call(f'/sbin/brctl showstp {command_interface}') -                call(f'/sbin/brctl showmacs {command_interface}') -        else: -            command = line[1] -            header(head) -            call(command) -    return - - -###################### THE PART OF ROUTING ###################### - -cmd_list_route = [ -    "show ip route bgp", -    "show ip route cache", -    "show ip route connected", -    "show ip route forward", -    "show ip route isis", -    "show ip route kernel", -    "show ip route ospf", -    "show ip route rip", -    "show ip route static", -    "show ip route summary", -    "show ip route supernets-only", -    "show ip route table", -    "show ip route tag", -    "show ip route vrf", -    "show ipv6 route bgp", -    "show ipv6 route cache", -    "show ipv6 route connected", -    "show ipv6 route forward", -    "show ipv6 route isis", -    "show ipv6 route kernel", -    "show ipv6 route ospf", -    "show ipv6 route rip", -    "show ipv6 route static", -    "show ipv6 route summary", -    "show ipv6 route supernets-only", -    "show ipv6 route table", -    "show ipv6 route tag", -    "show ipv6 route vrf", -] - - -def ROUTING(cmd): -    for command_line in cmd: -        head = command_line -        command = command_line -        header(head) -        call(f'/opt/vyatta/bin/vyatta-op-cmd-wrapper {command}') -    return - - -###################### THE PART OF IPTABLES ###################### - -cmd_list_iptables = [ -    "Filter Chain Details%sudo /sbin/iptables -L -vn", -    "Nat Chain Details%sudo /sbin/iptables -t nat -L -vn", -    "Mangle Chain Details%sudo /sbin/iptables -t mangle -L -vn", -    "Raw Chain Details%sudo /sbin/iptables -t raw -L -vn", -    "Save Iptables Rule-Set%sudo iptables-save -c" -] - - -def IPTABLES(cmd): -    for command_line in cmd: -        line = command_line.split('%') -        head = line[0] -        command = line[1] -        header(head) -        call(command) -    return - - -###################### THE PART OF SYSTEM ###################### - -cmd_list_system = [ -    "Show System Image Version%show system image version", -    "Show System Image Storage%show system image storage", -    "Current Time%date", -    "Installed Packages%dpkg -l", -    "Loaded Modules%cat /proc/modules", -    "CPU", -    "Installed CPU/s%lscpu", -    "Cumulative CPU Time Used by Running Processes%top -n1 -b -S", -    "Hardware Interrupt Counters%cat /proc/interrupts", -    "Load Average%cat /proc/loadavg" -] - - -def SYSTEM(cmd): -    for command_line in cmd: -        line = command_line.split('%') -        head = line[0] -        if command_line.startswith("CPU"): -            header(command_line) -        elif line[1].startswith("show"): -            header(head) -            command = line[1] -            call(f'/opt/vyatta/bin/vyatta-op-cmd-wrapper {command}') -        else: -            header(head) -            command = line[1] -            call(command) -    return - - -###################### THE PART OF PROCESSES ###################### - -cmd_list_processes = [ -    "Running Processes%ps -ef", -    "Memory", -    "Installed Memory%cat /proc/meminfo", -    " Memory Usage%free", -    "Storage", -    "Devices%cat /proc/devices", -    "Partitions%cat /proc/partitions", -    "Partitioning for disks%fdisk -l /dev/" -] - - -def PROCESSES(cmd): -    for command_line in cmd: -        line = command_line.split('%') -        head = line[0] -        if command_line.startswith("Memory"): -            header(command_line) -        elif command_line.startswith("Storage"): -            header(command_line) -        elif command_line.startswith("Partitioning for disks"): -            header(head) -            disks = set() -            with open('/proc/partitions') as partitions_file: -                for line in partitions_file: -                    fields = line.strip().split() -                    if len(fields) == 4 and fields[3].isalpha() and fields[3] != 'name': -                        disks.add(fields[3]) -                for disk in disks: -                    call(f'fdisk -l /dev/{disk}') -        else: -            header(head) -            command = line[1] -            call(command) -    return - - -###################### THE PART OF CORE SECTION ###################### - -cmd_list_core = [ -    "Mounts%cat /proc/mounts", -    "Diskstats%cat /proc/diskstats", -    "Hard Drive Usage%df -h -x squashfs", -    # "General System", -    "Boot Messages%cat /var/log/dmesg", -    "Recent Kernel messages (dmesg)%dmesg", -    "PCI Info%sudo lspci -vvx", -    "PCI Vendor and Device Codes%sudo lspci -nn", -    # "System Info%${vyatta_bindir}/vyatta-show-dmi", -    "GRUB Command line%cat /proc/cmdline", -    "Open Ports%sudo lsof -P -n -i", -    "System Startup Files%ls -l /etc/rc?.d", -    "Login History%last -ix", -    "Recent Log Messages%tail -n 250 /var/log/messages", -    "NTP%/opt/vyatta/bin/vyatta-op-cmd-wrapper show ntp", -] - - -def CORE(cmd): -    for command_line in cmd: -        line = command_line.split('%') -        command = line[1] -        header(line[0]) -        call(command) -    return - - -###################### THE PART OF VyOS INFORMATION ###################### - -cmd_list_vyos = [ -    "BGP", -    "header BGP Summary", -    "show ip bgp summary", -    "header BGP Neighbors", -    "show ip bgp neighbors", -    "header BGP Debugging Information", -    "show monitoring protocols bgp", -    "CLUSTERING", -    "Cluster Status", -    "show cluster status", -    "DHCP Server", -    "DHCP Leases", -    "show dhcp server leases", -    "DHCP Statistics", -    "show dhcp server statistics", -    "DHCP Client", -    "DHCP Client Leases", -    "show dhcp client leases", -    "DHCPV6 Server", -    "DHCPV6 Server Status", -    "show dhcpv6 server status", -    "DHCPV6 Server Leases", -    "show dhcpv6 server leases", -    "DHCPV6 Relay", -    "DHCPV6 Relay Status", -    "show dhcpv6 relay-agent status", -    "DHCPV6 Client", -    "DHCPV6 Client Leases", -    "show dhcpv6 client leases", -    "DNS", -    "DNS Dynamic Status", -    "show dns dynamic status", -    "DNS Forwarding Statistics", -    "show dns forwarding statistics", -    "DNS Forwarding Nameservers", -    "show dns forwarding nameservers", -    "FIREWALL", -    "Firewall Group", -    "show firewall group", -    "Firewall Summary", -    "show firewall summary", -    "Firewall Statistics", -    "show firewall statistics", -    "IPSec", -    "IPSec Status", -    "show vpn ipsec status", -    "IPSec sa", -    "show vpn ipsec sa", -    "IPSec sa Detail", -    "show vpn ipsec sa detail", -    "IPSec sa Statistics", -    "show vpn ipsec sa statistics", -    "/etc/ipsec.conf", -    "cat /etc/ipsec.conf", -    "/etc/ipsec.secrets", -    "cat /etc/ipsec.secrets", -    "NAT", -    "NAT Rules", -    "show nat rules", -    "NAT Statistics", -    "show nat statistics", -    "NAT Translations Detail", -    "show nat translations detail", -    "FlowAccounting", -    "show flow-accounting", -    "OPENVPN", -    "OpenVPN Interfaces", -    "show interfaces openvpn detail", -    "OpenVPN Server Status", -    "show openvpn status server", -    "OSPF", -    "OSPF Neighbor", -    "show ip ospf neighbor", -    "OSPF Route", -    "show ip ospf route", -    "OSPF Debugging Information", -    "show monitoring protocols ospf", -    "OSPFV3", -    "OSPFV3 Debugging Information", -    "show monitoring protocols ospfv3", -    "Policy", -    "IP Route Maps", -    "show ip protocol", -    "Route-Map", -    "show route-map", -    # header IP Access Lists -    # show ip access-lists -    "IP Community List", -    "show ip community-list", -    "Traffic Policy", -    "Current Traffic Policies", -    "show queueing", -    "RIP", -    "IP RIP", -    "show ip rip", -    "RIP Status", -    "show ip rip status", -    "RIP Debugging Information", -    "show monitoring protocols rip", -    "RIPNG", -    "RIPNG Debugging Information", -    "show monitoring protocols ripng", -    "VPN-L2TP", -    "VPN ike secrets", -    "show vpn ike secrets", -    "VPN rsa-keys", -    "show vpn ike rsa-keys", -    "VPN ike sa", -    "show vpn ike sa", -    "VPN ike Status", -    "show vpn ike status", -    "VPN Remote-Access", -    "show vpn remote-access", -    "VPN Debug Detail", -    "show vpn debug detail", -    "VPN-PPTP", -    "VPN Remote-Access", -    "show vpn remote-access", -    "VRRP", -    # XXX: not checking if configured, we'd have to walk all VIFs -    "show vrrp detail", -    "WAN LOAD BALANCING", -    "Wan Load Balance", -    "show wan-load-balance", -    "Wan Load Balance Status", -    "show wan-load-balance status", -    "Wan Load Balance Connection", -    "show wan-load-balance connection", -    "WEBPROXY/URL-FILTERING", -    "WebProxy Blacklist Categories", -    "show webproxy blacklist categories", -    "WebProxy Blacklist Domains", -    "show webproxy blacklist domains", -    "WebProxy Blacklist URLs", -    "show webproxy blacklist urls", -    "WebProxy Blacklist Log", -    "show webproxy blacklist log summary", -] - - -def VyOS(cmd): -    for command_line in cmd: -        if command_line.startswith("show"): -            call(f'/opt/vyatta/bin/vyatta-op-cmd-wrapper {command_line}') -        elif command_line.startswith("cat"): -            call(command_line) -        else: -            header(command_line) -    return - - -###################### execute all the commands ###################### - -header('CONFIGURATION') -CONFIGURATION(cmd_list_conf) - -header('INTERFACES') -INTERFACES(cmd_list_int) - -header('ROUTING') -ROUTING(cmd_list_route) - -header('IPTABLES') -IPTABLES(cmd_list_iptables) - -header('SYSTEM') -SYSTEM(cmd_list_system) - -header('PROCESSES') -PROCESSES(cmd_list_processes) - -header('CORE') -CORE(cmd_list_core) - -header('VyOS Information') -VyOS(cmd_list_vyos) + +def print_header(command: str) -> None: +    """Prints a command with headers '-'. + +    Example: + +    % print_header('Example command') + +    --------------- +    Example command +    --------------- +    """ +    header_length = len(command) * '-' +    print(f"\n{header_length}\n{command}\n{header_length}") + + +def execute_command(command: str, header_text: str) -> None: +    """Executes a command and prints the output with a header. + +    Example: +    % execute_command('uptime', "Uptime of the system") + +    -------------------- +    Uptime of the system +    -------------------- +    20:21:57 up  9:04,  5 users,  load average: 0.00, 0.00, 0.0 + +    """ +    print_header(header_text) +    try: +        rc, output = rc_cmd(command) +        print(output) +    except Exception as e: +        print(f"Error executing command: {command}") +        print(f"Error message: {e}") + + +def op(cmd: str) -> str: +    """Returns a command with the VyOS operational mode wrapper.""" +    return f'/opt/vyatta/bin/vyatta-op-cmd-wrapper {cmd}' + + +def get_ethernet_interfaces() -> List[Interface]: +    """Returns a list of Ethernet interfaces.""" +    return Section.interfaces('ethernet') + + +def show_version() -> None: +    """Prints the VyOS version and package changes.""" +    execute_command(op('show version'), 'VyOS Version and Package Changes') + + +def show_config_file() -> None: +    """Prints the contents of a configuration file with a header.""" +    execute_command('cat /opt/vyatta/etc/config/config.boot', 'Configuration file') + + +def show_running_config() -> None: +    """Prints the running configuration.""" +    execute_command(op('show configuration'), 'Running configuration') + + +def show_package_repository_config() -> None: +    """Prints the package repository configuration file.""" +    execute_command('cat /etc/apt/sources.list', 'Package Repository Configuration File') +    execute_command('ls -l /etc/apt/sources.list.d/', 'Repositories') + + +def show_user_startup_scripts() -> None: +    """Prints the user startup scripts.""" +    execute_command('cat /config/scripts/vyos-postconfig-bootup.script', 'User Startup Scripts') + + +def show_frr_config() -> None: +    """Prints the FRR configuration.""" +    execute_command('vtysh -c "show run"', 'FRR configuration') + + +def show_interfaces() -> None: +    """Prints the interfaces.""" +    execute_command(op('show interfaces'), 'Interfaces') + + +def show_interface_statistics() -> None: +    """Prints the interface statistics.""" +    execute_command('ip -s link show', 'Interface statistics') + + +def show_physical_interface_statistics() -> None: +    """Prints the physical interface statistics.""" +    execute_command('/usr/bin/true', 'Physical Interface statistics') +    for iface in get_ethernet_interfaces(): +        # Exclude vlans +        if '.' in iface: +            continue +        execute_command(f'ethtool --driver {iface}', f'ethtool --driver {iface}') +        execute_command(f'ethtool --statistics {iface}', f'ethtool --statistics {iface}') +        execute_command(f'ethtool --show-ring {iface}', f'ethtool --show-ring {iface}') +        execute_command(f'ethtool --show-coalesce {iface}', f'ethtool --show-coalesce {iface}') +        execute_command(f'ethtool --pause {iface}', f'ethtool --pause {iface}') +        execute_command(f'ethtool --show-features {iface}', f'ethtool --show-features {iface}') +        execute_command(f'ethtool --phy-statistics {iface}', f'ethtool --phy-statistics {iface}') +    execute_command('netstat --interfaces', 'netstat --interfaces') +    execute_command('netstat --listening', 'netstat --listening') +    execute_command('cat /proc/net/dev', 'cat /proc/net/dev') + + +def show_bridge() -> None: +    """Show bridge interfaces.""" +    execute_command(op('show bridge'), 'Show bridge') + + +def show_arp() -> None: +    """Prints ARP entries.""" +    execute_command(op('show arp'), 'ARP Table (Total entries)') +    execute_command(op('show ipv6 neighbors'), 'show ipv6 neighbors') + + +def show_route() -> None: +    """Prints routing information.""" + +    cmd_list_route = [ +        "show ip route bgp | head -108", +        "show ip route cache", +        "show ip route connected", +        "show ip route forward", +        "show ip route isis | head -108", +        "show ip route kernel", +        "show ip route ospf | head -108", +        "show ip route rip", +        "show ip route static", +        "show ip route summary", +        "show ip route supernets-only", +        "show ip route table all", +        "show ip route vrf all", +        "show ipv6 route bgp | head 108", +        "show ipv6 route cache", +        "show ipv6 route connected", +        "show ipv6 route forward", +        "show ipv6 route isis", +        "show ipv6 route kernel", +        "show ipv6 route ospf", +        "show ipv6 route rip", +        "show ipv6 route static", +        "show ipv6 route summary", +        "show ipv6 route table all", +        "show ipv6 route vrf all", +    ] +    for command in cmd_list_route: +        execute_command(op(command), command) + + +def show_firewall() -> None: +    """Prints firweall information.""" +    execute_command('sudo nft list ruleset', 'nft list ruleset') + + +def show_system() -> None: +    """Prints system parameters.""" +    execute_command(op('show system image version'), 'Show System Image Version') +    execute_command(op('show system image storage'), 'Show System Image Storage') + + +def show_date() -> None: +    """Print the current date.""" +    execute_command('date', 'Current Time') + + +def show_installed_packages() -> None: +    """Prints installed packages.""" +    execute_command('dpkg --list', 'Installed Packages') + + +def show_loaded_modules() -> None: +    """Prints loaded modules /proc/modules""" +    execute_command('cat /proc/modules', 'Loaded Modules') + + +def show_cpu_statistics() -> None: +    """Prints CPU statistics.""" +    execute_command('/usr/bin/true', 'CPU') +    execute_command('lscpu', 'Installed CPU\'s') +    execute_command('top --iterations 1 --batch-mode --accum-time-toggle', 'Cumulative CPU Time Used by Running Processes') +    execute_command('cat /proc/loadavg', 'Load Average') + + +def show_system_interrupts() -> None: +    """Prints system interrupts.""" +    execute_command('cat /proc/interrupts', 'Hardware Interrupt Counters') + + +def show_soft_irqs() -> None: +    """Prints soft IRQ's.""" +    execute_command('cat /proc/softirqs', 'Soft IRQ\'s') + + +def show_softnet_statistics() -> None: +    """Prints softnet statistics.""" +    execute_command('cat /proc/net/softnet_stat', 'cat /proc/net/softnet_stat') + + +def show_running_processes() -> None: +    """Prints current running processes""" +    execute_command('ps -ef', 'Running Processes') + + +def show_memory_usage() -> None: +    """Prints memory usage""" +    execute_command('/usr/bin/true', 'Memory') +    execute_command('cat /proc/meminfo', 'Installed Memory') +    execute_command('free', 'Memory Usage') + + +def list_disks(): +    disks = set() +    with open('/proc/partitions') as partitions_file: +        for line in partitions_file: +            fields = line.strip().split() +            if len(fields) == 4 and fields[3].isalpha() and fields[3] != 'name': +                disks.add(fields[3]) +    return disks + + +def show_storage() -> None: +    """Prints storage information.""" +    execute_command('cat /proc/devices', 'Devices') +    execute_command('cat /proc/partitions', 'Partitions') + +    for disk in list_disks(): +        execute_command(f'fdisk --list /dev/{disk}', f'Partitioning for disk {disk}') + + +def main(): +    # Configuration data +    show_version() +    show_config_file() +    show_running_config() +    show_package_repository_config() +    show_user_startup_scripts() +    show_frr_config() + +    # Interfaces +    show_interfaces() +    show_interface_statistics() +    show_physical_interface_statistics() +    show_bridge() +    show_arp() + +    # Routing +    show_route() + +    # Firewall +    show_firewall() + +    # System +    show_system() +    show_date() +    show_installed_packages() +    show_loaded_modules() + +    # CPU +    show_cpu_statistics() +    show_system_interrupts() +    show_soft_irqs() +    show_softnet_statistics() + +    # Memory +    show_memory_usage() + +    # Storage +    show_storage() + +    # Processes +    show_running_processes() + +    # TODO: Get information from clouds + + +if __name__ == "__main__": +    main() | 
