mirror of
https://github.com/TwiN/gatus.git
synced 2024-11-22 16:03:44 +01:00
54 lines
1.3 KiB
Go
54 lines
1.3 KiB
Go
|
package connectivity
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"strings"
|
||
|
"time"
|
||
|
|
||
|
"github.com/TwiN/gatus/v5/client"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
ErrInvalidInterval = errors.New("connectivity.checker.interval must be 5s or higher")
|
||
|
ErrInvalidDNSTarget = errors.New("connectivity.checker.target must be suffixed with :53")
|
||
|
)
|
||
|
|
||
|
// Config is the configuration for the connectivity checker.
|
||
|
type Config struct {
|
||
|
Checker *Checker `yaml:"checker,omitempty"`
|
||
|
}
|
||
|
|
||
|
func (c *Config) ValidateAndSetDefaults() error {
|
||
|
if c.Checker != nil {
|
||
|
if c.Checker.Interval == 0 {
|
||
|
c.Checker.Interval = 60 * time.Second
|
||
|
} else if c.Checker.Interval < 5*time.Second {
|
||
|
return ErrInvalidInterval
|
||
|
}
|
||
|
if !strings.HasSuffix(c.Checker.Target, ":53") {
|
||
|
return ErrInvalidDNSTarget
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Checker is the configuration for making sure Gatus has access to the internet.
|
||
|
type Checker struct {
|
||
|
Target string `yaml:"target"` // e.g. 1.1.1.1:53
|
||
|
Interval time.Duration `yaml:"interval,omitempty"`
|
||
|
|
||
|
isConnected bool
|
||
|
lastCheck time.Time
|
||
|
}
|
||
|
|
||
|
func (c Checker) Check() bool {
|
||
|
return client.CanCreateTCPConnection(c.Target, &client.Config{Timeout: 5 * time.Second})
|
||
|
}
|
||
|
|
||
|
func (c *Checker) IsConnected() bool {
|
||
|
if now := time.Now(); now.After(c.lastCheck.Add(c.Interval)) {
|
||
|
c.lastCheck, c.isConnected = now, c.Check()
|
||
|
}
|
||
|
return c.isConnected
|
||
|
}
|