diff --git a/internal/config/config.go b/internal/config/config.go index fbef2111..ffcf7738 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -18,6 +18,7 @@ import ( "github.com/yusing/go-proxy/internal/logging" "github.com/yusing/go-proxy/internal/net/gphttp/server" "github.com/yusing/go-proxy/internal/notif" + "github.com/yusing/go-proxy/internal/proxmox" proxy "github.com/yusing/go-proxy/internal/route/provider" "github.com/yusing/go-proxy/internal/task" "github.com/yusing/go-proxy/internal/utils" @@ -229,6 +230,7 @@ func (cfg *Config) load() gperr.Error { errs.Add(cfg.entrypoint.SetAccessLogger(cfg.task, model.Entrypoint.AccessLog)) cfg.initNotification(model.Providers.Notification) errs.Add(cfg.initAutoCert(model.AutoCert)) + errs.Add(cfg.initProxmox(model.Providers.Proxmox)) errs.Add(cfg.loadRouteProviders(&model.Providers)) cfg.value = model @@ -278,6 +280,17 @@ func (cfg *Config) initAutoCert(autocertCfg *autocert.Config) gperr.Error { return nil } +func (cfg *Config) initProxmox(proxmoxCfg []proxmox.Config) gperr.Error { + proxmox.Clients.Clear() + var errs = gperr.NewBuilder() + for _, cfg := range proxmoxCfg { + if err := cfg.Init(); err != nil { + errs.Add(err.Subject(cfg.URL)) + } + } + return errs.Error() +} + func (cfg *Config) errIfExists(p *proxy.Provider) gperr.Error { if _, ok := cfg.providers.Load(p.String()); ok { return gperr.Errorf("provider %s already exists", p.String()) diff --git a/internal/config/types/config.go b/internal/config/types/config.go index b1d657e7..0934d6f7 100644 --- a/internal/config/types/config.go +++ b/internal/config/types/config.go @@ -12,6 +12,7 @@ import ( "github.com/yusing/go-proxy/internal/gperr" "github.com/yusing/go-proxy/internal/logging/accesslog" "github.com/yusing/go-proxy/internal/notif" + "github.com/yusing/go-proxy/internal/proxmox" "github.com/yusing/go-proxy/internal/utils" ) @@ -30,6 +31,7 @@ type ( Docker map[string]string `json:"docker" yaml:"docker,omitempty" validate:"non_empty_docker_keys,dive,unix_addr|url"` Agents []*agent.AgentConfig `json:"agents" yaml:"agents,omitempty"` Notification []notif.NotificationConfig `json:"notification" yaml:"notification,omitempty"` + Proxmox []proxmox.Config `json:"proxmox" yaml:"proxmox,omitempty"` } Entrypoint struct { Middlewares []map[string]any `json:"middlewares"` diff --git a/internal/idlewatcher/watcher.go b/internal/idlewatcher/watcher.go index c78aa6d8..42ce4d8d 100644 --- a/internal/idlewatcher/watcher.go +++ b/internal/idlewatcher/watcher.go @@ -131,7 +131,7 @@ func NewWatcher(parent task.Parent, r routes.Route) (*Watcher, error) { case routes.StreamRoute: w.stream = r default: - return nil, gperr.New("unexpected route type") + return nil, gperr.Errorf("unexpected route type: %T", r) } ctx, cancel := context.WithTimeout(parent.Context(), reqTimeout) diff --git a/internal/route/reverse_proxy.go b/internal/route/reverse_proxy.go index d35c20ec..3240cb3d 100755 --- a/internal/route/reverse_proxy.go +++ b/internal/route/reverse_proxy.go @@ -22,19 +22,19 @@ import ( "github.com/yusing/go-proxy/internal/watcher/health/monitor" ) -type ( - ReveseProxyRoute struct { - *Route +type ReveseProxyRoute struct { + *Route - HealthMon health.HealthMonitor `json:"health,omitempty"` + HealthMon health.HealthMonitor `json:"health,omitempty"` - loadBalancer *loadbalancer.LoadBalancer - handler http.Handler - rp *reverseproxy.ReverseProxy + loadBalancer *loadbalancer.LoadBalancer + handler http.Handler + rp *reverseproxy.ReverseProxy - task *task.Task - } -) + task *task.Task +} + +var _ routes.ReverseProxyRoute = (*ReveseProxyRoute)(nil) // var globalMux = http.NewServeMux() // TODO: support regex subdomain matching. @@ -88,6 +88,11 @@ func NewReverseProxyRoute(base *Route) (*ReveseProxyRoute, gperr.Error) { return r, nil } +// ReverseProxy implements routes.ReverseProxyRoute. +func (r *ReveseProxyRoute) ReverseProxy() *reverseproxy.ReverseProxy { + return r.rp +} + // Start implements task.TaskStarter. func (r *ReveseProxyRoute) Start(parent task.Parent) gperr.Error { if existing, ok := routes.HTTP.Get(r.Key()); ok && !r.UseLoadBalance() {