73 lines
2.1 KiB
Go
73 lines
2.1 KiB
Go
package app
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
// ---------------------------------------------------------------------
|
|
// EN: `handleDNSStatus` is an HTTP handler for dns status.
|
|
// RU: `handleDNSStatus` - HTTP-обработчик для dns status.
|
|
// ---------------------------------------------------------------------
|
|
func handleDNSStatus(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodGet {
|
|
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
|
|
return
|
|
}
|
|
mode := loadDNSMode()
|
|
writeJSON(w, http.StatusOK, makeDNSStatusResponse(mode))
|
|
}
|
|
|
|
// ---------------------------------------------------------------------
|
|
// EN: `handleDNSModeSet` is an HTTP handler for dns mode set.
|
|
// RU: `handleDNSModeSet` - HTTP-обработчик для dns mode set.
|
|
// ---------------------------------------------------------------------
|
|
func handleDNSModeSet(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodPost {
|
|
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
|
|
return
|
|
}
|
|
|
|
var req DNSModeRequest
|
|
if r.Body != nil {
|
|
defer r.Body.Close()
|
|
if err := json.NewDecoder(io.LimitReader(r.Body, 1<<20)).Decode(&req); err != nil && err != io.EOF {
|
|
http.Error(w, "bad json", http.StatusBadRequest)
|
|
return
|
|
}
|
|
}
|
|
|
|
mode := loadDNSMode()
|
|
mode.Mode = normalizeDNSResolverMode(req.Mode, req.ViaSmartDNS)
|
|
mode.ViaSmartDNS = mode.Mode != DNSModeDirect
|
|
if strings.TrimSpace(req.SmartDNSAddr) != "" {
|
|
mode.SmartDNSAddr = req.SmartDNSAddr
|
|
}
|
|
if err := saveDNSMode(mode); err != nil {
|
|
http.Error(w, "write error", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
mode = loadDNSMode()
|
|
writeJSON(w, http.StatusOK, makeDNSStatusResponse(mode))
|
|
}
|
|
|
|
func makeDNSStatusResponse(mode DNSMode) DNSStatusResponse {
|
|
rt := smartDNSRuntimeSnapshot()
|
|
resp := DNSStatusResponse{
|
|
ViaSmartDNS: mode.ViaSmartDNS,
|
|
SmartDNSAddr: mode.SmartDNSAddr,
|
|
Mode: mode.Mode,
|
|
UnitState: smartdnsUnitState(),
|
|
RuntimeNftset: rt.Enabled,
|
|
WildcardSource: rt.WildcardSource,
|
|
RuntimeCfgPath: rt.ConfigPath,
|
|
}
|
|
if rt.Message != "" {
|
|
resp.RuntimeCfgError = rt.Message
|
|
}
|
|
return resp
|
|
}
|