108 lines
2.5 KiB
Go
108 lines
2.5 KiB
Go
package app
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
func handleVPNLoginState(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodGet {
|
|
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
|
|
return
|
|
}
|
|
|
|
state := VPNLoginState{
|
|
State: "no_login",
|
|
Msg: "login state file not found",
|
|
Text: "AdGuard VPN: (no login data)",
|
|
Color: "gray30",
|
|
}
|
|
|
|
data, err := os.ReadFile(loginStatePath)
|
|
if err == nil {
|
|
var fileState VPNLoginState
|
|
if err := json.Unmarshal(data, &fileState); err == nil {
|
|
if fileState.State != "" {
|
|
state.State = fileState.State
|
|
}
|
|
if fileState.Email != "" {
|
|
state.Email = fileState.Email
|
|
}
|
|
if fileState.Msg != "" {
|
|
state.Msg = fileState.Msg
|
|
}
|
|
} else {
|
|
state.State = "error"
|
|
state.Msg = "invalid adguard-login.json: " + err.Error()
|
|
}
|
|
} else if !os.IsNotExist(err) {
|
|
state.State = "error"
|
|
state.Msg = err.Error()
|
|
}
|
|
|
|
// text/color для GUI
|
|
switch state.State {
|
|
case "ok":
|
|
if state.Email != "" {
|
|
state.Text = fmt.Sprintf("AdGuard VPN: logged in as %s", state.Email)
|
|
} else {
|
|
state.Text = "AdGuard VPN: logged in"
|
|
}
|
|
state.Color = "green4"
|
|
case "no_login":
|
|
state.Text = "AdGuard VPN: (no login data)"
|
|
state.Color = "gray30"
|
|
default:
|
|
state.Text = "AdGuard VPN: " + state.State
|
|
state.Color = "orange3"
|
|
}
|
|
|
|
writeJSON(w, http.StatusOK, state)
|
|
}
|
|
|
|
func handleVPNLogout(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodPost {
|
|
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
|
|
return
|
|
}
|
|
appendTraceLine("login", "logout")
|
|
stdout, stderr, exitCode, err := runCommand(adgvpnCLI, "logout")
|
|
res := cmdResult{
|
|
OK: err == nil && exitCode == 0,
|
|
ExitCode: exitCode,
|
|
Stdout: stdout,
|
|
Stderr: stderr,
|
|
}
|
|
if err != nil {
|
|
res.Message = err.Error()
|
|
} else {
|
|
res.Message = "logout done"
|
|
}
|
|
|
|
// refresh login state
|
|
_, _, _, _ = runCommand("systemctl", "restart", adgvpnUnit)
|
|
|
|
writeJSON(w, http.StatusOK, res)
|
|
}
|
|
|
|
func handleSystemdState(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodGet {
|
|
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
|
|
return
|
|
}
|
|
unit := strings.TrimSpace(r.URL.Query().Get("unit"))
|
|
if unit == "" {
|
|
http.Error(w, "unit required", http.StatusBadRequest)
|
|
return
|
|
}
|
|
stdout, _, _, err := runCommand("systemctl", "is-active", unit)
|
|
st := strings.TrimSpace(stdout)
|
|
if err != nil || st == "" {
|
|
st = "unknown"
|
|
}
|
|
writeJSON(w, http.StatusOK, SystemdState{State: st})
|
|
}
|