From f14de93cdb1d1e366603d10d8d51994d9eb4bb8b Mon Sep 17 00:00:00 2001
From: mkorobeinikov <92354771+mkorobeinikov@users.noreply.github.com>
Date: Sun, 2 Apr 2023 07:29:14 +0300
Subject: T5137: refactoring the tech-support command
Refactoring the tech-support command from .sh to .py
---
op-mode-definitions/show-techsupport_report.xml.in | 17 +
src/op_mode/show_techsupport_report.py | 438 +++++++++++++++++++++
2 files changed, 455 insertions(+)
create mode 100644 op-mode-definitions/show-techsupport_report.xml.in
create mode 100644 src/op_mode/show_techsupport_report.py
diff --git a/op-mode-definitions/show-techsupport_report.xml.in b/op-mode-definitions/show-techsupport_report.xml.in
new file mode 100644
index 000000000..6f38105f8
--- /dev/null
+++ b/op-mode-definitions/show-techsupport_report.xml.in
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+ Show consolidated tech-support report (contains private information)
+
+ ${vyos_op_scripts_dir}/show_techsupport_report.py
+
+
+
+
+
+
diff --git a/src/op_mode/show_techsupport_report.py b/src/op_mode/show_techsupport_report.py
new file mode 100644
index 000000000..13ed9a3c1
--- /dev/null
+++ b/src/op_mode/show_techsupport_report.py
@@ -0,0 +1,438 @@
+#!/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 .
+
+from vyos.util import call
+import os
+
+
+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)
--
cgit v1.2.3