mirror of
https://github.com/e1732a364fed/v2ray_simple.git
synced 2025-12-24 13:27:56 +08:00
修订gui,变得更强大;升级一些依赖
This commit is contained in:
@@ -20,11 +20,13 @@ import (
|
||||
"rsc.io/qr"
|
||||
)
|
||||
|
||||
var mainwin *ui.Window
|
||||
|
||||
var testFunc func()
|
||||
var multilineEntry *ui.MultilineEntry //用于向用户提供一些随机的有用的需要复制的字符串
|
||||
var entriesGroup *ui.Group //父 of multilineEntry
|
||||
var (
|
||||
mainwin *ui.Window
|
||||
testFunc func()
|
||||
multilineEntry *ui.MultilineEntry //用于向用户提供一些随机的有用的需要复制的字符串
|
||||
entriesGroup *ui.Group //父 of multilineEntry
|
||||
lastConfFile string
|
||||
)
|
||||
|
||||
type GuiPreference struct {
|
||||
HttpAddr string `toml:"proxy_http_addr"`
|
||||
@@ -145,6 +147,15 @@ func makeBasicControlsPage() ui.Control {
|
||||
|
||||
loglvl_cbox := ui.NewCombobox()
|
||||
|
||||
toggleHbox.Append(ui.NewVerticalSeparator(), false)
|
||||
|
||||
printStateBtn := ui.NewButton("打印当前状态")
|
||||
printStateBtn.OnClicked(func(b *ui.Button) {
|
||||
mainM.PrintAllStateForHuman(os.Stdout)
|
||||
})
|
||||
|
||||
toggleHbox.Append(printStateBtn, false)
|
||||
|
||||
{
|
||||
grid.Append(loglvl_cbox,
|
||||
1, 0, 1, 1,
|
||||
@@ -238,24 +249,49 @@ func makeBasicControlsPage() ui.Control {
|
||||
confE.SetReadOnly(true)
|
||||
button.OnClicked(func(*ui.Button) {
|
||||
filename := ui.OpenFile(mainwin)
|
||||
notok := false
|
||||
if filename == "" {
|
||||
filename = "(cancelled)"
|
||||
notok = true
|
||||
} else if !utils.FileExist(filename) {
|
||||
notok = true
|
||||
}
|
||||
|
||||
if notok {
|
||||
return
|
||||
}
|
||||
confE.SetText(filename)
|
||||
|
||||
shouldStart := false
|
||||
if mainM.IsRunning() {
|
||||
mainM.Stop()
|
||||
mainM.RemoveAllClient()
|
||||
mainM.RemoveAllServer()
|
||||
|
||||
shouldStart = true
|
||||
}
|
||||
|
||||
_, loadConfigErr := mainM.LoadConfig(filename, "", "")
|
||||
if loadConfigErr != nil {
|
||||
if ce := utils.CanLogErr("Gui Load Conf File Err"); ce != nil {
|
||||
ce.Write(zap.Error(loadConfigErr))
|
||||
}
|
||||
} else {
|
||||
lastConfFile = filename
|
||||
mainM.SetupListenAndRoute()
|
||||
mainM.SetupDial()
|
||||
|
||||
if shouldStart {
|
||||
mainM.Start()
|
||||
}
|
||||
|
||||
setupTab()
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
if len(configFiles) == 1 {
|
||||
if lastConfFile != "" {
|
||||
confE.SetText(lastConfFile)
|
||||
} else if len(configFiles) == 1 {
|
||||
confE.SetText(configFiles[0])
|
||||
}
|
||||
|
||||
@@ -426,6 +462,8 @@ func windowClose(*ui.Window) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
var tab *ui.Tab
|
||||
|
||||
func setupUI() {
|
||||
|
||||
setMenu()
|
||||
@@ -444,20 +482,31 @@ func setupUI() {
|
||||
})
|
||||
}
|
||||
|
||||
tab := ui.NewTab()
|
||||
setupTab()
|
||||
|
||||
mainwin.Show()
|
||||
|
||||
}
|
||||
|
||||
func setupTab() {
|
||||
if tab != nil {
|
||||
mainwin.SetChild(nil)
|
||||
c := tab.NumPages()
|
||||
for i := 0; i < c; i++ {
|
||||
tab.Delete(0)
|
||||
}
|
||||
}
|
||||
tab = ui.NewTab()
|
||||
mainwin.SetChild(tab)
|
||||
mainwin.SetMargined(true)
|
||||
|
||||
tab.Append("基础控制", makeBasicControlsPage())
|
||||
tab.Append("代理控制", makeConfPage())
|
||||
tab.Append("app控制", makeAppPage())
|
||||
//tab.Append("Data Choosers", makeDataChoosersPage())
|
||||
|
||||
for i := 0; i < tab.NumPages(); i++ {
|
||||
tab.SetMargined(i, true)
|
||||
}
|
||||
mainwin.Show()
|
||||
|
||||
}
|
||||
|
||||
type imgTableH struct {
|
||||
|
||||
@@ -6,6 +6,8 @@ import (
|
||||
"os"
|
||||
|
||||
"github.com/e1732a364fed/ui"
|
||||
"github.com/e1732a364fed/v2ray_simple/proxy"
|
||||
"golang.org/x/exp/slices"
|
||||
)
|
||||
|
||||
var appVboxExtra []func(*ui.Box)
|
||||
@@ -21,10 +23,6 @@ func makeAppPage() ui.Control {
|
||||
vbox.SetPadded(true)
|
||||
group.SetChild(vbox)
|
||||
|
||||
// ip := ui.NewProgressBar()
|
||||
// ip.SetValue(-1)
|
||||
// vbox.Append(ip, false)
|
||||
|
||||
if len(appVboxExtra) > 0 {
|
||||
for _, f := range appVboxExtra {
|
||||
f(vbox)
|
||||
@@ -36,7 +34,9 @@ func makeAppPage() ui.Control {
|
||||
}
|
||||
|
||||
func makeConfPage() ui.Control {
|
||||
|
||||
result := ui.NewHorizontalBox()
|
||||
|
||||
group1 := ui.NewGroup("Listen")
|
||||
group2 := ui.NewGroup("Dial")
|
||||
|
||||
@@ -78,6 +78,7 @@ func makeConfPage() ui.Control {
|
||||
|
||||
hbox2 = ui.NewHorizontalBox()
|
||||
vbox2.Append(hbox2, false)
|
||||
vbox2.Append(ui.NewHorizontalSeparator(), false)
|
||||
|
||||
hbox2.Append(ui.NewLabel("Dial"), false)
|
||||
|
||||
@@ -103,18 +104,31 @@ func makeConfPage() ui.Control {
|
||||
update(false)
|
||||
})
|
||||
|
||||
muxC := ui.NewCheckbox("mux")
|
||||
if curSelectedDial >= 0 {
|
||||
muxC.SetChecked(sc.Dial[curSelectedDial].Mux)
|
||||
dialPCbox := ui.NewCombobox()
|
||||
vbox2.Append(dialPCbox, false)
|
||||
|
||||
allDialPs := proxy.AllClientTypeList()
|
||||
|
||||
for _, p := range allDialPs {
|
||||
dialPCbox.Append(p)
|
||||
}
|
||||
vbox2.Append(muxC, false)
|
||||
muxC.OnToggled(func(c *ui.Checkbox) {
|
||||
sc.Dial[curSelectedDial].Mux = muxC.Checked()
|
||||
update(true)
|
||||
|
||||
dialPCbox.OnSelected(func(c *ui.Combobox) {
|
||||
idx := dialPCbox.Selected()
|
||||
|
||||
sc.Dial[curSelectedDial].Protocol = allDialPs[idx]
|
||||
})
|
||||
|
||||
muxC := ui.NewCheckbox("mux")
|
||||
muxC.OnToggled(func(c *ui.Checkbox) {
|
||||
sc.Dial[curSelectedDial].Mux = muxC.Checked()
|
||||
})
|
||||
vbox2.Append(muxC, false)
|
||||
|
||||
update = func(shouldChange bool) {
|
||||
muxC.SetChecked(sc.Dial[curSelectedDial].Mux)
|
||||
curD := sc.Dial[curSelectedDial]
|
||||
muxC.SetChecked(curD.Mux)
|
||||
dialPCbox.SetSelected(slices.Index(allDialPs, curD.Protocol))
|
||||
|
||||
if shouldChange {
|
||||
var shouldStart = false
|
||||
@@ -135,6 +149,14 @@ func makeConfPage() ui.Control {
|
||||
}
|
||||
|
||||
}
|
||||
update(false)
|
||||
|
||||
applyBtn := ui.NewButton("提交修改")
|
||||
vbox2.Append(ui.NewHorizontalBox(), true)
|
||||
vbox2.Append(applyBtn, false)
|
||||
applyBtn.OnClicked(func(b *ui.Button) {
|
||||
update(true)
|
||||
})
|
||||
|
||||
// ecbox := ui.NewEditableCombobox()
|
||||
// vbox.Append(ecbox, false)
|
||||
|
||||
@@ -13,15 +13,14 @@ import (
|
||||
"github.com/e1732a364fed/ui"
|
||||
"github.com/e1732a364fed/v2ray_simple/netLayer"
|
||||
"github.com/e1732a364fed/v2ray_simple/utils"
|
||||
qrcode "github.com/skip2/go-qrcode"
|
||||
"go.uber.org/zap"
|
||||
"rsc.io/qr"
|
||||
)
|
||||
|
||||
func setMenu() {
|
||||
|
||||
var filesM = ui.NewMenu("Files")
|
||||
{
|
||||
filesM.AppendPreferencesItem()
|
||||
filesM.AppendAboutItem().OnClicked(func(mi *ui.MenuItem, w *ui.Window) {
|
||||
ui.MsgBox(mainwin,
|
||||
"verysimple, a very simple proxy",
|
||||
@@ -50,6 +49,15 @@ func setMenu() {
|
||||
p.Signal(syscall.SIGINT) //这个方法在windows上不好使
|
||||
}
|
||||
})
|
||||
filesM.AppendSeparator()
|
||||
|
||||
filesM.AppendItem("Download Geoip( GeoLite2-Country.mmdb)").OnClicked(func(mi *ui.MenuItem, w *ui.Window) {
|
||||
tryDownloadMMDB()
|
||||
})
|
||||
|
||||
filesM.AppendItem("Download Geosite folder(v2fly/domain-list-community)").OnClicked(func(mi *ui.MenuItem, w *ui.Window) {
|
||||
tryDownloadGeositeSource()
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
@@ -95,15 +103,16 @@ func debugMenu() {
|
||||
})
|
||||
|
||||
debugM.AppendItem("test2").OnClicked(func(mi *ui.MenuItem, w *ui.Window) {
|
||||
qr, err := qrcode.New("https://example.org", qrcode.Medium)
|
||||
c, err := qr.Encode("https://example.org", qr.L)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
nw := ui.NewWindow("img", 320, 320, false)
|
||||
uiimg := ui.NewImage(320, 320)
|
||||
rect := image.Rect(0, 0, 320, 320)
|
||||
rgbaImg := image.NewRGBA(rect)
|
||||
draw.Draw(rgbaImg, rect, qr.Image(256), image.Point{}, draw.Over)
|
||||
draw.Draw(rgbaImg, rect, c.Image(), image.Point{}, draw.Over)
|
||||
uiimg.Append(rgbaImg)
|
||||
|
||||
mh := newImgTableHandler()
|
||||
|
||||
23
go.mod
23
go.mod
@@ -18,17 +18,16 @@ require (
|
||||
github.com/oschwald/maxminddb-golang v1.9.0
|
||||
github.com/pires/go-proxyproto v0.6.2
|
||||
github.com/pkg/profile v1.6.0
|
||||
github.com/refraction-networking/utls v1.1.5
|
||||
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
|
||||
github.com/refraction-networking/utls v1.2.0
|
||||
github.com/xtaci/smux v1.5.16
|
||||
github.com/yl2chen/cidranger v1.0.2
|
||||
go.uber.org/atomic v1.9.0
|
||||
go.uber.org/zap v1.21.0
|
||||
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90
|
||||
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e
|
||||
golang.org/x/net v0.0.0-20220909164309-bea034e7d591
|
||||
golang.org/x/sys v0.2.0
|
||||
golang.org/x/time v0.0.0-20220224211638-0e9765cccd65
|
||||
go.uber.org/zap v1.24.0
|
||||
golang.org/x/crypto v0.4.0
|
||||
golang.org/x/exp v0.0.0-20221217163422-3c43f8badb15
|
||||
golang.org/x/net v0.4.0
|
||||
golang.org/x/sys v0.3.0
|
||||
golang.org/x/time v0.3.0
|
||||
golang.zx2c4.com/wireguard v0.0.0-20220920152132-bb719d3a6e2c
|
||||
gonum.org/v1/gonum v0.11.0
|
||||
gvisor.dev/gvisor v0.0.0-20221214043228-7501cb5e258d
|
||||
@@ -41,7 +40,7 @@ require (
|
||||
github.com/golang/mock v1.6.0 // indirect
|
||||
github.com/google/btree v1.0.1 // indirect
|
||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
|
||||
github.com/klauspost/compress v1.15.9 // indirect
|
||||
github.com/klauspost/compress v1.15.12 // indirect
|
||||
github.com/marten-seemann/qtls-go1-19 v0.1.1 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.2.0 // indirect
|
||||
github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 // indirect
|
||||
@@ -56,9 +55,9 @@ require (
|
||||
github.com/marten-seemann/qtls-go1-18 v0.1.3 // indirect
|
||||
github.com/shadowsocks/go-shadowsocks2 v0.1.5
|
||||
go.uber.org/multierr v1.8.0 // indirect
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
|
||||
golang.org/x/text v0.3.7 // indirect
|
||||
golang.org/x/tools v0.1.12 // indirect
|
||||
golang.org/x/mod v0.6.0 // indirect
|
||||
golang.org/x/text v0.5.0 // indirect
|
||||
golang.org/x/tools v0.2.0 // indirect
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
|
||||
)
|
||||
|
||||
|
||||
64
go.sum
64
go.sum
@@ -7,7 +7,6 @@ github.com/apernet/quic-go v0.31.1-0.20221126080508-c4a37bf8f6d7/go.mod h1:0wFbi
|
||||
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ=
|
||||
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
|
||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
|
||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||
github.com/biter777/countries v1.5.6 h1:YdvI0OYZR4gmI8BO+LrAuKmoZgiv4RrMdGBj6iORfn8=
|
||||
github.com/biter777/countries v1.5.6/go.mod h1:1HSpZ526mYqKJcpT5Ti1kcGQ0L0SrXWIaptUWjFfv2E=
|
||||
github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE=
|
||||
@@ -41,11 +40,8 @@ github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
|
||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=
|
||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY=
|
||||
github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM=
|
||||
github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
|
||||
github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA=
|
||||
github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg=
|
||||
github.com/marten-seemann/qtls v0.10.0 h1:ECsuYUKalRL240rRD4Ri33ISb7kAQ3qGDlrrl55b2pc=
|
||||
@@ -67,26 +63,23 @@ github.com/oschwald/maxminddb-golang v1.9.0 h1:tIk4nv6VT9OiPyrnDAfJS1s1xKDQMZOsG
|
||||
github.com/oschwald/maxminddb-golang v1.9.0/go.mod h1:TK+s/Z2oZq0rSl4PSeAEoP0bgm82Cp5HyvYbt8K3zLY=
|
||||
github.com/pires/go-proxyproto v0.6.2 h1:KAZ7UteSOt6urjme6ZldyFm4wDe/z0ZUP0Yv0Dos0d8=
|
||||
github.com/pires/go-proxyproto v0.6.2/go.mod h1:Odh9VFOZJCf9G8cLW5o435Xf1J95Jw9Gw5rnCjcwzAY=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/profile v1.6.0 h1:hUDfIISABYI59DyeB3OTay/HxSRwTQ8rB/H83k6r5dM=
|
||||
github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/refraction-networking/utls v1.1.5 h1:JtrojoNhbUQkBqEg05sP3gDgDj6hIEAAVKbI9lx4n6w=
|
||||
github.com/refraction-networking/utls v1.1.5/go.mod h1:jRQxtYi7nkq1p28HF2lwOH5zQm9aC8rpK0O9lIIzGh8=
|
||||
github.com/refraction-networking/utls v1.2.0 h1:U5f8wkij2NVinfLuJdFP3gCMwIHs+EzvhxmYdXgiapo=
|
||||
github.com/refraction-networking/utls v1.2.0/go.mod h1:NPq+cVqzH7D1BeOkmOcb5O/8iVewAsiVt2x1/eO0hgQ=
|
||||
github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg=
|
||||
github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3/go.mod h1:HgjTstvQsPGkxUsCd2KWxErBblirPizecHcpD3ffK+s=
|
||||
github.com/shadowsocks/go-shadowsocks2 v0.1.5 h1:PDSQv9y2S85Fl7VBeOMF9StzeXZyK1HakRm86CUbr28=
|
||||
github.com/shadowsocks/go-shadowsocks2 v0.1.5/go.mod h1:AGGpIoek4HRno4xzyFiAtLHkOpcoznZEkAccaI/rplM=
|
||||
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
|
||||
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
|
||||
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
|
||||
github.com/xtaci/smux v1.5.16 h1:FBPYOkW8ZTjLKUM4LI4xnnuuDC8CQ/dB04HD519WoEk=
|
||||
github.com/xtaci/smux v1.5.16/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY=
|
||||
github.com/yl2chen/cidranger v1.0.2 h1:lbOWZVCG1tCRX4u24kuM1Tb4nHqWkDxwLdoS+SevawU=
|
||||
@@ -96,32 +89,28 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
|
||||
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
|
||||
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
|
||||
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
|
||||
go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
|
||||
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
|
||||
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
|
||||
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM=
|
||||
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA=
|
||||
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8=
|
||||
golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80=
|
||||
golang.org/x/exp v0.0.0-20221217163422-3c43f8badb15 h1:5oN1Pz/eDhCpbMbLstvIPa0b/BEQo6g6nwV3pLjfM6w=
|
||||
golang.org/x/exp v0.0.0-20221217163422-3c43f8badb15/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I=
|
||||
golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220909164309-bea034e7d591 h1:D0B/7al0LLrVC8aWF4+oxpv/m8bc7ViFfVS8/gXGdqI=
|
||||
golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
||||
golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU=
|
||||
golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
||||
@@ -136,31 +125,26 @@ golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
|
||||
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
|
||||
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 h1:M73Iuj3xbbb9Uk1DYhzydthsj6oOd6l9bpuFcNoUvTs=
|
||||
golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
|
||||
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE=
|
||||
golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
@@ -172,11 +156,9 @@ gonum.org/v1/gonum v0.11.0 h1:f1IJhK4Km5tBJmaiJXtk/PkL4cdVX6J+tGiM187uT5E=
|
||||
gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA=
|
||||
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
||||
@@ -93,6 +93,14 @@ func (m *M) RemoveAllClient() {
|
||||
}
|
||||
}
|
||||
|
||||
func (m *M) RemoveAllServer() {
|
||||
count := m.ServerCount()
|
||||
|
||||
for i := 0; i < count; i++ {
|
||||
m.HotDeleteServer(0)
|
||||
}
|
||||
}
|
||||
|
||||
// delete and stop the client
|
||||
func (m *M) HotDeleteClient(index int) {
|
||||
if index < 0 || index >= len(m.allClients) {
|
||||
|
||||
@@ -19,6 +19,14 @@ var (
|
||||
}
|
||||
)
|
||||
|
||||
func AllClientTypeList() []string {
|
||||
return utils.GetMapSortedKeySlice(clientCreatorMap)
|
||||
}
|
||||
|
||||
func AllServerTypeList() []string {
|
||||
return utils.GetMapSortedKeySlice(serverCreatorMap)
|
||||
}
|
||||
|
||||
func PrintAllServerNames() {
|
||||
utils.PrintStr("===============================\nSupported Proxy Listen protocols:\n")
|
||||
for _, v := range utils.GetMapSortedKeySlice(serverCreatorMap) {
|
||||
|
||||
@@ -156,6 +156,9 @@ func MoveItem[T any](arr *[]T, fromIndex, toIndex int) {
|
||||
Splice(arr, toIndex, 0, item)
|
||||
}
|
||||
|
||||
// splices 包在 Nov 10, 2022 添加了Replace函数, 就不用我们自己的实现了
|
||||
// v0.0.0-20221110155412-d0897a79cd37, 不过我们为了代码兼容依然保存该代码,直到2.x.x版本.
|
||||
//
|
||||
// items to insert at start, delete deleteCount items at start
|
||||
// See https://github.com/zzwx/splice/blob/main/splice.go
|
||||
func Splice[T any](source *[]T, start int, deleteCount int, items ...T) (removed []T) {
|
||||
|
||||
Reference in New Issue
Block a user