diff --git a/common/counter/conn.go b/common/counter/conn.go new file mode 100644 index 0000000..cb5ee6c --- /dev/null +++ b/common/counter/conn.go @@ -0,0 +1,64 @@ +package counter + +import ( + "net" + + "github.com/sagernet/sing/common/buf" + + M "github.com/sagernet/sing/common/metadata" + "github.com/sagernet/sing/common/network" +) + +type ConnCounter struct { + net.Conn + storage *TrafficStorage +} + +func NewConnCounter(conn net.Conn, s *TrafficStorage) net.Conn { + return &ConnCounter{ + Conn: conn, + storage: s, + } +} + +func (c *ConnCounter) Read(b []byte) (n int, err error) { + n, err = c.Conn.Read(b) + c.storage.DownCounter.Store(int64(n)) + return +} + +func (c *ConnCounter) Write(b []byte) (n int, err error) { + n, err = c.Conn.Write(b) + c.storage.UpCounter.Store(int64(n)) + return +} + +type PacketConnCounter struct { + network.PacketConn + storage *TrafficStorage +} + +func NewPacketConnCounter(conn network.PacketConn, s *TrafficStorage) network.PacketConn { + return &PacketConnCounter{ + PacketConn: conn, + storage: s, + } +} + +func (p *PacketConnCounter) ReadPacket(buff *buf.Buffer) (destination M.Socksaddr, err error) { + destination, err = p.PacketConn.ReadPacket(buff) + if err != nil { + return + } + p.storage.DownCounter.Add(int64(buff.Len())) + return +} + +func (p *PacketConnCounter) WritePacket(buff *buf.Buffer, destination M.Socksaddr) (err error) { + err = p.PacketConn.WritePacket(buff, destination) + if err != nil { + return + } + p.storage.UpCounter.Add(int64(buff.Len())) + return +} diff --git a/common/counter/traffic.go b/common/counter/traffic.go new file mode 100644 index 0000000..3e477dd --- /dev/null +++ b/common/counter/traffic.go @@ -0,0 +1,85 @@ +package counter + +import ( + "sync" + "sync/atomic" +) + +type TrafficCounter struct { + counters map[string]*TrafficStorage + lock sync.RWMutex +} + +type TrafficStorage struct { + UpCounter atomic.Int64 + DownCounter atomic.Int64 +} + +func NewTrafficCounter() *TrafficCounter { + return &TrafficCounter{ + counters: map[string]*TrafficStorage{}, + } +} + +func (c *TrafficCounter) GetCounter(id string) *TrafficStorage { + c.lock.RLock() + cts, ok := c.counters[id] + c.lock.RUnlock() + if !ok { + cts = &TrafficStorage{} + c.counters[id] = cts + } + return cts +} + +func (c *TrafficCounter) GetUpCount(id string) int64 { + c.lock.RLock() + cts, ok := c.counters[id] + c.lock.RUnlock() + if ok { + return cts.UpCounter.Load() + } + return 0 +} + +func (c *TrafficCounter) GetDownCount(id string) int64 { + c.lock.RLock() + cts, ok := c.counters[id] + c.lock.RUnlock() + if ok { + return cts.DownCounter.Load() + } + return 0 +} + +func (c *TrafficCounter) Reset(id string) { + c.lock.RLock() + cts := c.GetCounter(id) + c.lock.RUnlock() + cts.UpCounter.Store(0) + cts.DownCounter.Store(0) +} + +func (c *TrafficCounter) Delete(id string) { + c.lock.Lock() + delete(c.counters, id) + c.lock.Unlock() +} + +func (c *TrafficCounter) Rx(id string, n int) { + cts := c.GetCounter(id) + cts.DownCounter.Add(int64(n)) +} + +func (c *TrafficCounter) Tx(id string, n int) { + cts := c.GetCounter(id) + cts.UpCounter.Add(int64(n)) +} + +func (c *TrafficCounter) IncConn(auth string) { + return +} + +func (c *TrafficCounter) DecConn(auth string) { + return +} diff --git a/core/hy/counter.go b/core/hy/counter.go deleted file mode 100644 index 6228bfa..0000000 --- a/core/hy/counter.go +++ /dev/null @@ -1,68 +0,0 @@ -package hy - -import ( - "sync" - "sync/atomic" -) - -type UserTrafficCounter struct { - counters map[string]*counters - lock sync.RWMutex -} - -type counters struct { - UpCounter atomic.Int64 - DownCounter atomic.Int64 - //ConnGauge atomic.Int64 -} - -func NewUserTrafficCounter() *UserTrafficCounter { - return &UserTrafficCounter{ - counters: map[string]*counters{}, - } -} - -func (c *UserTrafficCounter) getCounters(auth string) *counters { - c.lock.RLock() - cts, ok := c.counters[auth] - c.lock.RUnlock() - if !ok { - cts = &counters{} - c.counters[auth] = cts - } - return cts -} - -func (c *UserTrafficCounter) Rx(auth string, n int) { - cts := c.getCounters(auth) - cts.DownCounter.Add(int64(n)) -} - -func (c *UserTrafficCounter) Tx(auth string, n int) { - cts := c.getCounters(auth) - cts.UpCounter.Add(int64(n)) -} - -func (c *UserTrafficCounter) IncConn(_ string) { - /*cts := c.getCounters(auth) - cts.ConnGauge.Add(1)*/ - return -} - -func (c *UserTrafficCounter) DecConn(_ string) { - /*cts := c.getCounters(auth) - cts.ConnGauge.Add(1)*/ - return -} - -func (c *UserTrafficCounter) Reset(auth string) { - cts := c.getCounters(auth) - cts.UpCounter.Store(0) - cts.DownCounter.Store(0) -} - -func (c *UserTrafficCounter) Delete(auth string) { - c.lock.Lock() - delete(c.counters, auth) - c.lock.Unlock() -} diff --git a/core/hy/counter_test.go b/core/hy/counter_test.go deleted file mode 100644 index 8f97e3e..0000000 --- a/core/hy/counter_test.go +++ /dev/null @@ -1,7 +0,0 @@ -package hy - -import "testing" - -func TestUserTrafficCounter_Rx(t *testing.T) { - -} diff --git a/core/hy/node.go b/core/hy/node.go index 5cdf889..1893577 100644 --- a/core/hy/node.go +++ b/core/hy/node.go @@ -3,6 +3,7 @@ package hy import ( "errors" "fmt" + "github.com/Yuzuki616/V2bX/api/panel" "github.com/Yuzuki616/V2bX/conf" "github.com/Yuzuki616/V2bX/limiter" diff --git a/core/hy/resolver.go b/core/hy/resolver.go index e1eacbe..cc5edd9 100644 --- a/core/hy/resolver.go +++ b/core/hy/resolver.go @@ -3,11 +3,12 @@ package hy import ( "crypto/tls" "errors" - "github.com/Yuzuki616/hysteria/core/utils" - rdns "github.com/folbricht/routedns" "net" "net/url" "strings" + + "github.com/Yuzuki616/hysteria/core/utils" + rdns "github.com/folbricht/routedns" ) var errInvalidSyntax = errors.New("invalid syntax") diff --git a/core/hy/server.go b/core/hy/server.go index a744400..28e790e 100644 --- a/core/hy/server.go +++ b/core/hy/server.go @@ -9,6 +9,8 @@ import ( "sync/atomic" "time" + "github.com/Yuzuki616/V2bX/common/counter" + "github.com/Yuzuki616/V2bX/api/panel" "github.com/Yuzuki616/V2bX/conf" "github.com/Yuzuki616/V2bX/limiter" @@ -34,7 +36,7 @@ var serverPacketConnFuncFactoryMap = map[string]pktconns.ServerPacketConnFuncFac type Server struct { tag string l *limiter.Limiter - counter *UserTrafficCounter + counter *counter.TrafficCounter users sync.Map running atomic.Bool *cs.Server @@ -122,7 +124,7 @@ func (s *Server) runServer(node *panel.NodeInfo, c *conf.ControllerConfig) error // ACL var aclEngine *acl.Engine // Prometheus - s.counter = NewUserTrafficCounter() + s.counter = counter.NewTrafficCounter() // Packet conn pktConnFuncFactory := serverPacketConnFuncFactoryMap[""] if pktConnFuncFactory == nil { diff --git a/core/hy/server_test.go b/core/hy/server_test.go index db16d4f..c690968 100644 --- a/core/hy/server_test.go +++ b/core/hy/server_test.go @@ -2,13 +2,14 @@ package hy import ( "encoding/base64" + "log" + "testing" + "time" + "github.com/Yuzuki616/V2bX/api/panel" "github.com/Yuzuki616/V2bX/conf" "github.com/Yuzuki616/V2bX/limiter" "github.com/sirupsen/logrus" - "log" - "testing" - "time" ) func TestServer(t *testing.T) { diff --git a/core/hy/user.go b/core/hy/user.go index a286dcc..84d058e 100644 --- a/core/hy/user.go +++ b/core/hy/user.go @@ -3,6 +3,7 @@ package hy import ( "encoding/base64" "errors" + "github.com/Yuzuki616/V2bX/api/panel" "github.com/Yuzuki616/V2bX/core" ) @@ -23,8 +24,8 @@ func (h *Hy) GetUserTraffic(tag, uuid string, reset bool) (up int64, down int64) v, _ := h.servers.Load(tag) s := v.(*Server) auth := base64.StdEncoding.EncodeToString([]byte(uuid)) - up = s.counter.getCounters(auth).UpCounter.Load() - down = s.counter.getCounters(auth).DownCounter.Load() + up = s.counter.GetCounter(auth).UpCounter.Load() + down = s.counter.GetCounter(auth).DownCounter.Load() if reset { s.counter.Reset(auth) } diff --git a/core/imports/sing.go b/core/imports/sing.go new file mode 100644 index 0000000..f994c0b --- /dev/null +++ b/core/imports/sing.go @@ -0,0 +1,5 @@ +//go:build sing + +package imports + +import _ "github.com/Yuzuki616/V2bX/core/sing" diff --git a/core/sing/box_outbound.go b/core/sing/box_outbound.go new file mode 100644 index 0000000..37207b2 --- /dev/null +++ b/core/sing/box_outbound.go @@ -0,0 +1,79 @@ +package sing + +import ( + "strings" + + "github.com/inazumav/sing-box/adapter" + "github.com/sagernet/sing/common" + E "github.com/sagernet/sing/common/exceptions" + F "github.com/sagernet/sing/common/format" +) + +func (b *Box) startOutbounds() error { + outboundTags := make(map[adapter.Outbound]string) + outbounds := make(map[string]adapter.Outbound) + for i, outboundToStart := range b.outbounds { + var outboundTag string + if outboundToStart.Tag() == "" { + outboundTag = F.ToString(i) + } else { + outboundTag = outboundToStart.Tag() + } + if _, exists := outbounds[outboundTag]; exists { + return E.New("outbound tag ", outboundTag, " duplicated") + } + outboundTags[outboundToStart] = outboundTag + outbounds[outboundTag] = outboundToStart + } + started := make(map[string]bool) + for { + canContinue := false + startOne: + for _, outboundToStart := range b.outbounds { + outboundTag := outboundTags[outboundToStart] + if started[outboundTag] { + continue + } + dependencies := outboundToStart.Dependencies() + for _, dependency := range dependencies { + if !started[dependency] { + continue startOne + } + } + started[outboundTag] = true + canContinue = true + if starter, isStarter := outboundToStart.(common.Starter); isStarter { + b.logger.Trace("initializing outbound/", outboundToStart.Type(), "[", outboundTag, "]") + err := starter.Start() + if err != nil { + return E.Cause(err, "initialize outbound/", outboundToStart.Type(), "[", outboundTag, "]") + } + } + } + if len(started) == len(b.outbounds) { + break + } + if canContinue { + continue + } + currentOutbound := common.Find(b.outbounds, func(it adapter.Outbound) bool { + return !started[outboundTags[it]] + }) + var lintOutbound func(oTree []string, oCurrent adapter.Outbound) error + lintOutbound = func(oTree []string, oCurrent adapter.Outbound) error { + problemOutboundTag := common.Find(oCurrent.Dependencies(), func(it string) bool { + return !started[it] + }) + if common.Contains(oTree, problemOutboundTag) { + return E.New("circular outbound dependency: ", strings.Join(oTree, " -> "), " -> ", problemOutboundTag) + } + problemOutbound := outbounds[problemOutboundTag] + if problemOutbound == nil { + return E.New("dependency[", problemOutbound, "] not found for outbound[", outboundTags[oCurrent], "]") + } + return lintOutbound(append(oTree, problemOutboundTag), problemOutbound) + } + return lintOutbound([]string{outboundTags[currentOutbound]}, currentOutbound) + } + return nil +} diff --git a/core/sing/debug_go118.go b/core/sing/debug_go118.go new file mode 100644 index 0000000..7f57273 --- /dev/null +++ b/core/sing/debug_go118.go @@ -0,0 +1,36 @@ +//go:build !go1.19 + +package sing + +import ( + "runtime/debug" + + "github.com/inazumav/sing-box/common/dialer/conntrack" + "github.com/inazumav/sing-box/option" +) + +func applyDebugOptions(options option.DebugOptions) { + applyDebugListenOption(options) + if options.GCPercent != nil { + debug.SetGCPercent(*options.GCPercent) + } + if options.MaxStack != nil { + debug.SetMaxStack(*options.MaxStack) + } + if options.MaxThreads != nil { + debug.SetMaxThreads(*options.MaxThreads) + } + if options.PanicOnFault != nil { + debug.SetPanicOnFault(*options.PanicOnFault) + } + if options.TraceBack != "" { + debug.SetTraceback(options.TraceBack) + } + if options.MemoryLimit != 0 { + // debug.SetMemoryLimit(int64(options.MemoryLimit)) + conntrack.MemoryLimit = int64(options.MemoryLimit) + } + if options.OOMKiller != nil { + conntrack.KillerEnabled = *options.OOMKiller + } +} diff --git a/core/sing/debug_go119.go b/core/sing/debug_go119.go new file mode 100644 index 0000000..6f90610 --- /dev/null +++ b/core/sing/debug_go119.go @@ -0,0 +1,36 @@ +//go:build go1.19 + +package sing + +import ( + "runtime/debug" + + "github.com/inazumav/sing-box/common/dialer/conntrack" + "github.com/inazumav/sing-box/option" +) + +func applyDebugOptions(options option.DebugOptions) { + applyDebugListenOption(options) + if options.GCPercent != nil { + debug.SetGCPercent(*options.GCPercent) + } + if options.MaxStack != nil { + debug.SetMaxStack(*options.MaxStack) + } + if options.MaxThreads != nil { + debug.SetMaxThreads(*options.MaxThreads) + } + if options.PanicOnFault != nil { + debug.SetPanicOnFault(*options.PanicOnFault) + } + if options.TraceBack != "" { + debug.SetTraceback(options.TraceBack) + } + if options.MemoryLimit != 0 { + debug.SetMemoryLimit(int64(options.MemoryLimit)) + conntrack.MemoryLimit = int64(options.MemoryLimit) + } + if options.OOMKiller != nil { + conntrack.KillerEnabled = *options.OOMKiller + } +} diff --git a/core/sing/debug_http.go b/core/sing/debug_http.go new file mode 100644 index 0000000..01ad77a --- /dev/null +++ b/core/sing/debug_http.go @@ -0,0 +1,67 @@ +package sing + +import ( + "net/http" + "net/http/pprof" + "runtime" + "runtime/debug" + + "github.com/inazumav/sing-box/common/badjson" + "github.com/inazumav/sing-box/common/json" + "github.com/inazumav/sing-box/log" + "github.com/inazumav/sing-box/option" + E "github.com/sagernet/sing/common/exceptions" + + "github.com/dustin/go-humanize" + "github.com/go-chi/chi/v5" +) + +var debugHTTPServer *http.Server + +func applyDebugListenOption(options option.DebugOptions) { + if debugHTTPServer != nil { + debugHTTPServer.Close() + debugHTTPServer = nil + } + if options.Listen == "" { + return + } + r := chi.NewMux() + r.Route("/debug", func(r chi.Router) { + r.Get("/gc", func(writer http.ResponseWriter, request *http.Request) { + writer.WriteHeader(http.StatusNoContent) + go debug.FreeOSMemory() + }) + r.Get("/memory", func(writer http.ResponseWriter, request *http.Request) { + var memStats runtime.MemStats + runtime.ReadMemStats(&memStats) + + var memObject badjson.JSONObject + memObject.Put("heap", humanize.IBytes(memStats.HeapInuse)) + memObject.Put("stack", humanize.IBytes(memStats.StackInuse)) + memObject.Put("idle", humanize.IBytes(memStats.HeapIdle-memStats.HeapReleased)) + memObject.Put("goroutines", runtime.NumGoroutine()) + memObject.Put("rss", rusageMaxRSS()) + + encoder := json.NewEncoder(writer) + encoder.SetIndent("", " ") + encoder.Encode(memObject) + }) + r.HandleFunc("/pprof", pprof.Index) + r.HandleFunc("/pprof/*", pprof.Index) + r.HandleFunc("/pprof/cmdline", pprof.Cmdline) + r.HandleFunc("/pprof/profile", pprof.Profile) + r.HandleFunc("/pprof/symbol", pprof.Symbol) + r.HandleFunc("/pprof/trace", pprof.Trace) + }) + debugHTTPServer = &http.Server{ + Addr: options.Listen, + Handler: r, + } + go func() { + err := debugHTTPServer.ListenAndServe() + if err != nil && !E.IsClosed(err) { + log.Error(E.Cause(err, "serve debug HTTP server")) + } + }() +} diff --git a/core/sing/debug_linux.go b/core/sing/debug_linux.go new file mode 100644 index 0000000..1fb183f --- /dev/null +++ b/core/sing/debug_linux.go @@ -0,0 +1,23 @@ +package sing + +import ( + "runtime" + "syscall" +) + +func rusageMaxRSS() float64 { + ru := syscall.Rusage{} + err := syscall.Getrusage(syscall.RUSAGE_SELF, &ru) + if err != nil { + return 0 + } + + rss := float64(ru.Maxrss) + if runtime.GOOS == "darwin" || runtime.GOOS == "ios" { + rss /= 1 << 20 // ru_maxrss is bytes on darwin + } else { + // ru_maxrss is kilobytes elsewhere (linux, openbsd, etc) + rss /= 1 << 10 + } + return rss +} diff --git a/core/sing/debug_stub.go b/core/sing/debug_stub.go new file mode 100644 index 0000000..b3aff94 --- /dev/null +++ b/core/sing/debug_stub.go @@ -0,0 +1,7 @@ +//go:build !linux + +package sing + +func rusageMaxRSS() float64 { + return -1 +} diff --git a/core/sing/hook.go b/core/sing/hook.go new file mode 100644 index 0000000..6b02dd5 --- /dev/null +++ b/core/sing/hook.go @@ -0,0 +1,58 @@ +package sing + +import ( + "net" + + "github.com/Yuzuki616/V2bX/common/counter" + "github.com/inazumav/sing-box/adapter" + "github.com/inazumav/sing-box/log" + N "github.com/sagernet/sing/common/network" +) + +type HookServer struct { + hooker *Hooker +} + +func NewHookServer(logger log.Logger) *HookServer { + return &HookServer{ + hooker: &Hooker{ + logger: logger, + counter: make(map[string]*counter.TrafficCounter), + }, + } +} + +func (h *HookServer) Start() error { + return nil +} + +func (h *HookServer) Close() error { + return nil +} + +func (h *HookServer) StatsService() adapter.V2RayStatsService { + return h.hooker +} + +func (h *HookServer) Hooker() *Hooker { + return h.hooker +} + +type Hooker struct { + logger log.Logger + counter map[string]*counter.TrafficCounter +} + +func (h *Hooker) RoutedConnection(inbound string, outbound string, user string, conn net.Conn) net.Conn { + if c, ok := h.counter[inbound]; ok { + return counter.NewConnCounter(conn, c.GetCounter(user)) + } + return conn +} + +func (h *Hooker) RoutedPacketConnection(inbound string, outbound string, user string, conn N.PacketConn) N.PacketConn { + if c, ok := h.counter[inbound]; ok { + return counter.NewPacketConnCounter(conn, c.GetCounter(user)) + } + return conn +} diff --git a/core/sing/node.go b/core/sing/node.go new file mode 100644 index 0000000..e938919 --- /dev/null +++ b/core/sing/node.go @@ -0,0 +1,133 @@ +package sing + +import ( + "context" + "crypto/rand" + "encoding/base64" + "encoding/hex" + "fmt" + "net/netip" + "net/url" + "strconv" + "strings" + + "github.com/inazumav/sing-box/inbound" + F "github.com/sagernet/sing/common/format" + + "github.com/Yuzuki616/V2bX/api/panel" + "github.com/Yuzuki616/V2bX/conf" + "github.com/goccy/go-json" + "github.com/inazumav/sing-box/option" +) + +type WsNetworkConfig struct { + Path string `json:"path"` +} + +func getInboundOptions(tag string, info *panel.NodeInfo, c *conf.ControllerConfig) (option.Inbound, error) { + addr, _ := netip.ParseAddr("0.0.0.0") + listen := option.ListenOptions{ + Listen: (*option.ListenAddress)(&addr), + ListenPort: uint16(info.Port), + } + tls := option.InboundTLSOptions{ + Enabled: info.Tls, + CertificatePath: c.CertConfig.CertFile, + KeyPath: c.CertConfig.KeyFile, + ServerName: info.ServerName, + } + in := option.Inbound{ + Tag: tag, + } + switch info.Type { + case "v2ray": + in.Type = "vmess" + t := option.V2RayTransportOptions{ + Type: info.Network, + } + switch info.Network { + case "tcp": + case "ws": + network := WsNetworkConfig{} + err := json.Unmarshal(info.NetworkSettings, &network) + if err != nil { + return option.Inbound{}, fmt.Errorf("decode NetworkSettings error: %s", err) + } + var u *url.URL + u, err = url.Parse(network.Path) + if err != nil { + return option.Inbound{}, fmt.Errorf("parse path error: %s", err) + } + ed, _ := strconv.Atoi(u.Query().Get("ed")) + t.WebsocketOptions = option.V2RayWebsocketOptions{ + Path: u.Path, + EarlyDataHeaderName: "Sec-WebSocket-Protocol", + MaxEarlyData: uint32(ed), + } + case "grpc": + t.GRPCOptions = option.V2RayGRPCOptions{ + ServiceName: info.ServerName, + } + } + in.VMessOptions = option.VMessInboundOptions{ + ListenOptions: listen, + TLS: &tls, + Transport: &t, + } + case "shadowsocks": + in.Type = "shadowsocks" + p := make([]byte, 32) + _, _ = rand.Read(p) + randomPasswd := hex.EncodeToString(p) + if strings.Contains(info.Cipher, "2022") { + randomPasswd = base64.StdEncoding.EncodeToString([]byte(randomPasswd)) + } + in.ShadowsocksOptions = option.ShadowsocksInboundOptions{ + ListenOptions: listen, + Method: info.Cipher, + Password: info.ServerKey, + Users: []option.ShadowsocksUser{ + { + Password: randomPasswd, + }, + }, + } + } + return in, nil +} + +func (b *Box) AddNode(tag string, info *panel.NodeInfo, config *conf.ControllerConfig) error { + c, err := getInboundOptions(tag, info, config) + if err != nil { + return err + } + in, err := inbound.New( + context.Background(), + b.router, + b.logFactory.NewLogger(F.ToString("inbound/", c.Type, "[", tag, "]")), + c, + nil, + ) + b.inbounds[tag] = in + err = in.Start() + if err != nil { + return fmt.Errorf("start inbound error: %s", err) + } + err = b.router.AddInbound(in) + if err != nil { + return fmt.Errorf("add inbound error: %s", err) + } + return nil +} + +func (b *Box) DelNode(tag string) error { + err := b.inbounds[tag].Close() + if err != nil { + return fmt.Errorf("close inbound error: %s", err) + } + err = b.router.DelInbound(tag) + if err != nil { + return fmt.Errorf("delete inbound error: %s", err) + } + return nil +} diff --git a/core/sing/sing.go b/core/sing/sing.go new file mode 100644 index 0000000..2f28ea9 --- /dev/null +++ b/core/sing/sing.go @@ -0,0 +1,263 @@ +package sing + +import ( + "context" + "fmt" + "io" + "os" + "runtime/debug" + "time" + + "github.com/Yuzuki616/V2bX/conf" + vCore "github.com/Yuzuki616/V2bX/core" + + "github.com/inazumav/sing-box/adapter" + "github.com/inazumav/sing-box/inbound" + "github.com/inazumav/sing-box/log" + "github.com/inazumav/sing-box/option" + "github.com/inazumav/sing-box/outbound" + "github.com/inazumav/sing-box/route" + "github.com/sagernet/sing/common" + E "github.com/sagernet/sing/common/exceptions" + F "github.com/sagernet/sing/common/format" +) + +var _ adapter.Service = (*Box)(nil) + +type Box struct { + createdAt time.Time + router adapter.Router + inbounds map[string]adapter.Inbound + outbounds []adapter.Outbound + logFactory log.Factory + logger log.ContextLogger + hookServer *HookServer + done chan struct{} +} + +func init() { + vCore.RegisterCore("sing", New) +} + +func New(_ *conf.CoreConfig) (vCore.Core, error) { + options := option.Options{} + ctx := context.Background() + createdAt := time.Now() + experimentalOptions := common.PtrValueOrDefault(options.Experimental) + applyDebugOptions(common.PtrValueOrDefault(experimentalOptions.Debug)) + var defaultLogWriter io.Writer + logFactory, err := log.New(log.Options{ + Context: ctx, + Options: common.PtrValueOrDefault(options.Log), + DefaultWriter: defaultLogWriter, + BaseTime: createdAt, + }) + if err != nil { + return nil, E.Cause(err, "create log factory") + } + router, err := route.NewRouter( + ctx, + logFactory, + common.PtrValueOrDefault(options.Route), + common.PtrValueOrDefault(options.DNS), + common.PtrValueOrDefault(options.NTP), + options.Inbounds, + nil, + ) + if err != nil { + return nil, E.Cause(err, "parse route options") + } + inbounds := make([]adapter.Inbound, len(options.Inbounds)) + inMap := make(map[string]adapter.Inbound, len(inbounds)) + outbounds := make([]adapter.Outbound, 0, len(options.Outbounds)) + for i, inboundOptions := range options.Inbounds { + var in adapter.Inbound + var tag string + if inboundOptions.Tag != "" { + tag = inboundOptions.Tag + } else { + tag = F.ToString(i) + } + in, err = inbound.New( + ctx, + router, + logFactory.NewLogger(F.ToString("inbound/", inboundOptions.Type, "[", tag, "]")), + inboundOptions, + nil, + ) + if err != nil { + return nil, E.Cause(err, "parse inbound[", i, "]") + } + inbounds[i] = in + inMap[inboundOptions.Tag] = in + } + for i, outboundOptions := range options.Outbounds { + var out adapter.Outbound + var tag string + if outboundOptions.Tag != "" { + tag = outboundOptions.Tag + } else { + tag = F.ToString(i) + } + out, err = outbound.New( + ctx, + router, + logFactory.NewLogger(F.ToString("outbound/", outboundOptions.Type, "[", tag, "]")), + tag, + outboundOptions) + if err != nil { + return nil, E.Cause(err, "parse outbound[", i, "]") + } + outbounds = append(outbounds, out) + } + err = router.Initialize(inbounds, outbounds, func() adapter.Outbound { + out, oErr := outbound.New(ctx, router, logFactory.NewLogger("outbound/direct"), "direct", option.Outbound{Type: "direct", Tag: "default"}) + common.Must(oErr) + outbounds = append(outbounds, out) + return out + }) + if err != nil { + return nil, err + } + server := NewHookServer(logFactory.NewLogger("Hook-Server")) + if err != nil { + return nil, E.Cause(err, "create v2ray api server") + } + router.SetV2RayServer(server) + return &Box{ + router: router, + inbounds: inMap, + outbounds: outbounds, + createdAt: createdAt, + logFactory: logFactory, + logger: logFactory.Logger(), + hookServer: server, + done: make(chan struct{}), + }, nil +} + +func (b *Box) PreStart() error { + err := b.preStart() + if err != nil { + // TODO: remove catch error + defer func() { + v := recover() + if v != nil { + log.Error(E.Cause(err, "origin error")) + debug.PrintStack() + panic("panic on early close: " + fmt.Sprint(v)) + } + }() + b.Close() + return err + } + b.logger.Info("sing-box pre-started (", F.Seconds(time.Since(b.createdAt).Seconds()), "s)") + return nil +} + +func (b *Box) Start() error { + err := b.start() + if err != nil { + // TODO: remove catch error + defer func() { + v := recover() + if v != nil { + log.Error(E.Cause(err, "origin error")) + debug.PrintStack() + panic("panic on early close: " + fmt.Sprint(v)) + } + }() + b.Close() + return err + } + b.logger.Info("sing-box started (", F.Seconds(time.Since(b.createdAt).Seconds()), "s)") + return nil +} + +func (b *Box) preStart() error { + err := b.startOutbounds() + if err != nil { + return err + } + return b.router.Start() +} + +func (b *Box) start() error { + err := b.preStart() + if err != nil { + return err + } + for i, in := range b.inbounds { + var tag string + if in.Tag() == "" { + tag = F.ToString(i) + } else { + tag = in.Tag() + } + b.logger.Trace("initializing inbound/", in.Type(), "[", tag, "]") + err = in.Start() + if err != nil { + return E.Cause(err, "initialize inbound/", in.Type(), "[", tag, "]") + } + } + return nil +} + +func (b *Box) postStart() error { + for serviceName, service := range b.outbounds { + if lateService, isLateService := service.(adapter.PostStarter); isLateService { + b.logger.Trace("post-starting ", service) + err := lateService.PostStart() + if err != nil { + return E.Cause(err, "post-start ", serviceName) + } + } + } + return nil +} + +func (b *Box) Close() error { + select { + case <-b.done: + return os.ErrClosed + default: + close(b.done) + } + var errors error + for i, in := range b.inbounds { + b.logger.Trace("closing inbound/", in.Type(), "[", i, "]") + errors = E.Append(errors, in.Close(), func(err error) error { + return E.Cause(err, "close inbound/", in.Type(), "[", i, "]") + }) + } + for i, out := range b.outbounds { + b.logger.Trace("closing outbound/", out.Type(), "[", i, "]") + errors = E.Append(errors, common.Close(out), func(err error) error { + return E.Cause(err, "close outbound/", out.Type(), "[", i, "]") + }) + } + b.logger.Trace("closing router") + if err := common.Close(b.router); err != nil { + errors = E.Append(errors, err, func(err error) error { + return E.Cause(err, "close router") + }) + } + b.logger.Trace("closing log factory") + if err := common.Close(b.logFactory); err != nil { + errors = E.Append(errors, err, func(err error) error { + return E.Cause(err, "close log factory") + }) + } + return errors +} + +func (b *Box) Router() adapter.Router { + return b.router +} + +func (b *Box) Protocols() []string { + return []string{ + "v2ray", + "shadowsocks", + } +} diff --git a/core/sing/user.go b/core/sing/user.go new file mode 100644 index 0000000..602c6a5 --- /dev/null +++ b/core/sing/user.go @@ -0,0 +1,75 @@ +package sing + +import ( + "errors" + + "github.com/Yuzuki616/V2bX/api/panel" + "github.com/Yuzuki616/V2bX/core" + "github.com/inazumav/sing-box/inbound" + "github.com/inazumav/sing-box/option" +) + +func (b *Box) AddUsers(p *core.AddUsersParams) (added int, err error) { + switch p.NodeInfo.Type { + case "v2ray": + us := make([]option.VMessUser, len(p.UserInfo)) + for i := range p.UserInfo { + us[i] = option.VMessUser{ + Name: p.UserInfo[i].Uuid, + UUID: p.UserInfo[i].Uuid, + } + } + err = b.inbounds[p.Tag].(*inbound.VMess).AddUsers(us) + if err != nil { + return 0, err + } + case "shadowsocks": + us := make([]option.ShadowsocksUser, len(p.UserInfo)) + for i := range p.UserInfo { + us[i] = option.ShadowsocksUser{ + Name: p.UserInfo[i].Uuid, + Password: p.UserInfo[i].Uuid, + } + } + } + return len(p.UserInfo), err +} + +func (b *Box) GetUserTraffic(tag, uuid string, reset bool) (up int64, down int64) { + if c, ok := b.hookServer.Hooker().counter[tag]; ok { + up = c.GetUpCount(uuid) + down = c.GetDownCount(uuid) + if reset { + c.Reset(uuid) + } + return + } + return 0, 0 +} + +type UserDeleter interface { + DelUsers(uuid []string) error +} + +func (b *Box) DelUsers(users []panel.UserInfo, tag string) error { + var del UserDeleter + if i, ok := b.inbounds[tag]; ok { + switch i.Type() { + case "vmess": + del = i.(*inbound.VMess) + case "shadowsocks": + del = i.(*inbound.ShadowsocksMulti) + } + } else { + return errors.New("the inbound not found") + } + uuids := make([]string, len(users)) + for i := range users { + uuids[i] = users[i].Uuid + } + err := del.DelUsers(uuids) + if err != nil { + return err + } + return nil +} diff --git a/core/xray/app/dispatcher/config.pb.go b/core/xray/app/dispatcher/config.pb.go index c49cbda..0f2b69b 100644 --- a/core/xray/app/dispatcher/config.pb.go +++ b/core/xray/app/dispatcher/config.pb.go @@ -7,10 +7,11 @@ package dispatcher import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) const ( diff --git a/core/xray/distro/all/all.go b/core/xray/distro/all/all.go index d4efa63..968ef50 100644 --- a/core/xray/distro/all/all.go +++ b/core/xray/distro/all/all.go @@ -70,5 +70,5 @@ import ( _ "github.com/xtls/xray-core/transport/internet/headers/tls" _ "github.com/xtls/xray-core/transport/internet/headers/utp" _ "github.com/xtls/xray-core/transport/internet/headers/wechat" - _ "github.com/xtls/xray-core/transport/internet/headers/wireguard" + //_ "github.com/xtls/xray-core/transport/internet/headers/wireguard" ) diff --git a/core/xray/node.go b/core/xray/node.go index a26204a..062b508 100644 --- a/core/xray/node.go +++ b/core/xray/node.go @@ -3,6 +3,7 @@ package xray import ( "context" "fmt" + "github.com/Yuzuki616/V2bX/api/panel" "github.com/Yuzuki616/V2bX/conf" "github.com/xtls/xray-core/core" diff --git a/core/xray/outbound.go b/core/xray/outbound.go index ee09bab..cb3a140 100644 --- a/core/xray/outbound.go +++ b/core/xray/outbound.go @@ -2,6 +2,7 @@ package xray import ( "fmt" + conf2 "github.com/Yuzuki616/V2bX/conf" "github.com/goccy/go-json" "github.com/xtls/xray-core/common/net" diff --git a/core/xray/ss.go b/core/xray/ss.go index 299c2d7..8ebadd9 100644 --- a/core/xray/ss.go +++ b/core/xray/ss.go @@ -2,13 +2,14 @@ package xray import ( "encoding/base64" + "strings" + "github.com/Yuzuki616/V2bX/api/panel" "github.com/Yuzuki616/V2bX/common/format" "github.com/xtls/xray-core/common/protocol" "github.com/xtls/xray-core/common/serial" "github.com/xtls/xray-core/proxy/shadowsocks" "github.com/xtls/xray-core/proxy/shadowsocks_2022" - "strings" ) func buildSSUsers(tag string, userInfo []panel.UserInfo, cypher string, serverKey string) (users []*protocol.User) { diff --git a/go.mod b/go.mod index cd068d4..50a48cf 100644 --- a/go.mod +++ b/go.mod @@ -6,15 +6,19 @@ require ( github.com/Yuzuki616/hysteria/core v0.0.0-20230722103310-05508b7e5490 github.com/Yuzuki616/quic-go v0.34.1 github.com/beevik/ntp v1.2.0 + github.com/dustin/go-humanize v1.0.1 github.com/folbricht/routedns v0.1.20 github.com/fsnotify/fsnotify v1.6.0 github.com/go-acme/lego/v4 v4.13.2 + github.com/go-chi/chi/v5 v5.0.10 github.com/go-redis/redis/v8 v8.11.5 github.com/go-resty/resty/v2 v2.7.0 github.com/goccy/go-json v0.10.2 github.com/hashicorp/go-multierror v1.1.1 + github.com/inazumav/sing-box v0.0.0-20230728005925-1df6eb0f5bf7 github.com/juju/ratelimit v1.0.2 github.com/oschwald/geoip2-golang v1.9.0 + github.com/sagernet/sing v0.2.9 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/xtls/xray-core v1.8.3 @@ -25,6 +29,7 @@ require ( ) require ( + berty.tech/go-libtor v1.0.385 // indirect cloud.google.com/go/compute v1.19.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/AdamSLevy/jsonrpc2/v14 v14.1.0 // indirect @@ -44,6 +49,8 @@ require ( github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect + github.com/Dreamacro/clash v1.17.0 // indirect + github.com/Dreamacro/protobytes v0.0.0-20230617041236-6500a9f4f158 // indirect github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 // indirect github.com/RackSec/srslog v0.0.0-20180709174129-a4725f04ec91 // indirect github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2 // indirect @@ -52,12 +59,15 @@ require ( github.com/andybalholm/brotli v1.0.5 // indirect github.com/aws/aws-sdk-go v1.39.0 // indirect github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect + github.com/caddyserver/certmagic v0.19.0 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/civo/civogo v0.3.11 // indirect + github.com/cloudflare/circl v1.3.3 // indirect github.com/cloudflare/cloudflare-go v0.70.0 // indirect github.com/coreos/go-iptables v0.6.0 // indirect github.com/cpu/goacmedns v0.1.1 // indirect + github.com/cretz/bine v0.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.9.1 // indirect github.com/dgryski/go-metro v0.0.0-20211217172704-adc40b04c140 // indirect @@ -71,7 +81,9 @@ require ( github.com/ghodss/yaml v1.0.1-0.20220118164431-d8423dcdf344 // indirect github.com/go-errors/errors v1.0.1 // indirect github.com/go-jose/go-jose/v3 v3.0.0 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/gofrs/uuid/v5 v5.0.0 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/golang/mock v1.6.0 // indirect @@ -90,6 +102,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-retryablehttp v0.7.4 // indirect github.com/hashicorp/golang-lru/v2 v2.0.1 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/infobloxopen/infoblox-go-client v1.1.1 // indirect @@ -103,16 +116,19 @@ require ( github.com/kylelemons/godebug v1.1.0 // indirect github.com/labbsr0x/bindman-dns-webhook v1.0.2 // indirect github.com/labbsr0x/goh v1.0.1 // indirect + github.com/libdns/libdns v0.2.1 // indirect github.com/linode/linodego v1.17.2 // indirect github.com/liquidweb/go-lwApi v0.0.5 // indirect github.com/liquidweb/liquidweb-cli v0.6.9 // indirect github.com/liquidweb/liquidweb-go v1.6.3 // indirect + github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/lucas-clemente/quic-go v0.31.1 // indirect github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 // indirect github.com/marten-seemann/qpack v0.3.0 // indirect github.com/marten-seemann/qtls-go1-18 v0.1.4 // indirect github.com/marten-seemann/qtls-go1-19 v0.1.2 // indirect github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mholt/acmez v1.2.0 // indirect github.com/miekg/dns v1.1.55 // indirect github.com/mimuret/golang-iij-dpf v0.9.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -130,6 +146,7 @@ require ( github.com/nrdcg/porkbun v0.2.0 // indirect github.com/nzdjb/go-metaname v1.0.0 // indirect github.com/onsi/ginkgo/v2 v2.11.0 // indirect + github.com/ooni/go-libtor v1.1.8 // indirect github.com/oracle/oci-go-sdk v24.3.0+incompatible // indirect github.com/oschwald/maxminddb-golang v1.11.0 // indirect github.com/ovh/go-ovh v1.4.1 // indirect @@ -143,6 +160,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pquerna/otp v1.4.0 // indirect + github.com/quic-go/qtls-go1-18 v0.2.0 // indirect github.com/quic-go/qtls-go1-19 v0.3.2 // indirect github.com/quic-go/qtls-go1-20 v0.2.2 // indirect github.com/quic-go/quic-go v0.35.1 // indirect @@ -152,10 +170,26 @@ require ( github.com/sacloud/go-http v0.1.6 // indirect github.com/sacloud/iaas-api-go v1.11.1 // indirect github.com/sacloud/packages-go v0.0.9 // indirect - github.com/sagernet/sing v0.2.5 // indirect - github.com/sagernet/sing-shadowsocks v0.2.2 // indirect + github.com/sagernet/cloudflare-tls v0.0.0-20221031050923-d70792f4c3a0 // indirect + github.com/sagernet/go-tun2socks v1.16.12-0.20220818015926-16cb67876a61 // indirect + github.com/sagernet/gvisor v0.0.0-20230627031050-1ab0276e0dd2 // indirect + github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97 // indirect + github.com/sagernet/quic-go v0.0.0-20230615020047-10f05c797c02 // indirect + github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 // indirect + github.com/sagernet/sing-dns v0.1.8 // indirect + github.com/sagernet/sing-mux v0.1.2 // indirect + github.com/sagernet/sing-shadowsocks v0.2.4 // indirect + github.com/sagernet/sing-shadowsocks2 v0.1.3 // indirect + github.com/sagernet/sing-shadowtls v0.1.4 // indirect + github.com/sagernet/sing-tun v0.1.10-0.20230723061951-767ce42377f1 // indirect + github.com/sagernet/sing-vmess v0.1.7 // indirect + github.com/sagernet/smux v0.0.0-20230312102458-337ec2a5af37 // indirect + github.com/sagernet/tfo-go v0.0.0-20230303015439-ffcfd8c41cf9 // indirect + github.com/sagernet/utls v0.0.0-20230309024959-6732c2ab36f2 // indirect + github.com/sagernet/websocket v0.0.0-20220913015213-615516348b4e // indirect github.com/sagernet/wireguard-go v0.0.0-20221116151939-c99467f53f2c // indirect github.com/scaleway/scaleway-sdk-go v1.0.0-beta.17 // indirect + github.com/scjalliance/comshim v0.0.0-20230315213746-5e51f40bd3b9 // indirect github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb // indirect github.com/simplesurance/bunny-go v0.0.0-20221115111006-e11d9dc91f04 // indirect github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9 // indirect @@ -174,16 +208,21 @@ require ( github.com/ultradns/ultradns-go-sdk v1.5.0-20230427130837-23c9b0c // indirect github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e // indirect github.com/vinyldns/go-vinyldns v0.9.16 // indirect + github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 // indirect github.com/vultr/govultr/v2 v2.17.2 // indirect github.com/xtls/reality v0.0.0-20230613075828-e07c3b04b983 // indirect github.com/yandex-cloud/go-genproto v0.0.0-20220805142335-27b56ddae16f // indirect github.com/yandex-cloud/go-sdk v0.0.0-20220805164847-cf028e604997 // indirect + github.com/zeebo/blake3 v0.2.3 // indirect go.opencensus.io v0.24.0 // indirect go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect go.uber.org/ratelimit v0.2.0 // indirect - golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect + go.uber.org/zap v1.24.0 // indirect + go4.org/netipx v0.0.0-20230303233057-f1b76eb4bb35 // indirect + golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.11.0 // indirect + golang.org/x/net v0.12.0 // indirect golang.org/x/oauth2 v0.9.0 // indirect golang.org/x/text v0.11.0 // indirect golang.org/x/time v0.3.0 // indirect @@ -191,7 +230,7 @@ require ( google.golang.org/api v0.114.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect - google.golang.org/grpc v1.56.0 // indirect + google.golang.org/grpc v1.56.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/ns1/ns1-go.v2 v2.7.6 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 208a6f6..13f9cc4 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +berty.tech/go-libtor v1.0.385 h1:RWK94C3hZj6Z2GdvePpHJLnWYobFr3bY/OdUJ5aoEXw= +berty.tech/go-libtor v1.0.385/go.mod h1:9swOOQVb+kmvuAlsgWUK/4c52pm69AdbJsxLzk+fJEw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -64,6 +66,10 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkM github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Dreamacro/clash v1.17.0 h1:LWtp6KcnrCiujY58ufI8pylI+hbCBgSCsLI90EWhpi4= +github.com/Dreamacro/clash v1.17.0/go.mod h1:PtcAft7sdsK325BD6uwm8wvhOkMV3TCeED6dfZ/lnfE= +github.com/Dreamacro/protobytes v0.0.0-20230617041236-6500a9f4f158 h1:JFnwKplz9hj8ubqYjm8HkgZS1Rvz9yW+u/XCNNTxr0k= +github.com/Dreamacro/protobytes v0.0.0-20230617041236-6500a9f4f158/go.mod h1:QvmEZ/h6KXszPOr2wUFl7Zn3hfFNYdfbXwPVDTyZs6k= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 h1:xPMsUicZ3iosVPSIP7bW5EcGUzjiiMl1OYTe14y/R24= github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87/go.mod h1:iGLljf5n9GjT6kc0HBvyI1nOKnGQbNB66VzSNbK5iks= @@ -92,6 +98,7 @@ github.com/aws/aws-sdk-go v1.39.0 h1:74BBwkEmiqBbi2CGflEh34l0YNtIibTjZsibGarkNjo github.com/aws/aws-sdk-go v1.39.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/beevik/ntp v1.2.0 h1:n1teVGbd4YM36FlGvWYfccBIdGzeaakHrTlo6RSL8mw= github.com/beevik/ntp v1.2.0/go.mod h1:vD6h1um4kzXpqmLTuu0cCLcC+NfvC0IC+ltmEDA8E78= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -103,6 +110,8 @@ github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBT github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/c-bata/go-prompt v0.2.5/go.mod h1:vFnjEGDIIA/Lib7giyE4E9c50Lvl8j0S+7FVlAwDAVw= github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= +github.com/caddyserver/certmagic v0.19.0 h1:HuJ1Yf1H1jAfmBGrSSQN1XRkafnWcpDtyIiyMV6vmpM= +github.com/caddyserver/certmagic v0.19.0/go.mod h1:fsL01NomQ6N+kE2j37ZCnig2MFosG+MIO4ztnmG/zz8= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -116,6 +125,8 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/civo/civogo v0.3.11 h1:mON/fyrV946Sbk6paRtOSGsN+asCgCmHCgArf5xmGxM= github.com/civo/civogo v0.3.11/go.mod h1:7+GeeFwc4AYTULaEshpT2vIcl3Qq8HPoxA17viX3l6g= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/cloudflare-go v0.70.0 h1:4opGbUygM8DjirUuaz23jn3akuAcnOCEx+0nQtQEcFo= github.com/cloudflare/cloudflare-go v0.70.0/go.mod h1:VW6GuazkaZ4xEDkFt24lkXQUsE8q7BiGqDniC2s8WEM= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -135,6 +146,9 @@ github.com/cpu/goacmedns v0.1.1/go.mod h1:MuaouqEhPAHxsbqjgnck5zeghuwBP1dLnPoobe github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cretz/bine v0.1.0/go.mod h1:6PF6fWAvYtwjRGkAuDEJeWNOv3a2hUouSP/yRYXmvHw= +github.com/cretz/bine v0.2.0 h1:8GiDRGlTgz+o8H9DSnsl+5MeBK4HsExxgl6WgzOCuZo= +github.com/cretz/bine v0.2.0/go.mod h1:WU4o9QR9wWp8AVKtTM1XD5vUHkEqnf2vVSo6dBqbetI= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -156,6 +170,8 @@ github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnsimple/dnsimple-go v1.2.0 h1:ddTGyLVKly5HKb5L65AkLqFqwZlWo3WnR0BlFZlIddM= github.com/dnsimple/dnsimple-go v1.2.0/go.mod h1:z/cs26v/eiRvUyXsHQBLd8lWF8+cD6GbmkPH84plM4U= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -191,6 +207,8 @@ github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aev github.com/go-acme/lego/v4 v4.13.2 h1:liIHWM9Wr3bmQ5s8UukfPhC4HOOaue9jRkUyrd8Dk7Y= github.com/go-acme/lego/v4 v4.13.2/go.mod h1:c/iodVGMeBXG/+KiQczoNkySo3YLWTVa0kiyeVd/FHc= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-chi/chi/v5 v5.0.10 h1:rLz5avzKpjqxrYwXNfmjkrYYXOyLJd37pz53UFHC6vk= +github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-cmd/cmd v1.0.5/go.mod h1:y8q8qlK5wQibcw63djSl/ntiHUHXHGdCkPk0j4QeW4s= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= @@ -201,6 +219,8 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= @@ -223,6 +243,8 @@ github.com/goccy/go-json v0.7.8/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGF github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= +github.com/gofrs/uuid/v5 v5.0.0 h1:p544++a97kEL+svbcFbCQVM9KFu0Yo25UoISXGNNH9M= +github.com/gofrs/uuid/v5 v5.0.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= @@ -351,10 +373,16 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df h1:MZf03xP9WdakyXhOWuAD5uPK3wHh96wCsqe3hCMKh8E= github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhKWFeDesPjMj+wCHReeknARU3wqlyN4= +github.com/inazumav/sing-box v0.0.0-20230728005628-9c73947a55ad h1:Ho7F+U1n41dX6c+3TjojaCj1NjBlaaCa1Vjtll9BVW4= +github.com/inazumav/sing-box v0.0.0-20230728005628-9c73947a55ad/go.mod h1:W91us/coe3lvl5jCtw2n6acyagpRbOO16h1IV3/0nrc= +github.com/inazumav/sing-box v0.0.0-20230728005925-1df6eb0f5bf7 h1:fHFY6wVkFNFmL+LXVnU+zvrEoULqbZ1eVYCoKsb6/dQ= +github.com/inazumav/sing-box v0.0.0-20230728005925-1df6eb0f5bf7/go.mod h1:W91us/coe3lvl5jCtw2n6acyagpRbOO16h1IV3/0nrc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -388,6 +416,7 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.16.6 h1:91SKEy4K37vkp255cJ8QesJhjyRO0hn9i9G0GoUwLsk= github.com/klauspost/compress v1.16.6/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= @@ -421,6 +450,8 @@ github.com/lestrrat-go/httpcc v1.0.0/go.mod h1:tGS/u00Vh5N6FHNkExqGGNId8e0Big+++ github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= github.com/lestrrat-go/jwx v1.2.7/go.mod h1:bw24IXWbavc0R2RsOtpXL7RtMyP589yZ1+L7kd09ZGA= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/libdns/libdns v0.2.1 h1:Wu59T7wSHRgtA0cfxC+n1c/e+O3upJGWytknkmFEDis= +github.com/libdns/libdns v0.2.1/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSObbb40= github.com/linode/linodego v1.17.2 h1:b32dj4662PGG5P9qVa6nBezccWdqgukndlMIuPGq1CQ= github.com/linode/linodego v1.17.2/go.mod h1:C2iyT3Vg2O2sPxkWka4XAQ5WSUtm5LmTZ3Adw43Ra7Q= github.com/liquidweb/go-lwApi v0.0.0-20190605172801-52a4864d2738/go.mod h1:0sYF9rMXb0vlG+4SzdiGMXHheCZxjguMq+Zb4S2BfBs= @@ -430,6 +461,8 @@ github.com/liquidweb/liquidweb-cli v0.6.9 h1:acbIvdRauiwbxIsOCEMXGwF75aSJDbDiyAW github.com/liquidweb/liquidweb-cli v0.6.9/go.mod h1:cE1uvQ+x24NGUL75D0QagOFCG8Wdvmwu8aL9TLmA/eQ= github.com/liquidweb/liquidweb-go v1.6.3 h1:NVHvcnX3eb3BltiIoA+gLYn15nOpkYkdizOEYGSKrk4= github.com/liquidweb/liquidweb-go v1.6.3/go.mod h1:SuXXp+thr28LnjEw18AYtWwIbWMHSUiajPQs8T9c/Rc= +github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= +github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucas-clemente/quic-go v0.31.1 h1:O8Od7hfioqq0PMYHDyBkxU2aA7iZ2W9pjbrWuja2YR4= github.com/lucas-clemente/quic-go v0.31.1/go.mod h1:0wFbizLgYzqHqtlyxyCaJKlE7bYgE6JQ+54TLd/Dq2g= github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 h1:EnfXoSqDfSNJv0VBNqY/88RNnhSGYkrHaO0mmFGbVsc= @@ -465,6 +498,8 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= +github.com/mholt/acmez v1.2.0 h1:1hhLxSgY5FvH5HCnGUuwbKY2VQVo8IU7rxXKSnZ7F30= +github.com/mholt/acmez v1.2.0/go.mod h1:VT9YwH1xgNX1kmYY89gY8xPJC84BFAisjo8Egigt4kE= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.47/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= @@ -535,6 +570,8 @@ github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAl github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= +github.com/ooni/go-libtor v1.1.8 h1:Wo3V3DVTxl5vZdxtQakqYP+DAHx7pPtAFSl1bnAa08w= +github.com/ooni/go-libtor v1.1.8/go.mod h1:q1YyLwRD9GeMyeerVvwc0vJ2YgwDLTp2bdVcrh/JXyI= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/oracle/oci-go-sdk v24.3.0+incompatible h1:x4mcfb4agelf1O4/1/auGlZ1lr97jXRSSN5MxTgG/zU= github.com/oracle/oci-go-sdk v24.3.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= @@ -593,6 +630,8 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quic-go/qtls-go1-18 v0.2.0 h1:5ViXqBZ90wpUcZS0ge79rf029yx0dYB0McyPJwqqj7U= +github.com/quic-go/qtls-go1-18 v0.2.0/go.mod h1:moGulGHK7o6O8lSPSZNoOwcLvJKJ85vVNc7oJFD65bc= github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E= @@ -621,14 +660,50 @@ github.com/sacloud/iaas-api-go v1.11.1 h1:2MsFZ4H1uRdRVx2nVXuERWQ3swoFc3XreIV5hJ github.com/sacloud/iaas-api-go v1.11.1/go.mod h1:uBDSa06F/V0OnoR66jGdbH0PVnCJw+NeE9RVbVgMfss= github.com/sacloud/packages-go v0.0.9 h1:GbinkBLC/eirFhHpLjoDW6JV7+95Rnd2d8RWj7Afeks= github.com/sacloud/packages-go v0.0.9/go.mod h1:k+EEUMF2LlncjbNIJNOqLyZ9wjTESPIWIk1OA7x9j2Q= -github.com/sagernet/sing v0.2.5 h1:N8sUluR8GZvR9DqUiH3FA3vBb4m/EDdOVTYUrDzJvmY= -github.com/sagernet/sing v0.2.5/go.mod h1:Ta8nHnDLAwqySzKhGoKk4ZIB+vJ3GTKj7UPrWYvM+4w= -github.com/sagernet/sing-shadowsocks v0.2.2 h1:ezSdVhrmIcwDXmCZF3bOJVMuVtTQWpda+1Op+Ie2TA4= -github.com/sagernet/sing-shadowsocks v0.2.2/go.mod h1:JIBWG6a7orB2HxBxYElViQFLUQxFVG7DuqIj8gD7uCQ= +github.com/sagernet/cloudflare-tls v0.0.0-20221031050923-d70792f4c3a0 h1:KyhtFFt1Jtp5vW2ohNvstvQffTOQ/s5vENuGXzdA+TM= +github.com/sagernet/cloudflare-tls v0.0.0-20221031050923-d70792f4c3a0/go.mod h1:D4SFEOkJK+4W1v86ZhX0jPM0rAL498fyQAChqMtes/I= +github.com/sagernet/go-tun2socks v1.16.12-0.20220818015926-16cb67876a61 h1:5+m7c6AkmAylhauulqN/c5dnh8/KssrE9c93TQrXldA= +github.com/sagernet/go-tun2socks v1.16.12-0.20220818015926-16cb67876a61/go.mod h1:QUQ4RRHD6hGGHdFMEtR8T2P6GS6R3D/CXKdaYHKKXms= +github.com/sagernet/gvisor v0.0.0-20230627031050-1ab0276e0dd2 h1:dnkKrzapqtAwjTSWt6hdPrARORfoYvuUczynvRLrueo= +github.com/sagernet/gvisor v0.0.0-20230627031050-1ab0276e0dd2/go.mod h1:1JUiV7nGuf++YFm9eWZ8q2lrwHmhcUGzptMl/vL1+LA= +github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97 h1:iL5gZI3uFp0X6EslacyapiRz7LLSJyr4RajF/BhMVyE= +github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= +github.com/sagernet/quic-go v0.0.0-20230615020047-10f05c797c02 h1:9S+L1n/4hbe1pCLNTZnnddSNseQda8tuSm/+uRy6p8s= +github.com/sagernet/quic-go v0.0.0-20230615020047-10f05c797c02/go.mod h1:rth94YcHJfkC4mG03JTXmv7mJsDc8MOIIqQrCtoaV4U= +github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc= +github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU= +github.com/sagernet/sing v0.0.0-20220817130738-ce854cda8522/go.mod h1:QVsS5L/ZA2Q5UhQwLrn0Trw+msNd/NPGEhBKR/ioWiY= +github.com/sagernet/sing v0.1.8/go.mod h1:jt1w2u7lJQFFSGLiRrRIs5YWmx4kAPfWuOejuDW9qMk= +github.com/sagernet/sing v0.2.9 h1:3wsTz+JG5Wzy65eZnh6AuCrD2QqcRF6Iq6f7ttmJsAo= +github.com/sagernet/sing v0.2.9/go.mod h1:Ta8nHnDLAwqySzKhGoKk4ZIB+vJ3GTKj7UPrWYvM+4w= +github.com/sagernet/sing-dns v0.1.8 h1:zTYnxzA7mssg/Lwd70+RFPi8i3djioGnVS7zKwSF6cg= +github.com/sagernet/sing-dns v0.1.8/go.mod h1:lHv8WMl9GKfMV8Wt1AJTtjVTF/h5/owpGY2YutYZF6g= +github.com/sagernet/sing-mux v0.1.2 h1:av2/m6e+Gh+ECTuJZqYCjJz55BNkot0VyRMkREqyF/g= +github.com/sagernet/sing-mux v0.1.2/go.mod h1:r2V8AlOzXaRCHXK7fILCUGzuI2iILweTaG8C5xlpHxo= +github.com/sagernet/sing-shadowsocks v0.2.4 h1:s/CqXlvFAZhlIoHWUwPw5CoNnQ9Ibki9pckjuugtVfY= +github.com/sagernet/sing-shadowsocks v0.2.4/go.mod h1:80fNKP0wnqlu85GZXV1H1vDPC/2t+dQbFggOw4XuFUM= +github.com/sagernet/sing-shadowsocks2 v0.1.3 h1:WXoLvCFi5JTFBRYorf1YePGYIQyJ/zbsBM6Fwbl5kGA= +github.com/sagernet/sing-shadowsocks2 v0.1.3/go.mod h1:DOhJc/cLeqRv0wuePrQso+iUmDxOnWF4eT/oMcRzYFw= +github.com/sagernet/sing-shadowtls v0.1.4 h1:aTgBSJEgnumzFenPvc+kbD9/W0PywzWevnVpEx6Tw3k= +github.com/sagernet/sing-shadowtls v0.1.4/go.mod h1:F8NBgsY5YN2beQavdgdm1DPlhaKQlaL6lpDdcBglGK4= +github.com/sagernet/sing-tun v0.1.10-0.20230723061951-767ce42377f1 h1:PCA1u3HMLt1BcsMGVTR+0xRENEyHZrLQsF+/l99iOio= +github.com/sagernet/sing-tun v0.1.10-0.20230723061951-767ce42377f1/go.mod h1:XsyIVKd/Qp+2SdLZWGbavHtcpE7J7XU3S1zJmcoj9Ck= +github.com/sagernet/sing-vmess v0.1.7 h1:TM8FFLsXmlXH9XT8/oDgc6PC5BOzrg6OzyEe01is2r4= +github.com/sagernet/sing-vmess v0.1.7/go.mod h1:1qkC1L1T2sxnS/NuO6HU72S8TkltV+EXoKGR29m/Yss= +github.com/sagernet/smux v0.0.0-20230312102458-337ec2a5af37 h1:HuE6xSwco/Xed8ajZ+coeYLmioq0Qp1/Z2zczFaV8as= +github.com/sagernet/smux v0.0.0-20230312102458-337ec2a5af37/go.mod h1:3skNSftZDJWTGVtVaM2jfbce8qHnmH/AGDRe62iNOg0= +github.com/sagernet/tfo-go v0.0.0-20230303015439-ffcfd8c41cf9 h1:2ItpW1nMNkPzmBTxV0/eClCklHrFSQMnUGcpUmJxVeE= +github.com/sagernet/tfo-go v0.0.0-20230303015439-ffcfd8c41cf9/go.mod h1:FUyTEc5ye5NjKnDTDMuiLF2M6T4BE6y6KZuax//UCEg= +github.com/sagernet/utls v0.0.0-20230309024959-6732c2ab36f2 h1:kDUqhc9Vsk5HJuhfIATJ8oQwBmpOZJuozQG7Vk88lL4= +github.com/sagernet/utls v0.0.0-20230309024959-6732c2ab36f2/go.mod h1:JKQMZq/O2qnZjdrt+B57olmfgEmLtY9iiSIEYtWvoSM= +github.com/sagernet/websocket v0.0.0-20220913015213-615516348b4e h1:7uw2njHFGE+VpWamge6o56j2RWk4omF6uLKKxMmcWvs= +github.com/sagernet/websocket v0.0.0-20220913015213-615516348b4e/go.mod h1:45TUl8+gH4SIKr4ykREbxKWTxkDlSzFENzctB1dVRRY= github.com/sagernet/wireguard-go v0.0.0-20221116151939-c99467f53f2c h1:vK2wyt9aWYHHvNLWniwijBu/n4pySypiKRhN32u/JGo= github.com/sagernet/wireguard-go v0.0.0-20221116151939-c99467f53f2c/go.mod h1:euOmN6O5kk9dQmgSS8Df4psAl3TCjxOz0NW60EWkSaI= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.17 h1:1WuWJu7/e8SqK+uQl7lfk/N/oMZTL2NE/TJsNKRNMc4= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.17/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scjalliance/comshim v0.0.0-20230315213746-5e51f40bd3b9 h1:rc/CcqLH3lh8n+csdOuDfP+NuykE0U6AeYSJJHKDgSg= +github.com/scjalliance/comshim v0.0.0-20230315213746-5e51f40bd3b9/go.mod h1:a/83NAfUXvEuLpmxDssAXxgUgrEy12MId3Wd7OTs76s= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb h1:XfLJSPIOUX+osiMraVgIrMR27uMXnRJWGm1+GL8/63U= github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb/go.mod h1:bR6DqgcAl1zTcOX8/pE2Qkj9XO00eCNqmKb7lXP8EAg= @@ -736,6 +811,8 @@ github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49u github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/vinyldns/go-vinyldns v0.9.16 h1:GZJStDkcCk1F1AcRc64LuuMh+ENL8pHA0CVd4ulRMcQ= github.com/vinyldns/go-vinyldns v0.9.16/go.mod h1:5qIJOdmzAnatKjurI+Tl4uTus7GJKJxb+zitufjHs3Q= +github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg= +github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -753,6 +830,12 @@ github.com/yandex-cloud/go-sdk v0.0.0-20220805164847-cf028e604997/go.mod h1:2CHK github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= +github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= +github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= +github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= +github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -764,17 +847,25 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/ratelimit v0.2.0 h1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA= go.uber.org/ratelimit v0.2.0/go.mod h1:YYBV4e4naJvhpitQrWJu1vCpgB7CboMe0qhltKt6mUg= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +go4.org/netipx v0.0.0-20230303233057-f1b76eb4bb35 h1:nJAwRlGWZZDOD+6wni9KVUNHMpHko/OnRwsrCYeAzPo= +go4.org/netipx v0.0.0-20230303233057-f1b76eb4bb35/go.mod h1:TQvodOM+hJTioNQJilmLXu08JNb8i+ccq418+KWu1/Y= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -784,6 +875,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201217014255-9d1352758620/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -798,8 +890,8 @@ golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= +golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -849,6 +941,7 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -859,8 +952,9 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -894,6 +988,7 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -902,12 +997,14 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -930,6 +1027,7 @@ golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1056,8 +1154,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= -google.golang.org/grpc v1.56.0 h1:+y7Bs8rtMd07LeXmL3NxcTLn7mUkbKZqEpPhMNkwJEE= -google.golang.org/grpc v1.56.0/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/node/cert.go b/node/cert.go index d7f7620..1d6d8d4 100644 --- a/node/cert.go +++ b/node/cert.go @@ -2,20 +2,22 @@ package node import ( "fmt" + "github.com/Yuzuki616/V2bX/common/file" "github.com/Yuzuki616/V2bX/node/lego" - "log" + log "github.com/sirupsen/logrus" ) func (c *Controller) renewCertTask() error { l, err := lego.New(c.CertConfig) if err != nil { - log.Print("new lego error: ", err) + log.WithField("tag", c.tag).Info("new lego error: ", err) return nil } err = l.RenewCert() if err != nil { - log.Print("renew cert error: ", err) + log.WithField("tag", c.tag).Info("renew cert error: ", err) + return nil } return nil }