mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-01 14:46:36 +08:00
2a0ebd16fa
- 修复 ClickHouse Batch Writer 与 RiskControl LogWriter 优雅停机,确保退出前队列数据正确刷盘。 - 修复 OpenFlare 系统配置参数全局变量并发读写的 Data Race 冲突,在读取配置时引入读锁保护。 - 修复 upload 模块的 API 错误响应格式,使用 response.Abort* 代替原始的 c.AbortWithStatus 与 c.JSON,保证全局信封格式统一。 - 修复 pkg/utils/network 的 isPrivateIPv4 以使用标准库 net.IP.IsPrivate() 校验,修复 format 的 Bytes2Size 边界,修改大小单位因子变量为只读常量。 - 重构 upload 文件服务与路由器测试,使用 t.TempDir() 代替硬编码的 uploads 相对路径写入和删除,解决测试目录文件污染问题。
121 lines
2.8 KiB
Go
121 lines
2.8 KiB
Go
// Copyright 2026 Arctel.net
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package relay
|
|
|
|
import (
|
|
"net"
|
|
"strings"
|
|
|
|
"github.com/Rain-kl/Wavelet/internal/model"
|
|
)
|
|
|
|
const (
|
|
relayStatusUnhealthy = "unhealthy"
|
|
releaseChannelStable = "stable"
|
|
)
|
|
|
|
func normalizeRelayStatus(status string) string {
|
|
switch strings.ToLower(strings.TrimSpace(status)) {
|
|
case "healthy":
|
|
return "healthy"
|
|
case relayStatusUnhealthy:
|
|
return relayStatusUnhealthy
|
|
default:
|
|
return "unknown"
|
|
}
|
|
}
|
|
|
|
func normalizeReleaseChannel(channel string) string {
|
|
if strings.ToLower(strings.TrimSpace(channel)) == "preview" {
|
|
return "preview"
|
|
}
|
|
return releaseChannelStable
|
|
}
|
|
|
|
func resolveReportedNodeIP(reportedIP string, remoteAddr string) string {
|
|
reported := normalizeNodeIP(reportedIP)
|
|
remote := normalizeRemoteAddr(remoteAddr)
|
|
if reported == "" {
|
|
return remote
|
|
}
|
|
if isPublicNodeIP(reported) {
|
|
return reported
|
|
}
|
|
if isPublicNodeIP(remote) {
|
|
return remote
|
|
}
|
|
return reported
|
|
}
|
|
|
|
func normalizeNodeIP(raw string) string {
|
|
raw = strings.TrimSpace(raw)
|
|
if raw == "" {
|
|
return ""
|
|
}
|
|
if host, _, err := net.SplitHostPort(raw); err == nil {
|
|
raw = host
|
|
}
|
|
raw = strings.Trim(raw, "[]")
|
|
return raw
|
|
}
|
|
|
|
func normalizeRemoteAddr(remoteAddr string) string {
|
|
remoteAddr = strings.TrimSpace(remoteAddr)
|
|
if remoteAddr == "" {
|
|
return ""
|
|
}
|
|
host, _, err := net.SplitHostPort(remoteAddr)
|
|
if err != nil {
|
|
return normalizeNodeIP(remoteAddr)
|
|
}
|
|
return normalizeNodeIP(host)
|
|
}
|
|
|
|
func isPublicNodeIP(raw string) bool {
|
|
ip := net.ParseIP(strings.TrimSpace(raw))
|
|
if ip == nil {
|
|
return false
|
|
}
|
|
if ip.IsLoopback() || ip.IsPrivate() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() || ip.IsUnspecified() {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func buildRelayConfig(node *model.OpenFlareNode) *Config {
|
|
if node == nil {
|
|
return nil
|
|
}
|
|
return &Config{
|
|
BindPort: node.RelayBindPort,
|
|
VhostHTTPPort: node.RelayVhostHTTPPort,
|
|
AuthToken: node.RelayAuthToken,
|
|
LogLevel: "info",
|
|
WebServerEnabled: node.RelayWebServerEnabled,
|
|
}
|
|
}
|
|
|
|
// BuildSettings returns runtime settings shared by relay and flared clients.
|
|
func BuildSettings(node *model.OpenFlareNode, updateNow bool, updateChannel, updateTag string) *Settings {
|
|
model.OptionMapRWMutex.RLock()
|
|
defer model.OptionMapRWMutex.RUnlock()
|
|
|
|
autoUpdate := false
|
|
if node != nil {
|
|
autoUpdate = node.AutoUpdateEnabled
|
|
}
|
|
if strings.TrimSpace(updateChannel) == "" {
|
|
updateChannel = releaseChannelStable
|
|
}
|
|
return &Settings{
|
|
HeartbeatInterval: model.AgentHeartbeatInterval,
|
|
WebsocketUpgradeEnabled: model.AgentWebsocketUpgradeEnabled,
|
|
AutoUpdate: autoUpdate,
|
|
UpdateRepo: model.AgentUpdateRepo,
|
|
UpdateNow: updateNow,
|
|
UpdateChannel: updateChannel,
|
|
UpdateTag: strings.TrimSpace(updateTag),
|
|
}
|
|
}
|