151 lines
3.2 KiB
Go
151 lines
3.2 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"git.e3t.cc/e3team/pancheri"
|
|
"github.com/miekg/dns"
|
|
"github.com/sirupsen/logrus"
|
|
"gopkg.in/yaml.v2"
|
|
"os"
|
|
)
|
|
|
|
func main() {
|
|
configPath := flag.String("config", "/etc/pancheri/config.yml", "Path to enter a file or directory to load configuration from")
|
|
printUsage := flag.Bool("help", false, "Print command line usage")
|
|
|
|
flag.Parse()
|
|
|
|
if *printUsage {
|
|
flag.Usage()
|
|
os.Exit(0)
|
|
}
|
|
|
|
c, err := pancheri.LoadConfig(*configPath)
|
|
|
|
if err != nil {
|
|
fmt.Printf("failed to load config: %s", err)
|
|
}
|
|
|
|
if c.Logging.Format == "json" {
|
|
logrus.SetFormatter(&logrus.JSONFormatter{})
|
|
}
|
|
logrus.SetLevel(c.Logging.Level)
|
|
|
|
zones := make(map[string]*pancheri.Zone, len(c.Zone.LoadFiles))
|
|
|
|
for _, zonefile := range c.Zone.LoadFiles {
|
|
logrus.WithFields(logrus.Fields{
|
|
"file": zonefile,
|
|
}).Info("loading zone")
|
|
zone, err := pancheri.LoadZone(zonefile)
|
|
if err != nil {
|
|
logrus.Errorf("failed to load zone %s: %s", zonefile, err)
|
|
os.Exit(1)
|
|
}
|
|
authoritativeZone := "." + zone.Root + "."
|
|
logrus.WithFields(logrus.Fields{
|
|
"rsha": zone.ReducedHash,
|
|
"root": authoritativeZone,
|
|
}).Info("zone loaded")
|
|
zones[authoritativeZone] = zone
|
|
}
|
|
|
|
logrus.WithFields(logrus.Fields{
|
|
"port": "2112",
|
|
}).Info("starting promhttp listener")
|
|
|
|
go func() {
|
|
err := pancheri.PromMain()
|
|
if err != nil {
|
|
logrus.Errorf("error in prom listener: %s", err)
|
|
os.Exit(1)
|
|
}
|
|
}()
|
|
|
|
logrus.WithFields(logrus.Fields{
|
|
"host": c.Server.Host,
|
|
"port": c.Server.Port,
|
|
}).Info("starting DNS listener")
|
|
|
|
var r *pancheri.Resolver
|
|
|
|
if c.Resolver.Enable {
|
|
logrus.WithFields(logrus.Fields{
|
|
"upstream": c.Resolver.Upstream,
|
|
}).Info("enabling upstream resolver")
|
|
|
|
r = pancheri.NewResolver(c.Resolver.Upstream)
|
|
}
|
|
|
|
var b *pancheri.Blackholer
|
|
|
|
if c.Blackhole.Enable {
|
|
logrus.WithFields(logrus.Fields{
|
|
"denyfiles": len(c.Blackhole.BlockLists),
|
|
}).Info("enabling blackholer")
|
|
|
|
b = &pancheri.Blackholer{
|
|
DenyDomains: []string{},
|
|
}
|
|
|
|
for _, file := range c.Blackhole.BlockLists {
|
|
logrus.WithFields(logrus.Fields{
|
|
"file": file,
|
|
}).Info("loading blocklist")
|
|
|
|
f, err := os.Open(file)
|
|
if err != nil {
|
|
logrus.Errorf("error loading blocklist file: %s", err)
|
|
}
|
|
|
|
var cfg pancheri.BlackholeFile
|
|
decoder := yaml.NewDecoder(f)
|
|
|
|
err = decoder.Decode(&cfg)
|
|
if err != nil {
|
|
logrus.Errorf("error decoding blocklist file: %s", err)
|
|
}
|
|
|
|
err = f.Close()
|
|
if err != nil {
|
|
logrus.Errorf("error closing blocklist file: %s", err)
|
|
}
|
|
|
|
b.DenyDomains = append(b.DenyDomains, cfg.DenyDomains...)
|
|
logrus.WithFields(logrus.Fields{
|
|
"file": file,
|
|
}).Infof("loaded %d hosts", len(cfg.DenyDomains))
|
|
|
|
if !b.ShouldBlock("eu1.clevertap-prod.com") {
|
|
logrus.Errorf("failed sanity check!")
|
|
}
|
|
}
|
|
|
|
logrus.WithFields(logrus.Fields{
|
|
"hosts": len(b.DenyDomains),
|
|
}).Info("blackhole enabled")
|
|
}
|
|
|
|
handler := pancheri.Handler{
|
|
C: c,
|
|
R: r,
|
|
A: &pancheri.Authority{
|
|
Zones: zones,
|
|
},
|
|
B: b,
|
|
}
|
|
server := &dns.Server{
|
|
Addr: c.Server.Host + ":" + c.Server.Port,
|
|
Net: "udp",
|
|
Handler: &handler,
|
|
UDPSize: 65535,
|
|
ReusePort: true,
|
|
}
|
|
err = server.ListenAndServe()
|
|
|
|
if err != nil {
|
|
logrus.Errorf("failed to start server: %s", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|