# GenieACS Firmware Pusher Standalone HTML app for pushing firmware upgrades to GenieSpire satellites via GenieACS NBI API. ## Access **URL:** `https://calix.yoda.ddnsgeek.com` **Auth:** HTTP Basic Auth — `admin` + GenieACS admin password ## Setup ```bash # On VPS (root@161.97.153.158) cd /opt/firmware-pusher && docker compose up -d ``` ## Architecture ``` User browser (HTTPS) ↓ Traefik (calix.yoda.ddnsgeek.com → firmware-pusher container) ↓ nginx:alpine (auth + static files) ↓ firmware-pusher/index.html (the UI) UI → NBI API: https://nbi.yoda.ddnsgeek.com/devices (NBI also protected by same HTTP Basic Auth) ``` ## Files | File | Purpose | |------|---------| | `index.html` | The UI — single file, no build | | `nginx.conf` | nginx config with auth | | `.htpasswd` | HTTP Basic Auth password hash | | `docker-compose.yml` | Container definition + Traefik labels | ## How It Works 1. **Device list** — fetches from `GET /devices` (NBI API) 2. **Firmware files** — fetches from `GET /files` (NBI API) 3. **Push** — POSTs to `POST /devices/{id}/tasks` with: ```json { "name": "download", "fileType": "1 Firmware Upgrade Image", "fileName": "FullRel_EXOS_SIGNED_E5_R25.2.0.0.img", "productClass": "GigaSpire" } ``` ## Changing Password ```bash # Generate new htpasswd docker run --rm httpd:alpine htpasswd -nb admin NEW_PASSWORD # Update the .htpasswd file, then: docker exec firmware-pusher nginx -s reload ``` ## Firmware Versions Available | Version | File | |---------|------| | R23.3.0.5 | FullRel_EXOS_SIGNED_E5_R23.3.0.5.img | | R24.1.0.2 | FullRel_EXOS_SIGNED_E5_R24.1.0.2.img | | R24.4.0.0 | FullRel_EXOS_SIGNED_E5_R24.4.0.0.img | | R25.2.0.0 | FullRel_EXOS_SIGNED_E5_R25.2.0.0.img | ## Troubleshooting - **blank page / 404**: Check `docker logs firmware-pusher` - **auth not working**: Verify `.htpasswd` exists inside container: `docker exec firmware-pusher cat /etc/nginx/.htpasswd` - **push fails**: Check GenieACS fault queue at `https://genieacs.yoda.ddnsgeek.com`