{"id":31608697,"url":"https://github.com/garryshtern/network-device-upgrade-system","last_synced_at":"2026-05-04T08:44:06.714Z","repository":{"id":313428109,"uuid":"1050134005","full_name":"garryshtern/network-device-upgrade-system","owner":"garryshtern","description":"Production-ready AWX-based network device upgrade management system for 1000+ heterogeneous network devices with comprehensive validation, security, and monitoring.","archived":false,"fork":false,"pushed_at":"2025-11-12T00:07:21.000Z","size":3173,"stargazers_count":1,"open_issues_count":16,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-04T08:43:16.308Z","etag":null,"topics":["ansible","awx","cisco","devops","firmware-upgrade","fortinet","grafana","influxdb","infrastructure-automation","monitoring","netbox","network-automation","network-devices","network-engineering","opengear","validation"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/garryshtern.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":null},"created_at":"2025-09-04T02:07:12.000Z","updated_at":"2026-02-13T14:00:45.000Z","dependencies_parsed_at":"2025-10-27T16:11:30.333Z","dependency_job_id":null,"html_url":"https://github.com/garryshtern/network-device-upgrade-system","commit_stats":null,"previous_names":["garryshtern/network-device-upgrade-system"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/garryshtern/network-device-upgrade-system","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garryshtern%2Fnetwork-device-upgrade-system","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garryshtern%2Fnetwork-device-upgrade-system/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garryshtern%2Fnetwork-device-upgrade-system/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garryshtern%2Fnetwork-device-upgrade-system/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/garryshtern","download_url":"https://codeload.github.com/garryshtern/network-device-upgrade-system/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garryshtern%2Fnetwork-device-upgrade-system/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32600967,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T22:12:39.696Z","status":"online","status_checked_at":"2026-05-04T02:00:06.625Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","awx","cisco","devops","firmware-upgrade","fortinet","grafana","influxdb","infrastructure-automation","monitoring","netbox","network-automation","network-devices","network-engineering","opengear","validation"],"created_at":"2025-10-06T08:23:33.792Z","updated_at":"2026-05-04T08:44:06.708Z","avatar_url":"https://github.com/garryshtern.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Network Device Upgrade Management System\n\nA complete AWX-based network device upgrade management system designed for managing firmware upgrades across 1000+ heterogeneous network devices with comprehensive validation, security, and monitoring.\n\n## Overview\n\nThis system provides automated firmware upgrade capabilities for:\n- **Cisco NX-OS** (Nexus Switches) with ISSU support\n- **Cisco IOS-XE** (Enterprise Routers/Switches) with Install Mode\n- **Opengear** (Console Servers/Smart PDUs) with multi-architecture support\n- **FortiOS** (Fortinet Firewalls) with HA coordination\n\n**Status**: Production ready for all platforms. See [Platform Implementation Status](docs/platform-implementation-status.md) for detailed status.\n\n## Key Features\n\n### ✅ **Phase-Separated Upgrade Process**\n- **Phase 1**: Image Loading (business hours safe)\n- **Phase 2**: Image Installation (maintenance window)\n- Complete rollback capabilities\n\n### 🔒 **Maximum Security Compliance**\n- **Server-Initiated PUSH Transfers Only** - All firmware pushed from upgrade server to devices\n- **Zero Device-Initiated Operations** - No device-to-server connections for firmware retrieval\n- **SSH Key Authentication Priority** - SSH keys preferred over password authentication\n- **SHA512 Hash Verification** - Complete integrity validation for all firmware images\n- **Cryptographic Signature Verification** - Where supported by platform\n- **Complete Security Audit Trail** - All operations logged and verified\n\n### 📊 **Advanced Validation**\n- Pre/post upgrade network state comparison\n- BGP, BFD, IGMP/multicast, routing validation\n- IPSec tunnel and VPN connectivity validation\n- Interface optics and transceiver health monitoring  \n- Protocol convergence timing with baseline comparison\n\n### 🚀 **Enterprise Integration**\n- Native systemd service deployment (AWX and NetBox)\n- Pre-existing NetBox integration\n- InfluxDB v2 metrics integration\n- ✅ **Complete Grafana dashboard automation** with multi-environment support\n- ✅ **Real-time operational monitoring** with 15-second refresh dashboards\n- Existing monitoring system integration\n\n## Quick Start\n\n### System Installation\n\n```bash\n# 1. Install base system\n./install/setup-system.sh\n\n# 2. Setup AWX with native services\n./install/setup-awx.sh\n\n# 3. Setup NetBox with native services\n./install/setup-netbox.sh\n\n# 4. Configure monitoring integration\n./install/configure-telegraf.sh\n\n# 5. Set up SSL certificates\n./install/setup-ssl.sh\n\n# 6. Start all services\n./install/create-services.sh\n\n# 7. Deploy Grafana dashboards\ncd integration/grafana\nexport INFLUXDB_TOKEN=\"your_token_here\"\n./provision-dashboards.sh\n```\n\n### Workflow Execution\n\n**Single Entry Point**: All upgrade operations use `main-upgrade-workflow.yml` with tag-based execution.\n\n```bash\n# Health check (connectivity validation) - STEP 1\nansible-playbook ansible-content/playbooks/main-upgrade-workflow.yml --tags step1 \\\n  -e target_hosts=mydevice -e max_concurrent=5\n\n# Pre-upgrade validation (network state baseline) - STEP 5\nansible-playbook ansible-content/playbooks/main-upgrade-workflow.yml --tags step5 \\\n  -e target_hosts=mydevice -e target_firmware=fw.bin -e max_concurrent=5\n\n# Image loading (business hours safe) - STEP 4\nansible-playbook ansible-content/playbooks/main-upgrade-workflow.yml --tags step4 \\\n  -e target_hosts=mydevice -e target_firmware=fw.bin -e max_concurrent=5\n\n# Full upgrade workflow (maintenance window)\nansible-playbook ansible-content/playbooks/main-upgrade-workflow.yml \\\n  -e target_hosts=mydevice -e target_firmware=fw.bin \\\n  -e max_concurrent=5 -e maintenance_window=true\n```\n\n**Container Usage** (Docker/Podman):\n```bash\n# Health check using container\ndocker run --rm -v $(pwd)/inventory:/inventory \\\n  ghcr.io/garryshtern/network-device-upgrade-system:latest \\\n  playbook main-upgrade-workflow.yml --tags step1 \\\n  -e target_hosts=mydevice -e max_concurrent=5\n\n# Full upgrade using container\ndocker run --rm -v $(pwd)/inventory:/inventory \\\n  -e ANSIBLE_TAGS=\"step1,step2,step3,step4,step5,step6,step7,step8\" \\\n  ghcr.io/garryshtern/network-device-upgrade-system:latest \\\n  playbook main-upgrade-workflow.yml \\\n  -e target_hosts=mydevice -e target_firmware=fw.bin \\\n  -e max_concurrent=5 -e maintenance_window=true\n```\n\n**Deprecated Playbooks**: Individual playbooks have been consolidated into the main workflow:\n- `health-check.yml` → Use `--tags step1` instead\n- `network-validation.yml` → Use `--tags step5` (pre-upgrade) or `--tags step7` (post-upgrade)\n- `image-loading.yml` → Use `--tags step4` instead\n- `image-installation.yml` → Use `--tags step6` instead\n- `emergency-rollback.yml` → Use `--tags step8` instead\n\n**Standalone Operational Playbooks** (still separate):\n- `compliance-audit.yml` - Security and compliance auditing\n- `config-backup.yml` - Configuration backup operations\n\n## 🧪 Testing Framework\n\n**Comprehensive testing capabilities for Mac/Linux development without physical devices:**\n\n### 📊 **Current Test Results** (Updated: November 5, 2025)\n- **✅ Syntax Validation: 100% CLEAN** - All 129+ Ansible files pass syntax checks\n- **✅ Comprehensive Test Suite: 100% PASS** - All 50 test suites passing ✅\n- **✅ Critical Gap Test Suite: 100% PASS** - All 5 business-critical tests passing ($2.8M risk mitigation) ✅\n- **✅ Security Validation: 100% COMPLIANT** - All secure transfer and security boundary tests passing\n- **✅ Container Integration: SUCCESS** - Multi-architecture images (amd64/arm64) available\n- **✅ End-to-End Testing: VERIFIED** - Complete workflow validation across all platforms\n\n### 🚀 **Quick Testing**\n```bash\n# Syntax validation (100% clean)\nansible-playbook --syntax-check ansible-content/playbooks/main-upgrade-workflow.yml \\\n  -e target_hosts=localhost -e target_firmware=test.bin \\\n  -e maintenance_window=true -e max_concurrent=1\n\n# Mock device testing (all 5 platforms)\nansible-playbook -i tests/mock-inventories/all-platforms.yml --check \\\n  ansible-content/playbooks/main-upgrade-workflow.yml \\\n  -e target_hosts=all -e target_firmware=test.bin \\\n  -e maintenance_window=true -e max_concurrent=5\n\n# Tag-based testing (individual steps)\nansible-playbook --syntax-check ansible-content/playbooks/main-upgrade-workflow.yml \\\n  --tags step1 -e target_hosts=localhost -e max_concurrent=1\n\n# Complete test suite\n./tests/run-all-tests.sh\n\n# Molecule testing (requires Docker)\ncd tests/molecule-tests \u0026\u0026 molecule test\n\n# Container testing (production ready)\ndocker run --rm ghcr.io/garryshtern/network-device-upgrade-system:latest\npodman run --rm ghcr.io/garryshtern/network-device-upgrade-system:latest\n```\n\n### ✅ **Testing Categories - FULLY IMPLEMENTED**\n- **Mock Inventory Testing** - Simulated device testing for all platforms ✅\n- **Variable Validation** - Requirements and constraint validation ✅ \n- **Template Rendering** - Jinja2 template testing without connections ✅\n- **Workflow Logic** - Decision path and conditional testing ✅\n- **Error Handling** - Error condition and recovery validation ✅\n- **Integration Testing** - Complete workflow with mock devices ✅\n- **Performance Testing** - Execution time and resource measurement ✅\n- **Molecule Testing** - Container-based advanced testing ✅\n- **Platform-Specific Testing** - Vendor-specific comprehensive testing ✅\n- **YAML/JSON Validation** - File syntax and structure validation ✅\n- **CI/CD Integration** - GitHub Actions automated testing ✅\n\n**See comprehensive guide**: [Documentation Hub](docs/README.md) - Complete testing and setup documentation\n\n## 📚 Documentation\n\n**Complete documentation with architectural diagrams and implementation guides:**\n\n- **[📖 Documentation Hub](docs/README.md)** - Start here for comprehensive guides\n- **[⚙️ Installation \u0026 Configuration](CLAUDE.md)** - Complete system documentation including installation, parameters, and troubleshooting\n- **[🔄 Upgrade Workflow Guide](docs/user-guides/upgrade-workflow-guide.md)** - Upgrade process and safety mechanisms\n- **[🐳 Container Deployment Guide](docs/user-guides/container-deployment.md)** - Docker/Podman deployment\n- **[🏗️ Platform Implementation Status](docs/platform-guides/platform-implementation-status.md)** - Technical implementation details and feature support\n- **[🧪 Pre-Commit Setup Guide](docs/testing/pre-commit-setup.md)** - Quality gates and testing requirements\n- **[📝 Internal Documentation Index](docs/internal/INDEX.md)** - Developer reference guides and analysis documents\n\n## Architecture\n\n### System Overview\n\n```mermaid\ngraph TD\n    A[AWX Services\u003cbr/\u003eJob Control\u003cbr/\u003esystemd] --\u003e B[Ansible Engine\u003cbr/\u003ePlaybook Execution\u003cbr/\u003eRole-Based]\n    B --\u003e C[Network Devices\u003cbr/\u003e1000+ Supported\u003cbr/\u003eMulti-Vendor]\n    \n    D[NetBox\u003cbr/\u003eInventory DB\u003cbr/\u003ePre-existing] --\u003e B\n    E[Telegraf\u003cbr/\u003eMetrics Agent\u003cbr/\u003eCollection] --\u003e F[InfluxDB v2\u003cbr/\u003eTime Series\u003cbr/\u003eExisting]\n    \n    C --\u003e F\n    F --\u003e H[Grafana\u003cbr/\u003eDashboards\u003cbr/\u003eExisting]\n    \n    C -.-\u003e I[Cisco NX-OS]\n    C -.-\u003e J[Cisco IOS-XE]\n    C -.-\u003e K[FortiOS]\n    C -.-\u003e L[Opengear]\n    \n    style A fill:#e1f5fe\n    style C fill:#f3e5f5\n    style F fill:#e8f5e8\n    style H fill:#fff3e0\n```\n\n**Alternative System Flow:**\n\n| Component | Function | Integration |\n|-----------|----------|-------------|\n| **AWX Services (systemd)** | Job orchestration and workflow control | → Ansible Engine |\n| **Ansible Engine** | Playbook execution and device automation | → Network Devices |\n| **NetBox (Pre-existing)** | Device inventory and IPAM management | → Ansible Engine |\n| **Telegraf** | Metrics collection agent | → InfluxDB v2 |\n| **Network Devices** | Target devices for upgrades | → Metrics Export |\n| **InfluxDB v2** | Time-series metrics storage | → Grafana |\n| **Grafana** | Monitoring dashboards and visualization | Final consumer |\n\n### Component Interaction Flow\n\n```mermaid\nflowchart TD\n    U[User Request] --\u003e A[AWX Web UI]\n    A --\u003e B[Job Templates]\n    B --\u003e C[Workflows]\n    \n    B --\u003e D[Dynamic Inventory]\n    D --\u003e E[NetBox\u003cbr/\u003eDevice Data\u003cbr/\u003eVariables]\n    C --\u003e F[Ansible Execution]\n    D --\u003e F\n    \n    F --\u003e G[Network Devices]\n    G --\u003e H[Metrics Collection]\n    H --\u003e I[InfluxDB]\n    I --\u003e J[Grafana\u003cbr/\u003eDashboards]\n    \n    subgraph \"Job Templates\"\n        B1[Health Check]\n        B2[Image Load]\n        B3[Validation]\n    end\n    \n    subgraph \"Workflows\"  \n        C1[Phase 1: Load]\n        C2[Phase 2: Install]\n        C3[Phase 3: Verify]\n    end\n    \n    style U fill:#ffeb3b\n    style G fill:#f3e5f5\n    style I fill:#e8f5e8\n    style J fill:#fff3e0\n```\n\n**Simplified Data Flow:**\n\n1. **User Request** → AWX Web Interface\n2. **AWX** → Executes Ansible playbooks  \n3. **Ansible** → Connects to network devices via SSH/API\n4. **NetBox** → Provides device inventory to Ansible\n5. **Network Devices** → Export metrics during operations\n6. **Telegraf** → Collects metrics and sends to InfluxDB\n7. **InfluxDB** → Stores time-series data for Grafana\n8. **Grafana** → Displays dashboards and reports to users\n\n## Resource Requirements\n\n### Minimum System Requirements\n- **OS**: RHEL/CentOS 8+ or Ubuntu 20.04+\n- **CPU**: 4 cores minimum\n- **RAM**: 8GB minimum\n- **Storage**: 100GB+ for firmware and logs\n- **Network**: Reliable connectivity to all managed devices\n\n### Software Requirements\n- **Python**: 3.14.0 with pip - *Latest stable version (released Oct 7, 2025)*\n- **Ansible**: 11.0.0 (ansible-core 2.18.10) - *Latest stable version*\n- **Git**: Latest stable version\n\n### Supported Platforms\n- **Single Server Deployment**: No clustering required\n- **Container-based AWX**: Podman/Docker container deployment\n- **Pre-existing NetBox**: Uses existing NetBox installation\n- **SystemD User Services**: Native Linux user service management for base components\n\n## Directory Structure\n\n```\nnetwork-upgrade-system/\n├── deployment/                # Service-based deployment structure\n│   ├── system/                # Base system setup (SSL, system config)\n│   ├── services/              # Individual service deployments\n│   │   ├── awx/               # AWX automation platform\n│   │   ├── netbox/            # NetBox IPAM \u0026 device inventory\n│   │   ├── grafana/           # ✅ Complete dashboard automation\n│   │   ├── telegraf/          # Metrics collection\n│   │   └── redis/             # Caching \u0026 job queue\n│   └── scripts/               # General deployment scripts\n├── ansible-content/           # Ansible automation content\n│   ├── playbooks/             # Main orchestration playbooks\n│   ├── roles/                 # Vendor-specific upgrade roles\n│   └── collections/           # Ansible collection requirements\n├── tests/                     # Comprehensive test suites\n├── docs/                      # Complete documentation\n├── tools/                     # Development and utility tools\n└── .claude/                   # Claude Code commands and workflows\n```\n\n## Workflow Execution Modes\n\nThe system uses **`main-upgrade-workflow.yml`** as the single entry point for all upgrade operations. Individual steps can be executed using Ansible tags, with automatic dependency resolution.\n\n### Available Execution Tags\n\n| Tag | Step Name | Description | Dependencies | Safe During Business Hours |\n|-----|-----------|-------------|--------------|---------------------------|\n| `step1` | Connectivity Check | Initial SSH/NETCONF connectivity validation | None | ✅ Yes |\n| `step2` | Version Check | Collect current firmware version and verify file exists | step1 (direct); steps 1-2 (via tags) | ✅ Yes |\n| `step3` | Space Check | Verify sufficient disk space, auto-clean if needed | step1 (direct); steps 1-3 (via tags) | ✅ Yes |\n| `step4` | Image Upload | Upload firmware and verify SHA512 hash (PHASE 1) | step1 (direct); steps 1-4 (via tags) | ✅ Yes |\n| `step5` | Config Backup \u0026 Pre-Validation | Backup config and capture network state baseline | step1 (direct); steps 1-5 (via tags) | ✅ Yes |\n| `step6` | Installation \u0026 Reboot | Install firmware and reboot device (PHASE 2) | step1 (direct); steps 1-6 (via tags) | ⚠️ Maintenance Window |\n| `step7` | Post-Upgrade Validation | Validate network state after upgrade (PHASE 3) | step1 (direct); steps 1-7 (via tags) | ⚠️ Maintenance Window |\n| `step8` | Emergency Rollback | Restore previous firmware and configuration | step1 (direct); triggered by step7 or manual | ⚠️ Maintenance Window |\n\n### Execution Examples\n\n**Individual Step Execution:**\n```bash\n# Run only health check (STEP 1)\nansible-playbook ansible-content/playbooks/main-upgrade-workflow.yml \\\n  --tags step1 \\\n  -e target_hosts=mydevice \\\n  -e max_concurrent=5\n\n# Run only image loading (STEP 4) - business hours safe\nansible-playbook ansible-content/playbooks/main-upgrade-workflow.yml \\\n  --tags step4 \\\n  -e target_hosts=mydevice \\\n  -e target_firmware=nxos-10.3.5.bin \\\n  -e max_concurrent=5\n```\n\n**Multiple Step Execution:**\n```bash\n# Run PHASE 1: Health check + backup + image loading\nansible-playbook ansible-content/playbooks/main-upgrade-workflow.yml \\\n  --tags step1,step3,step4 \\\n  -e target_hosts=mydevice \\\n  -e target_firmware=nxos-10.3.5.bin \\\n  -e max_concurrent=5\n\n# Run PHASE 2: Installation + validation (maintenance window)\nansible-playbook ansible-content/playbooks/main-upgrade-workflow.yml \\\n  --tags step6,step7,step8 \\\n  -e target_hosts=mydevice \\\n  -e target_firmware=nxos-10.3.5.bin \\\n  -e maintenance_window=true \\\n  -e max_concurrent=5\n```\n\n**Full Workflow Execution:**\n```bash\n# Execute all steps (complete upgrade)\nansible-playbook ansible-content/playbooks/main-upgrade-workflow.yml \\\n  -e target_hosts=mydevice \\\n  -e target_firmware=nxos-10.3.5.bin \\\n  -e maintenance_window=true \\\n  -e max_concurrent=5\n```\n\n### Required Variables by Execution Mode\n\n| Execution Mode | Required Variables |\n|----------------|-------------------|\n| Health Check Only (step1) | `target_hosts`, `max_concurrent` |\n| Image Loading (step4) | `target_hosts`, `target_firmware`, `max_concurrent` |\n| Validation Only (step5/step7) | `target_hosts`, `target_firmware`, `max_concurrent` |\n| Full Upgrade | `target_hosts`, `target_firmware`, `maintenance_window`, `max_concurrent` |\n\n### Automatic Dependency Resolution\n\n**New Dependency Model**: Each step file depends directly only on STEP 1 (connectivity). The main workflow orchestrates additional dependencies through tag-based execution:\n\n- **Direct Dependencies**: All steps 2-8 include only STEP 1 (connectivity check)\n- **Orchestrated Dependencies**: Main workflow ensures proper execution order via tags\n- **STEP 2** Version check runs after STEP 1 (orchestrated by tags)\n- **STEP 3** Backup runs after STEPS 1-2 (orchestrated by tags)\n- **STEP 4** Image loading runs after STEPS 1-3 (orchestrated by tags)\n- **STEP 5** Pre-validation runs after STEPS 1-4 (orchestrated by tags)\n- **STEP 6** Installation runs after STEPS 1-5 (orchestrated by tags)\n- **STEP 7** Post-validation runs after STEPS 1-6 (orchestrated by tags)\n- **STEP 8** Emergency rollback can run independently (STEP 1 only) or triggered by STEP 7\n\n**Example**: Running `--tags step6` ensures the main workflow executes steps 1-6 in order, even though step-6-installation.yml only includes step-1-connectivity.yml directly.\n\n### Playbook Migration Guide\n\nFor users migrating from legacy individual playbooks:\n\n| Legacy Playbook | New Command |\n|----------------|-------------|\n| `health-check.yml` | `main-upgrade-workflow.yml --tags step1` |\n| `network-validation.yml` (pre) | `main-upgrade-workflow.yml --tags step5` |\n| `network-validation.yml` (post) | `main-upgrade-workflow.yml --tags step7` |\n| `image-loading.yml` | `main-upgrade-workflow.yml --tags step4` |\n| `image-installation.yml` | `main-upgrade-workflow.yml --tags step6` |\n| `emergency-rollback.yml` | `main-upgrade-workflow.yml --tags step8` |\n\n**Note**: Legacy playbooks are deprecated and will be removed in a future release. Migrate to tag-based execution.\n\n## Support\n\nFor technical support and questions:\n- Check the [CLAUDE.md](CLAUDE.md) for complete documentation and troubleshooting\n- Review platform-specific procedures in [Platform Implementation Guide](docs/platform-guides/platform-implementation-status.md)\n- Examine log files in `$HOME/.local/share/network-upgrade/logs/`\n- Use the built-in health check: `./scripts/system-health.sh`\n\n## License\n\nThis project is licensed under the MIT License - see the LICENSE file for details.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgarryshtern%2Fnetwork-device-upgrade-system","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgarryshtern%2Fnetwork-device-upgrade-system","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgarryshtern%2Fnetwork-device-upgrade-system/lists"}