fix(instance): add status verification after service operations

Add verification checks to ensure service is running/stopped after start/stop/restart operations
Fix import order and remove unnecessary whitespace
This commit is contained in:
2026-05-05 12:31:59 +08:00
parent 20c906c8cc
commit e72c142b16
+42 -9
View File
@@ -13,11 +13,11 @@ import (
"super-frpc/config"
"super-frpc/database"
"super-frpc/utils"
"super-frpc/global"
"super-frpc/postLog"
"super-frpc/service"
"super-frpc/utils"
"super-frpc/watchdog"
"super-frpc/global"
)
func CreateInstanceHandler(w http.ResponseWriter, r *http.Request) {
@@ -606,6 +606,12 @@ func StartInstanceHandler(w http.ResponseWriter, r *http.Request) {
return
}
postLog.Debug(fmt.Sprintf("[StartInstanceHandler] Windows service %s started successfully", serviceName))
time.Sleep(time.Millisecond * 200)
if err := service.IsInstanceRunning(instanceID); err != nil {
postLog.Error(fmt.Sprintf("[StartInstanceHandler] Windows service %s failed to start: %v", serviceName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to start Windows service: %v", err))
return
}
case "systemd":
if err := service.StartSystemdService(serviceName); err != nil {
@@ -614,6 +620,12 @@ func StartInstanceHandler(w http.ResponseWriter, r *http.Request) {
return
}
postLog.Debug(fmt.Sprintf("[StartInstanceHandler] Systemd service %s started successfully", serviceName))
time.Sleep(time.Millisecond * 200)
if err := service.IsInstanceRunning(instanceID); err != nil {
postLog.Error(fmt.Sprintf("[StartInstanceHandler] Systemd service %s failed to start: %v", serviceName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to start systemd service: %v", err))
return
}
case "init.d":
if err := service.StartInitDService(serviceName); err != nil {
@@ -622,6 +634,12 @@ func StartInstanceHandler(w http.ResponseWriter, r *http.Request) {
return
}
postLog.Debug(fmt.Sprintf("[StartInstanceHandler] Init.d service %s started successfully", serviceName))
time.Sleep(time.Millisecond * 200)
if err := service.IsInstanceRunning(instanceID); err != nil {
postLog.Error(fmt.Sprintf("[StartInstanceHandler] Init.d service %s failed to start: %v", serviceName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to start init.d service: %v", err))
return
}
default:
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Unsupported init system: %s", initType))
@@ -644,7 +662,6 @@ func StartInstanceHandler(w http.ResponseWriter, r *http.Request) {
}
}
postLog.Info(fmt.Sprintf("[StartInstanceHandler] Instance %d started successfully", instanceID))
}
@@ -716,6 +733,12 @@ func StopInstanceHandler(w http.ResponseWriter, r *http.Request) {
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop Windows service: %v", err))
return
}
time.Sleep(time.Millisecond * 200)
if err := service.IsInstanceRunning(instanceID); err == nil {
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 service: %v", err))
return
}
postLog.Debug(fmt.Sprintf("[StopInstanceHandler] Windows service %s stopped successfully", serviceName))
case "systemd":
@@ -728,6 +751,7 @@ func StopInstanceHandler(w http.ResponseWriter, r *http.Request) {
case "init.d":
if err := service.StopInitDService(serviceName); err != nil {
time.Sleep(time.Millisecond * 200)
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
@@ -754,7 +778,6 @@ func StopInstanceHandler(w http.ResponseWriter, r *http.Request) {
}
}
postLog.Info(fmt.Sprintf("[StopInstanceHandler] Instance %d stopped successfully", instanceID))
}
@@ -823,26 +846,36 @@ func RestartInstanceHandler(w http.ResponseWriter, r *http.Request) {
case "windows":
if err := service.RestartWindowsService(serviceName); err != nil {
postLog.Error(fmt.Sprintf("[RestartInstanceHandler] Failed to restart Windows service %s: %v", serviceName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to restart Windows service: %v", err))
time.Sleep(time.Millisecond * 200)
if err := service.IsInstanceRunning(instanceID); err != nil {
postLog.Error(fmt.Sprintf("[RestartInstanceHandler] Windows service %s restarted but is not running: %v", serviceName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Windows service restarted but is not running: %v", err))
return
}
postLog.Debug(fmt.Sprintf("[RestartInstanceHandler] Windows service %s restarted successfully", serviceName))
}
case "systemd":
if err := service.RestartSystemdService(serviceName); err != nil {
postLog.Error(fmt.Sprintf("[RestartInstanceHandler] Failed to restart systemd service %s: %v", serviceName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to restart systemd service: %v", err))
time.Sleep(time.Millisecond * 200)
if err := service.IsInstanceRunning(instanceID); err != nil {
postLog.Error(fmt.Sprintf("[RestartInstanceHandler] Failed to check if systemd service %s is running after restart: %v", serviceName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to check if systemd service is running after restart: %v", err))
return
}
postLog.Debug(fmt.Sprintf("[RestartInstanceHandler] Systemd service %s restarted successfully", serviceName))
}
case "init.d":
if err := service.RestartInitDService(serviceName); err != nil {
postLog.Error(fmt.Sprintf("[RestartInstanceHandler] Failed to restart init.d service %s: %v", serviceName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to restart init.d service: %v", err))
time.Sleep(time.Millisecond * 200)
if err := service.IsInstanceRunning(instanceID); err != nil {
postLog.Error(fmt.Sprintf("[RestartInstanceHandler] Failed to check init.d service %s status after restart: %v", serviceName, err))
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to check init.d service status after restart: %v", err))
return
}
postLog.Debug(fmt.Sprintf("[RestartInstanceHandler] Init.d service %s restarted successfully", serviceName))
}
default:
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Unsupported init system: %s", initType))