Merge branch 'upstream/master' into master and preserve domain extensions

This commit is contained in:
Bot
2026-08-31 02:46:42 +08:00
758 changed files with 89269 additions and 1366 deletions
+77 -38
View File
@@ -125,7 +125,6 @@ func (n *Notification) setRequestHeader(req *http.Request) error {
func (ns *NotificationServerBundle) Send(message string) error {
n := ns.Notification
if n.Type == NotificationTypeEmail || n.Type == NotificationTypeTelegram {
template := n.RequestBody
if template == "" {
@@ -142,12 +141,8 @@ func (ns *NotificationServerBundle) Send(message string) error {
return nil
}
var client *http.Client
if n.VerifyTLS != nil && *n.VerifyTLS {
client = utils.HttpClient
} else {
client = utils.HttpClientSkipTlsVerify
}
verifyTLS := n.VerifyTLS != nil && *n.VerifyTLS
reqBody, err := ns.reqBody(message)
if err != nil {
@@ -159,7 +154,13 @@ func (ns *NotificationServerBundle) Send(message string) error {
return err
}
req, err := http.NewRequest(reqMethod, ns.reqURL(message), strings.NewReader(reqBody))
reqURL := ns.reqURL(message)
client, err := newNotificationHTTPClient(reqURL, verifyTLS)
if err != nil {
return err
}
req, err := http.NewRequest(reqMethod, reqURL, strings.NewReader(reqBody))
if err != nil {
return err
}
@@ -179,8 +180,7 @@ func (ns *NotificationServerBundle) Send(message string) error {
}()
if resp.StatusCode < 200 || resp.StatusCode > 299 {
body, _ := io.ReadAll(resp.Body)
return fmt.Errorf("%d@%s %s", resp.StatusCode, resp.Status, string(body))
return notificationResponseError(resp)
} else {
_, _ = io.Copy(io.Discard, resp.Body)
}
@@ -188,9 +188,14 @@ func (ns *NotificationServerBundle) Send(message string) error {
return nil
}
func notificationResponseError(resp *http.Response) error {
_, _ = io.CopyN(io.Discard, resp.Body, 4096)
return fmt.Errorf("%d@%s", resp.StatusCode, resp.Status)
}
func newNotificationHTTPClient(rawURL string, verifyTLS bool) (*http.Client, error) {
return utils.NewRestrictedHTTPClient(rawURL, !verifyTLS)
}
// replaceParamInString 替换字符串中的占位符
func (ns *NotificationServerBundle) replaceParamsInString(str string, message string, mod func(string) string) string {
@@ -235,36 +240,41 @@ func (ns *NotificationServerBundle) replaceParamsInString(str string, message st
"#SERVER.BILLING_CYCLE#", mod(cycleStr),
)
if ns.Server.State != nil && ns.Server.Host != nil {
runtime := ns.Server.RuntimeSnapshot()
if runtime.State != nil && runtime.Host != nil {
state := runtime.State
host := runtime.Host
replacements = append(replacements,
// Converted metrics
"#SERVER.CPU#", mod(ns.formatUsage(false, ns.Server.State.CPU)),
"#SERVER.MEM#", mod(ns.formatUsage(true, float64(ns.Server.State.MemUsed)/float64(ns.Server.Host.MemTotal))),
"#SERVER.SWAP#", mod(ns.formatUsage(true, float64(ns.Server.State.SwapUsed)/float64(ns.Server.Host.SwapTotal))),
"#SERVER.DISK#", mod(ns.formatUsage(true, float64(ns.Server.State.DiskUsed)/float64(ns.Server.Host.DiskTotal))),
"#SERVER.SPEEDIN#", mod(fmt.Sprintf("%s/s", ns.formatSize(ns.Server.State.NetInSpeed))),
"#SERVER.SPEEDOUT#", mod(fmt.Sprintf("%s/s", ns.formatSize(ns.Server.State.NetOutSpeed))),
"#SERVER.TRANSFERIN#", mod(ns.formatSize(ns.Server.State.NetInTransfer)),
"#SERVER.TRANSFEROUT#", mod(ns.formatSize(ns.Server.State.NetOutTransfer)),
"#SERVER.CPU#", mod(ns.formatUsage(false, state.CPU)),
"#SERVER.MEM#", mod(ns.formatUsage(true, float64(state.MemUsed)/float64(host.MemTotal))),
"#SERVER.SWAP#", mod(ns.formatUsage(true, float64(state.SwapUsed)/float64(host.SwapTotal))),
"#SERVER.DISK#", mod(ns.formatUsage(true, float64(state.DiskUsed)/float64(host.DiskTotal))),
"#SERVER.SPEEDIN#", mod(fmt.Sprintf("%s/s", ns.formatSize(state.NetInSpeed))),
"#SERVER.SPEEDOUT#", mod(fmt.Sprintf("%s/s", ns.formatSize(state.NetOutSpeed))),
"#SERVER.TRANSFERIN#", mod(ns.formatSize(state.NetInTransfer)),
"#SERVER.TRANSFEROUT#", mod(ns.formatSize(state.NetOutTransfer)),
// Raw metrics
"#SERVER.CPUUSED#", mod(fmt.Sprintf("%f", ns.Server.State.CPU)),
"#SERVER.MEMUSED#", mod(fmt.Sprintf("%d", ns.Server.State.MemUsed)),
"#SERVER.SWAPUSED#", mod(fmt.Sprintf("%d", ns.Server.State.SwapUsed)),
"#SERVER.DISKUSED#", mod(fmt.Sprintf("%d", ns.Server.State.DiskUsed)),
"#SERVER.NETINSPEED#", mod(fmt.Sprintf("%d", ns.Server.State.NetInSpeed)),
"#SERVER.NETOUTSPEED#", mod(fmt.Sprintf("%d", ns.Server.State.NetOutSpeed)),
"#SERVER.TRANSFERINRAW#", mod(fmt.Sprintf("%d", ns.Server.State.NetInTransfer)),
"#SERVER.TRANSFEROUTRAW#", mod(fmt.Sprintf("%d", ns.Server.State.NetOutTransfer)),
"#SERVER.UPTIME#", mod(fmt.Sprintf("%d", ns.Server.State.Uptime)),
"#SERVER.MEMTOTAL#", mod(fmt.Sprintf("%d", ns.Server.Host.MemTotal)),
"#SERVER.SWAPTOTAL#", mod(fmt.Sprintf("%d", ns.Server.Host.SwapTotal)),
"#SERVER.DISKTOTAL#", mod(fmt.Sprintf("%d", ns.Server.Host.DiskTotal)),
"#SERVER.LOAD1#", mod(fmt.Sprintf("%f", ns.Server.State.Load1)),
"#SERVER.LOAD5#", mod(fmt.Sprintf("%f", ns.Server.State.Load5)),
"#SERVER.LOAD15#", mod(fmt.Sprintf("%f", ns.Server.State.Load15)),
"#SERVER.TCPCONNCOUNT#", mod(fmt.Sprintf("%d", ns.Server.State.TcpConnCount)),
"#SERVER.UDPCONNCOUNT#", mod(fmt.Sprintf("%d", ns.Server.State.UdpConnCount)),
"#SERVER.CPUUSED#", mod(fmt.Sprintf("%f", state.CPU)),
"#SERVER.MEMUSED#", mod(fmt.Sprintf("%d", state.MemUsed)),
"#SERVER.SWAPUSED#", mod(fmt.Sprintf("%d", state.SwapUsed)),
"#SERVER.DISKUSED#", mod(fmt.Sprintf("%d", state.DiskUsed)),
"#SERVER.NETINSPEED#", mod(fmt.Sprintf("%d", state.NetInSpeed)),
"#SERVER.NETOUTSPEED#", mod(fmt.Sprintf("%d", state.NetOutSpeed)),
"#SERVER.TRANSFERINRAW#", mod(fmt.Sprintf("%d", state.NetInTransfer)),
"#SERVER.TRANSFEROUTRAW#", mod(fmt.Sprintf("%d", state.NetOutTransfer)),
"#SERVER.NETINTRANSFER#", mod(fmt.Sprintf("%d", state.NetInTransfer)),
"#SERVER.NETOUTTRANSFER#", mod(fmt.Sprintf("%d", state.NetOutTransfer)),
"#SERVER.UPTIME#", mod(fmt.Sprintf("%d", state.Uptime)),
"#SERVER.MEMTOTAL#", mod(fmt.Sprintf("%d", host.MemTotal)),
"#SERVER.SWAPTOTAL#", mod(fmt.Sprintf("%d", host.SwapTotal)),
"#SERVER.DISKTOTAL#", mod(fmt.Sprintf("%d", host.DiskTotal)),
"#SERVER.LOAD1#", mod(fmt.Sprintf("%f", state.Load1)),
"#SERVER.LOAD5#", mod(fmt.Sprintf("%f", state.Load5)),
"#SERVER.LOAD15#", mod(fmt.Sprintf("%f", state.Load15)),
"#SERVER.TCPCONNCOUNT#", mod(fmt.Sprintf("%d", state.TcpConnCount)),
"#SERVER.UDPCONNCOUNT#", mod(fmt.Sprintf("%d", state.UdpConnCount)),
)
} else {
replacements = append(replacements,
@@ -284,6 +294,8 @@ func (ns *NotificationServerBundle) replaceParamsInString(str string, message st
"#SERVER.NETOUTSPEED#", mod("0"),
"#SERVER.TRANSFERINRAW#", mod("0"),
"#SERVER.TRANSFEROUTRAW#", mod("0"),
"#SERVER.NETINTRANSFER#", mod("0"),
"#SERVER.NETOUTTRANSFER#", mod("0"),
"#SERVER.UPTIME#", mod("0"),
"#SERVER.MEMTOTAL#", mod("0"),
"#SERVER.SWAPTOTAL#", mod("0"),
@@ -319,6 +331,33 @@ func (ns *NotificationServerBundle) replaceParamsInString(str string, message st
)
}
replacer := strings.NewReplacer(replacements...)
return replacer.Replace(str)
}
var ipv4, ipv6, validIP string
if ns.Server.GeoIP != nil {
ip := ns.Server.GeoIP.IP
if ip.IPv4Addr != "" && ip.IPv6Addr != "" {
ipv4 = ip.IPv4Addr
ipv6 = ip.IPv6Addr
validIP = ipv4
} else if ip.IPv4Addr != "" {
ipv4 = ip.IPv4Addr
validIP = ipv4
} else {
ipv6 = ip.IPv6Addr
validIP = ipv6
}
}
replacements = append(replacements,
"#SERVER.IP#", mod(validIP),
"#SERVER.IPV4#", mod(ipv4),
"#SERVER.IPV6#", mod(ipv6),
)
}
replacer := strings.NewReplacer(replacements...)
return replacer.Replace(str)
}