mirror of
https://github.com/wyx2685/V2bX.git
synced 2026-02-04 12:40:11 +00:00
update sing-box support
This commit is contained in:
24
conf/cert.go
Normal file
24
conf/cert.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package conf
|
||||
|
||||
type CertConfig struct {
|
||||
CertMode string `yaml:"CertMode"` // none, file, http, dns
|
||||
RejectUnknownSni bool `yaml:"RejectUnknownSni"`
|
||||
CertDomain string `yaml:"CertDomain"`
|
||||
CertFile string `yaml:"CertFile"`
|
||||
KeyFile string `yaml:"KeyFile"`
|
||||
Provider string `yaml:"Provider"` // alidns, cloudflare, gandi, godaddy....
|
||||
Email string `yaml:"Email"`
|
||||
DNSEnv map[string]string `yaml:"DNSEnv"`
|
||||
RealityConfig *RealityConfig `yaml:"RealityConfig"`
|
||||
}
|
||||
|
||||
type RealityConfig struct {
|
||||
Dest interface{} `yaml:"Dest" json:"Dest"`
|
||||
Xver uint64 `yaml:"Xver" json:"Xver"`
|
||||
ServerNames []string `yaml:"ServerNames" json:"ServerNames"`
|
||||
PrivateKey string `yaml:"PrivateKey" json:"PrivateKey"`
|
||||
MinClientVer string `yaml:"MinClientVer" json:"MinClientVer"`
|
||||
MaxClientVer string `yaml:"MaxClientVer" json:"MaxClientVer"`
|
||||
MaxTimeDiff uint64 `yaml:"MaxTimeDiff" json:"MaxTimeDiff"`
|
||||
ShortIds []string `yaml:"ShortIds" json:"ShortIds"`
|
||||
}
|
||||
21
conf/conf.go
21
conf/conf.go
@@ -2,9 +2,10 @@ package conf
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"gopkg.in/yaml.v3"
|
||||
"io"
|
||||
"os"
|
||||
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
type Conf struct {
|
||||
@@ -15,16 +16,9 @@ type Conf struct {
|
||||
func New() *Conf {
|
||||
return &Conf{
|
||||
CoreConfig: CoreConfig{
|
||||
Type: "xray",
|
||||
XrayConfig: &XrayConfig{
|
||||
LogConfig: NewLogConfig(),
|
||||
AssetPath: "/etc/V2bX/",
|
||||
DnsConfigPath: "",
|
||||
InboundConfigPath: "",
|
||||
OutboundConfigPath: "",
|
||||
RouteConfigPath: "",
|
||||
ConnectionConfig: NewConnectionConfig(),
|
||||
},
|
||||
Type: "xray",
|
||||
XrayConfig: NewXrayConfig(),
|
||||
SingConfig: NewSingConfig(),
|
||||
},
|
||||
NodesConfig: []*NodeConfig{},
|
||||
}
|
||||
@@ -44,10 +38,5 @@ func (p *Conf) LoadFromPath(filePath string) error {
|
||||
if err != nil {
|
||||
return fmt.Errorf("decode config error: %s", err)
|
||||
}
|
||||
old := &OldConfig{}
|
||||
err = yaml.Unmarshal(content, old)
|
||||
if err == nil {
|
||||
migrateOldConfig(p, old)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package conf
|
||||
|
||||
import (
|
||||
"log"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
@@ -11,9 +12,6 @@ func TestConf_LoadFromPath(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestConf_Watch(t *testing.T) {
|
||||
c := New()
|
||||
log.Println(c.Watch("../example/config.yml.example", func() {
|
||||
log.Println(1)
|
||||
}))
|
||||
select {}
|
||||
//c := New()
|
||||
log.Println(strings.Split("aaaa", " "))
|
||||
}
|
||||
|
||||
29
conf/core.go
29
conf/core.go
@@ -3,32 +3,5 @@ package conf
|
||||
type CoreConfig struct {
|
||||
Type string `yaml:"Type"`
|
||||
XrayConfig *XrayConfig `yaml:"XrayConfig"`
|
||||
}
|
||||
|
||||
type XrayConfig struct {
|
||||
LogConfig *LogConfig `yaml:"Log"`
|
||||
AssetPath string `yaml:"AssetPath"`
|
||||
DnsConfigPath string `yaml:"DnsConfigPath"`
|
||||
RouteConfigPath string `yaml:"RouteConfigPath"`
|
||||
ConnectionConfig *ConnectionConfig `yaml:"ConnectionConfig"`
|
||||
InboundConfigPath string `yaml:"InboundConfigPath"`
|
||||
OutboundConfigPath string `yaml:"OutboundConfigPath"`
|
||||
}
|
||||
|
||||
type ConnectionConfig struct {
|
||||
Handshake uint32 `yaml:"handshake"`
|
||||
ConnIdle uint32 `yaml:"connIdle"`
|
||||
UplinkOnly uint32 `yaml:"uplinkOnly"`
|
||||
DownlinkOnly uint32 `yaml:"downlinkOnly"`
|
||||
BufferSize int32 `yaml:"bufferSize"`
|
||||
}
|
||||
|
||||
func NewConnectionConfig() *ConnectionConfig {
|
||||
return &ConnectionConfig{
|
||||
Handshake: 4,
|
||||
ConnIdle: 30,
|
||||
UplinkOnly: 2,
|
||||
DownlinkOnly: 4,
|
||||
BufferSize: 64,
|
||||
}
|
||||
SingConfig *SingConfig `yaml:"SingConfig"`
|
||||
}
|
||||
|
||||
40
conf/limit.go
Normal file
40
conf/limit.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package conf
|
||||
|
||||
type LimitConfig struct {
|
||||
EnableRealtime bool `yaml:"EnableRealtime"`
|
||||
SpeedLimit int `yaml:"SpeedLimit"`
|
||||
IPLimit int `yaml:"DeviceLimit"`
|
||||
ConnLimit int `yaml:"ConnLimit"`
|
||||
EnableIpRecorder bool `yaml:"EnableIpRecorder"`
|
||||
IpRecorderConfig *IpReportConfig `yaml:"IpRecorderConfig"`
|
||||
EnableDynamicSpeedLimit bool `yaml:"EnableDynamicSpeedLimit"`
|
||||
DynamicSpeedLimitConfig *DynamicSpeedLimitConfig `yaml:"DynamicSpeedLimitConfig"`
|
||||
}
|
||||
|
||||
type RecorderConfig struct {
|
||||
Url string `yaml:"Url"`
|
||||
Token string `yaml:"Token"`
|
||||
Timeout int `yaml:"Timeout"`
|
||||
}
|
||||
|
||||
type RedisConfig struct {
|
||||
Address string `yaml:"Address"`
|
||||
Password string `yaml:"Password"`
|
||||
Db int `yaml:"Db"`
|
||||
Expiry int `json:"Expiry"`
|
||||
}
|
||||
|
||||
type IpReportConfig struct {
|
||||
Periodic int `yaml:"Periodic"`
|
||||
Type string `yaml:"Type"`
|
||||
RecorderConfig *RecorderConfig `yaml:"RecorderConfig"`
|
||||
RedisConfig *RedisConfig `yaml:"RedisConfig"`
|
||||
EnableIpSync bool `yaml:"EnableIpSync"`
|
||||
}
|
||||
|
||||
type DynamicSpeedLimitConfig struct {
|
||||
Periodic int `yaml:"Periodic"`
|
||||
Traffic int64 `yaml:"Traffic"`
|
||||
SpeedLimit int `yaml:"SpeedLimit"`
|
||||
ExpireTime int `yaml:"ExpireTime"`
|
||||
}
|
||||
15
conf/log.go
15
conf/log.go
@@ -1,15 +0,0 @@
|
||||
package conf
|
||||
|
||||
type LogConfig struct {
|
||||
Level string `yaml:"Level"`
|
||||
AccessPath string `yaml:"AccessPath"`
|
||||
ErrorPath string `yaml:"ErrorPath"`
|
||||
}
|
||||
|
||||
func NewLogConfig() *LogConfig {
|
||||
return &LogConfig{
|
||||
Level: "warning",
|
||||
AccessPath: "",
|
||||
ErrorPath: "",
|
||||
}
|
||||
}
|
||||
101
conf/node.go
101
conf/node.go
@@ -1,8 +1,8 @@
|
||||
package conf
|
||||
|
||||
type NodeConfig struct {
|
||||
ApiConfig *ApiConfig `yaml:"ApiConfig"`
|
||||
ControllerConfig *ControllerConfig `yaml:"ControllerConfig"`
|
||||
ApiConfig *ApiConfig `yaml:"ApiConfig"`
|
||||
Options *Options `yaml:"Options"`
|
||||
}
|
||||
|
||||
type ApiConfig struct {
|
||||
@@ -13,100 +13,3 @@ type ApiConfig struct {
|
||||
Timeout int `yaml:"Timeout"`
|
||||
RuleListPath string `yaml:"RuleListPath"`
|
||||
}
|
||||
|
||||
type ControllerConfig struct {
|
||||
ListenIP string `yaml:"ListenIP"`
|
||||
SendIP string `yaml:"SendIP"`
|
||||
XrayOptions XrayOptions `yaml:"XrayOptions"`
|
||||
HyOptions HyOptions `yaml:"HyOptions"`
|
||||
LimitConfig LimitConfig `yaml:"LimitConfig"`
|
||||
CertConfig *CertConfig `yaml:"CertConfig"`
|
||||
}
|
||||
|
||||
type RealityConfig struct {
|
||||
Dest interface{} `yaml:"Dest" json:"Dest"`
|
||||
Xver uint64 `yaml:"Xver" json:"Xver"`
|
||||
ServerNames []string `yaml:"ServerNames" json:"ServerNames"`
|
||||
PrivateKey string `yaml:"PrivateKey" json:"PrivateKey"`
|
||||
MinClientVer string `yaml:"MinClientVer" json:"MinClientVer"`
|
||||
MaxClientVer string `yaml:"MaxClientVer" json:"MaxClientVer"`
|
||||
MaxTimeDiff uint64 `yaml:"MaxTimeDiff" json:"MaxTimeDiff"`
|
||||
ShortIds []string `yaml:"ShortIds" json:"ShortIds"`
|
||||
}
|
||||
|
||||
type XrayOptions struct {
|
||||
EnableProxyProtocol bool `yaml:"EnableProxyProtocol"`
|
||||
EnableDNS bool `yaml:"EnableDNS"`
|
||||
DNSType string `yaml:"DNSType"`
|
||||
EnableUot bool `yaml:"EnableUot"`
|
||||
EnableTFO bool `yaml:"EnableTFO"`
|
||||
DisableIVCheck bool `yaml:"DisableIVCheck"`
|
||||
DisableSniffing bool `yaml:"DisableSniffing"`
|
||||
EnableFallback bool `yaml:"EnableFallback"`
|
||||
FallBackConfigs []FallBackConfig `yaml:"FallBackConfigs"`
|
||||
}
|
||||
|
||||
type HyOptions struct {
|
||||
Resolver string `yaml:"Resolver"`
|
||||
ResolvePreference string `yaml:"ResolvePreference"`
|
||||
SendDevice string `yaml:"SendDevice"`
|
||||
}
|
||||
|
||||
type LimitConfig struct {
|
||||
EnableRealtime bool `yaml:"EnableRealtime"`
|
||||
SpeedLimit int `yaml:"SpeedLimit"`
|
||||
IPLimit int `yaml:"DeviceLimit"`
|
||||
ConnLimit int `yaml:"ConnLimit"`
|
||||
EnableIpRecorder bool `yaml:"EnableIpRecorder"`
|
||||
IpRecorderConfig *IpReportConfig `yaml:"IpRecorderConfig"`
|
||||
EnableDynamicSpeedLimit bool `yaml:"EnableDynamicSpeedLimit"`
|
||||
DynamicSpeedLimitConfig *DynamicSpeedLimitConfig `yaml:"DynamicSpeedLimitConfig"`
|
||||
}
|
||||
|
||||
type FallBackConfig struct {
|
||||
SNI string `yaml:"SNI"`
|
||||
Alpn string `yaml:"Alpn"`
|
||||
Path string `yaml:"Path"`
|
||||
Dest string `yaml:"Dest"`
|
||||
ProxyProtocolVer uint64 `yaml:"ProxyProtocolVer"`
|
||||
}
|
||||
|
||||
type RecorderConfig struct {
|
||||
Url string `yaml:"Url"`
|
||||
Token string `yaml:"Token"`
|
||||
Timeout int `yaml:"Timeout"`
|
||||
}
|
||||
|
||||
type RedisConfig struct {
|
||||
Address string `yaml:"Address"`
|
||||
Password string `yaml:"Password"`
|
||||
Db int `yaml:"Db"`
|
||||
Expiry int `json:"Expiry"`
|
||||
}
|
||||
|
||||
type IpReportConfig struct {
|
||||
Periodic int `yaml:"Periodic"`
|
||||
Type string `yaml:"Type"`
|
||||
RecorderConfig *RecorderConfig `yaml:"RecorderConfig"`
|
||||
RedisConfig *RedisConfig `yaml:"RedisConfig"`
|
||||
EnableIpSync bool `yaml:"EnableIpSync"`
|
||||
}
|
||||
|
||||
type DynamicSpeedLimitConfig struct {
|
||||
Periodic int `yaml:"Periodic"`
|
||||
Traffic int64 `yaml:"Traffic"`
|
||||
SpeedLimit int `yaml:"SpeedLimit"`
|
||||
ExpireTime int `yaml:"ExpireTime"`
|
||||
}
|
||||
|
||||
type CertConfig struct {
|
||||
CertMode string `yaml:"CertMode"` // none, file, http, dns
|
||||
RejectUnknownSni bool `yaml:"RejectUnknownSni"`
|
||||
CertDomain string `yaml:"CertDomain"`
|
||||
CertFile string `yaml:"CertFile"`
|
||||
KeyFile string `yaml:"KeyFile"`
|
||||
Provider string `yaml:"Provider"` // alidns, cloudflare, gandi, godaddy....
|
||||
Email string `yaml:"Email"`
|
||||
DNSEnv map[string]string `yaml:"DNSEnv"`
|
||||
RealityConfig *RealityConfig `yaml:"RealityConfig"`
|
||||
}
|
||||
|
||||
81
conf/old.go
81
conf/old.go
@@ -1,81 +0,0 @@
|
||||
package conf
|
||||
|
||||
import "log"
|
||||
|
||||
type OldConfig struct {
|
||||
NodesConfig []*struct {
|
||||
ApiConfig *OldApiConfig `yaml:"ApiConfig"`
|
||||
ControllerConfig *OldControllerConfig `yaml:"ControllerConfig"`
|
||||
} `yaml:"Nodes"`
|
||||
}
|
||||
|
||||
type OldControllerConfig struct {
|
||||
ListenIP string `yaml:"ListenIP"`
|
||||
SendIP string `yaml:"SendIP"`
|
||||
EnableDNS bool `yaml:"EnableDNS"`
|
||||
DNSType string `yaml:"DNSType"`
|
||||
DisableUploadTraffic bool `yaml:"DisableUploadTraffic"`
|
||||
DisableGetRule bool `yaml:"DisableGetRule"`
|
||||
EnableProxyProtocol bool `yaml:"EnableProxyProtocol"`
|
||||
EnableFallback bool `yaml:"EnableFallback"`
|
||||
DisableIVCheck bool `yaml:"DisableIVCheck"`
|
||||
DisableSniffing bool `yaml:"DisableSniffing"`
|
||||
FallBackConfigs []*FallBackConfig `yaml:"FallBackConfigs"`
|
||||
EnableIpRecorder bool `yaml:"EnableIpRecorder"`
|
||||
IpRecorderConfig *IpReportConfig `yaml:"IpRecorderConfig"`
|
||||
EnableDynamicSpeedLimit bool `yaml:"EnableDynamicSpeedLimit"`
|
||||
DynamicSpeedLimitConfig *DynamicSpeedLimitConfig `yaml:"DynamicSpeedLimitConfig"`
|
||||
CertConfig *CertConfig `yaml:"CertConfig"`
|
||||
}
|
||||
|
||||
type OldApiConfig struct {
|
||||
APIHost string `yaml:"ApiHost"`
|
||||
NodeID int `yaml:"NodeID"`
|
||||
Key string `yaml:"ApiKey"`
|
||||
NodeType string `yaml:"NodeType"`
|
||||
EnableVless bool `yaml:"EnableVless"`
|
||||
Timeout int `yaml:"Timeout"`
|
||||
SpeedLimit int `yaml:"SpeedLimit"`
|
||||
DeviceLimit int `yaml:"DeviceLimit"`
|
||||
RuleListPath string `yaml:"RuleListPath"`
|
||||
DisableCustomConfig bool `yaml:"DisableCustomConfig"`
|
||||
}
|
||||
|
||||
func migrateOldConfig(c *Conf, old *OldConfig) {
|
||||
changed := false
|
||||
for i, n := range c.NodesConfig {
|
||||
if i >= len(old.NodesConfig) {
|
||||
break
|
||||
}
|
||||
// limit config
|
||||
if old.NodesConfig[i].ApiConfig.SpeedLimit != 0 {
|
||||
n.ControllerConfig.LimitConfig.SpeedLimit = old.NodesConfig[i].ApiConfig.SpeedLimit
|
||||
changed = true
|
||||
}
|
||||
if old.NodesConfig[i].ApiConfig.DeviceLimit != 0 {
|
||||
n.ControllerConfig.LimitConfig.IPLimit = old.NodesConfig[i].ApiConfig.DeviceLimit
|
||||
changed = true
|
||||
}
|
||||
if old.NodesConfig[i].ControllerConfig.EnableDynamicSpeedLimit {
|
||||
n.ControllerConfig.LimitConfig.EnableDynamicSpeedLimit = true
|
||||
changed = true
|
||||
}
|
||||
if old.NodesConfig[i].ControllerConfig.DynamicSpeedLimitConfig != nil {
|
||||
n.ControllerConfig.LimitConfig.DynamicSpeedLimitConfig =
|
||||
old.NodesConfig[i].ControllerConfig.DynamicSpeedLimitConfig
|
||||
changed = true
|
||||
}
|
||||
if old.NodesConfig[i].ControllerConfig.EnableIpRecorder {
|
||||
n.ControllerConfig.LimitConfig.EnableIpRecorder = true
|
||||
changed = true
|
||||
}
|
||||
if old.NodesConfig[i].ControllerConfig.IpRecorderConfig != nil {
|
||||
n.ControllerConfig.LimitConfig.IpRecorderConfig =
|
||||
old.NodesConfig[i].ControllerConfig.IpRecorderConfig
|
||||
changed = true
|
||||
}
|
||||
}
|
||||
if changed {
|
||||
log.Println("Warning: This config file is old.")
|
||||
}
|
||||
}
|
||||
36
conf/option.go
Normal file
36
conf/option.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package conf
|
||||
|
||||
type Options struct {
|
||||
ListenIP string `yaml:"ListenIP"`
|
||||
SendIP string `yaml:"SendIP"`
|
||||
LimitConfig LimitConfig `yaml:"LimitConfig"`
|
||||
CertConfig *CertConfig `yaml:"CertConfig"`
|
||||
XrayOptions XrayOptions `yaml:"-"`
|
||||
HyOptions HyOptions `yaml:"-"`
|
||||
}
|
||||
|
||||
type XrayOptions struct {
|
||||
EnableProxyProtocol bool `yaml:"EnableProxyProtocol"`
|
||||
EnableDNS bool `yaml:"EnableDNS"`
|
||||
DNSType string `yaml:"DNSType"`
|
||||
EnableUot bool `yaml:"EnableUot"`
|
||||
EnableTFO bool `yaml:"EnableTFO"`
|
||||
DisableIVCheck bool `yaml:"DisableIVCheck"`
|
||||
DisableSniffing bool `yaml:"DisableSniffing"`
|
||||
EnableFallback bool `yaml:"EnableFallback"`
|
||||
FallBackConfigs []FallBackConfig `yaml:"FallBackConfigs"`
|
||||
}
|
||||
|
||||
type FallBackConfig struct {
|
||||
SNI string `yaml:"SNI"`
|
||||
Alpn string `yaml:"Alpn"`
|
||||
Path string `yaml:"Path"`
|
||||
Dest string `yaml:"Dest"`
|
||||
ProxyProtocolVer uint64 `yaml:"ProxyProtocolVer"`
|
||||
}
|
||||
|
||||
type HyOptions struct {
|
||||
Resolver string `yaml:"Resolver"`
|
||||
ResolvePreference string `yaml:"ResolvePreference"`
|
||||
SendDevice string `yaml:"SendDevice"`
|
||||
}
|
||||
22
conf/sing.go
Normal file
22
conf/sing.go
Normal file
@@ -0,0 +1,22 @@
|
||||
package conf
|
||||
|
||||
type SingConfig struct {
|
||||
LogConfig SingLogConfig `yaml:"LogConfig"`
|
||||
OriginalPath string `yaml:"OriginalPath"`
|
||||
}
|
||||
|
||||
type SingLogConfig struct {
|
||||
Disabled bool `yaml:"Disable"`
|
||||
Level string `yaml:"Level"`
|
||||
Output string `yaml:"Output"`
|
||||
Timestamp bool `yaml:"Timestamp"`
|
||||
}
|
||||
|
||||
func NewSingConfig() *SingConfig {
|
||||
return &SingConfig{
|
||||
LogConfig: SingLogConfig{
|
||||
Level: "error",
|
||||
Timestamp: true,
|
||||
},
|
||||
}
|
||||
}
|
||||
47
conf/xray.go
Normal file
47
conf/xray.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package conf
|
||||
|
||||
type XrayConfig struct {
|
||||
LogConfig *XrayLogConfig `yaml:"Log"`
|
||||
AssetPath string `yaml:"AssetPath"`
|
||||
DnsConfigPath string `yaml:"DnsConfigPath"`
|
||||
RouteConfigPath string `yaml:"RouteConfigPath"`
|
||||
ConnectionConfig *XrayConnectionConfig `yaml:"XrayConnectionConfig"`
|
||||
InboundConfigPath string `yaml:"InboundConfigPath"`
|
||||
OutboundConfigPath string `yaml:"OutboundConfigPath"`
|
||||
}
|
||||
|
||||
type XrayLogConfig struct {
|
||||
Level string `yaml:"Level"`
|
||||
AccessPath string `yaml:"AccessPath"`
|
||||
ErrorPath string `yaml:"ErrorPath"`
|
||||
}
|
||||
|
||||
type XrayConnectionConfig struct {
|
||||
Handshake uint32 `yaml:"handshake"`
|
||||
ConnIdle uint32 `yaml:"connIdle"`
|
||||
UplinkOnly uint32 `yaml:"uplinkOnly"`
|
||||
DownlinkOnly uint32 `yaml:"downlinkOnly"`
|
||||
BufferSize int32 `yaml:"bufferSize"`
|
||||
}
|
||||
|
||||
func NewXrayConfig() *XrayConfig {
|
||||
return &XrayConfig{
|
||||
LogConfig: &XrayLogConfig{
|
||||
Level: "warning",
|
||||
AccessPath: "",
|
||||
ErrorPath: "",
|
||||
},
|
||||
AssetPath: "/etc/V2bX/",
|
||||
DnsConfigPath: "",
|
||||
InboundConfigPath: "",
|
||||
OutboundConfigPath: "",
|
||||
RouteConfigPath: "",
|
||||
ConnectionConfig: &XrayConnectionConfig{
|
||||
Handshake: 4,
|
||||
ConnIdle: 30,
|
||||
UplinkOnly: 2,
|
||||
DownlinkOnly: 4,
|
||||
BufferSize: 64,
|
||||
},
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user