Often you have to collect logs to analyze interfaces and errors. I propose to consider a command for extended collection of logs from all interfaces of the router.
generate_packetdrops_debug_archive.xml.in
<?xml version="1.0"?> <interfaceDefinition> <node name="generate"> <children> <node name="packetdrops"> <children> <node name="debug-archive"> <properties> <help>Generate packetdrops debug-archive</help> </properties> <command>${vyos_op_scripts_dir}/generate_packetdrops_debug_archive.py</command> </node> </children> </node> </children> </node> </interfaceDefinition>
generate_packetdrops_debug_archive.py
#!/usr/bin/env python3 from datetime import datetime from pathlib import Path from shutil import rmtree from socket import gethostname from sys import exit from tarfile import open as tar_open from vyos.util import rc_cmd import os # define a list of commands that needs to be executed CMD_LIST: list[str] = [ "sudo journalctl -b -n 500", "sudo journalctl -b -k -n 500", "sudo ip -s l", "sudo cat /proc/interrupts", "sudo cat /proc/softirqs", "sudo top -b -d 1 -n 2 -1", "sudo netstat -l", "sudo cat /proc/net/dev", "sudo cat /proc/net/softnet_stat", "sudo cat /proc/net/icmp", "sudo cat /proc/net/udp", "sudo cat /proc/net/tcp", "sudo cat /proc/net/netstat", "sudo sysctl net", "sudo timeout 10 tcpdump -c 500 -eni any port not 22" ] CMD_INTERFACES_LIST: list[str] = [ "sudo ethtool -i ", "sudo ethtool -S ", "sudo ethtool -g ", "sudo ethtool -c ", "sudo ethtool -a ", "sudo ethtool -k ", "sudo ethtool -i ", "sudo ethtool --phy-statistics " ] # get intefaces info interfaces_list = os.popen('ls /sys/class/net/').read().split() # modify CMD_INTERFACES_LIST for all interfaces CMD_INTERFACES_LIST_MOD=[] for command_interface in interfaces_list: for command_interfacev2 in CMD_INTERFACES_LIST: CMD_INTERFACES_LIST_MOD.append (f'{command_interfacev2}{command_interface}') # execute a command and save the output to a file def save_stdout(command: str, file: Path) -> None: rc, stdout = rc_cmd(command) body: str = f'''### Command: {command} Exit code: {rc} Stdout: {stdout} ''' with file.open(mode='a') as f: f.write(body) # get local host name hostname: str = gethostname() # get current time time_now: str = datetime.now().isoformat(timespec='seconds') # define a temporary directory for logs and collected data tmp_dir: Path = Path(f'/tmp/drops-debug_{time_now}') # set file paths drops_file: Path = Path(f'{tmp_dir}/drops.txt') interfaces_file: Path = Path(f'{tmp_dir}/interfaces.txt') archive_file: str = f'/tmp/packet-drops-debug_{time_now}.tar.bz2' # create files tmp_dir.mkdir() drops_file.touch() interfaces_file.touch() try: # execute all commands for command in CMD_LIST: save_stdout(command, drops_file) for command_interface in CMD_INTERFACES_LIST_MOD: save_stdout(command_interface, interfaces_file) # create an archive with tar_open(name=archive_file, mode='x:bz2') as tar_file: tar_file.add(tmp_dir) # inform user about success print(f'Debug file is generated and located in {archive_file}') except Exception as err: print(f'Error during generating a debug file: {err}') finally: # cleanup rmtree(tmp_dir) exit()