chore: change service && filename rule to "superfrpc_instanceID"
This commit is contained in:
+1
-13
@@ -467,19 +467,7 @@ func DBQueryUserInstances(userID int) (*sql.Rows, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetServiceNameByInstanceID(instanceID int) (string, error) {
|
func GetServiceNameByInstanceID(instanceID int) (string, error) {
|
||||||
instance, err := DBQueryFrpcInstanceByID(instanceID)
|
serviceName := fmt.Sprintf("superfrpc_%d", instanceID)
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("failed to query frpc instance: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
user, err := GetUserByID(instance.UserID)
|
|
||||||
if err != nil {
|
|
||||||
postLog.Warning(fmt.Sprintf("[GetServiceNameByInstanceID] User %d not found, using fallback", instance.UserID))
|
|
||||||
serviceName := fmt.Sprintf("superfrpc_unknown_%s", instance.Name)
|
|
||||||
return serviceName, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
serviceName := fmt.Sprintf("superfrpc_%s_%s", user.Username, instance.Name)
|
|
||||||
postLog.Debug(fmt.Sprintf("[GetServiceNameByInstanceID] instanceID: %d, serviceName: %s", instanceID, serviceName))
|
postLog.Debug(fmt.Sprintf("[GetServiceNameByInstanceID] instanceID: %d, serviceName: %s", instanceID, serviceName))
|
||||||
return serviceName, nil
|
return serviceName, nil
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-13
@@ -571,7 +571,7 @@ X-Timestamp: 1704067200000
|
|||||||
"message": "instance created successfully",
|
"message": "instance created successfully",
|
||||||
"data": {
|
"data": {
|
||||||
"name": "my_frpc",
|
"name": "my_frpc",
|
||||||
"configPath": "./configs/superfrpc_user_my_frpc.toml",
|
"configPath": "./configs/superfrpc_1.toml",
|
||||||
"bootAtStart": true
|
"bootAtStart": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -675,7 +675,7 @@ Modify fields in the `[common]` section of the frpc configuration file. Only `[c
|
|||||||
"message": "Config file modified successfully",
|
"message": "Config file modified successfully",
|
||||||
"data": {
|
"data": {
|
||||||
"instanceID": 1,
|
"instanceID": 1,
|
||||||
"configPath": "./configs/superfrpc_user_my_frpc.toml"
|
"configPath": "./configs/superfrpc_1.toml"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -712,7 +712,7 @@ Modify system-level settings such as instance name, boot-at-start configuration,
|
|||||||
"message": "System config modified successfully",
|
"message": "System config modified successfully",
|
||||||
"data": {
|
"data": {
|
||||||
"instanceID": 1,
|
"instanceID": 1,
|
||||||
"configPath": "./configs/superfrpc_user_new_frpc_name.toml",
|
"configPath": "./configs/superfrpc_1.toml",
|
||||||
"bootAtStart": true,
|
"bootAtStart": true,
|
||||||
"runUser": "www-data"
|
"runUser": "www-data"
|
||||||
}
|
}
|
||||||
@@ -727,7 +727,7 @@ Modify system-level settings such as instance name, boot-at-start configuration,
|
|||||||
"data": {
|
"data": {
|
||||||
"instanceName": "new_frpc_name",
|
"instanceName": "new_frpc_name",
|
||||||
"instanceID": 1,
|
"instanceID": 1,
|
||||||
"configPath": "./configs/superfrpc_user_new_frpc_name.toml",
|
"configPath": "./configs/superfrpc_1.toml",
|
||||||
"bootAtStart": true,
|
"bootAtStart": true,
|
||||||
"runUser": "www-data",
|
"runUser": "www-data",
|
||||||
"bootServiceError": "Failed to create boot service: unsupported init system"
|
"bootServiceError": "Failed to create boot service: unsupported init system"
|
||||||
@@ -1048,7 +1048,7 @@ X-Timestamp: 1704067200000
|
|||||||
"message": "Proxy created successfully",
|
"message": "Proxy created successfully",
|
||||||
"data": {
|
"data": {
|
||||||
"instanceID": 1,
|
"instanceID": 1,
|
||||||
"configPath": "./configs/superfrpc_user_my_frpc.toml",
|
"configPath": "./configs/superfrpc_1.toml",
|
||||||
"proxyName": "ssh_proxy"
|
"proxyName": "ssh_proxy"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1134,7 +1134,7 @@ X-Timestamp: 1704067200000
|
|||||||
"message": "Proxy modified successfully",
|
"message": "Proxy modified successfully",
|
||||||
"data": {
|
"data": {
|
||||||
"instanceID": 1,
|
"instanceID": 1,
|
||||||
"configPath": "./configs/superfrpc_user_my_frpc.toml",
|
"configPath": "./configs/superfrpc_1.toml",
|
||||||
"proxyName": "ssh_proxy123"
|
"proxyName": "ssh_proxy123"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1209,7 +1209,7 @@ X-Timestamp: 1704067200000
|
|||||||
"message": "Proxy deleted successfully",
|
"message": "Proxy deleted successfully",
|
||||||
"data": {
|
"data": {
|
||||||
"instanceID": 1,
|
"instanceID": 1,
|
||||||
"configPath": "./configs/superfrpc_user_my_frpc.toml",
|
"configPath": "./configs/superfrpc_1.toml",
|
||||||
"proxyName": "ssh_proxy"
|
"proxyName": "ssh_proxy"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1392,7 +1392,7 @@ instanceID=1
|
|||||||
"message": "Instance info retrieved successfully",
|
"message": "Instance info retrieved successfully",
|
||||||
"data": {
|
"data": {
|
||||||
"name": "my_frpc",
|
"name": "my_frpc",
|
||||||
"serviceName": "superfrpc_admin_my_frpc",
|
"serviceName": "superfrpc_1",
|
||||||
"createdAt": "2024-01-01T00:00:00Z",
|
"createdAt": "2024-01-01T00:00:00Z",
|
||||||
"createdBy": "admin",
|
"createdBy": "admin",
|
||||||
"isRunning": true,
|
"isRunning": true,
|
||||||
@@ -1401,7 +1401,7 @@ instanceID=1
|
|||||||
"auth_method": "token",
|
"auth_method": "token",
|
||||||
"bootAtStart": true,
|
"bootAtStart": true,
|
||||||
"runUser": "root",
|
"runUser": "root",
|
||||||
"configPath": "./configs/superfrpc_admin_my_frpc.toml"
|
"configPath": "./configs/superfrpc_1.toml"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -1413,14 +1413,14 @@ instanceID=1
|
|||||||
"message": "Instance info retrieved successfully",
|
"message": "Instance info retrieved successfully",
|
||||||
"data": {
|
"data": {
|
||||||
"name": "my_frpc",
|
"name": "my_frpc",
|
||||||
"serviceName": "superfrpc_admin_my_frpc",
|
"serviceName": "superfrpc_1",
|
||||||
"createdAt": "2024-01-01T00:00:00Z",
|
"createdAt": "2024-01-01T00:00:00Z",
|
||||||
"createdBy": "admin",
|
"createdBy": "admin",
|
||||||
"isRunning": true,
|
"isRunning": true,
|
||||||
"auth_method": "token",
|
"auth_method": "token",
|
||||||
"bootAtStart": true,
|
"bootAtStart": true,
|
||||||
"runUser": "root",
|
"runUser": "root",
|
||||||
"configPath": "./configs/superfrpc_admin_my_frpc.toml"
|
"configPath": "./configs/superfrpc_1.toml"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -1781,10 +1781,10 @@ Tokens are valid for 1 hour. After expiration, users need to re-login to get a n
|
|||||||
|
|
||||||
Instance configuration files are saved in the specified `instancePath` with the naming convention:
|
Instance configuration files are saved in the specified `instancePath` with the naming convention:
|
||||||
```
|
```
|
||||||
superfrpc_<username>_<instanceName>.toml
|
superfrpc_<instanceID>.toml
|
||||||
```
|
```
|
||||||
|
|
||||||
Example: `superfrpc_admin_my_frpc.toml`
|
Example: `superfrpc_1.toml`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
+1
-11
@@ -195,17 +195,7 @@ func GetUserByID(userID int) (*User, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetServiceNameByInstanceID(instanceID int) (string, error) {
|
func GetServiceNameByInstanceID(instanceID int) (string, error) {
|
||||||
instance, err := DBQueryFrpcInstanceByID(instanceID)
|
serviceName := fmt.Sprintf("superfrpc_%d", instanceID)
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("failed to query frpc instance: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
user, err := GetUserByID(instance.UserID)
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("failed to get user info: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
serviceName := fmt.Sprintf("superfrpc_%s_%s", user.Username, instance.Name)
|
|
||||||
return serviceName, nil
|
return serviceName, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+48
-84
@@ -91,13 +91,6 @@ func CreateInstanceHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
runUser = "root"
|
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()
|
configDir, err := sys.GetConfigDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
postLog.Error(fmt.Sprintf("[CreateInstanceHandler] Failed to get config directory: %v", err))
|
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
|
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{
|
instance := database.FrpcInstance{
|
||||||
UserID: userID,
|
UserID: userID,
|
||||||
Name: req.InstanceInfo.Name,
|
Name: req.InstanceInfo.Name,
|
||||||
BootAtStart: req.BootAtStart,
|
BootAtStart: req.BootAtStart,
|
||||||
RunUser: runUser,
|
RunUser: runUser,
|
||||||
ConfigPath: configPath,
|
ConfigPath: "",
|
||||||
Watchdog: 0,
|
Watchdog: 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := database.DBAddFrpcInstance(instance); err != nil {
|
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))
|
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")
|
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to save instance to database")
|
||||||
return
|
return
|
||||||
@@ -136,12 +115,34 @@ func CreateInstanceHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
createdInstance, err := database.DBQueryFrpcInstance(userID, req.InstanceInfo.Name)
|
createdInstance, err := database.DBQueryFrpcInstance(userID, req.InstanceInfo.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
os.Remove(configPath)
|
|
||||||
postLog.Error(fmt.Sprintf("[CreateInstanceHandler] Failed to query created instance: %v", err))
|
postLog.Error(fmt.Sprintf("[CreateInstanceHandler] Failed to query created instance: %v", err))
|
||||||
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to query created instance")
|
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to query created instance")
|
||||||
return
|
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 {
|
if err := sys.CreateBootService(createdInstance.ID); err != nil {
|
||||||
database.DBRemoveFrpcInstanceByID(createdInstance.ID)
|
database.DBRemoveFrpcInstanceByID(createdInstance.ID)
|
||||||
os.Remove(configPath)
|
os.Remove(configPath)
|
||||||
@@ -309,17 +310,10 @@ func ModifyInstanceHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
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" {
|
if modifyType == "configFile" {
|
||||||
handleConfigFileModify(w, instance, modifiedData)
|
handleConfigFileModify(w, instance, modifiedData)
|
||||||
} else {
|
} 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))
|
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
|
newName := instance.Name
|
||||||
newRunUser := instance.RunUser
|
newRunUser := instance.RunUser
|
||||||
newBootAtStart := instance.BootAtStart
|
newBootAtStart := instance.BootAtStart
|
||||||
@@ -386,36 +380,9 @@ func handleSystemConfigModify(w http.ResponseWriter, r *http.Request, instance d
|
|||||||
newBootAtStart = v
|
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.RunUser = newRunUser
|
||||||
instance.BootAtStart = newBootAtStart
|
instance.BootAtStart = newBootAtStart
|
||||||
instance.ConfigPath = newConfigPath
|
instance.Name = newName
|
||||||
|
|
||||||
if err := database.DBUpdateFrpcInstance(instance); err != nil {
|
if err := database.DBUpdateFrpcInstance(instance); err != nil {
|
||||||
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to update instance in database: %v", err))
|
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))
|
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to remove boot at start: %v", err))
|
||||||
bootServiceError = fmt.Sprintf("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 {
|
if err := sys.SetBootAtStart(instance.ID); err != nil {
|
||||||
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to set boot at start: %v", err))
|
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to set boot at start: %v", err))
|
||||||
if bootServiceError != "" {
|
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))
|
postLog.Error(fmt.Sprintf("[handleSystemConfigModify] Failed to remove boot at start: %v", err))
|
||||||
bootServiceError = fmt.Sprintf("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{}{
|
data := map[string]interface{}{
|
||||||
"instanceName": newName,
|
"instanceName": newName,
|
||||||
"instanceID": instance.ID,
|
"instanceID": instance.ID,
|
||||||
"configPath": newConfigPath,
|
"configPath": instance.ConfigPath,
|
||||||
"bootAtStart": newBootAtStart,
|
"bootAtStart": newBootAtStart,
|
||||||
"runUser": newRunUser,
|
"runUser": newRunUser,
|
||||||
}
|
}
|
||||||
@@ -720,44 +684,44 @@ func StopInstanceHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
initType := sys.GetInitSystem()
|
initType := sys.GetInitSystem()
|
||||||
sysName, err := database.GetServiceNameByInstanceID(instanceID)
|
serviceName, err := database.GetServiceNameByInstanceID(instanceID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Failed to get sys name: %v", err))
|
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Failed to get service name: %v", err))
|
||||||
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to get sys name")
|
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to get service name")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
switch initType {
|
switch initType {
|
||||||
case "windows":
|
case "windows":
|
||||||
if err := sys.StopWindowsService(sysName); err != nil {
|
if err := sys.StopWindowsService(serviceName); err != nil {
|
||||||
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Failed to stop Windows sys %s: %v", sysName, err))
|
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 sys: %v", err))
|
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop Windows service: %v", err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
time.Sleep(time.Millisecond * 200)
|
time.Sleep(time.Millisecond * 200)
|
||||||
if err := sys.IsInstanceRunning(instanceID); err == nil {
|
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))
|
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop Windows sys: %v", err))
|
||||||
return
|
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":
|
case "systemd":
|
||||||
if err := sys.StopSystemdService(sysName); err != nil {
|
if err := sys.StopSystemdService(serviceName); err != nil {
|
||||||
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Failed to stop systemd sys %s: %v", sysName, err))
|
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 sys: %v", err))
|
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop systemd service: %v", err))
|
||||||
return
|
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":
|
case "init.d":
|
||||||
if err := sys.StopInitDService(sysName); err != nil {
|
if err := sys.StopInitDService(serviceName); err != nil {
|
||||||
time.Sleep(time.Millisecond * 200)
|
time.Sleep(time.Millisecond * 200)
|
||||||
postLog.Error(fmt.Sprintf("[StopInstanceHandler] Failed to stop init.d sys %s: %v", sysName, 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 sys: %v", err))
|
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop init.d service: %v", err))
|
||||||
return
|
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:
|
default:
|
||||||
utils.SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Unsupported init system: %s", initType))
|
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 global.Is.WatchdogConnected {
|
||||||
if !watchdog.RemoveInstance(sysName) {
|
if !watchdog.RemoveInstance(serviceName) {
|
||||||
postLog.Warning(fmt.Sprintf("[StopInstanceHandler] Failed to remove watchdog instance %s", sysName))
|
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{}{
|
utils.SendSuccessResponse(w, "Instance stopped successfully but watchdog instance remove failed", map[string]interface{}{
|
||||||
"instanceID": instanceID,
|
"instanceID": instanceID,
|
||||||
"sysName": sysName,
|
"serviceName": serviceName,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
utils.SendSuccessResponse(w, "Instance stopped successfully", map[string]interface{}{
|
utils.SendSuccessResponse(w, "Instance stopped successfully", map[string]interface{}{
|
||||||
"instanceID": instanceID,
|
"instanceID": instanceID,
|
||||||
"sysName": sysName,
|
"serviceName": serviceName,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-26
@@ -68,18 +68,8 @@ func createSystemdService(instanceID int, configPath, runUser string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
instance, err := database.DBQueryFrpcInstanceByID(instanceID)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to query frpc instance: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
user, err := database.GetUserByID(instance.UserID)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to get user info: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
serviceContent := fmt.Sprintf(`[Unit]
|
serviceContent := fmt.Sprintf(`[Unit]
|
||||||
Description=superfrpc_%s_%s
|
Description=superfrpc_%d
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
@@ -91,7 +81,7 @@ RestartSec=5
|
|||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
`, user.Username, instance.Name, frpcPath, configPath, runUser)
|
`, instanceID, frpcPath, configPath, runUser)
|
||||||
|
|
||||||
servicePath := filepath.Join("/etc/systemd/system", serviceName+".service")
|
servicePath := filepath.Join("/etc/systemd/system", serviceName+".service")
|
||||||
if err := os.WriteFile(servicePath, []byte(serviceContent), 0644); err != nil {
|
if err := os.WriteFile(servicePath, []byte(serviceContent), 0644); err != nil {
|
||||||
@@ -123,16 +113,6 @@ func createInitDService(instanceID int, configPath, runUser string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
instance, err := database.DBQueryFrpcInstanceByID(instanceID)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to query frpc instance: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
user, err := database.GetUserByID(instance.UserID)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to get user info: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var serviceContent string
|
var serviceContent string
|
||||||
runUserArg := ""
|
runUserArg := ""
|
||||||
if runUser != "" && runUser != "root" {
|
if runUser != "" && runUser != "root" {
|
||||||
@@ -145,7 +125,7 @@ func createInitDService(instanceID int, configPath, runUser string) error {
|
|||||||
# Required-Stop: $network $remote_fs $syslog
|
# Required-Stop: $network $remote_fs $syslog
|
||||||
# Default-Start: 2 3 4 5
|
# Default-Start: 2 3 4 5
|
||||||
# Default-Stop: 0 1 6
|
# Default-Stop: 0 1 6
|
||||||
# Description: superfrpc %s %s
|
# Description: superfrpc %d
|
||||||
### END INIT INFO
|
### END INIT INFO
|
||||||
|
|
||||||
NAME="%s"
|
NAME="%s"
|
||||||
@@ -187,7 +167,7 @@ case "$1" in
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
`, serviceName, user.Username, instance.Name, serviceName, frpcPath, configPath, runUserArg)
|
`, serviceName, instanceID, serviceName, frpcPath, configPath, runUserArg)
|
||||||
} else {
|
} else {
|
||||||
serviceContent = fmt.Sprintf(`#!/bin/sh
|
serviceContent = fmt.Sprintf(`#!/bin/sh
|
||||||
|
|
||||||
@@ -197,7 +177,7 @@ exit 0
|
|||||||
# Required-Stop: $network $remote_fs $syslog
|
# Required-Stop: $network $remote_fs $syslog
|
||||||
# Default-Start: 2 3 4 5
|
# Default-Start: 2 3 4 5
|
||||||
# Default-Stop: 0 1 6
|
# Default-Stop: 0 1 6
|
||||||
# Description: superfrpc %s %s
|
# Description: superfrpc %d
|
||||||
### END INIT INFO
|
### END INIT INFO
|
||||||
|
|
||||||
NAME="%s"
|
NAME="%s"
|
||||||
@@ -238,7 +218,7 @@ case "$1" in
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
`, serviceName, user.Username, instance.Name, serviceName, frpcPath, configPath)
|
`, serviceName, instanceID, serviceName, frpcPath, configPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
servicePath := filepath.Join("/etc/init.d", serviceName)
|
servicePath := filepath.Join("/etc/init.d", serviceName)
|
||||||
|
|||||||
Reference in New Issue
Block a user