Files
tuio/internal/tui/config.go
T
jbandClaude Opus 4.8 d2717de47a refactor: clarify fixed container port with containerAppPort constant
The container always listens on 8080 internally while the user-provided
port is only the host-side mapping. Make this explicit without changing
behavior or the generated config:

- add a named containerAppPort constant and use it in both the docker -p
  mapping and the config.toml generation (was a bare 8080 literal in two
  places)
- document why config.toml hardcodes the port, so it isn't "fixed" back
  to the form value
- relabel the form field to "Porta (host)"

The generated config.toml is byte-identical (port = 8080).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 12:00:54 -03:00

123 lines
3.9 KiB
Go

package tui
import (
"fmt"
"os"
"strconv"
"strings"
)
func GenerateConfigTOML(cv ConfigValues) (string, error) {
var sb strings.Builder
// [server]
sb.WriteString("# Server Configuration\n")
sb.WriteString("[server]\n")
// Always containerAppPort: the container listens on this port internally; the
// user's port is the host-side mapping (see RunAppClienteContainer).
sb.WriteString(fmt.Sprintf("port = %d\n", containerAppPort))
sb.WriteString(fmt.Sprintf("timeout_seconds = %s\n", cv.Server["timeout"]))
sb.WriteString(fmt.Sprintf("environment = %q\n", cv.Server["environment"]))
sb.WriteString("\n")
// [database]
sb.WriteString("# Database Configuration\n")
sb.WriteString("[database]\n")
sb.WriteString(fmt.Sprintf("type = %q\n", cv.Database["database_type"]))
sb.WriteString(fmt.Sprintf("url = %q\n", cv.Database["database_url"]))
sb.WriteString(fmt.Sprintf("max_conns = %s\n", cv.Database["max_conns"]))
sb.WriteString(fmt.Sprintf("min_conns = %s\n", cv.Database["min_conns"]))
sb.WriteString("\n")
// [certificate]
sb.WriteString("# Certificate Options\n")
sb.WriteString("[certificate]\n")
sb.WriteString(fmt.Sprintf("mapped_dir = %q\n", cv.Cert["cert_dir_path"]))
sb.WriteString("cert_path = \"/app/certs/client.crt\"\n")
sb.WriteString("key_path = \"/app/certs/client.key\"\n")
sb.WriteString("ca_path = \"/app/certs/ca.crt\"\n")
sb.WriteString("\n")
// [application]
sb.WriteString("[application]\n")
sb.WriteString("erp = \"TOTVS\"\n")
sb.WriteString(fmt.Sprintf("central_server_url = %q\n", cv.Application["central_server_url"]))
sb.WriteString(fmt.Sprintf("enrollment_token = %q\n", cv.Application["enrollment_token"]))
sb.WriteString("\n")
// [log] — hardcoded defaults
sb.WriteString("[log]\n")
sb.WriteString("level = \"debug\"\n")
sb.WriteString("format = \"json\" # Options: \"json\" or \"text\"\n")
return sb.String(), nil
}
func GenerateWireguardConfig(cv ConfigValues) (string, error) {
var sb strings.Builder
// Primary Wireguard Settings
sb.WriteString(fmt.Sprintf("PRIVKEY=%s\n", cv.Wireguard["privkey"]))
sb.WriteString(fmt.Sprintf("VIP=%s\n", cv.Wireguard["vip"]))
sb.WriteString(fmt.Sprintf("PSK=%s\n", cv.Wireguard["psk"]))
sb.WriteString(fmt.Sprintf("PROXY_EDPS=%s\n", cv.Wireguard["proxy_edps"]))
sb.WriteString("\n# MTU Opcional\n")
if mtu, ok := cv.Wireguard["mtu"]; ok && mtu != "" {
sb.WriteString(fmt.Sprintf("MTU=%s\n", mtu))
} else {
sb.WriteString("# MTU=1380\n")
}
sb.WriteString("\n# Especifica o protocolo de transmissao\n")
sb.WriteString("# Default: UDP -> Manter se possivel, melhor performance e estabilidade.\n")
sb.WriteString("# Alguns firewalls restritivos podem impedir o trafego UDP.\n")
sb.WriteString("# Se nao for possivel negociar a abertura com o cliente, tentar usar TCP\n")
proto := cv.Wireguard["proto"]
if proto == "" {
proto = "UDP"
}
sb.WriteString(fmt.Sprintf("PROTO=%s\n", proto))
return sb.String(), nil
}
func WriteConfigFile(cv ConfigValues, path string) error {
// Validate numeric fields before writing
numericFields := map[string]string{
"port": cv.Server["port"],
"timeout": cv.Server["timeout"],
"max_conns": cv.Database["max_conns"],
"min_conns": cv.Database["min_conns"],
}
for field, val := range numericFields {
if _, err := strconv.Atoi(val); err != nil {
return fmt.Errorf("campo %q tem valor inválido: %q", field, val)
}
}
content, err := GenerateConfigTOML(cv)
if err != nil {
return err
}
return os.WriteFile(path, []byte(content), 0644)
}
func WriteWireguardConfigFile(cv ConfigValues, path string) error {
// Validate numeric fields before writing
if mtu, ok := cv.Wireguard["mtu"]; ok && mtu != "" {
if _, err := strconv.Atoi(mtu); err != nil {
return fmt.Errorf("o campo MTU deve ser um número, recebido: %q", mtu)
}
}
content, err := GenerateWireguardConfig(cv)
if err != nil {
return err
}
return os.WriteFile(path, []byte(content), 0644)
}