| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | package siteimport (	"fmt"	"net/http"	"os"	"runtime"	"sync"	"github.com/0xJacky/Nginx-UI/internal/helper"	"github.com/0xJacky/Nginx-UI/internal/nginx"	"github.com/0xJacky/Nginx-UI/internal/notification"	"github.com/go-resty/resty/v2"	"github.com/uozi-tech/cosy/logger")// Enable enables a site by creating a symlink in sites-enabledfunc Enable(name string) (err error) {	configFilePath := nginx.GetConfPath("sites-available", name)	enabledConfigFilePath := nginx.GetConfSymlinkPath(nginx.GetConfPath("sites-enabled", name))	_, err = os.Stat(configFilePath)	if err != nil {		return	}	if helper.FileExists(enabledConfigFilePath) {		return	}	err = os.Symlink(configFilePath, enabledConfigFilePath)	if err != nil {		return	}	// Test nginx config, if not pass, then disable the site.	res := nginx.Control(nginx.TestConfig)	if res.IsError() {		return res.GetError()	}	res = nginx.Control(nginx.Reload)	if res.IsError() {		return res.GetError()	}	go syncEnable(name)	return}func syncEnable(name string) {	nodes := getSyncNodes(name)	wg := &sync.WaitGroup{}	wg.Add(len(nodes))	for _, node := range nodes {		go func() {			defer func() {				if err := recover(); err != nil {					buf := make([]byte, 1024)					runtime.Stack(buf, false)					logger.Errorf("%s\n%s", err, buf)				}			}()			defer wg.Done()			client := resty.New()			client.SetBaseURL(node.URL)			resp, err := client.R().				SetHeader("X-Node-Secret", node.Token).				Post(fmt.Sprintf("/api/sites/%s/enable", name))			if err != nil {				notification.Error("Enable Remote Site Error", err.Error(), nil)				return			}			if resp.StatusCode() != http.StatusOK {				notification.Error("Enable Remote Site Error", "Enable site %{name} on %{node} failed", NewSyncResult(node.Name, name, resp))				return			}			notification.Success("Enable Remote Site Success", "Enable site %{name} on %{node} successfully", NewSyncResult(node.Name, name, resp))		}()	}	wg.Wait()}
 |