chore: change service && filename rule to "superfrpc_instanceID"

This commit is contained in:
2026-05-07 22:46:28 +08:00
parent 6e705ce2f3
commit 00319d790d
5 changed files with 69 additions and 147 deletions
+48 -84
View File
@@ -91,13 +91,6 @@ func CreateInstanceHandler(w http.ResponseWriter, r *http.Request) {
runUser = "root"
}
user, err := database.GetUserByID(userID)
if err != nil {
postLog.Error(fmt.Sprintf("[CreateInstanceHandler] Failed to get user info: %v", err))
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to get user info")
return
}
configDir, err := sys.GetConfigDir()
if err != nil {
postLog.Error(fmt.Sprintf("[CreateInstanceHandler] Failed to get config directory: %v", err))
@@ -105,30 +98,16 @@ func CreateInstanceHandler(w http.ResponseWriter, r *http.Request) {
return
}
configFileName := fmt.Sprintf("superfrpc_%s_%s.toml", user.Username, req.InstanceInfo.Name)
configPath := filepath.Join(configDir, configFileName)
setKeyTextWrapper := func(configPath, key, section, value string) error {
return config.SetKeyText(configPath, key, section, value, os.ReadFile, os.WriteFile)
}
if err := config.HandleConfigFileCreate(configPath, req.InstanceInfo, setKeyTextWrapper); err != nil {
postLog.Error(fmt.Sprintf("[CreateInstanceHandler] Failed to create config file %s: %v", configPath, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to create config file")
return
}
instance := database.FrpcInstance{
UserID: userID,
Name: req.InstanceInfo.Name,
BootAtStart: req.BootAtStart,
RunUser: runUser,
ConfigPath: configPath,
ConfigPath: "",
Watchdog: 0,
}
if err := database.DBAddFrpcInstance(instance); err != nil {
os.Remove(configPath)
postLog.Error(fmt.Sprintf("[CreateInstanceHandler] Failed to save instance %s to database: %v", req.InstanceInfo.Name, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to save instance to database")
return
@@ -136,12 +115,34 @@ func CreateInstanceHandler(w http.ResponseWriter, r *http.Request) {
createdInstance, err := database.DBQueryFrpcInstance(userID, req.InstanceInfo.Name)
if err != nil {
os.Remove(configPath)
postLog.Error(fmt.Sprintf("[CreateInstanceHandler] Failed to query created instance: %v", err))
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to query created instance")
return
}
configFileName := fmt.Sprintf("superfrpc_%d.toml", createdInstance.ID)
configPath := filepath.Join(configDir, configFileName)
setKeyTextWrapper := func(configPath, key, section, value string) error {
return config.SetKeyText(configPath, key, section, value, os.ReadFile, os.WriteFile)
}
if err := config.HandleConfigFileCreate(configPath, req.InstanceInfo, setKeyTextWrapper); err != nil {
database.DBRemoveFrpcInstanceByID(createdInstance.ID)
postLog.Error(fmt.Sprintf("[CreateInstanceHandler] Failed to create config file %s: %v", configPath, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to create config file")
return
}
createdInstance.ConfigPath = configPath
if err := database.DBUpdateFrpcInstance(createdInstance); err != nil {
os.Remove(configPath)
database.DBRemoveFrpcInstanceByID(createdInstance.ID)
postLog.Error(fmt.Sprintf("[CreateInstanceHandler] Failed to update instance config path: %v", err))
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to update instance config path")
return
}
if err := sys.CreateBootService(createdInstance.ID); err != nil {
database.DBRemoveFrpcInstanceByID(createdInstance.ID)
os.Remove(configPath)
@@ -309,17 +310,10 @@ func ModifyInstanceHandler(w http.ResponseWriter, r *http.Request) {
return
}
user, err := database.GetUserByID(instance.UserID)
if err != nil {
postLog.Error(fmt.Sprintf("[ModifyInstanceHandler] Failed to get user info: %v", err))
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to get user info")
return
}
if modifyType == "configFile" {
handleConfigFileModify(w, instance, modifiedData)
} else {
handleSystemConfigModify(w, r, instance, modifiedData, user)
handleSystemConfigModify(w, r, instance, modifiedData)
}
}
@@ -370,7 +364,7 @@ func handleConfigFileModify(w http.ResponseWriter, instance database.FrpcInstanc
postLog.Info(fmt.Sprintf("[handleConfigFileModify] Config file for instance %s modified successfully", instance.Name))
}
func handleSystemConfigModify(w http.ResponseWriter, r *http.Request, instance database.FrpcInstance, modifiedData map[string]interface{}, user *database.User) {
func handleSystemConfigModify(w http.ResponseWriter, r *http.Request, instance database.FrpcInstance, modifiedData map[string]interface{}) {
newName := instance.Name
newRunUser := instance.RunUser
newBootAtStart := instance.BootAtStart
@@ -386,36 +380,9 @@ func handleSystemConfigModify(w http.ResponseWriter, r *http.Request, instance d
newBootAtStart = v
}
oldConfigPath := instance.ConfigPath
var newConfigPath string
if newName != instance.Name || newRunUser != instance.RunUser {
configDir, err := sys.GetConfigDir()
if err != nil {
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to get config directory: %v", err))
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to get config directory")
return
}
newConfigFileName := fmt.Sprintf("superfrpc_%s_%s.toml", user.Username, newName)
newConfigPath = filepath.Join(configDir, newConfigFileName)
if oldConfigPath != newConfigPath {
if _, err := os.Stat(oldConfigPath); err == nil {
if err := os.Rename(oldConfigPath, newConfigPath); err != nil {
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to rename config file %s to %s: %v", oldConfigPath, newConfigPath, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to rename config file")
return
}
}
}
} else {
newConfigPath = oldConfigPath
}
instance.RunUser = newRunUser
instance.BootAtStart = newBootAtStart
instance.ConfigPath = newConfigPath
instance.Name = newName
if err := database.DBUpdateFrpcInstance(instance); err != nil {
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to update instance in database: %v", err))
@@ -428,7 +395,6 @@ func handleSystemConfigModify(w http.ResponseWriter, r *http.Request, instance d
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to remove boot at start: %v", err))
bootServiceError = fmt.Sprintf("Failed to remove boot at start: %v", err)
}
instance.Name = newName
if err := sys.SetBootAtStart(instance.ID); err != nil {
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to set boot at start: %v", err))
if bootServiceError != "" {
@@ -441,14 +407,12 @@ func handleSystemConfigModify(w http.ResponseWriter, r *http.Request, instance d
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to remove boot at start: %v", err))
bootServiceError = fmt.Sprintf("Failed to remove boot at start: %v", err)
}
instance.Name = newName
}
instance.Name = newName
data := map[string]interface{}{
"instanceName": newName,
"instanceID": instance.ID,
"configPath": newConfigPath,
"configPath": instance.ConfigPath,
"bootAtStart": newBootAtStart,
"runUser": newRunUser,
}
@@ -720,44 +684,44 @@ func StopInstanceHandler(w http.ResponseWriter, r *http.Request) {
}
initType := sys.GetInitSystem()
sysName, err := database.GetServiceNameByInstanceID(instanceID)
serviceName, err := database.GetServiceNameByInstanceID(instanceID)
if err != nil {
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Failed to get sys name: %v", err))
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to get sys name")
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Failed to get service name: %v", err))
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to get service name")
return
}
switch initType {
case "windows":
if err := sys.StopWindowsService(sysName); err != nil {
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Failed to stop Windows sys %s: %v", sysName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop Windows sys: %v", err))
if err := sys.StopWindowsService(serviceName); err != nil {
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Failed to stop Windows service %s: %v", serviceName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop Windows service: %v", err))
return
}
time.Sleep(time.Millisecond * 200)
if err := sys.IsInstanceRunning(instanceID); err == nil {
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Windows sys %s failed to stop: %v", sysName, err))
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Windows service %s failed to stop: %v", serviceName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop Windows sys: %v", err))
return
}
postLog.Debug(fmt.Sprintf("[StopInstanceHandler] Windows sys %s stopped successfully", sysName))
postLog.Debug(fmt.Sprintf("[StopInstanceHandler] Windows service %s stopped successfully", serviceName))
case "systemd":
if err := sys.StopSystemdService(sysName); err != nil {
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Failed to stop systemd sys %s: %v", sysName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop systemd sys: %v", err))
if err := sys.StopSystemdService(serviceName); err != nil {
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Failed to stop systemd service %s: %v", serviceName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop systemd service: %v", err))
return
}
postLog.Debug(fmt.Sprintf("[StopInstanceHandler] Systemd sys %s stopped successfully", sysName))
postLog.Debug(fmt.Sprintf("[StopInstanceHandler] Systemd service %s stopped successfully", serviceName))
case "init.d":
if err := sys.StopInitDService(sysName); err != nil {
if err := sys.StopInitDService(serviceName); err != nil {
time.Sleep(time.Millisecond * 200)
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Failed to stop init.d sys %s: %v", sysName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop init.d sys: %v", err))
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Failed to stop init.d service %s: %v", serviceName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop init.d service: %v", err))
return
}
postLog.Debug(fmt.Sprintf("[StopInstanceHandler] Init.d sys %s stopped successfully", sysName))
postLog.Debug(fmt.Sprintf("[StopInstanceHandler] Init.d service %s stopped successfully", serviceName))
default:
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Unsupported init system: %s", initType))
@@ -765,16 +729,16 @@ func StopInstanceHandler(w http.ResponseWriter, r *http.Request) {
}
if global.Is.WatchdogConnected {
if !watchdog.RemoveInstance(sysName) {
postLog.Warning(fmt.Sprintf("[StopInstanceHandler] Failed to remove watchdog instance %s", sysName))
if !watchdog.RemoveInstance(serviceName) {
postLog.Warning(fmt.Sprintf("[StopInstanceHandler] Failed to remove watchdog instance %s", serviceName))
utils.SendSuccessResponse(w, "Instance stopped successfully but watchdog instance remove failed", map[string]interface{}{
"instanceID": instanceID,
"sysName": sysName,
"serviceName": serviceName,
})
} else {
utils.SendSuccessResponse(w, "Instance stopped successfully", map[string]interface{}{
"instanceID": instanceID,
"sysName": sysName,
"serviceName": serviceName,
})
}
}