diff --git a/cmd/verysimple/gui.go b/cmd/verysimple/gui.go index 40dea69..2702d56 100644 --- a/cmd/verysimple/gui.go +++ b/cmd/verysimple/gui.go @@ -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 { diff --git a/cmd/verysimple/gui_conf.go b/cmd/verysimple/gui_conf.go index f0fdd93..df6fd94 100644 --- a/cmd/verysimple/gui_conf.go +++ b/cmd/verysimple/gui_conf.go @@ -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) diff --git a/cmd/verysimple/gui_menu.go b/cmd/verysimple/gui_menu.go index b7494f0..9ad428f 100644 --- a/cmd/verysimple/gui_menu.go +++ b/cmd/verysimple/gui_menu.go @@ -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() diff --git a/go.mod b/go.mod index 7e3b1a6..b80abe5 100644 --- a/go.mod +++ b/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 ) diff --git a/go.sum b/go.sum index 12ce2fd..03b4b0e 100644 --- a/go.sum +++ b/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= diff --git a/machine/load.go b/machine/load.go index 9d6f407..15ffca9 100644 --- a/machine/load.go +++ b/machine/load.go @@ -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) { diff --git a/proxy/creator.go b/proxy/creator.go index e7ad206..6aefff2 100644 --- a/proxy/creator.go +++ b/proxy/creator.go @@ -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) { diff --git a/utils/algo.go b/utils/algo.go index 2493155..7b52f0d 100644 --- a/utils/algo.go +++ b/utils/algo.go @@ -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) {