You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
2.1 KiB

package main
import (
"context"
"flag"
"fmt"
"log"
"net/http"
"regexp"
"strings"
"time"
"github.com/adamveld12/gopherhole/client/public"
"github.com/adamveld12/gopherhole/internal"
"github.com/miekg/dns"
)
var (
configFilePath = flag.String("config", "./config.json", "Config file")
// dbPath = flag.String("db-path", ".", "Directory to write database files to")
// httpAddr = flag.String("http-address", ":8080", "Bind address for http server")
// dnsAddr = flag.String("dns-address", ":53", "Bind address for dns server")
)
func main() {
flag.Parse()
var conf StartupConfig
if err := LoadStartupConfig(&conf, *configFilePath); err != nil {
log.Fatalf("%+v", err)
}
// conf.HTTPAddr = *httpAddr
// conf.DNSAddr = *dnsAddr
log.Printf("%+v", conf)
store := &internal.Sqlite{
Path: conf.DatabaseURL,
}
if err := store.Open(); err != nil {
log.Fatalf("COULD NOT OPEN SQLITE DB: %v", err)
}
re := &internal.RuleEngine{
Rules: conf.Rules,
}
cache := &internal.Memory{}
dnsClient := &dns.Client{
Net: "udp",
DialTimeout: time.Millisecond * 250,
ReadTimeout: time.Second,
WriteTimeout: time.Second,
}
dm := &internal.DomainManager{
Cache: cache,
Storage: store,
RuleEvaluator: re,
Recursors: internal.Recursor{
Upstreams: cleanRecursors(conf.Recursors),
Client: dnsClient,
},
}
go func() {
dnsSrv := &internal.DNSServer{Handler: dm}
if err := dnsSrv.ListenAndServe(context.Background(), conf.DNSAddr); err != nil {
log.Fatal(err)
}
}()
httpApi := internal.NewAdminHandler(cache, store, re, public.Assets)
if err := http.ListenAndServe(conf.HTTPAddr, httpApi); err != nil {
log.Fatal(err)
}
}
func cleanRecursors(recursors []string) []string {
cr := []string{}
reg := regexp.MustCompile(`^((?:\d{1,4}\.?){4})(?::(\d{0,5}))?`)
for _, r := range recursors {
if !reg.MatchString(r) {
log.Fatalf("%s is not a valid DNS server. Must be in ip:addr format.", r)
}
cleanedIPAddr := r
if !strings.Contains(r, ":") {
cleanedIPAddr = fmt.Sprintf("%s:53", r)
}
cr = append(cr, cleanedIPAddr)
}
log.Println(cr)
return cr
}