feat(system): add restart server endpoint with authentication
This commit is contained in:
+26
@@ -129,6 +129,32 @@ X-Timestamp: 1704067200000
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Restart Server
|
||||||
|
|
||||||
|
**Endpoint:** `/system/restart`
|
||||||
|
**Method:** GET
|
||||||
|
**Permission Level:** Admin
|
||||||
|
|
||||||
|
**Request Headers:**
|
||||||
|
```
|
||||||
|
X-Token: your_token
|
||||||
|
X-Timestamp: 1704067200000
|
||||||
|
```
|
||||||
|
| Header | Type | Required | Description |
|
||||||
|
|--------|------|----------|-------------|
|
||||||
|
| X-Token | string | Yes | Authentication token |
|
||||||
|
| X-Timestamp | int64 | Yes | Client timestamp in milliseconds |
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"message": "Restarting server..."
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Register User
|
## Register User
|
||||||
|
|
||||||
**Endpoint:** `/register`
|
**Endpoint:** `/register`
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ func setupRoutes() {
|
|||||||
http.HandleFunc("/api/system/getStatus", GetStatusHandler)
|
http.HandleFunc("/api/system/getStatus", GetStatusHandler)
|
||||||
http.HandleFunc("/api/system/getSoftwareInfo", GetSoftwareInfoHandler)
|
http.HandleFunc("/api/system/getSoftwareInfo", GetSoftwareInfoHandler)
|
||||||
http.HandleFunc("/api/system/selfCheck", sys.SelfCheckHandler)
|
http.HandleFunc("/api/system/selfCheck", sys.SelfCheckHandler)
|
||||||
|
http.HandleFunc("/api/system/restart", utils.RestartHandler)
|
||||||
|
|
||||||
http.HandleFunc("/api/system/settings/get", handlers.GetSettingsHandler)
|
http.HandleFunc("/api/system/settings/get", handlers.GetSettingsHandler)
|
||||||
http.HandleFunc("/api/system/settings/set", handlers.SetSettingsHandler)
|
http.HandleFunc("/api/system/settings/set", handlers.SetSettingsHandler)
|
||||||
|
|||||||
+35
-2
@@ -4,10 +4,11 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"os/exec"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"super-frpc/database"
|
"super-frpc/database"
|
||||||
"super-frpc/global"
|
"super-frpc/global"
|
||||||
@@ -167,3 +168,35 @@ func IsFileExist(filePath string) bool {
|
|||||||
_, err := os.Stat(filePath)
|
_, err := os.Stat(filePath)
|
||||||
return !os.IsNotExist(err)
|
return !os.IsNotExist(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RestartHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
userID, err := Auth(w, r, http.MethodGet, "superuser", "admin")
|
||||||
|
if err != nil {
|
||||||
|
SendErrorResponse(w, http.StatusUnauthorized, "invalid token or timestamp")
|
||||||
|
postLog.Warning(fmt.Sprintf("[RestartHandler] Auth failed: %v, userID: %d", err, userID))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = RestartProcess()
|
||||||
|
if err != nil {
|
||||||
|
SendErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("failed to restart: %v", err))
|
||||||
|
postLog.Error(fmt.Sprintf("[RestartHandler] [%d] failed to restart: %v", userID, err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
SendSuccessResponse(w, "Restarting server...", nil)
|
||||||
|
postLog.Info(fmt.Sprintf("[RestartHandler] [%d] Restarting server", userID))
|
||||||
|
}
|
||||||
|
|
||||||
|
func RestartProcess() error {
|
||||||
|
executable, err := os.Executable()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to get executable path: %w", err)
|
||||||
|
}
|
||||||
|
cmd := exec.Command(executable)
|
||||||
|
cmd.Stdout = os.Stdout
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
if err := cmd.Start(); err != nil {
|
||||||
|
return fmt.Errorf("failed to start new process: %w", err)
|
||||||
|
}
|
||||||
|
os.Exit(0)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user