
Research
/Security News
60 Malicious Ruby Gems Used in Targeted Credential Theft Campaign
A RubyGems malware campaign used 60 malicious packages posing as automation tools to steal credentials from social media and marketing tool users.
Tech Support Buddy is a versatile Python module built to empower developers and IT professionals in resolving technical issues. It provides a suite of Python functions designed to efficiently diagnose and resolve technical issues by parsing raw text into structured data, enabling automation and data-driven decision-making.
tsbuddy
)Tech Support Buddy is a versatile Python module built to improve network engineers' productivity. It provides a suite of Python utilities designed to efficiently diagnose technical issues, help resolve them, and facilitate automation. The main() function parses raw text into structured data, enabling automation and data-driven decision-making.
Dealing with raw text output can be tedious and time-consuming. tsbuddy
parsing aims to simplify this by providing tools to:
This allows you to quickly turn unstructured command output into actionable insights. This package currently supports Alcatel-Lucent Enterprise's OmniSwitch.
Tech Support Buddy (tsbuddy
) now includes an interactive menu and several CLI tools for common network support tasks. You can run the menu or any tool directly from the command line.
Run the menu to access all major features:
tsbuddy
You'll see a menu like:
( ^_^)ノ Hey there, tsbuddy is at your service!
Skip this menu by running the CLI commands directly (in parentheses below), e.g. `ts-extract`.
=== 🛎️ ===
1. Get GA Build & Upgrade (aosga)
2. Run tech support gatherer (ts-get)
3. Run tech_support_complete.tar Extractor (ts-extract)
4. Run tech_support.log to CSV Converter (ts-csv)
5. Run swlog parser to CSV & JSON (ts-log)
6. Run AOS Upgrader (aosup)
7. Run AOS Downloader (aosdl)
8. Show help info
0. Exit (つ﹏<)
Select an option by number, or run the CLI commands directly as shown in parentheses.
Each menu option is also available as a CLI command:
aosup
— Run AOS Upgraderaosga
— Run GA Build Lookupaosdl
— Run AOS Downloaderts-extract
— Extract tech_support_complete.tarts-log
— Parse swlog to CSV & JSONts-csv
— Convert tech_support.log to CSVts-get
— Collect tech support file from a switch via SSH and download it to your local machinets-get
CommandThe ts-get
command connects to a switch via SSH, runs the tech support command, and downloads the resulting tech_support_complete.tar
file to your local directory. It will prompt for device IP, username, and password, and will automatically handle file backup and cleanup on the device.
Example:
ts-get
Sample session:
Enter device IP [exit]: 10.1.1.1
Enter username for 10.1.1.1 [admin]: admin
Enter password for 10.1.1.1 [switch]:
Getting SN of 10.1.1.1.
Backing up existing file for 10.1.1.1
Downloaded existing tech_support_complete.tar as tech_support_complete_<serial>_<timestamp>_old.tar (size: 1234567 bytes)
Removed tech_support_complete.tar from /flash/
Connecting to 10.1.1.1 via SSH to run the tech support command
Command sent to switch
The file is still generating. Please wait...
The tech support files is ready. Beginning download
Downloaded new tech support file of size 2345678 bytes for 10.1.1.1
Removed tech_support_complete.tar from /flash/
Finished
The downloaded file will be named with the device serial number and timestamp for easy identification.
You can install tsbuddy
via pip:
pip install tsbuddy
tsbuddy can be run directly from your preferred terminal. The command ts-csv will search for tech_support.log in your current directory & output its contents to a CSV.
(venv) admin:~/tech_support_complete$ ts-csv
✅ CSV exported to parsed_sections_2025-05-30_220933.csv
Here's a basic example demonstrating how to use tsbuddy
within Python to parse temperature information from command output.
For this example, we will use a file named tech_support.log
in your working directory.
1. Import tsbuddy
and pprint
:
import tsbuddy as ts
from pprint import pprint
2. Read your log file:
(For this example, we'll simulate reading from the file. tsbuddy
itself can work on any source of text.)
# Example content for 'tech_support.log' stored in the file_text variable
# This would typically be read from the actual file
file_text = """
Some initial lines...
show system, show chassis, etc
show temperature
Chassis/Device Current Range Danger Thresh Status
---------------- ------- ---------- ------ ------ ---------------
1/CMMA 47 15 to 60 68 60 UNDER THRESHOLD
3/CMMA 46 15 to 60 68 60 UNDER THRESHOLD
4/CMMA 46 15 to 60 68 60 UNDER THRESHOLD
Some other lines...
show ip interface, etc
...
"""
3. Extract the relevant section:
The extract_section
function helps you get the raw text for a specific command or section.
# Extract the section containing "show temperature" output
temp_section_text = ts.extract_section(file_text, "show temperature")
# print("--- Raw Extracted Text ---")
# print(temp_section_text)
## Seen above, without other section output
4. Parse the raw text into a structured format:
tsbuddy
provides parsers for specific commands. Here, we use parse_temperature
.
# Parse the raw temperature text to structured data
parsed_temps = ts.parse_temperature(temp_section_text)
print("--- Parsed Temperature Data ---")
pprint(parsed_temps, sort_dicts=False)
This will output:
--- Parsed Temperature Data ---
[{'Chassis/Device': '1/CMMA',
'Current': '47',
'Range': '15 to 60',
'Danger': '68',
'Thresh': '60',
'Status': 'UNDER THRESHOLD'},
{'Chassis/Device': '3/CMMA',
'Current': '46',
'Range': '15 to 60',
'Danger': '68',
'Thresh': '60',
'Status': 'UNDER THRESHOLD'},
{'Chassis/Device': '4/CMMA',
'Current': '46',
'Range': '15 to 60',
'Danger': '68',
'Thresh': '60',
'Status': 'UNDER THRESHOLD'}]
5. Work with the structured data:
Now that the data is structured, you can easily access and process specific fields.
# Request data from specific fields
print("\n--- Device Statuses ---")
for chassis in parsed_temps:
print(chassis["Status"])
Output:
--- Device Statuses ---
UNDER THRESHOLD
UNDER THRESHOLD
UNDER THRESHOLD
6. Add custom logic:
You can build more complex logic based on the values of specific fields.
print("\n--- Devices with Current Temperature greater than 46°C ---")
for chassis in parsed_temps:
if int(chassis["Current"]) > 46:
print(chassis["Chassis/Device"] + " is greater than 46°C")
Output:
--- Devices with Current Temperature greater than 46°C ---
1/CMMA is greater than 46°C
This example shows how to use tsbuddy
to parse the output of a command executed over SSH.
1. Import necessary modules:
import tsbuddy as ts
import subprocess as sp
from pprint import pprint
2. Execute the SSH command:
We'll use subprocess.run
to execute an SSH command and capture its output.
# We will extract data from the "show system" command
command = 'ssh admin@10.255.121.24 "show system"'
result = sp.run(command, shell=True, stdout=sp.PIPE, stderr=sp.PIPE, text=True, check=True, timeout=30)
# The result object provides the stdout with the command output as raw text.
print("--- CompletedProcess Object ---")
print(result)
Expected output for print(result)
(will vary based on your actual SSH output):
--- CompletedProcess Object ---
CompletedProcess(args='ssh admin@10.255.121.24 "show system"', returncode=0, stdout='System:\n Description: Alcatel-Lucent Enterprise OS6900-X40 8.9.94.R04 GA, March 28, 2024.,\n Object ID: 1.3.6.1.4.1.6486.801.1.1.2.1.10.1.2,\n Up Time: 120 days 21 hours 29 minutes and 0 seconds,\n Contact: Alcatel-Lucent Enterprise, https://www.al-enterprise.com,\n Name: OS6900-X40,\n Location: Unknown,\n Services: 78,\n Date & Time: MON JUN 02 2025 19:23:22 (UTC)\nFlash Space:\n Primary CMM:\n Available (bytes): 1440706560,\n Comments : None\n\n', stderr='')
3. Access the raw output (stdout
):
# Here is the stdout raw text
print("\n--- Raw stdout from SSH Command ---")
print(result.stdout)
Expected result.stdout
(will vary based on your actual SSH output):
--- Raw stdout from SSH Command ---
System:
Description: Alcatel-Lucent Enterprise OS6900-X40 8.9.94.R04 GA, March 28, 2024.,
Object ID: 1.3.6.1.4.1.6486.801.1.1.2.1.10.1.2,
Up Time: 120 days 21 hours 29 minutes and 0 seconds,
Contact: Alcatel-Lucent Enterprise, https://www.al-enterprise.com,
Name: OS6900-X40,
Location: Unknown,
Services: 78,
Date & Time: MON JUN 02 2025 19:23:22 (UTC)
Flash Space:
Primary CMM:
Available (bytes): 1440706560,
Comments : None
4. Parse the output using tsbuddy
:
# Lets parse it and see the result
system_info = ts.parse_system(result.stdout)
print("\n--- Parsed System Information ---")
pprint(system_info, sort_dicts=False)
Output:
--- Parsed System Information ---
[{'Description': 'Alcatel-Lucent Enterprise OS6900-X40 8.9.94.R04 GA, March '
'28, 2024.',
'Object ID': '1.3.6.1.4.1.6486.801.1.1.2.1.10.1.2',
'Up Time': '120 days 21 hours 29 minutes and 0 seconds',
'Contact': 'Alcatel-Lucent Enterprise, https://www.al-enterprise.com',
'Name': 'OS6900-X40',
'Location': 'Unknown',
'Services': '78',
'Date & Time': 'MON JUN 02 2025 19:23:22 (UTC)',
'Primary CMM - Available (bytes)': '1440706560',
'Primary CMM - Comments': 'None'}]
5. Access specific data from the parsed output:
# Get the specific data you want, such as querying "Up Time"
print(system_info[0]["Up Time"])
Output:
120 days 21 hours 29 minutes and 0 seconds
aosdl
is a CLI command included in the tsbuddy
module that facilitates downloading AOS images to OmniSwitch. It automates the process of connecting to the devices via SSH, identifying their platform family, and downloading the appropriate images from your local repo.
Run the aosdl
command directly from your terminal:
(venv) admin:~/$ aosdl
This will prompt you to enter device details (IP, username, and password) and the AOS version. The script will then connect to the devices, identify their platform family, and download the appropriate images to their /flash/ directory.
(venv) admin:~/$ aosdl
Enter device IP: 192.168.1.1
Enter username for 192.168.1.1 [admin]: admin
Enter password for 192.168.1.1 [switch]:
Connecting to 192.168.1.1...
[192.168.1.1] Platform family: shasta
[192.168.1.1] Downloading Uos.img...
[192.168.1.1] Downloaded Uos.img to /flash/
The aosdl
command simplifies the process of pushing AOS images across multiple devices. For more details, see the aosdl README.
The tsbuddy
module is designed to be extensible. Future development could include:
show fabric
, vrf ... show ...
, debug show ...
).Contributions are welcome! If you have ideas for improvements or new features, or if you've found a bug, please feel free to:
git checkout -b feature/YourFeature
or bugfix/YourBugfix
).git commit -m 'Add some feature'
).git push origin feature/YourFeature
).Please ensure your code adheres to any existing style guidelines and includes tests where appropriate.
tsbuddy
features.aosup
, aosga
, ts-extract
, ts-log
.aosdl
, ts-csv
.FAQs
Tech Support Buddy is a versatile Python module built to empower developers and IT professionals in resolving technical issues. It provides a suite of Python functions designed to efficiently diagnose and resolve technical issues by parsing raw text into structured data, enabling automation and data-driven decision-making.
We found that tsbuddy demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
/Security News
A RubyGems malware campaign used 60 malicious packages posing as automation tools to steal credentials from social media and marketing tool users.
Security News
The CNA Scorecard ranks CVE issuers by data completeness, revealing major gaps in patch info and software identifiers across thousands of vulnerabilities.
Research
/Security News
Two npm packages masquerading as WhatsApp developer libraries include a kill switch that deletes all files if the phone number isn’t whitelisted.