Peter Kurfer
91f0cf6963
- use `Unmarshal` method of viper - move config loading, defaulting and stuff to config package - move serve to an extra command and move keep only global flags in root command - add startup logic to onInit method in root command - update mocks - clean config structs - adopt changes in plugins - update default config
77 lines
1.5 KiB
Go
77 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/baez90/inetmock/pkg/config"
|
|
"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 config.HandlerConfig) (err error) {
|
|
options := loadFromConfig(config.Options)
|
|
addr := fmt.Sprintf("%s:%d", config.ListenAddress, config.Port)
|
|
|
|
handler := ®exHandler{
|
|
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
|
|
}
|