refactor(config): improve config file handling and error messages

- Replace manual address formatting with net.JoinHostPort in tcpClient
- Simplify debug/error messages in IsInstanceRunning by removing redundant output
- Fix incorrect map reference for RunUser in CreateInstanceHandler
- Extract config file creation logic into handleConfigFileCreate
- Add auth_token to response data in GetInstanceInfoHandler
- Remove redundant AuthToken field from InstanceInfo struct
This commit is contained in:
2026-04-21 18:39:11 +08:00
parent 3e3adf122c
commit df8df78bab
4 changed files with 59 additions and 20 deletions

View File

@@ -27,7 +27,6 @@ type InstanceInfo struct {
ServerAddr string `json:"serverAddr"`
ServerPort string `json:"serverPort"`
AuthMethod string `json:"auth_method"`
AuthToken string `json:"auth_token"`
RunUser string `json:"runUser"`
Additional map[string]interface{} `json:"additionalProperties"`
}
@@ -231,26 +230,64 @@ func encodeFrpcConfig(config FrpcConfig) (string, error) {
return strings.TrimSuffix(buf.String(), "\n"), nil
}
func generateFrpcConfig(info InstanceInfo) string {
func handleConfigFileCreate(configPath string, info InstanceInfo) error {
config := FrpcConfig{
Global: make(map[string]interface{}),
}
config.Global["serverAddr"] = info.ServerAddr
config.Global["serverPort"] = info.ServerPort
config.Global["auth.method"] = info.AuthMethod
config.Global["auth.token"] = info.AuthToken
for key, value := range info.Additional {
config.Global[key] = value
}
result, err := encodeFrpcConfig(config)
if err != nil {
return ""
return fmt.Errorf("failed to encode empty config: %w", err)
}
return result
if err := os.WriteFile(configPath, []byte(result), 0644); err != nil {
return fmt.Errorf("failed to create config file: %w", err)
}
configData := make(map[string]interface{})
configData["serverAddr"] = info.ServerAddr
configData["serverPort"] = info.ServerPort
configData["auth.method"] = info.AuthMethod
if authToken, ok := info.Additional["auth_token"]; ok {
configData["auth.token"] = authToken
}
for key, value := range info.Additional {
if key == "auth_token" || key == "auth_method" {
continue
}
configData[key] = value
}
for key, value := range configData {
var configValue string
if key == "serverPort" {
switch v := value.(type) {
case float64:
configValue = strconv.Itoa(int(v))
case int:
configValue = strconv.Itoa(v)
case string:
var intVal int
if _, err := fmt.Sscanf(v, "%d", &intVal); err == nil {
configValue = strconv.Itoa(intVal)
} else {
configValue = v
}
default:
configValue = fmt.Sprintf("%v", value)
}
} else {
configValue = fmt.Sprintf("%v", value)
}
if err := setKeyText(configPath, key, "", configValue); err != nil {
return fmt.Errorf("failed to set key %s: %w", key, err)
}
}
return nil
}
func addFrpcProxy(configContent string, info FrpcProxyInfo) (string, error) {

View File

@@ -69,7 +69,7 @@ func CreateInstanceHandler(w http.ResponseWriter, r *http.Request) {
ServerAddr: getStringFromMap(instanceInfoMap, "serverAddr"),
ServerPort: getStringFromMap(instanceInfoMap, "serverPort"),
AuthMethod: getStringFromMap(instanceInfoMap, "auth_method"),
RunUser: getStringFromMap(reqMap, "runUser"),
RunUser: getStringFromMap(instanceInfoMap, "runUser"),
}
if additional, ok := reqMap["additionalProperties"].(map[string]interface{}); ok {
@@ -111,8 +111,7 @@ func CreateInstanceHandler(w http.ResponseWriter, r *http.Request) {
configFileName := fmt.Sprintf("superfrpc_%s_%s.toml", user.Username, req.InstanceInfo.Name)
configPath := filepath.Join(configDir, configFileName)
configContent := generateFrpcConfig(req.InstanceInfo)
if err := os.WriteFile(configPath, []byte(configContent), 0644); err != nil {
if err := handleConfigFileCreate(configPath, req.InstanceInfo); err != nil {
postLog.Error(fmt.Sprintf("[CreateInstanceHandler] Failed to create config file %s: %v", configPath, err))
SendErrorResponse(w, http.StatusInternalServerError, "Failed to create config file")
return
@@ -1002,6 +1001,9 @@ func GetInstanceInfoHandler(w http.ResponseWriter, r *http.Request) {
if authMethod, ok := config.Global["auth.method"]; ok {
responseData["auth_method"] = authMethod
}
if authToken, ok := config.Global["auth.token"]; ok {
responseData["auth_token"] = authToken
}
if userType == "admin" || userType == "superuser" {
if serverAddr, ok := config.Global["serverAddr"]; ok {

6
os.go
View File

@@ -445,15 +445,15 @@ func IsInstanceRunning(instanceID int) error {
return fmt.Errorf("service %s is not running", serviceName)
}
if exitCode == 3 {
postLog.Debug(fmt.Sprintf("[IsInstanceRunning] Systemd service %s is not running: %s, output: %s", serviceName, outputStr))
postLog.Debug(fmt.Sprintf("[IsInstanceRunning] Systemd service %s is not running: %s", serviceName, outputStr))
return fmt.Errorf("service %s is not running", serviceName)
}
if exitCode == 4 {
postLog.Debug(fmt.Sprintf("[IsInstanceRunning] Systemd service %s does not exist: %s, output: %s", serviceName, outputStr))
postLog.Debug(fmt.Sprintf("[IsInstanceRunning] Systemd service %s does not exist: %s", serviceName, outputStr))
return fmt.Errorf("service %s does not exist", serviceName)
}
}
postLog.Error(fmt.Sprintf("[IsInstanceRunning] Failed to check systemd service status: %s, output: %s", err, outputStr))
postLog.Error(fmt.Sprintf("[IsInstanceRunning] Failed to check systemd service status: %s", err))
return err
}

View File

@@ -42,7 +42,7 @@ func tcpConnect(ipaddr string, port int) error {
return fmt.Errorf("already connected")
}
address := fmt.Sprintf("%s:%d", ipaddr, port)
address := net.JoinHostPort(ipaddr, fmt.Sprintf("%d", port))
conn, err := net.DialTimeout("tcp", address, 3*time.Second)
if err != nil {
return fmt.Errorf("failed to connect to %s: %v", address, err)