diff --git a/app/vpnhole/handler.go b/app/vpnhole/handler.go index b24f56d1448ce1582b3a0d159d6587078d9720a7..efb429a73c2fe8903ce2ed69a9724f5ef81c9427 100644 --- a/app/vpnhole/handler.go +++ b/app/vpnhole/handler.go @@ -27,7 +27,14 @@ func Handler(rw dns.ResponseWriter, req *dns.Msg) { return } - c := vpnhole.ParseFlags() + c := vpnhole.NewVpnHoleClient("", "", "", nil) + err := c.Start() + if err != nil { + log.Fatal(err) + } + defer c.Stop() + fmt.Println(c) + resp, _, err := client.Exchange(req, c.Upstream) if err != nil { log.Fatalln(fmt.Errorf("failed to exchange: %w", err)) @@ -37,6 +44,7 @@ func Handler(rw dns.ResponseWriter, req *dns.Msg) { if err = rw.WriteMsg(resp); err != nil { log.Println(fmt.Errorf("failed to reply: %w", err)) } + } func Block(rw dns.ResponseWriter, req *dns.Msg) error { diff --git a/app/vpnhole/main.go b/app/vpnhole/main.go index 8ae72052496f85fe36a8a50a20ebc734e9fde09a..76748b2b42bc9afbc1f354d8aff1adabe8c61808 100644 --- a/app/vpnhole/main.go +++ b/app/vpnhole/main.go @@ -5,22 +5,27 @@ import ( "fmt" "log" + "time" + "0xacab.org/leap/vpn-hole/vpnhole/vpnhole" + "github.com/common-nighthawk/go-figure" "github.com/miekg/dns" - - "time" ) -func init() { - // start the cmdline parser - vpnhole.ParseFlags() - -} - func main() { - // call ParseFlags() to get the config struct with the values - c := vpnhole.ParseFlags() + // Print the 'VPN-Hole' Logo + Logo := figure.NewColorFigure(" VPN-Hole", "", "green", true) + Logo.Print() + + // call Start() to get the config struct with the values + // and then call Stop() to stop the VpnHoleClient + c := vpnhole.NewVpnHoleClient("", "", "", nil) + err := c.Start() + if err != nil { + log.Fatal(err) + } + defer c.Stop() fmt.Println(c) // start the vpnhole diff --git a/vpnhole/vpnhole.go b/vpnhole/vpnhole.go index 3acba5f5b333eebcbddb4199dc6f627490b34e54..1716f3b1e885ab0433f35e01a92e889ef790d5b8 100644 --- a/vpnhole/vpnhole.go +++ b/vpnhole/vpnhole.go @@ -1,32 +1,98 @@ package vpnhole import ( + "errors" "fmt" + "log" ) -var ErrShutdown = fmt.Errorf("vpnhole was shutdown gracefully") +var ( + ErrAlreadyRunning = errors.New("already running") + ErrNotRunning = errors.New("not running") +) -type vpnholeclient struct { +type VpnHoleClient struct { Addr string SubscriptionsFilename string Upstream string + Eventlogger EventLogger +} + +type EventLogger interface { + Infof(format string, v ...interface{}) + Errorf(format string, v ...interface{}) +} + +type DefaultEventLogger struct { + InfoLogger *log.Logger + ErrorLogger *log.Logger +} + +// Implement the EventLogger interface +func (l *DefaultEventLogger) Infof(format string, v ...interface{}) { + l.InfoLogger.Printf(format, v...) } -// parse the flags and return the config struct with the values -func ParseFlags() vpnholeclient { - return vpnholeclient{ - Addr: ":53", - SubscriptionsFilename: "subs.list", - Upstream: "1.1.1.1:53", +func (l *DefaultEventLogger) Errorf(format string, v ...interface{}) { + l.ErrorLogger.Printf(format, v...) +} + +func (c *VpnHoleClient) String() string { + return fmt.Sprintf("addr=%s, subscriptions=%s, upstream=%s", c.Addr, c.SubscriptionsFilename, c.Upstream) +} + +// NewVpnHoleClient creates a new VpnHoleClient + +func NewVpnHoleClient(addr, subscriptionsFilename, upstream string, eventlogger EventLogger) *VpnHoleClient { + return &VpnHoleClient{ + Addr: addr, + SubscriptionsFilename: subscriptionsFilename, + Upstream: upstream, + Eventlogger: eventlogger, } } -// start the vpnhole -func (c *vpnholeclient) Start() error { +// Start starts the VpnHoleClient and config new values +func (c *VpnHoleClient) Start() error { + + if c.Addr == "" { + c.Addr = ":53" + } + + if c.SubscriptionsFilename == "" { + c.SubscriptionsFilename = "subs.list" + } + + if c.Upstream == "" { + c.Upstream = "1.1.1.1:53" + } + + if c.Eventlogger == nil { + c.Eventlogger = &DefaultEventLogger{ + InfoLogger: log.New(log.Writer(), "INFO: ", log.Flags()), + ErrorLogger: log.New(log.Writer(), "ERROR: ", log.Flags()), + } + } + + c.Eventlogger.Infof("vpnhole started: %s", c) + + if c.IsRunning() { + return ErrAlreadyRunning + } + return nil } -// stop the vpnhole -func (c *vpnholeclient) Stop() error { +// Stop stops the VpnHoleClient +func (c *VpnHoleClient) Stop() error { + if !c.IsRunning() { + return ErrNotRunning + } + return nil } + +// IsRunning returns true if the VpnHoleClient is running +func (c *VpnHoleClient) IsRunning() bool { + return false +}