diff --git a/internal/acl/config.go b/internal/acl/config.go index 78b0be41..3bb99411 100644 --- a/internal/acl/config.go +++ b/internal/acl/config.go @@ -2,6 +2,7 @@ package acl import ( "net" + "sync/atomic" "time" "github.com/puzpuzpuz/xsync/v4" @@ -39,6 +40,9 @@ type checkCache struct { created time.Time } +// could be nil +var ActiveConfig atomic.Pointer[Config] + const cacheTTL = 1 * time.Minute func (c *checkCache) Expired() bool { diff --git a/internal/api/v1/cert/info.go b/internal/api/v1/cert/info.go index f0ae8817..75b6f93a 100644 --- a/internal/api/v1/cert/info.go +++ b/internal/api/v1/cert/info.go @@ -5,7 +5,7 @@ import ( "github.com/gin-gonic/gin" apitypes "github.com/yusing/godoxy/internal/api/types" - config "github.com/yusing/godoxy/internal/config/types" + "github.com/yusing/godoxy/internal/autocert" ) type CertInfo struct { @@ -29,7 +29,7 @@ type CertInfo struct { // @Failure 500 {object} apitypes.ErrorResponse // @Router /cert/info [get] func Info(c *gin.Context) { - autocert := config.GetInstance().AutoCertProvider() + autocert := autocert.ActiveProvider.Load() if autocert == nil { c.JSON(http.StatusNotFound, apitypes.Error("autocert is not enabled")) return diff --git a/internal/api/v1/cert/renew.go b/internal/api/v1/cert/renew.go index f2364b25..7c4d21b2 100644 --- a/internal/api/v1/cert/renew.go +++ b/internal/api/v1/cert/renew.go @@ -7,7 +7,7 @@ import ( "github.com/gin-gonic/gin" "github.com/rs/zerolog/log" apitypes "github.com/yusing/godoxy/internal/api/types" - config "github.com/yusing/godoxy/internal/config/types" + "github.com/yusing/godoxy/internal/autocert" "github.com/yusing/godoxy/internal/logging/memlogger" gperr "github.com/yusing/goutils/errs" "github.com/yusing/goutils/http/websocket" @@ -24,7 +24,7 @@ import ( // @Failure 500 {object} apitypes.ErrorResponse // @Router /cert/renew [get] func Renew(c *gin.Context) { - autocert := config.GetInstance().AutoCertProvider() + autocert := autocert.ActiveProvider.Load() if autocert == nil { c.JSON(http.StatusNotFound, apitypes.Error("autocert is not enabled")) return diff --git a/internal/autocert/provider.go b/internal/autocert/provider.go index d3b45020..d7032f8e 100644 --- a/internal/autocert/provider.go +++ b/internal/autocert/provider.go @@ -10,6 +10,7 @@ import ( "path" "slices" "strings" + "sync/atomic" "time" "github.com/go-acme/lego/v4/certificate" @@ -49,6 +50,9 @@ const ( requestCooldownDuration = 15 * time.Second ) +// could be nil +var ActiveProvider atomic.Pointer[Provider] + func NewProvider(cfg *Config, user *User, legoCfg *lego.Config) *Provider { return &Provider{ cfg: cfg, diff --git a/internal/homepage/types/config.go b/internal/homepage/types/config.go new file mode 100644 index 00000000..b795d28e --- /dev/null +++ b/internal/homepage/types/config.go @@ -0,0 +1,16 @@ +package homepage + +import "sync/atomic" + +type Config struct { + UseDefaultCategories bool `json:"use_default_categories"` +} + +// nil-safe +var ActiveConfig atomic.Pointer[Config] + +func init() { + ActiveConfig.Store(&Config{ + UseDefaultCategories: true, + }) +} diff --git a/internal/route/route.go b/internal/route/route.go index bae72fe7..04ad1b8d 100644 --- a/internal/route/route.go +++ b/internal/route/route.go @@ -13,6 +13,7 @@ import ( "github.com/yusing/godoxy/agent/pkg/agent" "github.com/yusing/godoxy/internal/docker" "github.com/yusing/godoxy/internal/homepage" + homepagecfg "github.com/yusing/godoxy/internal/homepage/types" netutils "github.com/yusing/godoxy/internal/net" nettypes "github.com/yusing/godoxy/internal/net/types" "github.com/yusing/godoxy/internal/proxmox" @@ -22,7 +23,6 @@ import ( "github.com/yusing/goutils/task" "github.com/yusing/godoxy/internal/common" - config "github.com/yusing/godoxy/internal/config/types" "github.com/yusing/godoxy/internal/logging/accesslog" "github.com/yusing/godoxy/internal/route/rules" route "github.com/yusing/godoxy/internal/route/types" @@ -676,7 +676,7 @@ func (r *Route) FinalizeHomepageConfig() { } if hp.Category == "" { - if config.GetInstance().Value().Homepage.UseDefaultCategories { + if homepagecfg.ActiveConfig.Load().UseDefaultCategories { for _, ref := range refs { if category, ok := homepage.PredefinedCategories[ref]; ok { hp.Category = category diff --git a/internal/route/stream/tcp_tcp.go b/internal/route/stream/tcp_tcp.go index a260b92e..1033d519 100644 --- a/internal/route/stream/tcp_tcp.go +++ b/internal/route/stream/tcp_tcp.go @@ -6,7 +6,8 @@ import ( "github.com/pires/go-proxyproto" "github.com/rs/zerolog" - config "github.com/yusing/godoxy/internal/config/types" + "github.com/yusing/godoxy/internal/acl" + "github.com/yusing/godoxy/internal/entrypoint" nettypes "github.com/yusing/godoxy/internal/net/types" ioutils "github.com/yusing/goutils/io" "go.uber.org/atomic" @@ -43,10 +44,10 @@ func (s *TCPTCPStream) ListenAndServe(ctx context.Context, preDial, onRead netty return } - if proxyProto := config.GetInstance().Value().Entrypoint.SupportProxyProtocol; proxyProto { + if proxyProto := entrypoint.ActiveConfig.Load().SupportProxyProtocol; proxyProto { s.listener = &proxyproto.Listener{Listener: s.listener} } - if acl := config.GetInstance().Value().ACL; acl != nil { + if acl := acl.ActiveConfig.Load(); acl != nil { s.listener = acl.WrapTCP(s.listener) } diff --git a/internal/route/stream/udp_udp.go b/internal/route/stream/udp_udp.go index 50afa144..2d696dc7 100644 --- a/internal/route/stream/udp_udp.go +++ b/internal/route/stream/udp_udp.go @@ -10,7 +10,7 @@ import ( "time" "github.com/rs/zerolog" - config "github.com/yusing/godoxy/internal/config/types" + "github.com/yusing/godoxy/internal/acl" nettypes "github.com/yusing/godoxy/internal/net/types" "github.com/yusing/goutils/synk" "go.uber.org/atomic" @@ -74,7 +74,7 @@ func (s *UDPUDPStream) ListenAndServe(ctx context.Context, preDial, onRead netty logErr(s, err, "failed to listen") return } - if acl := config.GetInstance().Value().ACL; acl != nil { + if acl := acl.ActiveConfig.Load(); acl != nil { s.listener = acl.WrapUDP(s.listener) } s.preDial = preDial