mirror of
https://github.com/Dvorinka/beszel.git
synced 2026-06-04 05:12:56 +00:00
Initial commit: Beszel fork with Domain Locker integration
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
package monitor
|
||||
|
||||
import "time"
|
||||
|
||||
// Status constants for monitors
|
||||
type Status string
|
||||
|
||||
const (
|
||||
StatusUp Status = "up"
|
||||
StatusDown Status = "down"
|
||||
StatusPending Status = "pending"
|
||||
StatusPaused Status = "paused"
|
||||
StatusMaintenance Status = "maintenance"
|
||||
)
|
||||
|
||||
// Monitor types
|
||||
const (
|
||||
TypeHTTP = "http"
|
||||
TypeHTTPS = "https"
|
||||
TypeTCP = "tcp"
|
||||
TypePing = "ping"
|
||||
TypeDNS = "dns"
|
||||
TypeKeyword = "keyword"
|
||||
TypeJSONQuery = "json-query"
|
||||
TypeDocker = "docker"
|
||||
)
|
||||
|
||||
// HTTPMethod constants
|
||||
const (
|
||||
MethodGET = "GET"
|
||||
MethodPOST = "POST"
|
||||
MethodPUT = "PUT"
|
||||
MethodDELETE = "DELETE"
|
||||
MethodHEAD = "HEAD"
|
||||
MethodOPTIONS = "OPTIONS"
|
||||
MethodPATCH = "PATCH"
|
||||
)
|
||||
|
||||
// Monitor represents a website/service monitor configuration
|
||||
type Monitor struct {
|
||||
ID string `json:"id" db:"id"`
|
||||
Name string `json:"name" db:"name"`
|
||||
Type string `json:"type" db:"type"`
|
||||
URL string `json:"url" db:"url"`
|
||||
Hostname string `json:"hostname" db:"hostname"`
|
||||
Port int `json:"port" db:"port"`
|
||||
Method string `json:"method" db:"method"`
|
||||
Headers string `json:"headers" db:"headers"`
|
||||
Body string `json:"body" db:"body"`
|
||||
Interval int `json:"interval" db:"interval"`
|
||||
Timeout int `json:"timeout" db:"timeout"`
|
||||
Retries int `json:"retries" db:"retries"`
|
||||
RetryInterval int `json:"retry_interval" db:"retry_interval"`
|
||||
MaxRedirects int `json:"max_redirects" db:"max_redirects"`
|
||||
Keyword string `json:"keyword" db:"keyword"`
|
||||
JSONQuery string `json:"json_query" db:"json_query"`
|
||||
ExpectedValue string `json:"expected_value" db:"expected_value"`
|
||||
InvertKeyword bool `json:"invert_keyword" db:"invert_keyword"`
|
||||
DNSResolveServer string `json:"dns_resolve_server" db:"dns_resolve_server"`
|
||||
DNSResolverMode string `json:"dns_resolver_mode" db:"dns_resolver_mode"`
|
||||
Status Status `json:"status" db:"status"`
|
||||
Active bool `json:"active" db:"active"`
|
||||
UserID string `json:"user" db:"user"`
|
||||
Tags []string `json:"tags" db:"tags"`
|
||||
Created time.Time `json:"created" db:"created"`
|
||||
Updated time.Time `json:"updated" db:"updated"`
|
||||
LastCheck time.Time `json:"last_check" db:"last_check"`
|
||||
UptimeStats map[string]float64 `json:"uptime_stats" db:"uptime_stats"`
|
||||
Description string `json:"description" db:"description"`
|
||||
CertExpiryNotification bool `json:"cert_expiry_notification" db:"cert_expiry_notification"`
|
||||
CertExpiryDays int `json:"cert_expiry_days" db:"cert_expiry_days"`
|
||||
ProxyID string `json:"proxy" db:"proxy"`
|
||||
IgnoreTLSError bool `json:"ignore_tls_error" db:"ignore_tls_error"`
|
||||
}
|
||||
|
||||
// Heartbeat represents a single monitor check result
|
||||
type Heartbeat struct {
|
||||
ID string `json:"id" db:"id"`
|
||||
MonitorID string `json:"monitor" db:"monitor"`
|
||||
Status Status `json:"status" db:"status"`
|
||||
Ping int `json:"ping" db:"ping"`
|
||||
Msg string `json:"msg" db:"msg"`
|
||||
Time time.Time `json:"time" db:"time"`
|
||||
CertExpiry int `json:"cert_expiry" db:"cert_expiry"`
|
||||
CertValid bool `json:"cert_valid" db:"cert_valid"`
|
||||
}
|
||||
|
||||
// UptimeStats holds calculated uptime statistics
|
||||
type UptimeStats struct {
|
||||
Total int `json:"total"`
|
||||
Up int `json:"up"`
|
||||
Down int `json:"down"`
|
||||
Uptime24h float64 `json:"uptime_24h"`
|
||||
Uptime7d float64 `json:"uptime_7d"`
|
||||
Uptime30d float64 `json:"uptime_30d"`
|
||||
}
|
||||
|
||||
// CheckResult holds the result of a monitor check
|
||||
type CheckResult struct {
|
||||
Status Status
|
||||
Ping int
|
||||
Msg string
|
||||
CertExpiry int
|
||||
CertValid bool
|
||||
Error error
|
||||
}
|
||||
|
||||
// CheckRequest holds parameters for a monitor check
|
||||
type CheckRequest struct {
|
||||
Monitor *Monitor
|
||||
Timeout time.Duration
|
||||
}
|
||||
|
||||
// ToPublicJSON returns a monitor object suitable for public display
|
||||
func (m *Monitor) ToPublicJSON() map[string]interface{} {
|
||||
return map[string]interface{}{
|
||||
"id": m.ID,
|
||||
"name": m.Name,
|
||||
"type": m.Type,
|
||||
"status": m.Status,
|
||||
"uptime": m.UptimeStats,
|
||||
}
|
||||
}
|
||||
|
||||
// IsUp returns true if monitor status is up
|
||||
func (m *Monitor) IsUp() bool {
|
||||
return m.Status == StatusUp
|
||||
}
|
||||
|
||||
// IsDown returns true if monitor status is down
|
||||
func (m *Monitor) IsDown() bool {
|
||||
return m.Status == StatusDown
|
||||
}
|
||||
|
||||
// GetUptimePercent calculates uptime percentage for given time range
|
||||
func (m *Monitor) GetUptimePercent(hours int) float64 {
|
||||
key := "uptime_24h"
|
||||
if hours == 168 {
|
||||
key = "uptime_7d"
|
||||
} else if hours == 720 {
|
||||
key = "uptime_30d"
|
||||
}
|
||||
if val, ok := m.UptimeStats[key]; ok {
|
||||
return val
|
||||
}
|
||||
return 100.0
|
||||
}
|
||||
Reference in New Issue
Block a user