platform: modularize api/gui, add docs-tests-web foundation, and refresh root config

This commit is contained in:
beckline
2026-03-26 22:40:54 +03:00
parent 0e2d7f61ea
commit 6a56d734c2
562 changed files with 70151 additions and 16423 deletions

View File

@@ -0,0 +1,89 @@
package app
import (
"fmt"
"os"
"strings"
"time"
)
func writeAutoloopLoginState(loginStateFile, state, email, msg string) {
ts := time.Now().Format(time.RFC3339)
payload := fmt.Sprintf(`{"ts":"%s","state":"%s","email":"%s","msg":"%s"}`,
ts,
escapeJSON(state),
escapeJSON(email),
escapeJSON(msg),
)
_ = os.WriteFile(loginStateFile, []byte(payload), 0o644)
}
func isAutoloopConnected(out string) bool {
low := strings.ToLower(out)
return strings.Contains(low, "vpn is connected") ||
strings.Contains(low, "connected to") ||
strings.Contains(low, "after connect: connected")
}
func parseAutoloopEmail(text string) string {
return autoloopEmailRe.FindString(text)
}
func isAutoloopLoginRequired(text string) bool {
low := strings.ToLower(text)
return strings.Contains(low, "please log in") ||
strings.Contains(low, "not logged in") ||
strings.Contains(low, "login required") ||
strings.Contains(low, "sign in")
}
func updateAutoloopLoginStateFromText(
text string,
writeState func(state, email, msg string),
logLine func(msg string),
) {
if writeState == nil {
return
}
if isAutoloopLoginRequired(text) {
writeState("no_login", "", "NOT LOGGED IN")
if logLine != nil {
logLine("login: NO (detected from output)")
}
return
}
if em := parseAutoloopEmail(text); em != "" {
writeState("ok", em, "logged in")
if logLine != nil {
logLine("login: OK email=" + em)
}
return
}
low := strings.ToLower(text)
if strings.Contains(low, "not logged in") ||
strings.Contains(low, "expired") ||
strings.Contains(low, "no active license") {
writeState("no_login", "", "NOT LOGGED IN (license)")
if logLine != nil {
logLine("login: NO (license says not logged in)")
}
return
}
if strings.Contains(low, "license") &&
(strings.Contains(low, "active") || strings.Contains(low, "valid")) {
writeState("ok", "", "logged in (license ok)")
if logLine != nil {
logLine("login: OK (license ok, email not found)")
}
return
}
}
func escapeJSON(s string) string {
s = strings.ReplaceAll(s, `\`, `\\`)
s = strings.ReplaceAll(s, `"`, `\\"`)
s = strings.ReplaceAll(s, "\n", "\\n")
s = strings.ReplaceAll(s, "\r", "")
return s
}