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") sb.WriteString(fmt.Sprintf("port = %s\n", cv.Server["port"])) 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(fmt.Sprintf("cert_path = %q\n", "/app/certs/"+cv.Cert["cert_name"])) sb.WriteString(fmt.Sprintf("key_path = %q\n", "/app/certs/"+cv.Cert["key_name"])) sb.WriteString(fmt.Sprintf("ca_path = %q\n", "/app/certs/"+cv.Cert["ca_name"])) sb.WriteString(fmt.Sprintf("server_name = %q\n", cv.Cert["server_name"])) sb.WriteString("\n") // [application] — hardcoded / pre-defined sb.WriteString("# Pre-defined options\n") sb.WriteString("[application]\n") sb.WriteString("erp = \"TOTVS\"\n") sb.WriteString("central_server_url = \"https://warden:8080\"\n") sb.WriteString("api_key = \"super secreto\"\n") sb.WriteString("\n") // [log] — hardcoded defaults sb.WriteString("[log]\n") sb.WriteString("level = \"debug\"\n") sb.WriteString("format = \"text\" # 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) }