feat(update): ✨ sync command with project latest
This commit is contained in:
parent
4d7c7df9cf
commit
231e0aaf51
1
.gitignore
vendored
1
.gitignore
vendored
@ -40,3 +40,4 @@
|
|||||||
/logs/
|
/logs/
|
||||||
*/logs/
|
*/logs/
|
||||||
/conf/
|
/conf/
|
||||||
|
/bin
|
60
Makefile
Normal file
60
Makefile
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
## 编译器
|
||||||
|
#GO=go
|
||||||
|
#
|
||||||
|
## 编译选项
|
||||||
|
#GOFLAGS=-v
|
||||||
|
|
||||||
|
NODE=npm
|
||||||
|
|
||||||
|
# 源文件
|
||||||
|
SRC=main.go
|
||||||
|
|
||||||
|
NAME=demo-server
|
||||||
|
|
||||||
|
# 目标文件
|
||||||
|
BIN=bin/$(NAME)
|
||||||
|
WEB_PATH=gui
|
||||||
|
WEB_DST=../internal/server/ext/web
|
||||||
|
|
||||||
|
################ 构建并启动 ########################
|
||||||
|
run-web: b-web b-dev run
|
||||||
|
dev: b-dev run
|
||||||
|
|
||||||
|
test: build test-run
|
||||||
|
|
||||||
|
################ 构建 #############################
|
||||||
|
build:
|
||||||
|
go build -o $(BIN) $(SRC)
|
||||||
|
|
||||||
|
b-web:
|
||||||
|
cd $(WEB_PATH) && $(NODE) install && $(NODE) run build \
|
||||||
|
&& rm -rf $(WEB_DST) && mv dist $(WEB_DST)
|
||||||
|
|
||||||
|
b-dev:
|
||||||
|
go build -o $(BIN) -tags "web swag" $(SRC)
|
||||||
|
|
||||||
|
#### 辅助工具 ######################################
|
||||||
|
swag-install:
|
||||||
|
go install github.com/swaggo/swag/cmd/swag@latest
|
||||||
|
|
||||||
|
swag:
|
||||||
|
swag fmt
|
||||||
|
swag init
|
||||||
|
|
||||||
|
############## 启动 #############################
|
||||||
|
run:
|
||||||
|
$(BIN) svr
|
||||||
|
|
||||||
|
# 测试
|
||||||
|
test-run:
|
||||||
|
$(BIN) --conf test/
|
||||||
|
|
||||||
|
# 清除
|
||||||
|
clean:
|
||||||
|
rm -rf $(BIN)
|
||||||
|
|
||||||
|
clean-app:
|
||||||
|
rm -rf ./app
|
||||||
|
|
||||||
|
clean-web:
|
||||||
|
rm -rf $(WEB_DST)
|
@ -1,77 +0,0 @@
|
|||||||
package init
|
|
||||||
|
|
||||||
//import (
|
|
||||||
// "btdp-agent-admin/internal/config"
|
|
||||||
// "btdp-agent-admin/internal/dao"
|
|
||||||
// "btdp-agent-admin/internal/dao/db"
|
|
||||||
// "btdp-agent-admin/internal/dao/group"
|
|
||||||
// "btdp-agent-admin/internal/dao/instance"
|
|
||||||
// "btdp-agent-admin/internal/dao/log"
|
|
||||||
// "btdp-agent-admin/internal/model"
|
|
||||||
//)
|
|
||||||
//
|
|
||||||
//var (
|
|
||||||
// d *daoPolymer
|
|
||||||
//)
|
|
||||||
//
|
|
||||||
//func getDaoPolymer() dao.Interface {
|
|
||||||
// return d
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//type daoPolymer struct {
|
|
||||||
// cli *db.Cli
|
|
||||||
// group group.Dao
|
|
||||||
// agent instance.Dao
|
|
||||||
// log log.Dao
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//func initDaoPolymer(cli *db.Cli) {
|
|
||||||
// d = &daoPolymer{
|
|
||||||
// cli: cli,
|
|
||||||
// group: group.New(cli),
|
|
||||||
// agent: instance.New(cli),
|
|
||||||
// log: log.New(cli),
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//func (d *daoPolymer) GetGroupDao() group.Dao {
|
|
||||||
// return d.group
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//func (d *daoPolymer) GetInstanceDao() instance.Dao {
|
|
||||||
// return d.agent
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//func (d *daoPolymer) GetLogDao() log.Dao {
|
|
||||||
// return d.log
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// 初始化数据库,通过 getDaoPolymer 得到聚合体
|
|
||||||
//func initDB() (err error) {
|
|
||||||
// cfg := config.Get()
|
|
||||||
//
|
|
||||||
// if cfg == nil || cfg.DB == nil {
|
|
||||||
// return ErrorInitFundamental
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// var (
|
|
||||||
// cli *db.Cli
|
|
||||||
// cfgDB = cfg.DB
|
|
||||||
// )
|
|
||||||
//
|
|
||||||
// if cli, err = db.New(cfgDB); err != nil {
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// initDaoPolymer(cli)
|
|
||||||
// return
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//func initDBTables() (err error) {
|
|
||||||
// orm := d.cli.Orm()
|
|
||||||
// err = orm.Exec(model.DBSQLInit).Error
|
|
||||||
// if config.Get().DB.Type == model.DBTypeSQLITE {
|
|
||||||
// orm.Exec(model.DBSQLConfigSQLite)
|
|
||||||
// }
|
|
||||||
// return
|
|
||||||
//}
|
|
@ -1,4 +1,4 @@
|
|||||||
package init
|
package inits
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
@ -1,4 +1,4 @@
|
|||||||
package init
|
package inits
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"demo-server/internal/config"
|
"demo-server/internal/config"
|
68
cmd/inits/db.go
Normal file
68
cmd/inits/db.go
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
package inits
|
||||||
|
|
||||||
|
import (
|
||||||
|
"demo-server/internal/dao"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
d *daoPolymer
|
||||||
|
)
|
||||||
|
|
||||||
|
func getDaoPolymer() dao.Interface {
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
type daoPolymer struct {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func initDaoPolymer() {
|
||||||
|
d = &daoPolymer{
|
||||||
|
//cli: cli,
|
||||||
|
//group: group.New(cli),
|
||||||
|
//agent: instance.New(cli),
|
||||||
|
//log: log.New(cli),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//func (d *daoPolymer) GetGroupDao() group.Dao {
|
||||||
|
// return d.group
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//func (d *daoPolymer) GetInstanceDao() instance.Dao {
|
||||||
|
// return d.agent
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//func (d *daoPolymer) GetLogDao() log.Dao {
|
||||||
|
// return d.log
|
||||||
|
//}
|
||||||
|
|
||||||
|
// 初始化数据库,通过 getDaoPolymer 得到聚合体
|
||||||
|
func initDB() (err error) {
|
||||||
|
//cfg := config.Get()
|
||||||
|
//
|
||||||
|
//if cfg == nil || cfg.DB == nil {
|
||||||
|
// return ErrorInitFundamental
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//var (
|
||||||
|
// cli *db.Cli
|
||||||
|
// cfgDB = cfg.DB
|
||||||
|
//)
|
||||||
|
//
|
||||||
|
//if cli, err = db.New(cfgDB); err != nil {
|
||||||
|
// return
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//initDaoPolymer(cli)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func initDBTables() (err error) {
|
||||||
|
//orm := d.cli.Orm()
|
||||||
|
//err = orm.Exec(model.DBSQLInit).Error
|
||||||
|
//if config.Get().DB.Type == model.DBTypeSQLITE {
|
||||||
|
// orm.Exec(model.DBSQLConfigSQLite)
|
||||||
|
//}
|
||||||
|
return
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package init
|
package inits
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"demo-server/internal/config"
|
"demo-server/internal/config"
|
55
cmd/inits/service.go
Normal file
55
cmd/inits/service.go
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package inits
|
||||||
|
|
||||||
|
import (
|
||||||
|
"demo-server/internal/config"
|
||||||
|
"demo-server/internal/service"
|
||||||
|
|
||||||
|
//"demo-server/internal/manager/kafka"
|
||||||
|
//"demo-server/internal/service"
|
||||||
|
//"demo-server/internal/service/group"
|
||||||
|
//"demo-server/internal/service/instance"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
svc *servicePolymer
|
||||||
|
)
|
||||||
|
|
||||||
|
type servicePolymer struct {
|
||||||
|
//group *group.Service
|
||||||
|
//instance *instance.Service
|
||||||
|
}
|
||||||
|
//
|
||||||
|
//func (s servicePolymer) GetGroupService() *group.Service {
|
||||||
|
// return s.group
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//func (s servicePolymer) GetInstanceService() *instance.Service {
|
||||||
|
// return s.instance
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//func (s servicePolymer) SetKafka(ka kafka.Manager) {
|
||||||
|
// s.GetInstanceService().SetKafka(ka)
|
||||||
|
// s.GetGroupService().SetKafka(ka)
|
||||||
|
//}
|
||||||
|
|
||||||
|
func GetSvcPolymer() service.Interface {
|
||||||
|
return svc
|
||||||
|
}
|
||||||
|
|
||||||
|
func initService() (err error) {
|
||||||
|
dp := getDaoPolymer()
|
||||||
|
conf := config.Get()
|
||||||
|
|
||||||
|
if dp == nil || conf == nil {
|
||||||
|
err = ErrorInitFundamental
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
svc = &servicePolymer{
|
||||||
|
//instance: instance.New(dp),
|
||||||
|
//group: group.New(dp),
|
||||||
|
}
|
||||||
|
|
||||||
|
//svc.group.SetISvc(svc.instance)
|
||||||
|
return
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"demo-server/cmd/inits"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -34,7 +35,7 @@ func Execute() {
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
cobra.OnInitialize(func() {
|
cobra.OnInitialize(func() {
|
||||||
err := InitFundamental()
|
err := inits.InitFundamental()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
69
cmd/svr.go
69
cmd/svr.go
@ -2,71 +2,70 @@ package cmd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"demo-server/cmd/inits"
|
||||||
|
"demo-server/internal/config"
|
||||||
"demo-server/internal/model"
|
"demo-server/internal/model"
|
||||||
"demo-server/internal/server"
|
"demo-server/internal/server"
|
||||||
|
"fmt"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"net/http"
|
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"syscall"
|
"syscall"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
// svrCmd represents the svr command
|
// svrCmd represents the svr command
|
||||||
// go build -ldflags "-w -s" -o packet-admin.out . && ./packet-admin.out svr
|
// go build -ldflags "-w -s" -o packet-admin.out . && ./packet-admin.out svr
|
||||||
var svrCmd = &cobra.Command{
|
var svrCmd = &cobra.Command{
|
||||||
Use: "svr",
|
Use: "svr",
|
||||||
Short: "server run",
|
Short: "server run",
|
||||||
Long: `server run,default on ` + model.DefaultServerAddress,
|
Long: `server run,default on ` + model.DefaultServerAddress + `
|
||||||
Run: RunSvr,
|
flag: -d don't run stub'
|
||||||
|
`,
|
||||||
|
Run: runSvr,
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
rootCmd.AddCommand(svrCmd)
|
rootCmd.AddCommand(svrCmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RunSvr 启动 server
|
// runSvr 启动 server
|
||||||
func RunSvr(_ *cobra.Command, _ []string) {
|
func runSvr(_ *cobra.Command, _ []string) {
|
||||||
if err := InitServer(); err != nil {
|
if err := inits.InitServer(); err != nil {
|
||||||
zap.S().Panicf("init svr err, cause: %v", err)
|
panic(fmt.Errorf("init svr err, cause: %w", err))
|
||||||
}
|
}
|
||||||
|
runServer()
|
||||||
runHttpServer()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func runHttpServer() {
|
func runServer() {
|
||||||
var httpServer *http.Server
|
conf := config.Get()
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
svc := inits.GetSvcPolymer()
|
||||||
|
if conf == nil || conf.Svr == nil || svc == nil {
|
||||||
defer func() {
|
zap.S().Error("server conf nil!", inits.ErrorInitFundamental)
|
||||||
if httpServer == nil {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err := httpServer.Shutdown(ctx)
|
|
||||||
|
|
||||||
if err != nil {
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
zap.S().Errorf("server stop error(%v)", err)
|
|
||||||
}
|
//ka := kafka.NewManager(ctx, conf.Kafka)
|
||||||
}()
|
//svc.SetKafka(ka)
|
||||||
|
svr := server.New(conf)
|
||||||
|
|
||||||
|
go svr.Run()
|
||||||
|
svr.SvrRunSuccessMsg()
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
select {
|
if err := svr.Shutdown(ctx); err != nil {
|
||||||
case <-ctx.Done():
|
zap.S().Error(err)
|
||||||
default:
|
|
||||||
cancel()
|
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
config := config.GetConfig()
|
signalWatch(ctx, cancel)
|
||||||
if config == nil || config.Svr == nil {
|
|
||||||
zap.S().Panic("server config nil!", ErrorInitFundamental)
|
|
||||||
}
|
|
||||||
httpServer = server.RunServer(config, cancel)
|
|
||||||
|
|
||||||
SignalWatchWithContext(ctx, cancel)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func SignalWatchWithContext(ctx context.Context, cancel context.CancelFunc) {
|
// signalWatch 阻塞主进程
|
||||||
|
func signalWatch(ctx context.Context, cancel context.CancelFunc) {
|
||||||
sigterm := make(chan os.Signal, 1)
|
sigterm := make(chan os.Signal, 1)
|
||||||
signal.Notify(sigterm, syscall.SIGINT, syscall.SIGTERM)
|
signal.Notify(sigterm, syscall.SIGINT, syscall.SIGTERM)
|
||||||
select {
|
select {
|
||||||
@ -77,9 +76,3 @@ func SignalWatchWithContext(ctx context.Context, cancel context.CancelFunc) {
|
|||||||
zap.S().Infof("terminating: via signal")
|
zap.S().Infof("terminating: via signal")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func SignalWatch() {
|
|
||||||
sigterm := make(chan os.Signal, 1)
|
|
||||||
sig := <-sigterm
|
|
||||||
zap.S().Infof("terminating: via signal, %v", sig)
|
|
||||||
}
|
|
||||||
|
12
go.mod
12
go.mod
@ -7,11 +7,14 @@ require (
|
|||||||
github.com/gin-contrib/pprof v1.4.0
|
github.com/gin-contrib/pprof v1.4.0
|
||||||
github.com/gin-contrib/zap v0.1.0
|
github.com/gin-contrib/zap v0.1.0
|
||||||
github.com/gin-gonic/gin v1.8.1
|
github.com/gin-gonic/gin v1.8.1
|
||||||
|
github.com/goccy/go-json v0.10.0
|
||||||
github.com/google/uuid v1.3.0
|
github.com/google/uuid v1.3.0
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/prometheus/client_golang v1.14.0
|
github.com/prometheus/client_golang v1.14.0
|
||||||
|
github.com/segmentio/kafka-go v0.4.40
|
||||||
github.com/spf13/cobra v1.6.1
|
github.com/spf13/cobra v1.6.1
|
||||||
github.com/spf13/viper v1.14.0
|
github.com/spf13/viper v1.14.0
|
||||||
|
github.com/swaggo/files v1.0.1
|
||||||
github.com/vearutop/statigz v1.2.0
|
github.com/vearutop/statigz v1.2.0
|
||||||
go.uber.org/zap v1.24.0
|
go.uber.org/zap v1.24.0
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0
|
||||||
@ -26,13 +29,13 @@ require (
|
|||||||
github.com/go-playground/locales v0.14.0 // indirect
|
github.com/go-playground/locales v0.14.0 // indirect
|
||||||
github.com/go-playground/universal-translator v0.18.0 // indirect
|
github.com/go-playground/universal-translator v0.18.0 // indirect
|
||||||
github.com/go-playground/validator/v10 v10.11.1 // indirect
|
github.com/go-playground/validator/v10 v10.11.1 // indirect
|
||||||
github.com/goccy/go-json v0.10.0 // indirect
|
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.0.1 // indirect
|
github.com/inconshreveable/mousetrap v1.0.1 // indirect
|
||||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
github.com/jinzhu/now v1.1.5 // indirect
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
|
github.com/klauspost/compress v1.15.9 // indirect
|
||||||
github.com/leodido/go-urn v1.2.1 // indirect
|
github.com/leodido/go-urn v1.2.1 // indirect
|
||||||
github.com/magiconair/properties v1.8.6 // indirect
|
github.com/magiconair/properties v1.8.6 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.16 // indirect
|
github.com/mattn/go-isatty v0.0.16 // indirect
|
||||||
@ -42,6 +45,7 @@ require (
|
|||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/pelletier/go-toml v1.9.5 // indirect
|
github.com/pelletier/go-toml v1.9.5 // indirect
|
||||||
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
|
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
|
||||||
|
github.com/pierrec/lz4/v4 v4.1.15 // indirect
|
||||||
github.com/prometheus/client_model v0.3.0 // indirect
|
github.com/prometheus/client_model v0.3.0 // indirect
|
||||||
github.com/prometheus/common v0.37.0 // indirect
|
github.com/prometheus/common v0.37.0 // indirect
|
||||||
github.com/prometheus/procfs v0.8.0 // indirect
|
github.com/prometheus/procfs v0.8.0 // indirect
|
||||||
@ -56,9 +60,9 @@ require (
|
|||||||
go.uber.org/atomic v1.10.0 // indirect
|
go.uber.org/atomic v1.10.0 // indirect
|
||||||
go.uber.org/multierr v1.8.0 // indirect
|
go.uber.org/multierr v1.8.0 // indirect
|
||||||
golang.org/x/crypto v0.4.0 // indirect
|
golang.org/x/crypto v0.4.0 // indirect
|
||||||
golang.org/x/net v0.4.0 // indirect
|
golang.org/x/net v0.7.0 // indirect
|
||||||
golang.org/x/sys v0.3.0 // indirect
|
golang.org/x/sys v0.5.0 // indirect
|
||||||
golang.org/x/text v0.5.0 // indirect
|
golang.org/x/text v0.7.0 // indirect
|
||||||
google.golang.org/protobuf v1.28.1 // indirect
|
google.golang.org/protobuf v1.28.1 // indirect
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
36
go.sum
36
go.sum
@ -200,6 +200,8 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X
|
|||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
|
github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY=
|
||||||
|
github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
||||||
@ -237,6 +239,8 @@ github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCko
|
|||||||
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
|
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
|
||||||
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
|
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
|
||||||
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
|
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
|
||||||
|
github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0=
|
||||||
|
github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
@ -276,6 +280,8 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE
|
|||||||
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
|
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
|
||||||
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
|
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
|
github.com/segmentio/kafka-go v0.4.40 h1:sszW7c0/uyv7+VcTW5trx2ZC7kMWDTxuR/6Zn8U1bm8=
|
||||||
|
github.com/segmentio/kafka-go v0.4.40/go.mod h1:naFEZc5MQKdeL3W6NkZIAn48Y6AazqjRFDhnXeg3h94=
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||||
@ -307,16 +313,25 @@ github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKs
|
|||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=
|
github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=
|
||||||
github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
|
github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
|
||||||
|
github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
|
||||||
|
github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg=
|
||||||
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
|
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
|
||||||
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
|
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
|
||||||
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
|
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
|
||||||
github.com/vearutop/statigz v1.2.0 h1:GGBHsDF3KnJBE6UmhvYdRg58ok9boQX/R+nUGRWPMXM=
|
github.com/vearutop/statigz v1.2.0 h1:GGBHsDF3KnJBE6UmhvYdRg58ok9boQX/R+nUGRWPMXM=
|
||||||
github.com/vearutop/statigz v1.2.0/go.mod h1:jqlOPvLAdiQktMtYAkyguI3Ee0FA26iXKeEx2pS5l88=
|
github.com/vearutop/statigz v1.2.0/go.mod h1:jqlOPvLAdiQktMtYAkyguI3Ee0FA26iXKeEx2pS5l88=
|
||||||
|
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
|
||||||
|
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
||||||
|
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
|
||||||
|
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
|
||||||
|
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
|
||||||
|
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
|
||||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
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.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
@ -350,6 +365,7 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
|
|||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8=
|
golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8=
|
||||||
@ -388,6 +404,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|||||||
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@ -426,8 +443,9 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx
|
|||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
|
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
|
||||||
|
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
@ -450,6 +468,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@ -499,12 +518,15 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||||||
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/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-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
|
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
||||||
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
|
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@ -513,8 +535,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|||||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
|
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
||||||
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
|
||||||
|
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
@ -566,6 +589,7 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f
|
|||||||
golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
||||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
5
internal/dao/interface.go
Normal file
5
internal/dao/interface.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package dao
|
||||||
|
|
||||||
|
type Interface interface {
|
||||||
|
|
||||||
|
}
|
@ -2,22 +2,32 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"demo-server/internal/model"
|
"demo-server/internal/model"
|
||||||
"github.com/gin-contrib/pprof"
|
"demo-server/internal/server/ext"
|
||||||
|
"demo-server/pkg/log"
|
||||||
gzap "github.com/gin-contrib/zap"
|
gzap "github.com/gin-contrib/zap"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"runtime"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type handler func(s *Server)
|
type handler func(s *Server)
|
||||||
|
|
||||||
func (s *Server) Init(hs ...handler) {
|
func (s *Server) init(hs ...handler) {
|
||||||
for _, h := range hs {
|
for _, h := range hs {
|
||||||
h(s)
|
h(s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Server) Init() {
|
||||||
|
s.init(
|
||||||
|
InitEngine, // gin
|
||||||
|
InitHttpSvr, // http
|
||||||
|
InitExt, // ext
|
||||||
|
InitRouter, // router
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
func InitEngine(s *Server) {
|
func InitEngine(s *Server) {
|
||||||
config := s.cfg.Svr
|
config := s.cfg.Svr
|
||||||
if config.Address == "" {
|
if config.Address == "" {
|
||||||
@ -29,11 +39,9 @@ func InitEngine(s *Server) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
eng := gin.New()
|
eng := gin.New()
|
||||||
s.Engine = eng
|
s.engine = eng
|
||||||
|
|
||||||
gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) {
|
gin.DebugPrintRouteFunc = log.GinRouter
|
||||||
zap.S().Infof("%v\t%v\t%v\t%v", httpMethod, absolutePath, handlerName, nuHandlers)
|
|
||||||
}
|
|
||||||
|
|
||||||
eng.Use(gzap.Ginzap(zap.L(), time.RFC3339, true))
|
eng.Use(gzap.Ginzap(zap.L(), time.RFC3339, true))
|
||||||
eng.Use(gzap.RecoveryWithZap(zap.L(), true))
|
eng.Use(gzap.RecoveryWithZap(zap.L(), true))
|
||||||
@ -42,12 +50,21 @@ func InitEngine(s *Server) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func InitRouter(s *Server) {
|
func InitRouter(s *Server) {
|
||||||
if s.cfg.Svr.PprofOn {
|
s.router(s.engine)
|
||||||
runtime.SetMutexProfileFraction(1)
|
}
|
||||||
runtime.SetBlockProfileRate(1)
|
|
||||||
pprof.Register(s.Engine)
|
func InitExt(s *Server) {
|
||||||
|
ext.Init(s.engine, s.GetCfg())
|
||||||
|
}
|
||||||
|
|
||||||
|
func InitHttpSvr(s *Server) {
|
||||||
|
httpSvr := &http.Server{
|
||||||
|
Addr: s.cfg.Svr.Address,
|
||||||
|
Handler: s.engine,
|
||||||
|
ReadTimeout: 120 * time.Second,
|
||||||
|
WriteTimeout: 120 * time.Second,
|
||||||
|
MaxHeaderBytes: 1 << 20,
|
||||||
}
|
}
|
||||||
|
|
||||||
API(s)
|
s.httpSvr = httpSvr
|
||||||
GUI(s)
|
|
||||||
}
|
}
|
||||||
|
@ -2,65 +2,57 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
|
||||||
"github.com/vearutop/statigz"
|
|
||||||
"go.uber.org/zap"
|
|
||||||
"io"
|
|
||||||
"io/fs"
|
|
||||||
"net/http"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func GUI(s *Server) {
|
func (s *Server) router(e *gin.Engine) {
|
||||||
r := s.Engine
|
base := e.Group("/api")
|
||||||
webFS, err := fs.Sub(webRootFS, "web")
|
apiV1 := base.Group("/v1")
|
||||||
if err != nil {
|
|
||||||
zap.S().Panic("init gui err, cause: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
guiStaticResource(r, webFS)
|
|
||||||
guiIndexHTML(r, webFS)
|
|
||||||
}
|
|
||||||
|
|
||||||
func guiStaticResource(r *gin.Engine, sfs fs.FS) {
|
|
||||||
|
|
||||||
const (
|
|
||||||
staticPrefix = "/assets"
|
|
||||||
stripPrefix = ""
|
|
||||||
)
|
|
||||||
|
|
||||||
staticResource := http.StripPrefix(stripPrefix, statigz.FileServer(sfs.(fs.ReadDirFS)))
|
|
||||||
r.GET(staticPrefix+"/*w", func(c *gin.Context) {
|
|
||||||
staticResource.ServeHTTP(c.Writer, c.Request)
|
|
||||||
})
|
|
||||||
r.GET("/favicon.ico", func(c *gin.Context) {
|
|
||||||
staticResource.ServeHTTP(c.Writer, c.Request)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func guiIndexHTML(r *gin.Engine, sfs fs.FS) {
|
|
||||||
var indexHTML []byte
|
|
||||||
{
|
{
|
||||||
const indexFileName = "index.html"
|
apiV1.GET("/ping", func(c *gin.Context) {
|
||||||
index, err := sfs.Open(indexFileName)
|
c.String(200, "alive")
|
||||||
if err != nil {
|
})
|
||||||
zap.S().Panicf("open [%s] err! cause: %e", indexFileName, err)
|
|
||||||
}
|
|
||||||
indexHTML, err = io.ReadAll(index)
|
|
||||||
if err != nil {
|
|
||||||
zap.S().Panicf("read [%s] err! cause: %e", indexFileName, err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
r.GET("/", html(indexHTML))
|
//s.bindGroupRouter(apiV1.Group("/group"))
|
||||||
|
//s.bindAgentRouter(apiV1.Group("/instance"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func API(s *Server) {
|
//func (s *Server) bindGroupRouter(r *gin.RouterGroup) {
|
||||||
r := s.Engine
|
// group := s.group
|
||||||
r.GET("/metrics", gin.WrapH(promhttp.Handler()))
|
//
|
||||||
|
// r.GET("/list", api(group.List()))
|
||||||
apiGroup := r.Group("/api")
|
// r.POST("/new", api(group.New()))
|
||||||
{
|
//
|
||||||
v1 := apiGroup.Group("/v1")
|
// byID := r.Group("/:id")
|
||||||
_ = v1
|
// // manage relation
|
||||||
}
|
// byID.PUT("/join", api(group.Join()))
|
||||||
}
|
// byID.DELETE("/delete", api(group.Delete()))
|
||||||
|
// byID.GET("/list", api(group.ListInstance()))
|
||||||
|
// // batch operation
|
||||||
|
// byID.POST("/up", api(group.Up()))
|
||||||
|
// byID.POST("/down", api(group.Down()))
|
||||||
|
// byID.POST("/update", api(group.Update()))
|
||||||
|
// // config
|
||||||
|
// byID.GET("/config", api(group.GetConfig()))
|
||||||
|
// byID.POST("/config", api(group.SaveConfig()))
|
||||||
|
// byID.POST("/save", api(group.Save()))
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//func (s *Server) bindAgentRouter(r *gin.RouterGroup) {
|
||||||
|
// agent := s.instance
|
||||||
|
//
|
||||||
|
// r.POST("/up", api(agent.BatchUp()))
|
||||||
|
// r.POST("/down", api(agent.BatchDown()))
|
||||||
|
// r.POST("/update", api(agent.Update()))
|
||||||
|
// r.DELETE("/delete", api(agent.Delete()))
|
||||||
|
//
|
||||||
|
// byID := r.Group("/:id")
|
||||||
|
// byID.GET("/config", api(agent.GetConfig()))
|
||||||
|
// byID.GET("/info", api(agent.Info()))
|
||||||
|
// byID.GET("/log", api(agent.Log()))
|
||||||
|
// // operation
|
||||||
|
// byID.POST("/up", api(agent.Up()))
|
||||||
|
// byID.POST("/down", api(agent.Down()))
|
||||||
|
// byID.POST("/update", api(agent.Update()))
|
||||||
|
// byID.DELETE("/delete", api(agent.Delete()))
|
||||||
|
//}
|
||||||
|
@ -2,18 +2,17 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"demo-server/internal/model"
|
"demo-server/internal/config"
|
||||||
"demo-server/internal/model/server"
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
cfg *model.Configuration
|
cfg *config.Configuration
|
||||||
*gin.Engine
|
engine *gin.Engine
|
||||||
|
httpSvr *http.Server
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -24,53 +23,40 @@ func GetSvr() *Server {
|
|||||||
return svr
|
return svr
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSvr(cfg *model.Configuration) *Server {
|
func New(cfg *config.Configuration) *Server {
|
||||||
s := &Server{
|
s := &Server{
|
||||||
cfg: cfg,
|
cfg: cfg,
|
||||||
}
|
}
|
||||||
s.Init(InitEngine, InitRouter)
|
s.Init()
|
||||||
|
|
||||||
svr = s
|
svr = s
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
// RunServer 如果初始化失败 cancel
|
func (s *Server) Run() {
|
||||||
func RunServer(cfg *model.Configuration, cancel context.CancelFunc) (httpServer *http.Server) {
|
if err := s.httpSvr.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||||||
s := NewSvr(cfg)
|
panic(err)
|
||||||
|
|
||||||
svrConfig := cfg.Svr
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
cancel()
|
|
||||||
} else {
|
|
||||||
serverRunSuccess(svrConfig)
|
|
||||||
}
|
}
|
||||||
}()
|
}
|
||||||
|
|
||||||
httpSvr := &http.Server{
|
func (s *Server) Shutdown(ctx context.Context) (err error) {
|
||||||
Addr: svrConfig.Address,
|
if s.httpSvr == nil {
|
||||||
Handler: s.Engine,
|
return
|
||||||
ReadTimeout: 120 * time.Second,
|
|
||||||
WriteTimeout: 120 * time.Second,
|
|
||||||
MaxHeaderBytes: 1 << 20,
|
|
||||||
}
|
}
|
||||||
|
err = s.httpSvr.Shutdown(ctx)
|
||||||
httpServer = httpSvr
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
if err := httpSvr.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
|
||||||
zap.S().Panicf("run server err! %v", err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func serverRunSuccess(svr *server.Config) {
|
func (s *Server) SvrRunSuccessMsg() {
|
||||||
|
svr := s.cfg.Svr
|
||||||
printIPInfo := func(adds ...string) {
|
printIPInfo := func(adds ...string) {
|
||||||
info := "svr running, via"
|
info := "svr running, via"
|
||||||
for _, add := range adds {
|
for _, add := range adds {
|
||||||
info += "\n\thttp://" + add
|
info += "\n\thttp://" + add
|
||||||
}
|
}
|
||||||
|
if len(adds) > 0 {
|
||||||
|
info += "\n\tvia doc at http://" + adds[0] + "/swagger"
|
||||||
|
}
|
||||||
zap.S().Info(info)
|
zap.S().Info(info)
|
||||||
}
|
}
|
||||||
ip, port, _ := net.SplitHostPort(svr.Address)
|
ip, port, _ := net.SplitHostPort(svr.Address)
|
||||||
@ -78,7 +64,7 @@ func serverRunSuccess(svr *server.Config) {
|
|||||||
if net.ParseIP(ip).IsUnspecified() && err == nil {
|
if net.ParseIP(ip).IsUnspecified() && err == nil {
|
||||||
var successAddress []string
|
var successAddress []string
|
||||||
for _, addr := range adders {
|
for _, addr := range adders {
|
||||||
if ipNet, ok := addr.(*net.IPNet); ok {
|
if ipNet, ok := addr.(*net.IPNet); ok && (ipNet.IP.IsPrivate()) {
|
||||||
successAddress = append(successAddress, net.JoinHostPort(ipNet.IP.String(), port))
|
successAddress = append(successAddress, net.JoinHostPort(ipNet.IP.String(), port))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -88,8 +74,12 @@ func serverRunSuccess(svr *server.Config) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Server) GetCfg() *config.Configuration {
|
||||||
|
return s.cfg
|
||||||
|
}
|
||||||
|
|
||||||
// Dispatch 当配置文件更新的时候可以去调用
|
// Dispatch 当配置文件更新的时候可以去调用
|
||||||
// 目前使用的全局 config 指针的方式如果发生更改,理论上 server 关联的 model 内置指针对象也会被更改
|
// 目前使用的全局 config 指针的方式如果发生更改,理论上 server 关联的 model 内置指针对象也会被更改
|
||||||
// 需要重新初始化的部分将由本函数予以实现
|
// 需要重新初始化的部分将由本函数予以实现
|
||||||
func (s *Server) Dispatch(_ *model.Configuration) {
|
func (s *Server) Dispatch(_ *config.Configuration) {
|
||||||
}
|
}
|
||||||
|
@ -1,42 +0,0 @@
|
|||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/md5"
|
|
||||||
"demo-server/pkg"
|
|
||||||
"embed"
|
|
||||||
"fmt"
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
embed static web learn from opensource license MIT
|
|
||||||
see "github.com/v2rayA/v2rayA/server/router/index.go"
|
|
||||||
*/
|
|
||||||
|
|
||||||
// webRootFS 嵌入静态文件
|
|
||||||
//
|
|
||||||
//go:embed web
|
|
||||||
var webRootFS embed.FS
|
|
||||||
|
|
||||||
// html 缓存 HTML 页面
|
|
||||||
func html(html []byte) func(ctx *gin.Context) {
|
|
||||||
etag := fmt.Sprintf("W/%x", md5.Sum(html))
|
|
||||||
h := pkg.B2S(html)
|
|
||||||
return func(ctx *gin.Context) {
|
|
||||||
if ctx.IsAborted() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
ctx.Header("Content-Type", "text/html; charset=utf-8")
|
|
||||||
ctx.Header("Cache-Control", "public, must-revalidate")
|
|
||||||
ctx.Header("ETag", etag)
|
|
||||||
if match := ctx.GetHeader("If-None-Match"); match != "" {
|
|
||||||
if strings.Contains(match, etag) {
|
|
||||||
ctx.Status(http.StatusNotModified)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ctx.String(http.StatusOK, h)
|
|
||||||
}
|
|
||||||
}
|
|
5
internal/service/interface.go
Normal file
5
internal/service/interface.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
type Interface interface {
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user