pyRetroTerm


NamepyRetroTerm JSON
Version 0.2.0 PyPI version JSON
download
home_pagehttps://github.com/scottpeterman/pyretroterm
SummarypyRetroTerm - A PyQt6 Terminal Emulator with Real-time Telemetry and Retro Themes
upload_time2025-02-17 02:32:49
maintainerNone
docs_urlNone
authorScott Peterman
requires_python>=3.9
licenseNone
keywords terminal ssh network automation telemetry monitoring pyqt6
VCS
bugtrack_url
requirements backports.tarfile bcrypt certifi cffi charset-normalizer click colorama cryptography docutils idna importlib_metadata jaraco.classes jaraco.context jaraco.functools keyring logicmonitor-sdk markdown-it-py mdurl more-itertools napalm nh3 packaging paramiko pkginfo pycparser Pygments PyNaCl pynetbox PyQt6 PyQt6-Charts PyQt6-Charts-Qt6 PyQt6-Qt6 PyQt6-WebEngine PyQt6-WebEngine-Qt6 PyQt6_sip python-dateutil pywin32-ctypes PyYAML qasync readme_renderer requests requests-toolbelt rfc3986 rich six twine typing_extensions urllib3 zipp
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # pyRetroTerm
![Screenshot](https://raw.githubusercontent.com/scottpeterman/pyretroterm/main/screenshots/0_2_0/radar.svg)

A modern terminal emulator built with PyQt6, featuring dynamic themes, real-time telemetry, and advanced terminal capabilities.

![Screenshot](https://raw.githubusercontent.com/scottpeterman/pyretroterm/main/screenshots/0_2_0/slides1.gif)
![License](https://img.shields.io/badge/license-GPL--3.0-blue.svg)
![Python](https://img.shields.io/badge/python-3.9+-blue.svg)

## Features

### Core Features

#### Telemetry Interface Features
- Modern terminal emulator with three-pane adaptive layout:
  - Left: Session management and device navigation
  - Center: Terminal interface with full emulation
  - Right: Device telemetry and status panels
- Dynamic theme system with live preview and hot-reload
- Multi-tabbed terminal support with session persistence
- Quick connect functionality for rapid device access
- Session search and filtering capabilities
- Adjustable layouts with resizable panes

#### Device Monitoring
- Real-time interface status monitoring with UP/DOWN indicators
- Live system resource tracking (CPU, Memory, Temperature)
- Environmental monitoring dashboard
- Automatic neighbor discovery via LLDP
- Debug logging with timestamped events
- Default route and network topology visualization

#### Terminal Capabilities
- Full SSH terminal emulation
- Secure credential management with encryption
- Multiple device type support (Linux, Cisco IOS, Arista EOS, etc.)
- Sessions organization and persistence
- Customizable text rendering and display options
- Zoom controls for accessibility

### Dynamic Theming System
- Theme configuration via external JSON files for easy customization
- Rich set of included themes: Cyberpunk, CRT (Amber/Green), Dark/Light, Borland, Gruvbox, Nord, and more
- Simple theme creation and modification without code changes
- Real-time theme switching and reloading

### Real-Time Telemetry
- Live device monitoring and statistics
- Interface status tracking
- Environmental monitoring (CPU, Memory, Temperature, Power, Fans)
- Real-time device information updates
- LLDP neighbor discovery

### Integration Capabilities

#### Netbox Integration

- Bulk export of device configurations, organizing folders by site
- Preserves device metadata (model, serial, vendor info)
- SSL verification options for internal deployments
- Progress tracking for large deployments

#### LogicMonitor Integration
- Automated device import from LogicMonitor monitoring platform
- Geographic site-based organization
- Secure API key authentication
- Support for custom SSL certificates (e.g., Zscaler)
- Intelligent property mapping (model, serial, version)
- Progress tracking and status updates
- Configurable batch processing
- Persistence to YAML file for sessions use

#### Additional Integration Features
- Portable session management with YAML configuration
- Plugin system for extensibility
- Automated credential management
- Bulk import/export capabilities

## Installation

### Via pip

```bash
pip install pyretroterm
pyretroterm
```

### From source

```bash
git clone https://github.com/scottpeterman/pyretroterm.git
cd pyretroterm
pip install -r requirements.txt
python -m pyretroterm.pyretroterm
```

## Quick Start

1. Launch the application:
```bash
pyretroterm
```

2. For console mode:
```bash
pyretroterm-con
```

3. Install theme pack (optional but recommended):
   ```bash
   # Create themes directory in your installation
   mkdir themes
   
   # Download and extract theme pack
   curl -LO https://raw.githubusercontent.com/scottpeterman/pyretroterm/main/themes.zip
   unzip themes.zip -d themes/
   ```
   
4. On first launch:
   - Set up a master password for credential management
   - Configure your session settings
   - Choose your preferred theme from the expanded theme collection
   - If themes don't appear, ensure theme JSON files are in the 'themes' directory

## Interface Overview

### Main Window Layout
The interface is divided into three main sections:
- **Left Panel**: Session management, search, and quick connect
- **Center Panel**: Active terminal session with full terminal emulation
- **Right Panel**: Device telemetry, controls, and monitoring

### Device Information Display
- Real-time device status and information
- Interface status monitoring with visual indicators
- Environmental metrics (CPU, Memory, Temperature, etc.)
- LLDP neighbor discovery and topology
- Routing table and network information

### Theme System
The application includes several professionally designed themes:
- Cyberpunk (neon blue accents)
- CRT Amber/Green (classic terminal looks)
- Dark/Light modes for different environments
- Borland (nostalgic IDE style)
- Modern themes (Nord, Gruvbox, Solarized)
Each theme provides consistent styling across all panels and includes:
- Custom border designs and panel layouts
- Color-coded status indicators
- Readable typography and contrast ratios
- Live preview and hot-reload capability

## Device Support

### Supported Network Operating Systems
- Cisco IOS
- Arista EOS
- Cisco NXOS (SSH)
- Juniper JUNOS
- Linux/Unix Systems

### Telemetry Support
Each platform supports different levels of telemetry collection:

#### Full SSH Based Telemetry Support
- Interface status monitoring
- CPU and memory statistics
- Environmental monitoring (temperature, power, fans)
- LLDP neighbor discovery
- Routing table information
- Hardware inventory
- System information

#### Platform-Specific Capabilities
- **Linux/Unix**:
  - Dynamic hardware detection
  - Detailed CPU core monitoring
  - Memory usage with buffer/cache analysis
  - VMware environment detection
  - Temperature sensors with thresholds
  - Power supply status
  - Fan speed monitoring
  - Hardware platform detection
  - Enhanced security with sudo support
  
- **Network Devices** (IOS, EOS, NXOS, JUNOS):
  - Interface statistics
  - Protocol states
  - Hardware health monitoring
  - Power and cooling status
  - Configuration analysis
  - Routing protocol information

## Extensibility

### Driver Architecture
pyRetroTerm features a modular driver architecture that allows easy addition of new device support:

```python
class CustomDriver:
    def __init__(self, hostname, username, password, optional_args=None):
        self.hostname = hostname
        self.username = username
        self.password = password
        self.optional_args = optional_args or {}
        
    def get_facts(self):
        # Implement device fact collection
        pass
        
    def get_environment(self):
        # Implement environmental monitoring
        pass
        
    def get_interfaces(self):
        # Implement interface status collection
        pass
```

### Adding New Device Support
1. Create a new driver class implementing the standard interface
2. Add device-specific command parsing
3. Implement telemetry collection methods
4. Register the driver with the platform

### Example: Custom Linux Driver Features
- Robust error handling and recovery
- Flexible command execution
- Privilege escalation management
- Dynamic capability detection
- Comprehensive hardware discovery
- Detailed system information collection

## Configuration

### Integration Configuration

#### Netbox Setup
1. Obtain your Netbox API token from your Netbox instance
2. Configure the connection:
   - Enter your Netbox URL (e.g., "http://netbox.yourcompany.com")
   - Input your API token
   - Optionally disable SSL verification for internal deployments
3. Click "Download" to start the import process
4. Save the generated YAML file

#### LogicMonitor Setup
1. Gather your LogicMonitor credentials:
   - Company name
   - Access ID
   - Access Key
2. Optional: Configure SSL certificate path for Zscaler
3. Run the import process
4. Save the generated YAML configuration

### Sessions
Sessions are configured via YAML files. Example configuration:

```yaml
- folder_name: Example
  sessions:
  - DeviceType: linux
    Model: vm 
    SerialNumber: ''
    SoftwareVersion: ''
    Vendor: ubuntu
    credsid: '1'
    display_name: T1000
    host: 10.0.0.104
    port: '22'
```

### Custom Themes
Themes are defined in JSON files for easy customization and can be installed from the themes pack:

1. Download the official theme pack:
   ```bash
   curl -LO https://raw.githubusercontent.com/scottpeterman/pyretroterm/main/themes.zip
   ```

2. Extract to your themes directory:
   ```bash
   unzip themes.zip -d themes/
   ```
3. Themes folder is scanned at startup (or via UI) and dynamically loaded

4. Create new themes by adding JSON files to the themes directory

Example theme structure:
```json
{
  "name": "my-custom-theme",
  "colors": {
    "background": "#1e1e1e",
    "text": "#ffffff",
    "primary": "#0affff",
    "secondary": "#888888",
    "border": "#444444"
  }
}
```

## Security Features
- Protection of stored secrets
- PBKDF2-HMAC-SHA256 key derivation (480,000 iterations)
- Fernet (AES-128-CBC) encryption with HMAC authentication
- Platform-specific secure

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/scottpeterman/pyretroterm",
    "name": "pyRetroTerm",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "terminal, ssh, network, automation, telemetry, monitoring, pyqt6",
    "author": "Scott Peterman",
    "author_email": "scottpeterman@gmail.com",
    "download_url": null,
    "platform": null,
    "description": "# pyRetroTerm\r\n![Screenshot](https://raw.githubusercontent.com/scottpeterman/pyretroterm/main/screenshots/0_2_0/radar.svg)\r\n\r\nA modern terminal emulator built with PyQt6, featuring dynamic themes, real-time telemetry, and advanced terminal capabilities.\r\n\r\n![Screenshot](https://raw.githubusercontent.com/scottpeterman/pyretroterm/main/screenshots/0_2_0/slides1.gif)\r\n![License](https://img.shields.io/badge/license-GPL--3.0-blue.svg)\r\n![Python](https://img.shields.io/badge/python-3.9+-blue.svg)\r\n\r\n## Features\r\n\r\n### Core Features\r\n\r\n#### Telemetry Interface Features\r\n- Modern terminal emulator with three-pane adaptive layout:\r\n  - Left: Session management and device navigation\r\n  - Center: Terminal interface with full emulation\r\n  - Right: Device telemetry and status panels\r\n- Dynamic theme system with live preview and hot-reload\r\n- Multi-tabbed terminal support with session persistence\r\n- Quick connect functionality for rapid device access\r\n- Session search and filtering capabilities\r\n- Adjustable layouts with resizable panes\r\n\r\n#### Device Monitoring\r\n- Real-time interface status monitoring with UP/DOWN indicators\r\n- Live system resource tracking (CPU, Memory, Temperature)\r\n- Environmental monitoring dashboard\r\n- Automatic neighbor discovery via LLDP\r\n- Debug logging with timestamped events\r\n- Default route and network topology visualization\r\n\r\n#### Terminal Capabilities\r\n- Full SSH terminal emulation\r\n- Secure credential management with encryption\r\n- Multiple device type support (Linux, Cisco IOS, Arista EOS, etc.)\r\n- Sessions organization and persistence\r\n- Customizable text rendering and display options\r\n- Zoom controls for accessibility\r\n\r\n### Dynamic Theming System\r\n- Theme configuration via external JSON files for easy customization\r\n- Rich set of included themes: Cyberpunk, CRT (Amber/Green), Dark/Light, Borland, Gruvbox, Nord, and more\r\n- Simple theme creation and modification without code changes\r\n- Real-time theme switching and reloading\r\n\r\n### Real-Time Telemetry\r\n- Live device monitoring and statistics\r\n- Interface status tracking\r\n- Environmental monitoring (CPU, Memory, Temperature, Power, Fans)\r\n- Real-time device information updates\r\n- LLDP neighbor discovery\r\n\r\n### Integration Capabilities\r\n\r\n#### Netbox Integration\r\n\r\n- Bulk export of device configurations, organizing folders by site\r\n- Preserves device metadata (model, serial, vendor info)\r\n- SSL verification options for internal deployments\r\n- Progress tracking for large deployments\r\n\r\n#### LogicMonitor Integration\r\n- Automated device import from LogicMonitor monitoring platform\r\n- Geographic site-based organization\r\n- Secure API key authentication\r\n- Support for custom SSL certificates (e.g., Zscaler)\r\n- Intelligent property mapping (model, serial, version)\r\n- Progress tracking and status updates\r\n- Configurable batch processing\r\n- Persistence to YAML file for sessions use\r\n\r\n#### Additional Integration Features\r\n- Portable session management with YAML configuration\r\n- Plugin system for extensibility\r\n- Automated credential management\r\n- Bulk import/export capabilities\r\n\r\n## Installation\r\n\r\n### Via pip\r\n\r\n```bash\r\npip install pyretroterm\r\npyretroterm\r\n```\r\n\r\n### From source\r\n\r\n```bash\r\ngit clone https://github.com/scottpeterman/pyretroterm.git\r\ncd pyretroterm\r\npip install -r requirements.txt\r\npython -m pyretroterm.pyretroterm\r\n```\r\n\r\n## Quick Start\r\n\r\n1. Launch the application:\r\n```bash\r\npyretroterm\r\n```\r\n\r\n2. For console mode:\r\n```bash\r\npyretroterm-con\r\n```\r\n\r\n3. Install theme pack (optional but recommended):\r\n   ```bash\r\n   # Create themes directory in your installation\r\n   mkdir themes\r\n   \r\n   # Download and extract theme pack\r\n   curl -LO https://raw.githubusercontent.com/scottpeterman/pyretroterm/main/themes.zip\r\n   unzip themes.zip -d themes/\r\n   ```\r\n   \r\n4. On first launch:\r\n   - Set up a master password for credential management\r\n   - Configure your session settings\r\n   - Choose your preferred theme from the expanded theme collection\r\n   - If themes don't appear, ensure theme JSON files are in the 'themes' directory\r\n\r\n## Interface Overview\r\n\r\n### Main Window Layout\r\nThe interface is divided into three main sections:\r\n- **Left Panel**: Session management, search, and quick connect\r\n- **Center Panel**: Active terminal session with full terminal emulation\r\n- **Right Panel**: Device telemetry, controls, and monitoring\r\n\r\n### Device Information Display\r\n- Real-time device status and information\r\n- Interface status monitoring with visual indicators\r\n- Environmental metrics (CPU, Memory, Temperature, etc.)\r\n- LLDP neighbor discovery and topology\r\n- Routing table and network information\r\n\r\n### Theme System\r\nThe application includes several professionally designed themes:\r\n- Cyberpunk (neon blue accents)\r\n- CRT Amber/Green (classic terminal looks)\r\n- Dark/Light modes for different environments\r\n- Borland (nostalgic IDE style)\r\n- Modern themes (Nord, Gruvbox, Solarized)\r\nEach theme provides consistent styling across all panels and includes:\r\n- Custom border designs and panel layouts\r\n- Color-coded status indicators\r\n- Readable typography and contrast ratios\r\n- Live preview and hot-reload capability\r\n\r\n## Device Support\r\n\r\n### Supported Network Operating Systems\r\n- Cisco IOS\r\n- Arista EOS\r\n- Cisco NXOS (SSH)\r\n- Juniper JUNOS\r\n- Linux/Unix Systems\r\n\r\n### Telemetry Support\r\nEach platform supports different levels of telemetry collection:\r\n\r\n#### Full SSH Based Telemetry Support\r\n- Interface status monitoring\r\n- CPU and memory statistics\r\n- Environmental monitoring (temperature, power, fans)\r\n- LLDP neighbor discovery\r\n- Routing table information\r\n- Hardware inventory\r\n- System information\r\n\r\n#### Platform-Specific Capabilities\r\n- **Linux/Unix**:\r\n  - Dynamic hardware detection\r\n  - Detailed CPU core monitoring\r\n  - Memory usage with buffer/cache analysis\r\n  - VMware environment detection\r\n  - Temperature sensors with thresholds\r\n  - Power supply status\r\n  - Fan speed monitoring\r\n  - Hardware platform detection\r\n  - Enhanced security with sudo support\r\n  \r\n- **Network Devices** (IOS, EOS, NXOS, JUNOS):\r\n  - Interface statistics\r\n  - Protocol states\r\n  - Hardware health monitoring\r\n  - Power and cooling status\r\n  - Configuration analysis\r\n  - Routing protocol information\r\n\r\n## Extensibility\r\n\r\n### Driver Architecture\r\npyRetroTerm features a modular driver architecture that allows easy addition of new device support:\r\n\r\n```python\r\nclass CustomDriver:\r\n    def __init__(self, hostname, username, password, optional_args=None):\r\n        self.hostname = hostname\r\n        self.username = username\r\n        self.password = password\r\n        self.optional_args = optional_args or {}\r\n        \r\n    def get_facts(self):\r\n        # Implement device fact collection\r\n        pass\r\n        \r\n    def get_environment(self):\r\n        # Implement environmental monitoring\r\n        pass\r\n        \r\n    def get_interfaces(self):\r\n        # Implement interface status collection\r\n        pass\r\n```\r\n\r\n### Adding New Device Support\r\n1. Create a new driver class implementing the standard interface\r\n2. Add device-specific command parsing\r\n3. Implement telemetry collection methods\r\n4. Register the driver with the platform\r\n\r\n### Example: Custom Linux Driver Features\r\n- Robust error handling and recovery\r\n- Flexible command execution\r\n- Privilege escalation management\r\n- Dynamic capability detection\r\n- Comprehensive hardware discovery\r\n- Detailed system information collection\r\n\r\n## Configuration\r\n\r\n### Integration Configuration\r\n\r\n#### Netbox Setup\r\n1. Obtain your Netbox API token from your Netbox instance\r\n2. Configure the connection:\r\n   - Enter your Netbox URL (e.g., \"http://netbox.yourcompany.com\")\r\n   - Input your API token\r\n   - Optionally disable SSL verification for internal deployments\r\n3. Click \"Download\" to start the import process\r\n4. Save the generated YAML file\r\n\r\n#### LogicMonitor Setup\r\n1. Gather your LogicMonitor credentials:\r\n   - Company name\r\n   - Access ID\r\n   - Access Key\r\n2. Optional: Configure SSL certificate path for Zscaler\r\n3. Run the import process\r\n4. Save the generated YAML configuration\r\n\r\n### Sessions\r\nSessions are configured via YAML files. Example configuration:\r\n\r\n```yaml\r\n- folder_name: Example\r\n  sessions:\r\n  - DeviceType: linux\r\n    Model: vm \r\n    SerialNumber: ''\r\n    SoftwareVersion: ''\r\n    Vendor: ubuntu\r\n    credsid: '1'\r\n    display_name: T1000\r\n    host: 10.0.0.104\r\n    port: '22'\r\n```\r\n\r\n### Custom Themes\r\nThemes are defined in JSON files for easy customization and can be installed from the themes pack:\r\n\r\n1. Download the official theme pack:\r\n   ```bash\r\n   curl -LO https://raw.githubusercontent.com/scottpeterman/pyretroterm/main/themes.zip\r\n   ```\r\n\r\n2. Extract to your themes directory:\r\n   ```bash\r\n   unzip themes.zip -d themes/\r\n   ```\r\n3. Themes folder is scanned at startup (or via UI) and dynamically loaded\r\n\r\n4. Create new themes by adding JSON files to the themes directory\r\n\r\nExample theme structure:\r\n```json\r\n{\r\n  \"name\": \"my-custom-theme\",\r\n  \"colors\": {\r\n    \"background\": \"#1e1e1e\",\r\n    \"text\": \"#ffffff\",\r\n    \"primary\": \"#0affff\",\r\n    \"secondary\": \"#888888\",\r\n    \"border\": \"#444444\"\r\n  }\r\n}\r\n```\r\n\r\n## Security Features\r\n- Protection of stored secrets\r\n- PBKDF2-HMAC-SHA256 key derivation (480,000 iterations)\r\n- Fernet (AES-128-CBC) encryption with HMAC authentication\r\n- Platform-specific secure\r\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "pyRetroTerm - A PyQt6 Terminal Emulator with Real-time Telemetry and Retro Themes",
    "version": "0.2.0",
    "project_urls": {
        "Homepage": "https://github.com/scottpeterman/pyretroterm"
    },
    "split_keywords": [
        "terminal",
        " ssh",
        " network",
        " automation",
        " telemetry",
        " monitoring",
        " pyqt6"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "151c335f440162d4e9074b844baaa156c94f8873e40a2ce745789f2d071322f4",
                "md5": "0d561d58f76ff1e5f9f6ca0a3f5512fe",
                "sha256": "76575bc010b8b381f65e98d1a92bdf932260bb176b00c3553861b0f2a8562b61"
            },
            "downloads": -1,
            "filename": "pyRetroTerm-0.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "0d561d58f76ff1e5f9f6ca0a3f5512fe",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 23430231,
            "upload_time": "2025-02-17T02:32:49",
            "upload_time_iso_8601": "2025-02-17T02:32:49.625830Z",
            "url": "https://files.pythonhosted.org/packages/15/1c/335f440162d4e9074b844baaa156c94f8873e40a2ce745789f2d071322f4/pyRetroTerm-0.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-02-17 02:32:49",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "scottpeterman",
    "github_project": "pyretroterm",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "backports.tarfile",
            "specs": [
                [
                    ">=",
                    "1.2.0"
                ]
            ]
        },
        {
            "name": "bcrypt",
            "specs": [
                [
                    ">=",
                    "4.2.1"
                ]
            ]
        },
        {
            "name": "certifi",
            "specs": [
                [
                    ">=",
                    "2024.12.14"
                ]
            ]
        },
        {
            "name": "cffi",
            "specs": [
                [
                    ">=",
                    "1.17.1"
                ]
            ]
        },
        {
            "name": "charset-normalizer",
            "specs": [
                [
                    ">=",
                    "3.4.1"
                ]
            ]
        },
        {
            "name": "click",
            "specs": [
                [
                    ">=",
                    "8.1.8"
                ]
            ]
        },
        {
            "name": "colorama",
            "specs": [
                [
                    ">=",
                    "0.4.6"
                ]
            ]
        },
        {
            "name": "cryptography",
            "specs": [
                [
                    ">=",
                    "44.0.0"
                ]
            ]
        },
        {
            "name": "docutils",
            "specs": [
                [
                    ">=",
                    "0.21.2"
                ]
            ]
        },
        {
            "name": "idna",
            "specs": [
                [
                    ">=",
                    "3.10"
                ]
            ]
        },
        {
            "name": "importlib_metadata",
            "specs": [
                [
                    ">=",
                    "8.5.0"
                ]
            ]
        },
        {
            "name": "jaraco.classes",
            "specs": [
                [
                    ">=",
                    "3.4.0"
                ]
            ]
        },
        {
            "name": "jaraco.context",
            "specs": [
                [
                    ">=",
                    "6.0.1"
                ]
            ]
        },
        {
            "name": "jaraco.functools",
            "specs": [
                [
                    ">=",
                    "4.1.0"
                ]
            ]
        },
        {
            "name": "keyring",
            "specs": [
                [
                    ">=",
                    "25.6.0"
                ]
            ]
        },
        {
            "name": "logicmonitor-sdk",
            "specs": [
                [
                    ">=",
                    "3.0.222"
                ]
            ]
        },
        {
            "name": "markdown-it-py",
            "specs": [
                [
                    ">=",
                    "3.0.0"
                ]
            ]
        },
        {
            "name": "mdurl",
            "specs": [
                [
                    ">=",
                    "0.1.2"
                ]
            ]
        },
        {
            "name": "more-itertools",
            "specs": [
                [
                    ">=",
                    "10.6.0"
                ]
            ]
        },
        {
            "name": "napalm",
            "specs": [
                [
                    ">=",
                    "5.0.0"
                ]
            ]
        },
        {
            "name": "nh3",
            "specs": [
                [
                    ">=",
                    "0.2.20"
                ]
            ]
        },
        {
            "name": "packaging",
            "specs": [
                [
                    ">=",
                    "24.2"
                ]
            ]
        },
        {
            "name": "paramiko",
            "specs": [
                [
                    ">=",
                    "3.5.0"
                ]
            ]
        },
        {
            "name": "pkginfo",
            "specs": [
                [
                    ">=",
                    "1.12.0"
                ]
            ]
        },
        {
            "name": "pycparser",
            "specs": [
                [
                    ">=",
                    "2.22"
                ]
            ]
        },
        {
            "name": "Pygments",
            "specs": [
                [
                    ">=",
                    "2.19.1"
                ]
            ]
        },
        {
            "name": "PyNaCl",
            "specs": [
                [
                    ">=",
                    "1.5.0"
                ]
            ]
        },
        {
            "name": "pynetbox",
            "specs": [
                [
                    ">=",
                    "7.4.1"
                ]
            ]
        },
        {
            "name": "PyQt6",
            "specs": [
                [
                    ">=",
                    "6.8.0"
                ]
            ]
        },
        {
            "name": "PyQt6-Charts",
            "specs": [
                [
                    ">=",
                    "6.8.0"
                ]
            ]
        },
        {
            "name": "PyQt6-Charts-Qt6",
            "specs": [
                [
                    ">=",
                    "6.8.1"
                ]
            ]
        },
        {
            "name": "PyQt6-Qt6",
            "specs": [
                [
                    ">=",
                    "6.8.1"
                ]
            ]
        },
        {
            "name": "PyQt6-WebEngine",
            "specs": [
                [
                    ">=",
                    "6.8.0"
                ]
            ]
        },
        {
            "name": "PyQt6-WebEngine-Qt6",
            "specs": [
                [
                    ">=",
                    "6.8.1"
                ]
            ]
        },
        {
            "name": "PyQt6_sip",
            "specs": [
                [
                    ">=",
                    "13.9.1"
                ]
            ]
        },
        {
            "name": "python-dateutil",
            "specs": [
                [
                    ">=",
                    "2.9.0.post0"
                ]
            ]
        },
        {
            "name": "pywin32-ctypes",
            "specs": [
                [
                    ">=",
                    "0.2.3"
                ]
            ]
        },
        {
            "name": "PyYAML",
            "specs": [
                [
                    ">=",
                    "6.0.2"
                ]
            ]
        },
        {
            "name": "qasync",
            "specs": [
                [
                    ">=",
                    "0.27.1"
                ]
            ]
        },
        {
            "name": "readme_renderer",
            "specs": [
                [
                    ">=",
                    "44.0"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    ">=",
                    "2.32.3"
                ]
            ]
        },
        {
            "name": "requests-toolbelt",
            "specs": [
                [
                    ">=",
                    "1.0.0"
                ]
            ]
        },
        {
            "name": "rfc3986",
            "specs": [
                [
                    ">=",
                    "2.0.0"
                ]
            ]
        },
        {
            "name": "rich",
            "specs": [
                [
                    ">=",
                    "13.9.4"
                ]
            ]
        },
        {
            "name": "six",
            "specs": [
                [
                    ">=",
                    "1.17.0"
                ]
            ]
        },
        {
            "name": "twine",
            "specs": [
                [
                    ">=",
                    "6.0.1"
                ]
            ]
        },
        {
            "name": "typing_extensions",
            "specs": [
                [
                    ">=",
                    "4.12.2"
                ]
            ]
        },
        {
            "name": "urllib3",
            "specs": [
                [
                    ">=",
                    "2.3.0"
                ]
            ]
        },
        {
            "name": "zipp",
            "specs": [
                [
                    ">=",
                    "3.21.0"
                ]
            ]
        }
    ],
    "lcname": "pyretroterm"
}
        
Elapsed time: 3.53509s