api/plugins/dns_mock/main.go
Peter Kurfer 7c2a41ad25 Move TLS/cert handling to main app
- apply changes in proxy plugin and TLS interceptor
- add HTTPS proxy support
- move ca-generation command to main app
- minor refactoring to improve API stability
- move mocks to extra packages to avoid cycling imports
- fix bug in multi-port configuration
- change HTTP proxy to redirect to HTTP mock instead of maintaining custom rules
2020-04-26 00:32:46 +02:00

77 lines
1.5 KiB
Go

package main
import (
"fmt"
"github.com/baez90/inetmock/pkg/api"
"github.com/baez90/inetmock/pkg/logging"
"github.com/miekg/dns"
"go.uber.org/zap"
)
type dnsHandler struct {
logger logging.Logger
dnsServer []*dns.Server
}
func (d *dnsHandler) Start(config api.HandlerConfig) (err error) {
options := loadFromConfig(config.Options())
addr := fmt.Sprintf("%s:%d", config.ListenAddress(), config.Port())
handler := &regexHandler{
fallback: options.Fallback,
logger: d.logger,
}
for _, rule := range options.Rules {
d.logger.Info(
"register DNS rule",
zap.String("pattern", rule.pattern.String()),
zap.String("response", rule.response.String()),
)
handler.AddRule(rule)
}
d.logger = d.logger.With(
zap.String("address", addr),
)
d.dnsServer = []*dns.Server{
{
Addr: addr,
Net: "udp",
Handler: handler,
},
{
Addr: addr,
Net: "tcp",
Handler: handler,
},
}
for _, dnsServer := range d.dnsServer {
go d.startServer(dnsServer)
}
return
}
func (d *dnsHandler) startServer(dnsServer *dns.Server) {
if err := dnsServer.ListenAndServe(); err != nil {
d.logger.Error(
"failed to start DNS server listener",
zap.Error(err),
)
}
}
func (d *dnsHandler) Shutdown() error {
d.logger.Info("shutting down DNS mock")
for _, dnsServer := range d.dnsServer {
if err := dnsServer.Shutdown(); err != nil {
d.logger.Error(
"failed to shutdown server",
zap.Error(err),
)
}
}
return nil
}