feat(service): add auto-start management for services

Implement setBootAtStart and removeBootAtStart functions to handle service auto-start configuration separately from service creation/removal. Update handlers to use these new functions for better control of boot behavior. The changes support Windows, systemd and init.d systems.
This commit is contained in:
2026-03-25 11:05:17 +08:00
parent 3a00f5d6a5
commit da729b44ff
2 changed files with 83 additions and 17 deletions
+21 -17
View File
@@ -180,14 +180,20 @@ func CreateInstanceHandler(w http.ResponseWriter, r *http.Request) {
return
}
if req.BootAtStart {
if err := createBootService(user.Username, req.InstanceInfo.Name, configPath, runUser); err != nil {
if err := createBootService(user.Username, req.InstanceInfo.Name, configPath, runUser); err != nil {
frpcDB.Exec("DELETE FROM frpcInstances WHERE userID = ? AND name = ?", userID, req.InstanceInfo.Name)
os.Remove(configPath)
postLog.Error(fmt.Sprintf("[CreateInstanceHandler] Failed to create boot service for instance %s: %v", req.InstanceInfo.Name, err))
SendErrorResponse(w, http.StatusInternalServerError, "Failed to create boot service")
return
}
if req.BootAtStart {
if err := setBootAtStart(user.Username, req.InstanceInfo.Name); err != nil {
postLog.Error(fmt.Sprintf("[CreateInstanceHandler] Failed to set boot at start for instance %s: %v", req.InstanceInfo.Name, err))
SendErrorResponse(w, http.StatusInternalServerError, "Failed to set boot at start")
return
}
}
SendSuccessResponse(w, "Instance created successfully", map[string]interface{}{
@@ -264,12 +270,10 @@ func DeleteInstanceHandler(w http.ResponseWriter, r *http.Request) {
return
}
if instance.BootAtStart {
if err := removeBootService(user.Username, instance.Name); err != nil {
postLog.Error(fmt.Sprintf("[DeleteInstanceHandler] Failed to remove boot service for instance %s: %v", instance.Name, err))
SendErrorResponse(w, http.StatusInternalServerError, "Failed to remove boot service")
return
}
if err := removeBootService(user.Username, instance.Name); err != nil {
postLog.Error(fmt.Sprintf("[DeleteInstanceHandler] Failed to remove boot service for instance %s: %v", instance.Name, err))
SendErrorResponse(w, http.StatusInternalServerError, "Failed to remove boot service")
return
}
if _, err := os.Stat(instance.ConfigPath); err == nil {
@@ -508,22 +512,22 @@ func handleSystemConfigModify(w http.ResponseWriter, r *http.Request, instance F
}
if newBootAtStart {
if err := removeBootService(user.Username, instance.Name); err != nil {
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to remove boot service: %v", err))
bootServiceError = fmt.Sprintf("Failed to remove boot service: %v", err)
if err := removeBootAtStart(user.Username, instance.Name); err != nil {
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 := createBootService(user.Username, newName, newConfigPath, newRunUser); err != nil {
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to create boot service: %v", err))
if err := setBootAtStart(user.Username, newName); err != nil {
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to set boot at start: %v", err))
if bootServiceError != "" {
bootServiceError += "; "
}
bootServiceError += fmt.Sprintf("Failed to create boot service: %v", err)
bootServiceError += fmt.Sprintf("Failed to set boot at start: %v", err)
}
} else {
if err := removeBootService(user.Username, instance.Name); err != nil {
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to remove boot service: %v", err))
bootServiceError = fmt.Sprintf("Failed to remove boot service: %v", err)
if err := removeBootAtStart(user.Username, instance.Name); err != nil {
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
}