Healthcheck moved to HTTP control server

This commit is contained in:
Quentin McGaw
2020-08-31 01:57:45 +00:00
parent 7c102c0028
commit 9dcc00900e
3 changed files with 45 additions and 7 deletions

View File

@@ -3,12 +3,11 @@ package cli
import ( import (
"flag" "flag"
"fmt" "fmt"
"io/ioutil"
"net/http" "net/http"
"strings" "strings"
"time" "time"
"net"
"github.com/qdm12/gluetun/internal/constants" "github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gluetun/internal/params" "github.com/qdm12/gluetun/internal/params"
"github.com/qdm12/gluetun/internal/provider" "github.com/qdm12/gluetun/internal/provider"
@@ -40,13 +39,20 @@ func ClientKey(args []string) error {
} }
func HealthCheck() 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 { if err != nil {
return fmt.Errorf("cannot resolve github.com (%s)", err) return err
} else if len(ips) == 0 {
return fmt.Errorf("resolved no IP addresses for github.com")
} }
defer response.Body.Close()
if response.StatusCode == http.StatusOK {
return nil 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 { func OpenvpnConfig() error {

27
internal/server/health.go Normal file
View File

@@ -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)
}
}

View File

@@ -3,6 +3,7 @@ package server
import ( import (
"context" "context"
"fmt" "fmt"
"net"
"net/http" "net/http"
"sync" "sync"
"time" "time"
@@ -22,6 +23,7 @@ type server struct {
restartUnbound func() restartUnbound func()
getOpenvpnSettings func() settings.OpenVPN getOpenvpnSettings func() settings.OpenVPN
getPortForwarded func() uint16 getPortForwarded func() uint16
lookupIP func(host string) ([]net.IP, error)
} }
func New(address string, logger logging.Logger, restartOpenvpn, restartUnbound func(), 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, restartUnbound: restartUnbound,
getOpenvpnSettings: getOpenvpnSettings, getOpenvpnSettings: getOpenvpnSettings,
getPortForwarded: getPortForwarded, getPortForwarded: getPortForwarded,
lookupIP: net.LookupIP,
} }
} }
@@ -71,6 +74,8 @@ func (s *server) makeHandler() http.HandlerFunc {
s.handleGetPortForwarded(w) s.handleGetPortForwarded(w)
case "/openvpn/settings": case "/openvpn/settings":
s.handleGetOpenvpnSettings(w) s.handleGetOpenvpnSettings(w)
case "/health":
s.handleHealth(w)
default: default:
routeDoesNotExist(s.logger, w, r) routeDoesNotExist(s.logger, w, r)
} }