mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2025-05-11 02:15:48 +02:00
126 lines
2.8 KiB
Go
126 lines
2.8 KiB
Go
package cluster
|
|
|
|
import (
|
|
"net/http"
|
|
"runtime"
|
|
"sync"
|
|
|
|
"github.com/0xJacky/Nginx-UI/internal/notification"
|
|
"github.com/0xJacky/Nginx-UI/model"
|
|
"github.com/0xJacky/Nginx-UI/query"
|
|
"github.com/go-resty/resty/v2"
|
|
"github.com/uozi-tech/cosy/logger"
|
|
)
|
|
|
|
type syncResult struct {
|
|
Node string `json:"node"`
|
|
Resp string `json:"resp"`
|
|
}
|
|
|
|
// syncReload handle reload nginx on remote nodes
|
|
func syncReload(nodeIDs []uint64) {
|
|
if len(nodeIDs) == 0 {
|
|
return
|
|
}
|
|
|
|
e := query.Environment
|
|
nodes, err := e.Where(e.ID.In(nodeIDs...)).Find()
|
|
if err != nil {
|
|
logger.Error("Failed to get environment nodes:", err)
|
|
return
|
|
}
|
|
|
|
wg := &sync.WaitGroup{}
|
|
wg.Add(len(nodes))
|
|
|
|
for _, node := range nodes {
|
|
go func(node *model.Environment) {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
buf := make([]byte, 1024)
|
|
runtime.Stack(buf, false)
|
|
logger.Error(err)
|
|
}
|
|
}()
|
|
defer wg.Done()
|
|
|
|
client := resty.New()
|
|
client.SetBaseURL(node.URL)
|
|
resp, err := client.R().
|
|
SetHeader("X-Node-Secret", node.Token).
|
|
Post("/api/nginx/reload")
|
|
if err != nil {
|
|
notification.Error("Reload Remote Nginx Error", "", err.Error())
|
|
return
|
|
}
|
|
if resp.StatusCode() != http.StatusOK {
|
|
notification.Error("Reload Remote Nginx Error",
|
|
"Reload Nginx on %{node} failed, response: %{resp}", syncResult{
|
|
Node: node.Name,
|
|
Resp: resp.String(),
|
|
})
|
|
return
|
|
}
|
|
notification.Success("Reload Remote Nginx Success",
|
|
"Reload Nginx on %{node} successfully", syncResult{
|
|
Node: node.Name,
|
|
})
|
|
}(node)
|
|
}
|
|
|
|
wg.Wait()
|
|
}
|
|
|
|
// syncRestart handle restart nginx on remote nodes
|
|
func syncRestart(nodeIDs []uint64) {
|
|
if len(nodeIDs) == 0 {
|
|
return
|
|
}
|
|
|
|
e := query.Environment
|
|
nodes, err := e.Where(e.ID.In(nodeIDs...)).Find()
|
|
if err != nil {
|
|
logger.Error("Failed to get environment nodes:", err)
|
|
return
|
|
}
|
|
|
|
wg := &sync.WaitGroup{}
|
|
wg.Add(len(nodes))
|
|
|
|
for _, node := range nodes {
|
|
go func(node *model.Environment) {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
buf := make([]byte, 1024)
|
|
runtime.Stack(buf, false)
|
|
logger.Error(err)
|
|
}
|
|
}()
|
|
defer wg.Done()
|
|
|
|
client := resty.New()
|
|
client.SetBaseURL(node.URL)
|
|
resp, err := client.R().
|
|
SetHeader("X-Node-Secret", node.Token).
|
|
Post("/api/nginx/restart")
|
|
if err != nil {
|
|
notification.Error("Restart Remote Nginx Error", "", err.Error())
|
|
return
|
|
}
|
|
if resp.StatusCode() != http.StatusOK {
|
|
notification.Error("Restart Remote Nginx Error",
|
|
"Restart Nginx on %{node} failed, response: %{resp}", syncResult{
|
|
Node: node.Name,
|
|
Resp: resp.String(),
|
|
})
|
|
return
|
|
}
|
|
notification.Success("Restart Remote Nginx Success",
|
|
"Restart Nginx on %{node} successfully", syncResult{
|
|
Node: node.Name,
|
|
})
|
|
}(node)
|
|
}
|
|
|
|
wg.Wait()
|
|
}
|