#!/usr/bin/env bash # ⚠️ VERALTET — nur FW 1.0. Switch ist auf FW 2.2.1 geflasht; die dispatcher.cgi-cmd-Codes # unten gelten dort NICHT mehr. Konfig jetzt via Telnet-CLI: switch/cli/ (run-cli.exp + .cli). # Bleibt nur als Historie / für den (unwahrscheinlichen) FW-1.0-Rollback. # ALL-SG8316M (Realtek dispatcher.cgi) driver — curl-based, no MCP needed. # Read ops are safe. WRITE ops change config; SAVE persists to flash. # Creds via ./.secrets (gitignored): SW_HOST, SW_USER, SW_PASS. set -euo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" [ -f "$HERE/.secrets" ] && . "$HERE/.secrets" HOST="${SW_HOST:-10.40.41.239}" BASE="http://$HOST/cgi-bin/dispatcher.cgi" CURL=(curl -sS --max-time 12) # --- read --- get() { "${CURL[@]}" "$BASE?cmd=$1"; } # Curated config-view + AJAX-data cmd codes (see sg8316m-cgi-map.md) SCRAPE_CMDS="512 517 519 1297 541 543 768 779 1024 1026 1031 \ 1282 1283 1289 1291 1293 534 537 539 524 \ 4096 4098 4100 2560 2562 2564 2572 2574 2816 2818 2821 3840 3842 3844" scrape() { local out="$HERE/${1:-state-PRE}"; mkdir -p "$out" echo "Scraping $HOST -> $out" for c in $SCRAPE_CMDS; do if "${CURL[@]}" "$BASE?cmd=$c" >"$out/cmd-$c.html" 2>/dev/null; then printf ' cmd=%-5s %6s bytes\n' "$c" "$(wc -c <"$out/cmd-$c.html" | tr -d ' ')" else printf ' cmd=%-5s FAILED\n' "$c" fi done } # Pretty-print one page as text view() { get "$1" | sed -e 's/<[^>]*>/ /g' | tr -s ' \t\r\n' ' ' | sed 's/ / /g'; echo; } # --- write (use deliberately, then `save`) --- post() { "${CURL[@]}" -X POST "$BASE" "$@"; } add_vlans() { post --data-urlencode "vlanlist=$1" --data "vlanAction=0" --data-urlencode "name=${2:-}" --data "cmd=1284"; } del_vlans() { post --data-urlencode "vlanlist=$1" --data "vlanAction=1" --data "cmd=1284"; } # set_ip [netmask] [gateway] — RECOVERY: re-point mgmt IP (e.g. after flash reset to 192.168.1.1) set_ip() { post --data "mode=0" --data "ip=$1" --data "netmask=${2:-255.255.255.0}" --data "gateway=${3:-10.40.41.254}" --data "cmd=518"; } save_flash() { echo ">> SAVE to FLASH (cmd=4358)"; get 4358 >/dev/null; } usage() { cat < scrape [dir] dump config pages to switch/ (default state-PRE) [READ] get raw HTML of cmd=N [READ] view cmd=N as plain text [READ] add-vlans [prefix] e.g. add-vlans 10,20,30,40,100 [WRITE] del-vlans [WRITE] set-ip [mask] [gw] RECOVERY: re-point mgmt IP [WRITE] save persist running config to flash [WRITE] Recovery after flash (switch reset to 192.168.1.1): SW_HOST=192.168.1.1 SW_USER=admin SW_PASS=admin $0 set-ip 10.40.41.239 USAGE } case "${1:-}" in scrape) scrape "${2:-state-PRE}" ;; get) get "$2" ;; view) view "$2" ;; add-vlans) add_vlans "$2" "${3:-}" ;; del-vlans) del_vlans "$2" ;; set-ip) set_ip "$2" "${3:-255.255.255.0}" "${4:-10.40.41.254}" ;; save) save_flash ;; *) usage ;; esac