Feat: add backend enabled and disabled

pull/47/head
zijiren233 2 years ago
parent 9959df32be
commit 2665ebddbf

@ -9,8 +9,8 @@ require (
github.com/gin-gonic/gin v1.9.1
github.com/glebarez/sqlite v1.10.0
github.com/go-kratos/aegis v0.2.0
github.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20231216092143-856bc9a17b4a
github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20231216092143-856bc9a17b4a
github.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20231219111544-85740b179b09
github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20231219111544-85740b179b09
github.com/go-kratos/kratos/v2 v2.7.2
github.com/go-resty/resty/v2 v2.10.0
github.com/golang-jwt/jwt/v4 v4.5.0
@ -29,7 +29,7 @@ require (
github.com/sirupsen/logrus v1.9.3
github.com/soheilhy/cmux v0.1.5
github.com/spf13/cobra v1.8.0
github.com/synctv-org/vendors v0.1.1-0.20231219160707-b86154001009
github.com/synctv-org/vendors v0.1.1-0.20231222143031-9a863227415f
github.com/ulule/limiter/v3 v3.11.2
github.com/zencoder/go-dash/v3 v3.0.3
github.com/zijiren233/gencontainer v0.0.0-20231213075414-f7f4c8261dca
@ -39,10 +39,10 @@ require (
github.com/zijiren233/yaml-comment v0.2.1
go.etcd.io/etcd/client/v3 v3.5.11
golang.org/x/crypto v0.17.0
golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611
golang.org/x/exp v0.0.0-20231219180239-dc181d75b848
golang.org/x/oauth2 v0.15.0
google.golang.org/grpc v1.60.1
google.golang.org/protobuf v1.31.0
google.golang.org/protobuf v1.32.0
gopkg.in/yaml.v3 v3.0.1
gorm.io/driver/mysql v1.5.2
gorm.io/driver/postgres v1.5.4
@ -112,7 +112,7 @@ require (
github.com/ugorji/go/codec v1.2.12 // indirect
go.etcd.io/etcd/api/v3 v3.5.11 // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.11 // indirect
go.uber.org/mock v0.3.0 // indirect
go.uber.org/mock v0.4.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.26.0 // indirect
golang.org/x/arch v0.6.0 // indirect
@ -127,7 +127,7 @@ require (
google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
modernc.org/libc v1.37.6 // indirect
modernc.org/libc v1.38.0 // indirect
modernc.org/mathutil v1.6.0 // indirect
modernc.org/memory v1.7.2 // indirect
modernc.org/sqlite v1.28.0 // indirect

@ -79,16 +79,16 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kratos/aegis v0.2.0 h1:dObzCDWn3XVjUkgxyBp6ZeWtx/do0DPZ7LY3yNSJLUQ=
github.com/go-kratos/aegis v0.2.0/go.mod h1:v0R2m73WgEEYB3XYu6aE2WcMwsZkJ/Rzuf5eVccm7bI=
github.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20231216092143-856bc9a17b4a h1:j+JFB6IcA0+uslBlgo4q5zZgfYq4TciPo+QRrBIbXkE=
github.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20231216092143-856bc9a17b4a/go.mod h1:yb9i4gq3jCW5zMFqzi50J0Xh3n4MRbcMlnuDBXYpvjs=
github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20231216092143-856bc9a17b4a h1:3/xN+wgIuxYA3iSQhXxBaopz61z13ZDxYDrC57Mb69k=
github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20231216092143-856bc9a17b4a/go.mod h1:CiTe7H5Lj8WB6dGvBwS4HFukcWnobfq+vFWedIGYftA=
github.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20231219111544-85740b179b09 h1:CQLh4u2gVu4T6YqQTSw7Mg0tUAZpKpCbU9E43U9Ysew=
github.com/go-kratos/kratos/contrib/registry/consul/v2 v2.0.0-20231219111544-85740b179b09/go.mod h1:yb9i4gq3jCW5zMFqzi50J0Xh3n4MRbcMlnuDBXYpvjs=
github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20231219111544-85740b179b09 h1:4EK4o8ZmXalxUy2lVhXWIE8+AnzBR0GaBHJXzc8NqSw=
github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20231219111544-85740b179b09/go.mod h1:CiTe7H5Lj8WB6dGvBwS4HFukcWnobfq+vFWedIGYftA=
github.com/go-kratos/kratos/v2 v2.7.2 h1:WVPGFNLKpv+0odMnCPxM4ZHa2hy9I5FOnwpG3Vv4w5c=
github.com/go-kratos/kratos/v2 v2.7.2/go.mod h1:rppuc8+pGL2UtXA29bgFHWKqaaF6b6GB2XIYiDvFBRk=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
@ -348,8 +348,8 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/synctv-org/vendors v0.1.1-0.20231219160707-b86154001009 h1:iT6l+r8aPkjSWaXFYD1LrpaC+Vt6afpb3CvrynivyXw=
github.com/synctv-org/vendors v0.1.1-0.20231219160707-b86154001009/go.mod h1:C0ZGPeF8nYsx60gePPhSrgrjrONj6F72XFHW9Mh8+vU=
github.com/synctv-org/vendors v0.1.1-0.20231222143031-9a863227415f h1:31x5Kdga//iexaMtQo8dU1mPaIBIHnt/CiU+fuRXsMI=
github.com/synctv-org/vendors v0.1.1-0.20231222143031-9a863227415f/go.mod h1:CkgeP0V9bce02Yfl053rDy3IdAeILaanRPpN58A4VPc=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
@ -380,8 +380,8 @@ go.etcd.io/etcd/client/v3 v3.5.11 h1:ajWtgoNSZJ1gmS8k+icvPtqsqEav+iUorF7b0qozgUU
go.etcd.io/etcd/client/v3 v3.5.11/go.mod h1:a6xQUEqFJ8vztO1agJh/KQKOMfFI8og52ZconzcDJwE=
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo=
go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
@ -398,8 +398,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=
golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 h1:+iq7lrkxmFNBM7xx+Rae2W6uyPfhPeDWD+n+JgppptE=
golang.org/x/exp v0.0.0-20231219180239-dc181d75b848/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
@ -511,8 +511,8 @@ google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU=
google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@ -536,8 +536,8 @@ gorm.io/driver/postgres v1.5.4/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C
gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=
gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw=
modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE=
modernc.org/libc v1.38.0 h1:o4Lpk0zNDSdsjfEXnF1FGXWQ9PDi1NOdWcLP5n13FGo=
modernc.org/libc v1.38.0/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE=
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E=

@ -17,6 +17,22 @@ func CreateVendorBackend(backend *model.VendorBackend) error {
return db.Create(backend).Error
}
func EnableVendorBackend(endpoint string) error {
return db.Model(&model.VendorBackend{}).Where("backend_endpoint = ?", endpoint).Update("enabled", true).Error
}
func EnableVendorBackends(endpoints []string) error {
return db.Model(&model.VendorBackend{}).Where("backend_endpoint IN ?", endpoints).Update("enabled", true).Error
}
func DisableVendorBackend(endpoint string) error {
return db.Model(&model.VendorBackend{}).Where("backend_endpoint = ?", endpoint).Update("enabled", false).Error
}
func DisableVendorBackends(endpoints []string) error {
return db.Model(&model.VendorBackend{}).Where("backend_endpoint IN ?", endpoints).Update("enabled", false).Error
}
func DeleteVendorBackend(endpoint string) error {
return db.Where("backend_endpoint = ?", endpoint).Delete(&model.VendorBackend{}).Error
}

@ -51,6 +51,7 @@ func (b *Backend) Validate() error {
type VendorBackend struct {
Backend Backend `gorm:"embedded;embeddedPrefix:backend_" json:"backend"`
Enabled bool `gorm:"default:true" json:"enabled"`
UsedBy BackendUsedBy `gorm:"embedded;embeddedPrefix:used_by_" json:"usedBy"`
}

@ -84,6 +84,162 @@ func Init(ctx context.Context) error {
return nil
}
func EnableVendorBackend(ctx context.Context, endpoint string) (err error) {
if !lock.TryLock() {
return errors.New("vendor backend is updating")
}
defer lock.Unlock()
raw := LoadConns()
if v, ok := raw[endpoint]; !ok {
return fmt.Errorf("endpoint not found: %s", endpoint)
} else if v.Info.Enabled {
return nil
}
raw[endpoint].Info.Enabled = true
defer func() {
if err != nil {
raw[endpoint].Info.Enabled = false
}
}()
vc, err := newVendorClients(raw)
if err != nil {
return err
}
err = db.EnableVendorBackend(endpoint)
if err != nil {
return err
}
storeBackends(raw, vc)
return nil
}
func EnableVendorBackends(ctx context.Context, endpoints []string) (err error) {
if !lock.TryLock() {
return errors.New("vendor backend is updating")
}
defer lock.Unlock()
raw := LoadConns()
needChangeEndpoints := make([]string, 0, len(endpoints))
for _, endpoint := range endpoints {
if v, ok := raw[endpoint]; !ok {
return fmt.Errorf("endpoint not found: %s", endpoint)
} else if !v.Info.Enabled {
needChangeEndpoints = append(needChangeEndpoints, endpoint)
}
}
for _, endpoint := range needChangeEndpoints {
raw[endpoint].Info.Enabled = true
}
defer func() {
if err != nil {
for _, endpoint := range needChangeEndpoints {
raw[endpoint].Info.Enabled = false
}
}
}()
vc, err := newVendorClients(raw)
if err != nil {
return err
}
err = db.EnableVendorBackends(needChangeEndpoints)
if err != nil {
return err
}
storeBackends(raw, vc)
return nil
}
func DisableVendorBackend(ctx context.Context, endpoint string) (err error) {
if !lock.TryLock() {
return errors.New("vendor backend is updating")
}
defer lock.Unlock()
raw := LoadConns()
if v, ok := raw[endpoint]; !ok {
return fmt.Errorf("endpoint not found: %s", endpoint)
} else if !v.Info.Enabled {
return nil
}
raw[endpoint].Info.Enabled = false
defer func() {
if err != nil {
raw[endpoint].Info.Enabled = true
}
}()
vc, err := newVendorClients(raw)
if err != nil {
return err
}
err = db.DisableVendorBackend(endpoint)
if err != nil {
return err
}
storeBackends(raw, vc)
return nil
}
func DisableVendorBackends(ctx context.Context, endpoints []string) (err error) {
if !lock.TryLock() {
return errors.New("vendor backend is updating")
}
defer lock.Unlock()
raw := LoadConns()
needChangeEndpoints := make([]string, 0, len(endpoints))
for _, endpoint := range endpoints {
if v, ok := raw[endpoint]; !ok {
return fmt.Errorf("endpoint not found: %s", endpoint)
} else if v.Info.Enabled {
needChangeEndpoints = append(needChangeEndpoints, endpoint)
}
}
for _, endpoint := range needChangeEndpoints {
raw[endpoint].Info.Enabled = false
}
defer func() {
if err != nil {
for _, endpoint := range needChangeEndpoints {
raw[endpoint].Info.Enabled = true
}
}
}()
vc, err := newVendorClients(raw)
if err != nil {
return err
}
err = db.DisableVendorBackends(needChangeEndpoints)
if err != nil {
return err
}
storeBackends(raw, vc)
return nil
}
func AddVendorBackend(ctx context.Context, backend *model.VendorBackend) error {
if !lock.TryLock() {
return errors.New("vendor backend is updating")
@ -290,6 +446,9 @@ func newVendorClients(conns map[string]*BackendConn) (*VendorClients, error) {
emby: make(map[string]EmbyInterface),
}
for _, conn := range conns {
if !conn.Info.Enabled {
continue
}
if conn.Info.UsedBy.Bilibili {
if _, ok := clients.bilibili[conn.Info.UsedBy.BilibiliBackendName]; ok {
return nil, fmt.Errorf("duplicate bilibili backend name: %s", conn.Info.UsedBy.BilibiliBackendName)

@ -830,3 +830,37 @@ func AdminReconnectVendorBackends(ctx *gin.Context) {
ctx.Status(http.StatusNoContent)
}
func AdminEnableVendorBackends(ctx *gin.Context) {
// user := ctx.MustGet("user").(*op.User)
var req model.VendorBackendEndpointsReq
if err := model.Decode(ctx, &req); err != nil {
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err))
return
}
if err := vendor.EnableVendorBackends(ctx, req.Endpoints); err != nil {
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err))
return
}
ctx.Status(http.StatusNoContent)
}
func AdminDisableVendorBackends(ctx *gin.Context) {
// user := ctx.MustGet("user").(*op.User)
var req model.VendorBackendEndpointsReq
if err := model.Decode(ctx, &req); err != nil {
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err))
return
}
if err := vendor.DisableVendorBackends(ctx, req.Endpoints); err != nil {
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err))
return
}
ctx.Status(http.StatusNoContent)
}

@ -83,6 +83,10 @@ func initAdmin(admin *gin.RouterGroup, root *gin.RouterGroup) {
admin.POST("/vendors/reconnect", AdminReconnectVendorBackends)
admin.POST("/vendors/enable", AdminEnableVendorBackends)
admin.POST("/vendors/disable", AdminDisableVendorBackends)
{
user := admin.Group("/user")

Loading…
Cancel
Save