101 lines
4.2 KiB
Bash
Executable File
101 lines
4.2 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
urldecode() {
|
|
echo -e "$(echo "$1" | sed "s/+/ /g; s/%\([0-9A-Fa-f][0-9A-Fa-f]\)/\\\\x\1/g")"
|
|
}
|
|
|
|
if [ "$REQUEST_METHOD" = "POST" ]; then
|
|
read -n "$CONTENT_LENGTH" POST_DATA 2>/dev/null
|
|
action=$(echo "$POST_DATA" | tr "&" "\n" | grep "^action=" | cut -d= -f2-)
|
|
new_ssid=$(echo "$POST_DATA" | tr "&" "\n" | grep "^ssid=" | cut -d= -f2-)
|
|
new_key=$(echo "$POST_DATA" | tr "&" "\n" | grep "^key=" | cut -d= -f2-)
|
|
new_ssid=$(urldecode "$new_ssid")
|
|
new_key=$(urldecode "$new_key")
|
|
|
|
case "$action" in
|
|
toggle)
|
|
disabled=$(uci get wireless.radio0.disabled 2>/dev/null || echo 0)
|
|
if [ "$disabled" = "1" ]; then
|
|
uci set wireless.radio0.disabled="0"
|
|
uci commit wireless
|
|
wifi up &
|
|
else
|
|
uci set wireless.radio0.disabled="1"
|
|
uci commit wireless
|
|
wifi down &
|
|
fi
|
|
;;
|
|
update)
|
|
[ -n "$new_ssid" ] && uci set wireless.default_radio0.ssid="$new_ssid"
|
|
[ -n "$new_key" ] && [ ${#new_key} -ge 8 ] && uci set wireless.default_radio0.key="$new_key"
|
|
uci commit wireless
|
|
wifi reload &
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
disabled=$(uci get wireless.radio0.disabled 2>/dev/null || echo 0)
|
|
ssid=$(uci get wireless.default_radio0.ssid 2>/dev/null)
|
|
[ "$disabled" = "1" ] && wstatus="Disabled" && wcolor="#dc2626" && toggle_lbl="Enable WiFi" \
|
|
|| wstatus="Enabled" && wcolor="#16a34a" && toggle_lbl="Disable WiFi"
|
|
|
|
echo "Content-Type: text/html"
|
|
echo ""
|
|
cat << HTML
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>WiFi Control</title>
|
|
<style>
|
|
*{box-sizing:border-box;margin:0;padding:0}
|
|
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;background:#f1f5f9;min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px}
|
|
.card{background:#fff;border-radius:12px;box-shadow:0 4px 6px rgba(0,0,0,.1);padding:32px;width:100%;max-width:400px}
|
|
h1{font-size:1.3rem;color:#0f172a;margin-bottom:20px}
|
|
.status{display:flex;align-items:center;gap:10px;background:#f8fafc;border-radius:8px;padding:12px 16px;margin-bottom:20px}
|
|
.dot{width:10px;height:10px;border-radius:50%;background:${wcolor};flex-shrink:0}
|
|
.slabel{font-size:.8rem;color:#64748b}
|
|
.sval{font-weight:700;color:${wcolor}}
|
|
.ssid{font-size:.85rem;color:#475569;margin-top:2px}
|
|
.btn{width:100%;padding:11px;border:none;border-radius:8px;font-size:.9rem;font-weight:600;cursor:pointer}
|
|
.btn-toggle{background:#0f172a;color:#fff;margin-bottom:20px}
|
|
.btn-toggle:hover{background:#1e293b}
|
|
.divider{border:none;border-top:1px solid #e2e8f0;margin-bottom:20px}
|
|
label{display:block;font-size:.75rem;font-weight:700;color:#64748b;text-transform:uppercase;letter-spacing:.05em;margin-bottom:5px}
|
|
input{width:100%;padding:9px 12px;border:1px solid #e2e8f0;border-radius:8px;font-size:.9rem;margin-bottom:14px;outline:none}
|
|
input:focus{border-color:#0284c7;box-shadow:0 0 0 2px rgba(2,132,199,.15)}
|
|
.btn-save{background:#0284c7;color:#fff}
|
|
.btn-save:hover{background:#0369a1}
|
|
.note{font-size:.75rem;color:#94a3b8;margin-top:12px;text-align:center}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="card">
|
|
<h1>WiFi Control</h1>
|
|
<div class="status">
|
|
<div class="dot"></div>
|
|
<div>
|
|
<div class="slabel">Status: <span class="sval">${wstatus}</span></div>
|
|
<div class="ssid">SSID: ${ssid}</div>
|
|
</div>
|
|
</div>
|
|
<form method="POST">
|
|
<input type="hidden" name="action" value="toggle">
|
|
<button class="btn btn-toggle">${toggle_lbl}</button>
|
|
</form>
|
|
<hr class="divider">
|
|
<form method="POST">
|
|
<input type="hidden" name="action" value="update">
|
|
<label>SSID</label>
|
|
<input type="text" name="ssid" value="${ssid}" placeholder="Network name">
|
|
<label>Password <span style="font-weight:400;text-transform:none">(min 8 chars — blank = no change)</span></label>
|
|
<input type="password" name="key" placeholder="••••••••">
|
|
<button class="btn btn-save">Save & Apply</button>
|
|
</form>
|
|
<p class="note">Changes apply within ~5 seconds</p>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
HTML
|