From baab76d6673085e3fbc2f840126647be2da9522b Mon Sep 17 00:00:00 2001 From: yuzuki999 Date: Mon, 10 Oct 2022 11:31:15 +0800 Subject: [PATCH] add config watch --- conf/conf.go | 41 ++++- core/core.go | 19 ++- go.mod | 16 +- go.sum | 39 ++--- main.go | 33 ++-- node/{ => controller}/inbound.go | 4 +- node/{ => controller}/inbound_test.go | 4 +- node/{ => controller}/legoCmd/cmd/account.go | 0 .../legoCmd/cmd/accounts_storage.go | 43 +++-- .../legoCmd/cmd/certs_storage.go | 15 +- node/{ => controller}/legoCmd/cmd/cmd.go | 0 .../legoCmd/cmd/cmd_before.go | 2 +- .../legoCmd/cmd/cmd_dnshelp.go | 0 node/{ => controller}/legoCmd/cmd/cmd_list.go | 0 .../{ => controller}/legoCmd/cmd/cmd_renew.go | 2 +- .../legoCmd/cmd/cmd_renew_test.go | 0 .../legoCmd/cmd/cmd_revoke.go | 2 +- node/{ => controller}/legoCmd/cmd/cmd_run.go | 2 +- node/{ => controller}/legoCmd/cmd/flags.go | 0 node/{ => controller}/legoCmd/cmd/hook.go | 0 node/{ => controller}/legoCmd/cmd/setup.go | 2 +- .../legoCmd/cmd/setup_challenges.go | 2 +- .../legoCmd/cmd/zz_gen_cmd_dnshelp.go | 0 node/{ => controller}/legoCmd/lego.go | 8 +- node/{ => controller}/legoCmd/lego_test.go | 2 +- node/{ => controller}/legoCmd/log/log.go | 0 node/controller/node.go | 160 ++++++++++++++++++ node/{ => controller}/node_test.go | 4 +- node/{ => controller}/outbound.go | 2 +- node/{ => controller}/task.go | 4 +- node/{ => controller}/user.go | 2 +- node/node.go | 159 +++-------------- 32 files changed, 320 insertions(+), 247 deletions(-) rename node/{ => controller}/inbound.go (99%) rename node/{ => controller}/inbound_test.go (96%) rename node/{ => controller}/legoCmd/cmd/account.go (100%) rename node/{ => controller}/legoCmd/cmd/accounts_storage.go (80%) rename node/{ => controller}/legoCmd/cmd/certs_storage.go (94%) rename node/{ => controller}/legoCmd/cmd/cmd.go (100%) rename node/{ => controller}/legoCmd/cmd/cmd_before.go (89%) rename node/{ => controller}/legoCmd/cmd/cmd_dnshelp.go (100%) rename node/{ => controller}/legoCmd/cmd/cmd_list.go (100%) rename node/{ => controller}/legoCmd/cmd/cmd_renew.go (99%) rename node/{ => controller}/legoCmd/cmd/cmd_renew_test.go (100%) rename node/{ => controller}/legoCmd/cmd/cmd_revoke.go (96%) rename node/{ => controller}/legoCmd/cmd/cmd_run.go (98%) rename node/{ => controller}/legoCmd/cmd/flags.go (100%) rename node/{ => controller}/legoCmd/cmd/hook.go (100%) rename node/{ => controller}/legoCmd/cmd/setup.go (98%) rename node/{ => controller}/legoCmd/cmd/setup_challenges.go (98%) rename node/{ => controller}/legoCmd/cmd/zz_gen_cmd_dnshelp.go (100%) rename node/{ => controller}/legoCmd/lego.go (96%) rename node/{ => controller}/legoCmd/lego_test.go (96%) rename node/{ => controller}/legoCmd/log/log.go (100%) create mode 100644 node/controller/node.go rename node/{ => controller}/node_test.go (96%) rename node/{ => controller}/outbound.go (98%) rename node/{ => controller}/task.go (99%) rename node/{ => controller}/user.go (99%) diff --git a/conf/conf.go b/conf/conf.go index b28bdb2..bc44712 100644 --- a/conf/conf.go +++ b/conf/conf.go @@ -2,7 +2,9 @@ package conf import ( "fmt" + "github.com/fsnotify/fsnotify" "gopkg.in/yaml.v3" + "log" "os" "path" ) @@ -35,11 +37,46 @@ func (p *Conf) LoadFromPath(filePath string) error { os.Setenv("XRAY_LOCATION_CONFIG", confPath) f, err := os.Open(filePath) if err != nil { - return fmt.Errorf("open config file error: %v", err) + return fmt.Errorf("open config file error: %s", err) } err = yaml.NewDecoder(f).Decode(p) if err != nil { - return fmt.Errorf("decode config error: %v", err) + return fmt.Errorf("decode config error: %s", err) + } + return nil +} + +func (p *Conf) Watch(filePath string, reload func()) error { + watcher, err := fsnotify.NewWatcher() + if err != nil { + return fmt.Errorf("new watcher error: %s", err) + } + go func() { + defer watcher.Close() + for { + select { + case event := <-watcher.Events: + if event.Op&fsnotify.Chmod == fsnotify.Chmod { + if event.Name == filePath { + log.Println("config file changed, reloading...") + err := p.LoadFromPath(filePath) + if err != nil { + log.Printf("reload config error: %s", err) + } + log.Println("reload config success") + reload() + } + } + case err := <-watcher.Errors: + if err != nil { + log.Panicf("watcher error: %s", err) + } + } + } + }() + err = watcher.Add(path.Dir(filePath)) + if err != nil { + return fmt.Errorf("watch file error: %s", err) } return nil } diff --git a/core/core.go b/core/core.go index 3502e09..c85bf9d 100644 --- a/core/core.go +++ b/core/core.go @@ -167,6 +167,23 @@ func (p *Core) Start() error { func (p *Core) Close() { p.access.Lock() defer p.access.Unlock() - p.Server.Close() + p.ihm = nil + p.ohm = nil + p.shm = nil + p.dispatcher = nil + err := p.Server.Close() + if err != nil { + log.Panicf("failed to close xray core: %s", err) + } return } + +func (p *Core) Restart(v2bXConfig *conf.Conf) error { + p.Close() + p.Server = getCore(v2bXConfig) + err := p.Start() + if err != nil { + return err + } + return nil +} diff --git a/go.mod b/go.mod index 3bf5004..8d23357 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/Yuzuki616/V2bX go 1.19 require ( - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-acme/lego/v4 v4.9.0 + github.com/fsnotify/fsnotify v1.5.4 + github.com/go-acme/lego/v4 v4.8.0 github.com/go-resty/resty/v2 v2.7.0 github.com/golang/protobuf v1.5.2 // indirect github.com/juju/ratelimit v1.0.2 @@ -42,7 +42,6 @@ require ( github.com/aws/aws-sdk-go v1.44.7 // indirect github.com/boombuler/barcode v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect - github.com/civo/civogo v0.3.11 // indirect github.com/cloudflare/cloudflare-go v0.49.0 // indirect github.com/cpu/goacmedns v0.1.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect @@ -54,7 +53,6 @@ require ( github.com/exoscale/egoscale v1.19.0 // indirect github.com/fatih/structs v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect - github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect github.com/gofrs/uuid v4.2.0+incompatible // indirect @@ -68,9 +66,7 @@ require ( github.com/gophercloud/gophercloud v1.0.0 // indirect github.com/gophercloud/utils v0.0.0-20220307143606-8e7800759d16 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.1 // indirect github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df // indirect github.com/infobloxopen/infoblox-go-client v1.1.1 // indirect @@ -107,6 +103,7 @@ require ( github.com/nrdcg/porkbun v0.1.1 // indirect github.com/nxadm/tail v1.4.8 // indirect github.com/onsi/ginkgo v1.16.5 // indirect + github.com/onsi/gomega v1.19.0 // indirect github.com/oracle/oci-go-sdk v24.3.0+incompatible // indirect github.com/ovh/go-ovh v1.1.0 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect @@ -118,10 +115,7 @@ require ( github.com/refraction-networking/utls v1.1.2 // indirect github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sacloud/api-client-go v0.2.1 // indirect - github.com/sacloud/go-http v0.1.2 // indirect - github.com/sacloud/iaas-api-go v1.3.2 // indirect - github.com/sacloud/packages-go v0.0.5 // indirect + github.com/sacloud/libsacloud v1.36.2 // indirect github.com/sagernet/sing v0.0.0-20220801112236-1bb95f9661fc // indirect github.com/sagernet/sing-shadowsocks v0.0.0-20220801112336-a91eacdd01e1 // indirect github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9 // indirect @@ -139,8 +133,6 @@ require ( github.com/vinyldns/go-vinyldns v0.9.16 // indirect github.com/vultr/govultr/v2 v2.17.2 // indirect github.com/xtls/go v0.0.0-20220914232946-0441cf4cf837 // 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 go.opencensus.io v0.23.0 // indirect go.starlark.net v0.0.0-20220817180228-f738f5508c12 // indirect go.uber.org/ratelimit v0.2.0 // indirect diff --git a/go.sum b/go.sum index 5423e6e..664215f 100644 --- a/go.sum +++ b/go.sum @@ -123,7 +123,6 @@ github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= 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/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -132,8 +131,6 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -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/cloudflare-go v0.49.0 h1:KqJYk/YQ5ZhmyYz1oa4kGDskfF1gVuZfqesaJ/XDLto= github.com/cloudflare/cloudflare-go v0.49.0/go.mod h1:h0QgcIZ3qEXwFiwfBO8sQxjVdYsLX+PfD7NFEnANaKg= @@ -208,12 +205,11 @@ github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= -github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-acme/lego/v4 v4.9.0 h1:8Hjj44IqRS7cigshMyFQ+0pIZvwgkG/+9A0UnNh7G8A= -github.com/go-acme/lego/v4 v4.9.0/go.mod h1:g3JRUyWS3L/VObpp4bCxzJftKyf/Wba8QrSSnoiqjg4= +github.com/go-acme/lego/v4 v4.8.0 h1:XienkuT6ZKHe0DE/LXeGP4ZY+ft+7ZMlqtiJ7XJs2pI= +github.com/go-acme/lego/v4 v4.8.0/go.mod h1:MXCdgHuQh25bfi/tPpyOV/9k2p1JVu6oxXcylAwkouI= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-cmd/cmd v1.0.5/go.mod h1:y8q8qlK5wQibcw63djSl/ntiHUHXHGdCkPk0j4QeW4s= @@ -254,7 +250,6 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.1 h1:pC5DB52sCeK48Wlb9oPcdhnjkz1TKt1D/P7WKJ0kUcQ= github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= @@ -377,7 +372,6 @@ github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslC github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -387,8 +381,6 @@ github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXc github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ= github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= @@ -524,8 +516,10 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= 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/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= @@ -539,8 +533,8 @@ github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceT github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed/go.mod h1:3rdaFaCv4AyBgu5ALFM0+tSuHrBh6v692nyQe3ikrq0= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -654,14 +648,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sacloud/api-client-go v0.2.1 h1:jl02ZG6cM+mcH4eDYg0cxCFFuTOVTOjUCLYL4UbP09U= -github.com/sacloud/api-client-go v0.2.1/go.mod h1:8fmYy5OpT3W8ltV5ZxF8evultNwKpduGN4YKmU9Af7w= -github.com/sacloud/go-http v0.1.2 h1:a84HkeDHxDD1vIA6HiOT72a3fwwJueZBwuGP6zVtEJU= -github.com/sacloud/go-http v0.1.2/go.mod h1:gvWaT8LFBFnSBFVrznOQXC62uad46bHZQM8w+xoH3eE= -github.com/sacloud/iaas-api-go v1.3.2 h1:03obrdVdv/bGHK9p6CV7Uzg+ot2gLsddUMevm9DDZqQ= -github.com/sacloud/iaas-api-go v1.3.2/go.mod h1:CoqpRYBG2NRB5xfqTfZNyh2lVLKyLkE/HV9ISqmbhGc= -github.com/sacloud/packages-go v0.0.5 h1:NXTQNyyp/3ugM4CANtLBJLejFESzfWu4GPUURN4NJrA= -github.com/sacloud/packages-go v0.0.5/go.mod h1:XWMBSNHT9YKY3lCh6yJsx1o1RRQQGpuhNqJA6bSHdD4= +github.com/sacloud/libsacloud v1.36.2 h1:aosI7clbQ9IU0Hj+3rpk3SKJop5nLPpLThnWCivPqjI= +github.com/sacloud/libsacloud v1.36.2/go.mod h1:P7YAOVmnIn3DKHqCZcUKYUXmSwGBm3yS7IBEjKVSrjg= github.com/sagernet/sing v0.0.0-20220801112236-1bb95f9661fc h1:x7H64IiqyrpxPWl/KrWkknzEK4GmpqgfZeVKFVw6E/M= github.com/sagernet/sing v0.0.0-20220801112236-1bb95f9661fc/go.mod h1:GbtQfZSpmtD3cXeD1qX2LCMwY8dH+bnnInDTqd92IsM= github.com/sagernet/sing-shadowsocks v0.0.0-20220801112336-a91eacdd01e1 h1:RYvOc69eSNMN0dwVugrDts41Nn7Ar/C/n/fvytvFcp4= @@ -699,6 +687,7 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9 h1:hp2CYQUINdZMHdvTdXtPOY2ainKl4IoMcpAXEf2xj3Q= @@ -749,6 +738,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.490/go.mod github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/transip/gotransip/v6 v6.17.0 h1:2RCyqYqz5+Ej8z96EyE4sf6tQrrfEBaFDO0LliSl6+8= github.com/transip/gotransip/v6 v6.17.0/go.mod h1:pQZ36hWWRahCUXkFWlx9Hs711gLd8J4qdgLdRzmtY+g= +github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= @@ -774,10 +764,6 @@ github.com/xtls/go v0.0.0-20220914232946-0441cf4cf837 h1:AHhUwwFJGl27E46OpdJHplZ github.com/xtls/go v0.0.0-20220914232946-0441cf4cf837/go.mod h1:YJTRELIWrGxR1s8xcEBgxcxBfwQfMGjdvNLTjN9XFgY= github.com/xtls/xray-core v1.6.0 h1:5kqFV/BbMb0vn3ymyRIxtnJbS7ctb0Fgb7P3slaYdzI= github.com/xtls/xray-core v1.6.0/go.mod h1:wLbZAk/dz5JEnsMZ3QeGTeKyOB50ZqKYKPGRnv0MrWI= -github.com/yandex-cloud/go-genproto v0.0.0-20220805142335-27b56ddae16f h1:cG+ehPRJSlqljSufLf1KXeXpUd1dLNjnzA18mZcB/O0= -github.com/yandex-cloud/go-genproto v0.0.0-20220805142335-27b56ddae16f/go.mod h1:HEUYX/p8966tMUHHT+TsS0hF/Ca/NYwqprC5WXSDMfE= -github.com/yandex-cloud/go-sdk v0.0.0-20220805164847-cf028e604997 h1:2wzke3JH7OtN20WsNDZx2VH/TCmsbqtDEbXzjF+i05E= -github.com/yandex-cloud/go-sdk v0.0.0-20220805164847-cf028e604997/go.mod h1:2CHKs/YGbCcNn/BPaCkEBwKz/FNCELi+MLILjR9RaTA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -797,15 +783,18 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20220817180228-f738f5508c12 h1:xOBJXWGEDwU5xSDxH6macxO11Us0AH2fTa9rmsbbF7g= go.starlark.net v0.0.0-20220817180228-f738f5508c12/go.mod h1:VZcBMdr3cT3PnBoWunTabuSEXwVAH+ZJ5zxfs3AdASk= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/ratelimit v0.0.0-20180316092928-c15da0234277/go.mod h1:2X8KaoNd1J0lZV+PxJk/5+DGbO/tpwLR1m++a7FnB/Y= 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= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= 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-20180621125126-a49355c7e3f8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 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= @@ -967,6 +956,7 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220907140024-f12130a52804 h1:0SH2R3f1b1VmIMG7BXbEZCBUu2dKmHschSmjqGUrW8A= +golang.org/x/sys v0.0.0-20180622082034-63fc586f45fe/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1058,7 +1048,6 @@ golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41 h1:ohgcoMbSofXygzo6AD2I1kz3B golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41/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 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= 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= @@ -1262,7 +1251,6 @@ google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211021150943-2b146023228c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= @@ -1315,7 +1303,6 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= diff --git a/main.go b/main.go index 12d769c..e0e152f 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,6 @@ package main import ( "flag" "fmt" - "github.com/Yuzuki616/V2bX/api/panel" "github.com/Yuzuki616/V2bX/conf" "github.com/Yuzuki616/V2bX/core" "github.com/Yuzuki616/V2bX/node" @@ -20,7 +19,7 @@ var ( ) var ( - version = "v0.0.7_beta" + version = "v0.0.7_beta2" codename = "V2bX" intro = "A V2board backend based on Xray-core" ) @@ -29,18 +28,6 @@ func showVersion() { fmt.Printf("%s %s (%s) \n", codename, version, intro) } -func startNodes(nodes []*conf.NodeConfig, core *core.Core) error { - for i := range nodes { - var apiClient = panel.New(nodes[i].ApiConfig) - // Register controller service - err := node.New(core, apiClient, nodes[i].ControllerConfig).Start() - if err != nil { - return err - } - } - return nil -} - func main() { flag.Parse() showVersion() @@ -59,10 +46,26 @@ func main() { log.Panicf("Failed to start core: %s", err) } defer x.Close() - err = startNodes(config.NodesConfig, x) + nodes := node.New() + err = nodes.Start(config.NodesConfig, x) if err != nil { log.Panicf("run nodes error: %s", err) } + err = config.Watch(*configFile, func() { + nodes.Close() + err = x.Restart(config) + if err != nil { + log.Panicf("Failed to restart core: %s", err) + } + err = nodes.Start(config.NodesConfig, x) + if err != nil { + log.Panicf("run nodes error: %s", err) + } + runtime.GC() + }) + if err != nil { + log.Panicf("watch config file error: %s", err) + } //Explicitly triggering GC to remove garbage from config loading. runtime.GC() // Running backend diff --git a/node/inbound.go b/node/controller/inbound.go similarity index 99% rename from node/inbound.go rename to node/controller/inbound.go index e296ab4..d56dea2 100644 --- a/node/inbound.go +++ b/node/controller/inbound.go @@ -1,12 +1,12 @@ // Package node the InbounderConfig used by add inbound -package node +package controller import ( "encoding/json" "fmt" "github.com/Yuzuki616/V2bX/api/panel" "github.com/Yuzuki616/V2bX/conf" - "github.com/Yuzuki616/V2bX/node/legoCmd" + "github.com/Yuzuki616/V2bX/node/controller/legoCmd" "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/uuid" "github.com/xtls/xray-core/core" diff --git a/node/inbound_test.go b/node/controller/inbound_test.go similarity index 96% rename from node/inbound_test.go rename to node/controller/inbound_test.go index c80dd0a..6ea0a2d 100644 --- a/node/inbound_test.go +++ b/node/controller/inbound_test.go @@ -1,8 +1,8 @@ -package node_test +package controller_test import ( "github.com/Yuzuki616/V2bX/api/panel" - . "github.com/Yuzuki616/V2bX/node" + . "github.com/Yuzuki616/V2bX/node/controller" "testing" ) diff --git a/node/legoCmd/cmd/account.go b/node/controller/legoCmd/cmd/account.go similarity index 100% rename from node/legoCmd/cmd/account.go rename to node/controller/legoCmd/cmd/account.go diff --git a/node/legoCmd/cmd/accounts_storage.go b/node/controller/legoCmd/cmd/accounts_storage.go similarity index 80% rename from node/legoCmd/cmd/accounts_storage.go rename to node/controller/legoCmd/cmd/accounts_storage.go index 9e9fd65..6b05d5a 100644 --- a/node/legoCmd/cmd/accounts_storage.go +++ b/node/controller/legoCmd/cmd/accounts_storage.go @@ -7,7 +7,7 @@ import ( "encoding/pem" "errors" "fmt" - "github.com/Yuzuki616/V2bX/node/legoCmd/log" + "github.com/Yuzuki616/V2bX/node/controller/legoCmd/log" "io/ioutil" "net/url" "os" @@ -30,36 +30,35 @@ const ( // // rootPath: // -// ./.lego/accounts/ -// │ └── root accounts directory -// └── "path" option +// ./.lego/accounts/ +// │ └── root accounts directory +// └── "path" option // // rootUserPath: // -// ./.lego/accounts/localhost_14000/hubert@hubert.com/ -// │ │ │ └── userID ("email" option) -// │ │ └── CA server ("server" option) -// │ └── root accounts directory -// └── "path" option +// ./.lego/accounts/localhost_14000/hubert@hubert.com/ +// │ │ │ └── userID ("email" option) +// │ │ └── CA server ("server" option) +// │ └── root accounts directory +// └── "path" option // // keysPath: // -// ./.lego/accounts/localhost_14000/hubert@hubert.com/keys/ -// │ │ │ │ └── root keys directory -// │ │ │ └── userID ("email" option) -// │ │ └── CA server ("server" option) -// │ └── root accounts directory -// └── "path" option +// ./.lego/accounts/localhost_14000/hubert@hubert.com/keys/ +// │ │ │ │ └── root keys directory +// │ │ │ └── userID ("email" option) +// │ │ └── CA server ("server" option) +// │ └── root accounts directory +// └── "path" option // // accountFilePath: // -// ./.lego/accounts/localhost_14000/hubert@hubert.com/account.json -// │ │ │ │ └── account file -// │ │ │ └── userID ("email" option) -// │ │ └── CA server ("server" option) -// │ └── root accounts directory -// └── "path" option -// +// ./.lego/accounts/localhost_14000/hubert@hubert.com/account.json +// │ │ │ │ └── account file +// │ │ │ └── userID ("email" option) +// │ │ └── CA server ("server" option) +// │ └── root accounts directory +// └── "path" option type AccountsStorage struct { userID string rootPath string diff --git a/node/legoCmd/cmd/certs_storage.go b/node/controller/legoCmd/cmd/certs_storage.go similarity index 94% rename from node/legoCmd/cmd/certs_storage.go rename to node/controller/legoCmd/cmd/certs_storage.go index 6f56b5f..e0f7f85 100644 --- a/node/legoCmd/cmd/certs_storage.go +++ b/node/controller/legoCmd/cmd/certs_storage.go @@ -4,7 +4,7 @@ import ( "bytes" "crypto/x509" "encoding/json" - "github.com/Yuzuki616/V2bX/node/legoCmd/log" + "github.com/Yuzuki616/V2bX/node/controller/legoCmd/log" "io/ioutil" "os" "path/filepath" @@ -27,16 +27,15 @@ const ( // // rootPath: // -// ./.lego/certificates/ -// │ └── root certificates directory -// └── "path" option +// ./.lego/certificates/ +// │ └── root certificates directory +// └── "path" option // // archivePath: // -// ./.lego/archives/ -// │ └── archived certificates directory -// └── "path" option -// +// ./.lego/archives/ +// │ └── archived certificates directory +// └── "path" option type CertificatesStorage struct { rootPath string archivePath string diff --git a/node/legoCmd/cmd/cmd.go b/node/controller/legoCmd/cmd/cmd.go similarity index 100% rename from node/legoCmd/cmd/cmd.go rename to node/controller/legoCmd/cmd/cmd.go diff --git a/node/legoCmd/cmd/cmd_before.go b/node/controller/legoCmd/cmd/cmd_before.go similarity index 89% rename from node/legoCmd/cmd/cmd_before.go rename to node/controller/legoCmd/cmd/cmd_before.go index ce3b078..f5361a9 100644 --- a/node/legoCmd/cmd/cmd_before.go +++ b/node/controller/legoCmd/cmd/cmd_before.go @@ -1,7 +1,7 @@ package cmd import ( - "github.com/Yuzuki616/V2bX/node/legoCmd/log" + "github.com/Yuzuki616/V2bX/node/controller/legoCmd/log" "github.com/urfave/cli" ) diff --git a/node/legoCmd/cmd/cmd_dnshelp.go b/node/controller/legoCmd/cmd/cmd_dnshelp.go similarity index 100% rename from node/legoCmd/cmd/cmd_dnshelp.go rename to node/controller/legoCmd/cmd/cmd_dnshelp.go diff --git a/node/legoCmd/cmd/cmd_list.go b/node/controller/legoCmd/cmd/cmd_list.go similarity index 100% rename from node/legoCmd/cmd/cmd_list.go rename to node/controller/legoCmd/cmd/cmd_list.go diff --git a/node/legoCmd/cmd/cmd_renew.go b/node/controller/legoCmd/cmd/cmd_renew.go similarity index 99% rename from node/legoCmd/cmd/cmd_renew.go rename to node/controller/legoCmd/cmd/cmd_renew.go index a25b470..bc5a131 100644 --- a/node/legoCmd/cmd/cmd_renew.go +++ b/node/controller/legoCmd/cmd/cmd_renew.go @@ -3,7 +3,7 @@ package cmd import ( "crypto" "crypto/x509" - "github.com/Yuzuki616/V2bX/node/legoCmd/log" + "github.com/Yuzuki616/V2bX/node/controller/legoCmd/log" "time" "github.com/go-acme/lego/v4/certcrypto" diff --git a/node/legoCmd/cmd/cmd_renew_test.go b/node/controller/legoCmd/cmd/cmd_renew_test.go similarity index 100% rename from node/legoCmd/cmd/cmd_renew_test.go rename to node/controller/legoCmd/cmd/cmd_renew_test.go diff --git a/node/legoCmd/cmd/cmd_revoke.go b/node/controller/legoCmd/cmd/cmd_revoke.go similarity index 96% rename from node/legoCmd/cmd/cmd_revoke.go rename to node/controller/legoCmd/cmd/cmd_revoke.go index 44dd152..d7ee201 100644 --- a/node/legoCmd/cmd/cmd_revoke.go +++ b/node/controller/legoCmd/cmd/cmd_revoke.go @@ -1,7 +1,7 @@ package cmd import ( - "github.com/Yuzuki616/V2bX/node/legoCmd/log" + "github.com/Yuzuki616/V2bX/node/controller/legoCmd/log" "github.com/urfave/cli" ) diff --git a/node/legoCmd/cmd/cmd_run.go b/node/controller/legoCmd/cmd/cmd_run.go similarity index 98% rename from node/legoCmd/cmd/cmd_run.go rename to node/controller/legoCmd/cmd/cmd_run.go index 7aa5c1c..298195c 100644 --- a/node/legoCmd/cmd/cmd_run.go +++ b/node/controller/legoCmd/cmd/cmd_run.go @@ -3,7 +3,7 @@ package cmd import ( "bufio" "fmt" - "github.com/Yuzuki616/V2bX/node/legoCmd/log" + "github.com/Yuzuki616/V2bX/node/controller/legoCmd/log" "os" "strings" diff --git a/node/legoCmd/cmd/flags.go b/node/controller/legoCmd/cmd/flags.go similarity index 100% rename from node/legoCmd/cmd/flags.go rename to node/controller/legoCmd/cmd/flags.go diff --git a/node/legoCmd/cmd/hook.go b/node/controller/legoCmd/cmd/hook.go similarity index 100% rename from node/legoCmd/cmd/hook.go rename to node/controller/legoCmd/cmd/hook.go diff --git a/node/legoCmd/cmd/setup.go b/node/controller/legoCmd/cmd/setup.go similarity index 98% rename from node/legoCmd/cmd/setup.go rename to node/controller/legoCmd/cmd/setup.go index 60a040a..86bcff1 100644 --- a/node/legoCmd/cmd/setup.go +++ b/node/controller/legoCmd/cmd/setup.go @@ -4,7 +4,7 @@ import ( "crypto/x509" "encoding/pem" "fmt" - "github.com/Yuzuki616/V2bX/node/legoCmd/log" + "github.com/Yuzuki616/V2bX/node/controller/legoCmd/log" "io/ioutil" "os" "strings" diff --git a/node/legoCmd/cmd/setup_challenges.go b/node/controller/legoCmd/cmd/setup_challenges.go similarity index 98% rename from node/legoCmd/cmd/setup_challenges.go rename to node/controller/legoCmd/cmd/setup_challenges.go index 1c61045..449ca74 100644 --- a/node/legoCmd/cmd/setup_challenges.go +++ b/node/controller/legoCmd/cmd/setup_challenges.go @@ -1,7 +1,7 @@ package cmd import ( - "github.com/Yuzuki616/V2bX/node/legoCmd/log" + "github.com/Yuzuki616/V2bX/node/controller/legoCmd/log" "net" "strings" "time" diff --git a/node/legoCmd/cmd/zz_gen_cmd_dnshelp.go b/node/controller/legoCmd/cmd/zz_gen_cmd_dnshelp.go similarity index 100% rename from node/legoCmd/cmd/zz_gen_cmd_dnshelp.go rename to node/controller/legoCmd/cmd/zz_gen_cmd_dnshelp.go diff --git a/node/legoCmd/lego.go b/node/controller/legoCmd/lego.go similarity index 96% rename from node/legoCmd/lego.go rename to node/controller/legoCmd/lego.go index b87411c..4490475 100644 --- a/node/legoCmd/lego.go +++ b/node/controller/legoCmd/lego.go @@ -5,7 +5,7 @@ package legoCmd import ( "errors" "fmt" - cmd2 "github.com/Yuzuki616/V2bX/node/legoCmd/cmd" + "github.com/Yuzuki616/V2bX/node/controller/legoCmd/cmd" "os" "path" "path/filepath" @@ -47,11 +47,11 @@ func New() (*LegoCMD, error) { defaultPath = filepath.Join(pathTemp, "cert") - app.Flags = cmd2.CreateFlags(defaultPath) + app.Flags = cmd.CreateFlags(defaultPath) - app.Before = cmd2.Before + app.Before = cmd.Before - app.Commands = cmd2.CreateCommands() + app.Commands = cmd.CreateCommands() lego := &LegoCMD{ cmdClient: app, diff --git a/node/legoCmd/lego_test.go b/node/controller/legoCmd/lego_test.go similarity index 96% rename from node/legoCmd/lego_test.go rename to node/controller/legoCmd/lego_test.go index 345d7bc..fa50c8f 100644 --- a/node/legoCmd/lego_test.go +++ b/node/controller/legoCmd/lego_test.go @@ -1,7 +1,7 @@ package legoCmd_test import ( - "github.com/Yuzuki616/V2bX/node/legoCmd" + "github.com/Yuzuki616/V2bX/node/controller/legoCmd" "testing" ) diff --git a/node/legoCmd/log/log.go b/node/controller/legoCmd/log/log.go similarity index 100% rename from node/legoCmd/log/log.go rename to node/controller/legoCmd/log/log.go diff --git a/node/controller/node.go b/node/controller/node.go new file mode 100644 index 0000000..75449d0 --- /dev/null +++ b/node/controller/node.go @@ -0,0 +1,160 @@ +package controller + +import ( + "errors" + "fmt" + "github.com/Yuzuki616/V2bX/api/panel" + "github.com/Yuzuki616/V2bX/conf" + "github.com/Yuzuki616/V2bX/core" + "github.com/xtls/xray-core/common/task" + "log" + "time" +) + +type Node struct { + server *core.Core + config *conf.ControllerConfig + clientInfo panel.ClientInfo + apiClient panel.Panel + nodeInfo *panel.NodeInfo + Tag string + userList []panel.UserInfo + nodeInfoMonitorPeriodic *task.Periodic + userReportPeriodic *task.Periodic + onlineIpReportPeriodic *task.Periodic + DynamicSpeedLimitPeriodic *task.Periodic +} + +// New return a Node service with default parameters. +func New(server *core.Core, api panel.Panel, config *conf.ControllerConfig) *Node { + controller := &Node{ + server: server, + config: config, + apiClient: api, + } + return controller +} + +// Start implement the Start() function of the service interface +func (c *Node) Start() error { + c.clientInfo = c.apiClient.Describe() + // First fetch Node Info + newNodeInfo, err := c.apiClient.GetNodeInfo() + if err != nil { + return fmt.Errorf("get node info failed: %s", err) + } + c.nodeInfo = newNodeInfo + c.Tag = c.buildNodeTag() + // Add new tag + err = c.addNewTag(newNodeInfo) + if err != nil { + return fmt.Errorf("add new tag failed: %s", err) + } + // Update user + c.userList, err = c.apiClient.GetUserList() + if err != nil { + return fmt.Errorf("get user list failed: %s", err) + } + if len(c.userList) == 0 { + return errors.New("add users failed: not have any user") + } + err = c.addNewUser(c.userList, newNodeInfo) + if err != nil { + return err + } + if err := c.server.AddInboundLimiter(c.Tag, c.nodeInfo); err != nil { + return fmt.Errorf("add inbound limiter failed: %s", err) + } + // Add Rule Manager + if !c.config.DisableGetRule { + if ruleList, err := c.apiClient.GetNodeRule(); err != nil { + log.Printf("Get rule list filed: %s", err) + } else if ruleList != nil { + if err := c.server.UpdateRule(c.Tag, ruleList); err != nil { + log.Printf("Update rule filed: %s", err) + } + } + } + // fetch node info task + c.nodeInfoMonitorPeriodic = &task.Periodic{ + Interval: time.Duration(c.config.UpdatePeriodic) * time.Second, + Execute: c.nodeInfoMonitor, + } + // fetch user list task + c.userReportPeriodic = &task.Periodic{ + Interval: time.Duration(c.config.UpdatePeriodic) * time.Second, + Execute: c.reportUserTraffic, + } + log.Printf("[%s: %d] Start monitor node status", c.nodeInfo.NodeType, c.nodeInfo.NodeId) + // delay to start nodeInfoMonitor + go func() { + time.Sleep(time.Duration(c.config.UpdatePeriodic) * time.Second) + _ = c.nodeInfoMonitorPeriodic.Start() + }() + + log.Printf("[%s: %d] Start report node status", c.nodeInfo.NodeType, c.nodeInfo.NodeId) + // delay to start userReport + go func() { + time.Sleep(time.Duration(c.config.UpdatePeriodic) * time.Second) + _ = c.userReportPeriodic.Start() + }() + if c.config.EnableIpRecorder { + // report and fetch online ip list task + c.onlineIpReportPeriodic = &task.Periodic{ + Interval: time.Duration(c.config.IpRecorderConfig.Periodic) * time.Second, + Execute: c.reportOnlineIp, + } + go func() { + time.Sleep(time.Duration(c.config.IpRecorderConfig.Periodic) * time.Second) + _ = c.onlineIpReportPeriodic.Start() + }() + log.Printf("[%s: %d] Start report online ip", c.nodeInfo.NodeType, c.nodeInfo.NodeId) + } + if c.config.EnableDynamicSpeedLimit { + // Check dynamic speed limit task + c.DynamicSpeedLimitPeriodic = &task.Periodic{ + Interval: time.Duration(c.config.DynamicSpeedLimitConfig.Periodic) * time.Second, + Execute: c.dynamicSpeedLimit, + } + go func() { + time.Sleep(time.Duration(c.config.DynamicSpeedLimitConfig.Periodic) * time.Second) + _ = c.DynamicSpeedLimitPeriodic.Start() + }() + log.Printf("[%s: %d] Start dynamic speed limit", c.nodeInfo.NodeType, c.nodeInfo.NodeId) + } + return nil +} + +// Close implement the Close() function of the service interface +func (c *Node) Close() error { + if c.nodeInfoMonitorPeriodic != nil { + err := c.nodeInfoMonitorPeriodic.Close() + if err != nil { + log.Panicf("node info periodic close failed: %s", err) + } + } + + if c.nodeInfoMonitorPeriodic != nil { + err := c.userReportPeriodic.Close() + if err != nil { + log.Panicf("user report periodic close failed: %s", err) + } + } + if c.onlineIpReportPeriodic != nil { + err := c.onlineIpReportPeriodic.Close() + if err != nil { + log.Panicf("online ip report periodic close failed: %s", err) + } + } + if c.DynamicSpeedLimitPeriodic != nil { + err := c.DynamicSpeedLimitPeriodic.Close() + if err != nil { + log.Panicf("dynamic speed limit periodic close failed: %s", err) + } + } + return nil +} + +func (c *Node) buildNodeTag() string { + return fmt.Sprintf("%s_%s_%d", c.nodeInfo.NodeType, c.config.ListenIP, c.nodeInfo.NodeId) +} diff --git a/node/node_test.go b/node/controller/node_test.go similarity index 96% rename from node/node_test.go rename to node/controller/node_test.go index a7a711a..7323fd5 100644 --- a/node/node_test.go +++ b/node/controller/node_test.go @@ -1,4 +1,4 @@ -package node_test +package controller_test import ( "fmt" @@ -6,7 +6,7 @@ import ( "github.com/Yuzuki616/V2bX/conf" "github.com/Yuzuki616/V2bX/core" _ "github.com/Yuzuki616/V2bX/core/distro/all" - . "github.com/Yuzuki616/V2bX/node" + . "github.com/Yuzuki616/V2bX/node/controller" xCore "github.com/xtls/xray-core/core" coreConf "github.com/xtls/xray-core/infra/conf" "os" diff --git a/node/outbound.go b/node/controller/outbound.go similarity index 98% rename from node/outbound.go rename to node/controller/outbound.go index abbb7f5..1195c17 100644 --- a/node/outbound.go +++ b/node/controller/outbound.go @@ -1,4 +1,4 @@ -package node +package controller import ( "encoding/json" diff --git a/node/task.go b/node/controller/task.go similarity index 99% rename from node/task.go rename to node/controller/task.go index b4ab3d6..7ce1e8e 100644 --- a/node/task.go +++ b/node/controller/task.go @@ -1,10 +1,10 @@ -package node +package controller import ( "fmt" "github.com/Yuzuki616/V2bX/api/panel" "github.com/Yuzuki616/V2bX/core/app/dispatcher" - "github.com/Yuzuki616/V2bX/node/legoCmd" + "github.com/Yuzuki616/V2bX/node/controller/legoCmd" "github.com/go-resty/resty/v2" "github.com/goccy/go-json" "github.com/xtls/xray-core/common/protocol" diff --git a/node/user.go b/node/controller/user.go similarity index 99% rename from node/user.go rename to node/controller/user.go index 7c0713c..aa4e0ea 100644 --- a/node/user.go +++ b/node/controller/user.go @@ -1,4 +1,4 @@ -package node +package controller import ( "fmt" diff --git a/node/node.go b/node/node.go index ae120bc..1c4fea8 100644 --- a/node/node.go +++ b/node/node.go @@ -1,160 +1,39 @@ package node import ( - "errors" - "fmt" "github.com/Yuzuki616/V2bX/api/panel" "github.com/Yuzuki616/V2bX/conf" "github.com/Yuzuki616/V2bX/core" - "github.com/xtls/xray-core/common/task" - "log" - "time" + "github.com/Yuzuki616/V2bX/node/controller" ) type Node struct { - server *core.Core - config *conf.ControllerConfig - clientInfo panel.ClientInfo - apiClient panel.Panel - nodeInfo *panel.NodeInfo - Tag string - userList []panel.UserInfo - nodeInfoMonitorPeriodic *task.Periodic - userReportPeriodic *task.Periodic - onlineIpReportPeriodic *task.Periodic - DynamicSpeedLimitPeriodic *task.Periodic + controllers []*controller.Node } -// New return a Node service with default parameters. -func New(server *core.Core, api panel.Panel, config *conf.ControllerConfig) *Node { - controller := &Node{ - server: server, - config: config, - apiClient: api, - } - return controller +func New() *Node { + return &Node{} } -// Start implement the Start() function of the service interface -func (c *Node) Start() error { - c.clientInfo = c.apiClient.Describe() - // First fetch Node Info - newNodeInfo, err := c.apiClient.GetNodeInfo() - if err != nil { - return fmt.Errorf("get node info failed: %s", err) - } - c.nodeInfo = newNodeInfo - c.Tag = c.buildNodeTag() - // Add new tag - err = c.addNewTag(newNodeInfo) - if err != nil { - return fmt.Errorf("add new tag failed: %s", err) - } - // Update user - c.userList, err = c.apiClient.GetUserList() - if err != nil { - return fmt.Errorf("get user list failed: %s", err) - } - if len(c.userList) == 0 { - return errors.New("add users failed: not have any user") - } - err = c.addNewUser(c.userList, newNodeInfo) - if err != nil { - return err - } - if err := c.server.AddInboundLimiter(c.Tag, c.nodeInfo); err != nil { - return fmt.Errorf("add inbound limiter failed: %s", err) - } - // Add Rule Manager - if !c.config.DisableGetRule { - if ruleList, err := c.apiClient.GetNodeRule(); err != nil { - log.Printf("Get rule list filed: %s", err) - } else if ruleList != nil { - if err := c.server.UpdateRule(c.Tag, ruleList); err != nil { - log.Printf("Update rule filed: %s", err) - } - } - } - // fetch node info task - c.nodeInfoMonitorPeriodic = &task.Periodic{ - Interval: time.Duration(c.config.UpdatePeriodic) * time.Second, - Execute: c.nodeInfoMonitor, - } - // fetch user list task - c.userReportPeriodic = &task.Periodic{ - Interval: time.Duration(c.config.UpdatePeriodic) * time.Second, - Execute: c.reportUserTraffic, - } - log.Printf("[%s: %d] Start monitor node status", c.nodeInfo.NodeType, c.nodeInfo.NodeId) - // delay to start nodeInfoMonitor - go func() { - time.Sleep(time.Duration(c.config.UpdatePeriodic) * time.Second) - _ = c.nodeInfoMonitorPeriodic.Start() - }() - - log.Printf("[%s: %d] Start report node status", c.nodeInfo.NodeType, c.nodeInfo.NodeId) - // delay to start userReport - go func() { - time.Sleep(time.Duration(c.config.UpdatePeriodic) * time.Second) - _ = c.userReportPeriodic.Start() - }() - if c.config.EnableIpRecorder { - // report and fetch online ip list task - c.onlineIpReportPeriodic = &task.Periodic{ - Interval: time.Duration(c.config.IpRecorderConfig.Periodic) * time.Second, - Execute: c.reportOnlineIp, - } - go func() { - time.Sleep(time.Duration(c.config.IpRecorderConfig.Periodic) * time.Second) - _ = c.onlineIpReportPeriodic.Start() - }() - log.Printf("[%s: %d] Start report online ip", c.nodeInfo.NodeType, c.nodeInfo.NodeId) - } - if c.config.EnableDynamicSpeedLimit { - // Check dynamic speed limit task - c.DynamicSpeedLimitPeriodic = &task.Periodic{ - Interval: time.Duration(c.config.DynamicSpeedLimitConfig.Periodic) * time.Second, - Execute: c.dynamicSpeedLimit, - } - go func() { - time.Sleep(time.Duration(c.config.DynamicSpeedLimitConfig.Periodic) * time.Second) - _ = c.DynamicSpeedLimitPeriodic.Start() - }() - log.Printf("[%s: %d] Start dynamic speed limit", c.nodeInfo.NodeType, c.nodeInfo.NodeId) - } - return nil -} - -// Close implement the Close() function of the service interface -func (c *Node) Close() error { - if c.nodeInfoMonitorPeriodic != nil { - err := c.nodeInfoMonitorPeriodic.Close() +func (n *Node) Start(nodes []*conf.NodeConfig, core *core.Core) error { + n.controllers = make([]*controller.Node, len(nodes)) + for i, c := range nodes { + // Register controller service + n.controllers[i] = controller.New(core, panel.New(c.ApiConfig), c.ControllerConfig) + err := n.controllers[i].Start() if err != nil { - log.Panicf("node info periodic close failed: %s", err) - } - } - - if c.nodeInfoMonitorPeriodic != nil { - err := c.userReportPeriodic.Close() - if err != nil { - log.Panicf("user report periodic close failed: %s", err) - } - } - if c.onlineIpReportPeriodic != nil { - err := c.onlineIpReportPeriodic.Close() - if err != nil { - log.Panicf("online ip report periodic close failed: %s", err) - } - } - if c.DynamicSpeedLimitPeriodic != nil { - err := c.DynamicSpeedLimitPeriodic.Close() - if err != nil { - log.Panicf("dynamic speed limit periodic close failed: %s", err) + return err } } return nil } -func (c *Node) buildNodeTag() string { - return fmt.Sprintf("%s_%s_%d", c.nodeInfo.NodeType, c.config.ListenIP, c.nodeInfo.NodeId) +func (n *Node) Close() { + for _, c := range n.controllers { + err := c.Close() + if err != nil { + panic(err) + } + } + n.controllers = nil }