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.

78 lines
1.7 KiB

package main
import (
"context"
"flag"
"log"
"net/http"
"time"
"github.com/adamveld12/gopherhole/client/public"
"github.com/adamveld12/gopherhole/internal"
"github.com/miekg/dns"
)
var (
dbPath = flag.String("db-path", ".", "Directory to write database files to")
httpAddr = flag.String("http-address", "0.0.0.0:80", "Bind address for http server")
dnsAddr = flag.String("dns-address", "0.0.0.0:53", "Bind address for dns server")
defaultUpstream = flag.String("upstream", "1.1.1.1:53", "default upstream DNS server when no others are specified")
)
func main() {
flag.Parse()
log.SetFlags(log.LUTC | log.Lshortfile)
conf := StartupConfig{
HTTPAddr: *httpAddr,
DNSAddr: *dnsAddr,
DatabaseURL: *dbPath,
}
log.Printf("%+v", conf)
store := &internal.Sqlite{
Path: conf.DatabaseURL,
}
defer store.Close()
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: []string{*defaultUpstream},
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)
}
}