From 9dcc00900e45baf2c97e6af676e55cc2a347a247 Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Mon, 31 Aug 2020 01:57:45 +0000 Subject: [PATCH] Healthcheck moved to HTTP control server --- internal/cli/cli.go | 20 +++++++++++++------- internal/server/health.go | 27 +++++++++++++++++++++++++++ internal/server/server.go | 5 +++++ 3 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 internal/server/health.go diff --git a/internal/cli/cli.go b/internal/cli/cli.go index d1354f1f..ada447b6 100644 --- a/internal/cli/cli.go +++ b/internal/cli/cli.go @@ -3,12 +3,11 @@ package cli import ( "flag" "fmt" + "io/ioutil" "net/http" "strings" "time" - "net" - "github.com/qdm12/gluetun/internal/constants" "github.com/qdm12/gluetun/internal/params" "github.com/qdm12/gluetun/internal/provider" @@ -40,13 +39,20 @@ func ClientKey(args []string) error { } func HealthCheck() error { - ips, err := net.LookupIP("github.com") + client := &http.Client{Timeout: time.Second} + response, err := client.Get("http://localhost:8000/health") if err != nil { - return fmt.Errorf("cannot resolve github.com (%s)", err) - } else if len(ips) == 0 { - return fmt.Errorf("resolved no IP addresses for github.com") + return err } - return nil + defer response.Body.Close() + if response.StatusCode == http.StatusOK { + return nil + } + b, err := ioutil.ReadAll(response.Body) + if err != nil { + return err + } + return fmt.Errorf("HTTP status code %s with message: %s", response.Status, string(b)) } func OpenvpnConfig() error { diff --git a/internal/server/health.go b/internal/server/health.go new file mode 100644 index 00000000..5d7e0e73 --- /dev/null +++ b/internal/server/health.go @@ -0,0 +1,27 @@ +package server + +import ( + "fmt" + "net/http" +) + +func (s *server) handleHealth(w http.ResponseWriter) { + // TODO option to disable + // TODO use mullvad API if current provider is Mullvad + ips, err := s.lookupIP("github.com") + var errorMessage string + switch { + case err != nil: + errorMessage = fmt.Sprintf("cannot resolve github.com (%s)", err) + case len(ips) == 0: + errorMessage = "resolved no IP addresses for github.com" + default: // success + w.WriteHeader(http.StatusOK) + return + } + s.logger.Warn(errorMessage) + w.WriteHeader(http.StatusInternalServerError) + if _, err := w.Write([]byte(errorMessage)); err != nil { + s.logger.Warn(err) + } +} diff --git a/internal/server/server.go b/internal/server/server.go index 6ef6f6a8..10ef8c4f 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -3,6 +3,7 @@ package server import ( "context" "fmt" + "net" "net/http" "sync" "time" @@ -22,6 +23,7 @@ type server struct { restartUnbound func() getOpenvpnSettings func() settings.OpenVPN getPortForwarded func() uint16 + lookupIP func(host string) ([]net.IP, error) } func New(address string, logger logging.Logger, restartOpenvpn, restartUnbound func(), @@ -33,6 +35,7 @@ func New(address string, logger logging.Logger, restartOpenvpn, restartUnbound f restartUnbound: restartUnbound, getOpenvpnSettings: getOpenvpnSettings, getPortForwarded: getPortForwarded, + lookupIP: net.LookupIP, } } @@ -71,6 +74,8 @@ func (s *server) makeHandler() http.HandlerFunc { s.handleGetPortForwarded(w) case "/openvpn/settings": s.handleGetOpenvpnSettings(w) + case "/health": + s.handleHealth(w) default: routeDoesNotExist(s.logger, w, r) }