nginx-ui/api/cluster/nginx.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()
}