修订代码;将fallback的from从string改为[]string

这样可以支持从多个listen fallback到相同的目标,又不至于使用默认回落, 更灵活.
This commit is contained in:
e1732a364fed
2022-05-06 22:48:15 +08:00
parent efe7980eed
commit dfebe3f707
8 changed files with 33 additions and 29 deletions

View File

@@ -690,11 +690,11 @@ func interactively_hotRemoveServerOrClient() {
allClients = utils.TrimSlice(allClients, will_delete_index)
}
if will_delete_listen {
listenCloserArray[will_delete_index].Close()
listenCloserList[will_delete_index].Close()
allServers[will_delete_index].Stop()
allServers = utils.TrimSlice(allServers, will_delete_index)
listenCloserArray = utils.TrimSlice(listenCloserArray, will_delete_index)
listenCloserList = utils.TrimSlice(listenCloserList, will_delete_index)
}
@@ -778,7 +778,7 @@ func interactively_hotLoadConfigFile() {
lis := vs.ListenSer(ser, cli, &routingEnv)
if lis != nil {
listenCloserArray = append(listenCloserArray, lis)
listenCloserList = append(listenCloserList, lis)
}
}

View File

@@ -251,7 +251,7 @@ func hotLoadListenConfForRuntime(conf []*proxy.ListenConf) {
}
lis := vs.ListenSer(inServer, defaultOutClient, &routingEnv)
if lis != nil {
listenCloserArray = append(listenCloserArray, lis)
listenCloserList = append(listenCloserList, lis)
allServers = append(allServers, inServer)
}

View File

@@ -39,7 +39,7 @@ var (
tproxyList []*tproxy.Machine //储存所有 tproxy的监听.(一般就一个, 但不排除极特殊情况)
listenCloserArray []io.Closer //储存除tproxy之外 所有运行的 inServer 的 Listener 的 Closer
listenCloserList []io.Closer //储存除tproxy之外 所有运行的 inServer 的 Listener 的 Closer
defaultOutClient proxy.Client
@@ -86,7 +86,7 @@ func cleanup() {
}
}
for _, listener := range listenCloserArray {
for _, listener := range listenCloserList {
if listener != nil {
listener.Close()
}
@@ -364,14 +364,14 @@ func mainFunc() (result int) {
if mode == proxy.SimpleMode {
lis := vs.ListenSer(defaultInServer, defaultOutClient, &routingEnv)
if lis != nil {
listenCloserArray = append(listenCloserArray, lis)
listenCloserList = append(listenCloserList, lis)
}
} else {
for _, inServer := range allServers {
lis := vs.ListenSer(inServer, defaultOutClient, &routingEnv)
if lis != nil {
listenCloserArray = append(listenCloserArray, lis)
listenCloserList = append(listenCloserList, lis)
}
}
@@ -440,7 +440,7 @@ func mainFunc() (result int) {
}
func hasProxyRunning() bool {
return len(listenCloserArray) > 0 || len(tproxyList) > 0
return len(listenCloserList) > 0 || len(tproxyList) > 0
}
//是否可以在运行时动态修改配置。如果没有开启 apiServer 开关 也没有 动态修改配置的功能,则当前模式不灵活,无法动态修改

View File

@@ -43,7 +43,7 @@ path = "ohmygod_verysimple_is_very_simple"
[[fallback]]
from = "my_ws1" # 可选, 标明该fallback用于 哪个tag的 listen。 如果未给出则所有listen都会用到该fallback。
from = ["my_ws1"] # 可选, 标明该fallback用于 哪个tag的 listen。 如果未给出则所有listen都会用到该fallback。
dest = 6060 # 必填,回落到本机端口 6060

View File

@@ -15,13 +15,13 @@ key = "cert.key"
[[fallback]]
from = "vlesstls"
from = ["vlesstls"]
alpn = ["http/1.1"]
dest = "@vlessws" # dest 也可以写成 这种形式, 直接匹配tag, 可防止笔误。
[[fallback]]
from = "vlesstls"
from = ["vlesstls"]
alpn = ["h2"]
dest = "@vlessgrpc"
@@ -36,7 +36,7 @@ path = "/simple"
[[fallback]]
from = "vlessws"
from = ["vlessws"]
dest = "/dev/shm/h1.sock" # 回落到 nginx的 h1 服务你要配置nginx监听这个文件
@@ -51,7 +51,7 @@ path = "very"
[[fallback]]
from = "vlessgrpc"
from = ["vlessgrpc"]
dest = "/dev/shm/h2c.sock" # 回落到 nginx的 h2c 服务你要配置nginx监听这个文件

View File

@@ -66,24 +66,27 @@ func NewClassicFallbackFromConfList(fcl []*FallbackConf) *ClassicFallback {
return cfb
}
func (cfb *ClassicFallback) InsertFallbackConditionSet(condition FallbackConditionSet, forServerTag string, addr netLayer.Addr, xver int) {
func (cfb *ClassicFallback) InsertFallbackConditionSet(condition FallbackConditionSet, forServerTags []string, addr netLayer.Addr, xver int) {
ftype := condition.GetType()
if ftype == FallBack_default && forServerTag == "" {
if ftype == FallBack_default && len(forServerTags) == 0 {
cfb.Default = &FallbackResult{Addr: addr, Xver: xver}
return
}
cfb.supportedTypeMask |= ftype
realMap := cfb.Map[forServerTag]
if realMap == nil {
realMap = make(map[FallbackConditionSet]*FallbackResult)
cfb.Map[forServerTag] = realMap
}
for _, forServerTag := range forServerTags {
realMap[condition] = &FallbackResult{Addr: addr, Xver: xver}
realMap := cfb.Map[forServerTag]
if realMap == nil {
realMap = make(map[FallbackConditionSet]*FallbackResult)
cfb.Map[forServerTag] = realMap
}
realMap[condition] = &FallbackResult{Addr: addr, Xver: xver}
}
}

View File

@@ -64,7 +64,7 @@ func (FallbackResult) SupportType() byte {
type FallbackConf struct {
//可选
FromTag string `toml:"from" json:"from"` //which inServer triggered this fallback
FromTag []string `toml:"from" json:"from"` //which inServer triggered this fallback
Xver int `toml:"xver" json:"xver"` //use PROXY protocol or not, and which version

13
iics.go
View File

@@ -145,16 +145,12 @@ func checkfallback(iics incomingInserverConnState) (targetAddr netLayer.Addr, re
fbResult = mf.GetFallback("", thisFallbackType, fallback_params...)
}
if ce := utils.CanLogDebug("Fallback check"); ce != nil {
if ce := utils.CanLogDebug("Fallback to"); ce != nil {
if fbResult != nil {
ce.Write(
zap.String("matched", fbResult.Addr.String()),
zap.String("addr", fbResult.Addr.String()),
zap.Any("params", fallback_params),
)
} else {
ce.Write(
zap.String("no match", ""),
)
}
}
if fbResult != nil {
@@ -172,6 +168,11 @@ func checkfallback(iics incomingInserverConnState) (targetAddr netLayer.Addr, re
if defaultFallbackAddr := iics.inServer.GetFallback(); defaultFallbackAddr != nil {
if ce := utils.CanLogDebug("Fallback to default setting"); ce != nil {
ce.Write(
zap.String("addr", defaultFallbackAddr.String()),
)
}
targetAddr = *defaultFallbackAddr
result = 0