Files
xboard-node/internal/model/panel.go
T
2026-04-11 05:39:59 +08:00

225 lines
6.7 KiB
Go

package model
import (
"github.com/cedar2025/xboard-node/internal/config"
"github.com/cedar2025/xboard-node/internal/panel"
)
func NodeSpecFromPanel(nc *panel.NodeConfig) *NodeSpec {
if nc == nil {
return nil
}
var certCfg *config.CertConfig
if nc.CertConfig != nil {
certCfg = &config.CertConfig{
CertMode: nc.CertConfig.CertMode,
Domain: nc.CertConfig.Domain,
Email: nc.CertConfig.Email,
DNSProvider: nc.CertConfig.DNSProvider,
DNSEnv: nc.CertConfig.DNSEnv,
HTTPPort: nc.CertConfig.HTTPPort,
CertFile: nc.CertConfig.CertFile,
KeyFile: nc.CertConfig.KeyFile,
CertContent: nc.CertConfig.CertContent,
KeyContent: nc.CertConfig.KeyContent,
}
}
var multiplex *MultiplexConfig
if nc.Multiplex != nil {
multiplex = &MultiplexConfig{
Enabled: nc.Multiplex.Enabled,
Protocol: nc.Multiplex.Protocol,
MaxConnections: nc.Multiplex.MaxConnections,
MinStreams: nc.Multiplex.MinStreams,
MaxStreams: nc.Multiplex.MaxStreams,
Padding: nc.Multiplex.Padding,
}
if nc.Multiplex.Brutal != nil {
multiplex.Brutal = &BrutalConfig{
Enabled: nc.Multiplex.Brutal.Enabled,
UpMbps: nc.Multiplex.Brutal.UpMbps,
DownMbps: nc.Multiplex.Brutal.DownMbps,
}
}
}
routes := make([]RouteRule, 0, len(nc.Routes))
for _, route := range nc.Routes {
routes = append(routes, RouteRule{
ID: route.ID,
Match: cloneStringSlice(route.Match),
Action: route.Action,
ActionValue: route.ActionValue,
})
}
outbounds := make([]OutboundConfig, 0, len(nc.CustomOutbounds))
for _, outbound := range nc.CustomOutbounds {
outbounds = append(outbounds, OutboundConfig{
Tag: outbound.Tag,
Protocol: outbound.Protocol,
Settings: cloneAnyMap(outbound.Settings),
ProxyTag: outbound.ProxyTag,
})
}
return &NodeSpec{
Protocol: nc.Protocol,
ListenIP: nc.ListenIP,
ServerPort: nc.ServerPort,
Network: nc.Network,
NetworkSettings: cloneAnyMap(nc.NetworkSettings),
Routes: routes,
KernelType: nc.KernelType,
KernelLogLevel: nc.KernelLogLevel,
CustomOutbounds: outbounds,
CustomRoutes: cloneMapSlice(nc.CustomRoutes),
CertConfig: certCfg,
AutoTLS: nc.AutoTLS,
Domain: nc.Domain,
Cipher: nc.Cipher,
Plugin: nc.Plugin,
PluginOpt: nc.PluginOpt,
ServerKey: nc.ServerKey,
TLS: nc.TLS,
Flow: nc.Flow,
Decryption: nc.Decryption,
TLSSettings: cloneAnyMap(nc.TLSSettings),
Host: nc.Host,
ServerName: nc.ServerName,
Version: nc.Version,
UpMbps: nc.UpMbps,
DownMbps: nc.DownMbps,
Obfs: nc.Obfs,
ObfsPassword: nc.ObfsPassword,
CongestionControl: nc.CongestionControl,
PaddingScheme: string(nc.PaddingScheme),
Transport: nc.Transport,
TrafficPattern: nc.TrafficPattern,
Multiplex: multiplex,
AcceptProxyProtocol: nc.AcceptProxyProtocol,
}
}
func UserSpecsFromPanel(users []panel.User) []UserSpec {
if users == nil {
return nil
}
out := make([]UserSpec, 0, len(users))
for _, user := range users {
out = append(out, UserSpec{ID: user.ID, UUID: user.UUID, SpeedLimit: user.SpeedLimit, DeviceLimit: user.DeviceLimit})
}
return out
}
func (n *NodeSpec) ToPanel() *panel.NodeConfig {
if n == nil {
return nil
}
var certCfg *panel.CertConfig
if n.CertConfig != nil {
certCfg = &panel.CertConfig{
CertMode: n.CertConfig.CertMode,
Domain: n.CertConfig.Domain,
Email: n.CertConfig.Email,
DNSProvider: n.CertConfig.DNSProvider,
DNSEnv: n.CertConfig.DNSEnv,
HTTPPort: n.CertConfig.HTTPPort,
CertFile: n.CertConfig.CertFile,
KeyFile: n.CertConfig.KeyFile,
CertContent: n.CertConfig.CertContent,
KeyContent: n.CertConfig.KeyContent,
}
}
var multiplex *panel.MultiplexConfig
if n.Multiplex != nil {
multiplex = &panel.MultiplexConfig{
Enabled: n.Multiplex.Enabled,
Protocol: n.Multiplex.Protocol,
MaxConnections: n.Multiplex.MaxConnections,
MinStreams: n.Multiplex.MinStreams,
MaxStreams: n.Multiplex.MaxStreams,
Padding: n.Multiplex.Padding,
}
if n.Multiplex.Brutal != nil {
multiplex.Brutal = &panel.BrutalConfig{
Enabled: n.Multiplex.Brutal.Enabled,
UpMbps: n.Multiplex.Brutal.UpMbps,
DownMbps: n.Multiplex.Brutal.DownMbps,
}
}
}
routes := make([]panel.RouteRule, 0, len(n.Routes))
for _, route := range n.Routes {
routes = append(routes, panel.RouteRule{
ID: route.ID,
Match: cloneStringSlice(route.Match),
Action: route.Action,
ActionValue: route.ActionValue,
})
}
outbounds := make([]panel.OutboundConfig, 0, len(n.CustomOutbounds))
for _, outbound := range n.CustomOutbounds {
outbounds = append(outbounds, panel.OutboundConfig{
Tag: outbound.Tag,
Protocol: outbound.Protocol,
Settings: cloneAnyMap(outbound.Settings),
ProxyTag: outbound.ProxyTag,
})
}
return &panel.NodeConfig{
Protocol: n.Protocol,
ListenIP: n.ListenIP,
ServerPort: n.ServerPort,
Network: n.Network,
NetworkSettings: cloneAnyMap(n.NetworkSettings),
Routes: routes,
KernelType: n.KernelType,
KernelLogLevel: n.KernelLogLevel,
CustomOutbounds: outbounds,
CustomRoutes: cloneMapSlice(n.CustomRoutes),
CertConfig: certCfg,
AutoTLS: n.AutoTLS,
Domain: n.Domain,
Cipher: n.Cipher,
Plugin: n.Plugin,
PluginOpt: n.PluginOpt,
ServerKey: n.ServerKey,
TLS: n.TLS,
Flow: n.Flow,
Decryption: n.Decryption,
TLSSettings: cloneAnyMap(n.TLSSettings),
Host: n.Host,
ServerName: n.ServerName,
Version: n.Version,
UpMbps: n.UpMbps,
DownMbps: n.DownMbps,
Obfs: n.Obfs,
ObfsPassword: n.ObfsPassword,
CongestionControl: n.CongestionControl,
PaddingScheme: panel.StringOrArray(n.PaddingScheme),
Transport: n.Transport,
TrafficPattern: n.TrafficPattern,
Multiplex: multiplex,
AcceptProxyProtocol: n.AcceptProxyProtocol,
}
}
func UserSpecsToPanel(users []UserSpec) []panel.User {
if users == nil {
return nil
}
out := make([]panel.User, 0, len(users))
for _, user := range users {
out = append(out, panel.User{ID: user.ID, UUID: user.UUID, SpeedLimit: user.SpeedLimit, DeviceLimit: user.DeviceLimit})
}
return out
}