2020-02-11 03:26:04 +03:00
package server
import (
"context"
2022-11-21 20:36:05 +03:00
"github.com/rs/zerolog/log"
2023-02-03 17:24:05 +03:00
"github.com/traefik/traefik/v3/pkg/config/runtime"
"github.com/traefik/traefik/v3/pkg/config/static"
"github.com/traefik/traefik/v3/pkg/server/middleware"
tcpmiddleware "github.com/traefik/traefik/v3/pkg/server/middleware/tcp"
"github.com/traefik/traefik/v3/pkg/server/router"
tcprouter "github.com/traefik/traefik/v3/pkg/server/router/tcp"
udprouter "github.com/traefik/traefik/v3/pkg/server/router/udp"
"github.com/traefik/traefik/v3/pkg/server/service"
tcpsvc "github.com/traefik/traefik/v3/pkg/server/service/tcp"
udpsvc "github.com/traefik/traefik/v3/pkg/server/service/udp"
"github.com/traefik/traefik/v3/pkg/tcp"
"github.com/traefik/traefik/v3/pkg/tls"
"github.com/traefik/traefik/v3/pkg/udp"
2020-02-11 03:26:04 +03:00
)
// RouterFactory the factory of TCP/UDP routers.
type RouterFactory struct {
2024-09-13 16:54:04 +03:00
entryPointsTCP [ ] string
entryPointsUDP [ ] string
allowACMEByPass map [ string ] bool
2020-02-11 03:26:04 +03:00
2024-01-30 18:28:05 +03:00
managerFactory * service . ManagerFactory
2020-02-11 03:26:04 +03:00
2020-09-07 14:58:03 +03:00
pluginBuilder middleware . PluginsBuilder
2020-04-20 19:36:34 +03:00
2024-01-30 18:28:05 +03:00
observabilityMgr * middleware . ObservabilityMgr
tlsManager * tls . Manager
2022-11-16 13:38:07 +03:00
2022-12-09 11:58:05 +03:00
dialerManager * tcp . DialerManager
2022-11-16 13:38:07 +03:00
cancelPrevState func ( )
2020-02-11 03:26:04 +03:00
}
2020-05-11 13:06:07 +03:00
// NewRouterFactory creates a new RouterFactory.
2021-04-30 11:22:04 +03:00
func NewRouterFactory ( staticConfiguration static . Configuration , managerFactory * service . ManagerFactory , tlsManager * tls . Manager ,
2024-01-30 18:28:05 +03:00
observabilityMgr * middleware . ObservabilityMgr , pluginBuilder middleware . PluginsBuilder , dialerManager * tcp . DialerManager ,
2022-03-21 12:42:08 +03:00
) * RouterFactory {
2024-09-13 16:54:04 +03:00
handlesTLSChallenge := false
for _ , resolver := range staticConfiguration . CertificatesResolvers {
2024-09-19 12:50:04 +03:00
if resolver . ACME != nil && resolver . ACME . TLSChallenge != nil {
2024-09-13 16:54:04 +03:00
handlesTLSChallenge = true
break
}
}
allowACMEByPass := map [ string ] bool { }
2020-02-11 03:26:04 +03:00
var entryPointsTCP , entryPointsUDP [ ] string
2024-09-13 16:54:04 +03:00
for name , ep := range staticConfiguration . EntryPoints {
allowACMEByPass [ name ] = ep . AllowACMEByPass || ! handlesTLSChallenge
protocol , err := ep . GetProtocol ( )
2020-02-11 03:26:04 +03:00
if err != nil {
// Should never happen because Traefik should not start if protocol is invalid.
2022-11-21 20:36:05 +03:00
log . Error ( ) . Err ( err ) . Msg ( "Invalid protocol" )
2020-02-11 03:26:04 +03:00
}
if protocol == "udp" {
entryPointsUDP = append ( entryPointsUDP , name )
} else {
entryPointsTCP = append ( entryPointsTCP , name )
}
}
return & RouterFactory {
2024-01-30 18:28:05 +03:00
entryPointsTCP : entryPointsTCP ,
entryPointsUDP : entryPointsUDP ,
managerFactory : managerFactory ,
observabilityMgr : observabilityMgr ,
tlsManager : tlsManager ,
pluginBuilder : pluginBuilder ,
dialerManager : dialerManager ,
2024-09-16 17:24:08 +03:00
allowACMEByPass : allowACMEByPass ,
2020-02-11 03:26:04 +03:00
}
}
2020-05-11 13:06:07 +03:00
// CreateRouters creates new TCPRouters and UDPRouters.
2022-12-09 11:58:05 +03:00
func ( f * RouterFactory ) CreateRouters ( rtConf * runtime . Configuration ) ( map [ string ] * tcprouter . Router , map [ string ] udp . Handler ) {
2022-11-16 13:38:07 +03:00
if f . cancelPrevState != nil {
f . cancelPrevState ( )
}
var ctx context . Context
ctx , f . cancelPrevState = context . WithCancel ( context . Background ( ) )
2020-02-11 03:26:04 +03:00
// HTTP
serviceManager := f . managerFactory . Build ( rtConf )
2020-04-20 19:36:34 +03:00
middlewaresBuilder := middleware . NewBuilder ( rtConf . Middlewares , serviceManager , f . pluginBuilder )
2020-02-11 03:26:04 +03:00
2024-01-30 18:28:05 +03:00
routerManager := router . NewManager ( rtConf , serviceManager , middlewaresBuilder , f . observabilityMgr , f . tlsManager )
2020-02-11 03:26:04 +03:00
handlersNonTLS := routerManager . BuildHandlers ( ctx , f . entryPointsTCP , false )
handlersTLS := routerManager . BuildHandlers ( ctx , f . entryPointsTCP , true )
2022-11-16 13:38:07 +03:00
serviceManager . LaunchHealthCheck ( ctx )
2020-02-29 02:13:44 +03:00
2020-02-11 03:26:04 +03:00
// TCP
2022-12-09 11:58:05 +03:00
svcTCPManager := tcpsvc . NewManager ( rtConf , f . dialerManager )
2020-02-11 03:26:04 +03:00
2022-03-17 20:02:08 +03:00
middlewaresTCPBuilder := tcpmiddleware . NewBuilder ( rtConf . TCPMiddlewares )
2021-06-11 16:30:05 +03:00
2022-03-17 20:02:08 +03:00
rtTCPManager := tcprouter . NewManager ( rtConf , svcTCPManager , middlewaresTCPBuilder , handlersNonTLS , handlersTLS , f . tlsManager )
2020-02-11 03:26:04 +03:00
routersTCP := rtTCPManager . BuildHandlers ( ctx , f . entryPointsTCP )
2024-09-13 16:54:04 +03:00
for ep , r := range routersTCP {
if allowACMEByPass , ok := f . allowACMEByPass [ ep ] ; ok && allowACMEByPass {
r . EnableACMETLSPassthrough ( )
}
}
2020-02-11 03:26:04 +03:00
// UDP
2022-12-09 11:58:05 +03:00
svcUDPManager := udpsvc . NewManager ( rtConf )
2022-03-17 20:02:08 +03:00
rtUDPManager := udprouter . NewManager ( rtConf , svcUDPManager )
2020-02-11 03:26:04 +03:00
routersUDP := rtUDPManager . BuildHandlers ( ctx , f . entryPointsUDP )
rtConf . PopulateUsedBy ( )
return routersTCP , routersUDP
}