mirror of
https://github.com/Dvorinka/beszel.git
synced 2026-06-03 21:02:56 +00:00
Initial commit: Beszel fork with Domain Locker integration
This commit is contained in:
@@ -0,0 +1,245 @@
|
||||
package domain
|
||||
|
||||
import "time"
|
||||
|
||||
// Domain represents a tracked domain with WHOIS and DNS information
|
||||
type Domain struct {
|
||||
ID string `json:"id" db:"id"`
|
||||
DomainName string `json:"domain_name" db:"domain_name"`
|
||||
Status string `json:"status" db:"status"`
|
||||
Active bool `json:"active" db:"active"`
|
||||
|
||||
// Dates
|
||||
ExpiryDate *time.Time `json:"expiry_date" db:"expiry_date"`
|
||||
CreationDate *time.Time `json:"creation_date" db:"creation_date"`
|
||||
UpdatedDate *time.Time `json:"updated_date" db:"updated_date"`
|
||||
|
||||
// Registrar
|
||||
RegistrarName string `json:"registrar_name" db:"registrar_name"`
|
||||
RegistrarID string `json:"registrar_id" db:"registrar_id"`
|
||||
RegistrarURL string `json:"registrar_url" db:"registrar_url"`
|
||||
RegistryDomainID string `json:"registry_domain_id" db:"registry_domain_id"`
|
||||
|
||||
// DNS
|
||||
DNSSEC string `json:"dnssec" db:"dnssec"`
|
||||
NameServers []string `json:"name_servers" db:"name_servers"`
|
||||
MXRecords []string `json:"mx_records" db:"mx_records"`
|
||||
TXTRecords []string `json:"txt_records" db:"txt_records"`
|
||||
|
||||
// IP Addresses
|
||||
IPv4Addresses []string `json:"ipv4_addresses" db:"ipv4_addresses"`
|
||||
IPv6Addresses []string `json:"ipv6_addresses" db:"ipv6_addresses"`
|
||||
|
||||
// SSL Certificate
|
||||
SSLIssuer string `json:"ssl_issuer" db:"ssl_issuer"`
|
||||
SSLIssuerCountry string `json:"ssl_issuer_country" db:"ssl_issuer_country"`
|
||||
SSLValidFrom *time.Time `json:"ssl_valid_from" db:"ssl_valid_from"`
|
||||
SSLValidTo *time.Time `json:"ssl_valid_to" db:"ssl_valid_to"`
|
||||
SSLSubject string `json:"ssl_subject" db:"ssl_subject"`
|
||||
SSLFingerprint string `json:"ssl_fingerprint" db:"ssl_fingerprint"`
|
||||
SSLKeySize int `json:"ssl_key_size" db:"ssl_key_size"`
|
||||
SSLSignatureAlgo string `json:"ssl_signature_algo" db:"ssl_signature_algo"`
|
||||
|
||||
// Host Info
|
||||
HostCountry string `json:"host_country" db:"host_country"`
|
||||
HostRegion string `json:"host_region" db:"host_region"`
|
||||
HostCity string `json:"host_city" db:"host_city"`
|
||||
HostISP string `json:"host_isp" db:"host_isp"`
|
||||
HostOrg string `json:"host_org" db:"host_org"`
|
||||
HostAS string `json:"host_as" db:"host_as"`
|
||||
HostLat float64 `json:"host_lat" db:"host_lat"`
|
||||
HostLon float64 `json:"host_lon" db:"host_lon"`
|
||||
|
||||
// Valuation
|
||||
PurchasePrice float64 `json:"purchase_price" db:"purchase_price"`
|
||||
CurrentValue float64 `json:"current_value" db:"current_value"`
|
||||
RenewalCost float64 `json:"renewal_cost" db:"renewal_cost"`
|
||||
AutoRenew bool `json:"auto_renew" db:"auto_renew"`
|
||||
|
||||
// Registrant Contact (from WHOIS)
|
||||
RegistrantName string `json:"registrant_name" db:"registrant_name"`
|
||||
RegistrantOrg string `json:"registrant_org" db:"registrant_org"`
|
||||
RegistrantStreet string `json:"registrant_street" db:"registrant_street"`
|
||||
RegistrantCity string `json:"registrant_city" db:"registrant_city"`
|
||||
RegistrantState string `json:"registrant_state" db:"registrant_state"`
|
||||
RegistrantCountry string `json:"registrant_country" db:"registrant_country"`
|
||||
RegistrantPostal string `json:"registrant_postal" db:"registrant_postal"`
|
||||
|
||||
// Abuse Contact (from WHOIS)
|
||||
AbuseEmail string `json:"abuse_email" db:"abuse_email"`
|
||||
AbusePhone string `json:"abuse_phone" db:"abuse_phone"`
|
||||
|
||||
// Metadata
|
||||
Tags []string `json:"tags" db:"tags"`
|
||||
Notes string `json:"notes" db:"notes"`
|
||||
FaviconURL string `json:"favicon_url" db:"favicon_url"`
|
||||
|
||||
// Ownership
|
||||
UserID string `json:"user" db:"user"`
|
||||
Created time.Time `json:"created" db:"created"`
|
||||
Updated time.Time `json:"updated" db:"updated"`
|
||||
LastChecked time.Time `json:"last_checked" db:"last_checked"`
|
||||
|
||||
// Alert settings
|
||||
AlertDaysBefore int `json:"alert_days_before" db:"alert_days_before"` // Days before expiry to alert
|
||||
SSLAlertEnabled bool `json:"ssl_alert_enabled" db:"ssl_alert_enabled"`
|
||||
}
|
||||
|
||||
// DomainHistory tracks changes to a domain over time
|
||||
type DomainHistory struct {
|
||||
ID string `json:"id" db:"id"`
|
||||
DomainID string `json:"domain" db:"domain"`
|
||||
ChangeType string `json:"change_type" db:"change_type"` // expiry, ssl, dns, registrar, ip, etc.
|
||||
FieldName string `json:"field_name" db:"field_name"`
|
||||
OldValue string `json:"old_value" db:"old_value"`
|
||||
NewValue string `json:"new_value" db:"new_value"`
|
||||
UserID string `json:"user" db:"user"`
|
||||
CreatedAt time.Time `json:"created_at" db:"created_at"`
|
||||
}
|
||||
|
||||
// WHOISData represents parsed WHOIS information
|
||||
type WHOISData struct {
|
||||
DomainName string `json:"domain_name"`
|
||||
Status []string `json:"status"`
|
||||
DNSSEC string `json:"dnssec"`
|
||||
Dates WHOISDates `json:"dates"`
|
||||
Registrar WHOISRegistrar `json:"registrar"`
|
||||
Registrant WHOISContact `json:"registrant"`
|
||||
Abuse WHOISAbuse `json:"abuse"`
|
||||
}
|
||||
|
||||
type WHOISDates struct {
|
||||
ExpiryDate *time.Time `json:"expiry_date"`
|
||||
CreationDate *time.Time `json:"creation_date"`
|
||||
UpdatedDate *time.Time `json:"updated_date"`
|
||||
}
|
||||
|
||||
type WHOISRegistrar struct {
|
||||
Name string `json:"name"`
|
||||
ID string `json:"id"`
|
||||
URL string `json:"url"`
|
||||
RegistryDomainID string `json:"registry_domain_id"`
|
||||
}
|
||||
|
||||
type WHOISContact struct {
|
||||
Name string `json:"name"`
|
||||
Organization string `json:"organization"`
|
||||
Street string `json:"street"`
|
||||
City string `json:"city"`
|
||||
State string `json:"state"`
|
||||
Country string `json:"country"`
|
||||
PostalCode string `json:"postal_code"`
|
||||
}
|
||||
|
||||
type WHOISAbuse struct {
|
||||
Email string `json:"email"`
|
||||
Phone string `json:"phone"`
|
||||
}
|
||||
|
||||
// SSLInfo represents SSL certificate information
|
||||
type SSLInfo struct {
|
||||
Issuer string `json:"issuer"`
|
||||
IssuerCountry string `json:"issuer_country"`
|
||||
ValidFrom time.Time `json:"valid_from"`
|
||||
ValidTo time.Time `json:"valid_to"`
|
||||
Subject string `json:"subject"`
|
||||
Fingerprint string `json:"fingerprint"`
|
||||
KeySize int `json:"key_size"`
|
||||
SignatureAlgo string `json:"signature_algo"`
|
||||
}
|
||||
|
||||
// DNSInfo represents DNS records
|
||||
type DNSInfo struct {
|
||||
NameServers []string `json:"name_servers"`
|
||||
MXRecords []string `json:"mx_records"`
|
||||
TXTRecords []string `json:"txt_records"`
|
||||
DNSSEC string `json:"dnssec"`
|
||||
}
|
||||
|
||||
// HostInfo represents host/geolocation information
|
||||
type HostInfo struct {
|
||||
Country string `json:"country"`
|
||||
Region string `json:"region"`
|
||||
City string `json:"city"`
|
||||
Lat float64 `json:"lat"`
|
||||
Lon float64 `json:"lon"`
|
||||
ISP string `json:"isp"`
|
||||
Org string `json:"org"`
|
||||
ASNumber string `json:"as_number"`
|
||||
}
|
||||
|
||||
// IPInfo represents IP address information
|
||||
type IPInfo struct {
|
||||
IPv4 []string `json:"ipv4"`
|
||||
IPv6 []string `json:"ipv6"`
|
||||
}
|
||||
|
||||
// ChangeType constants for domain history
|
||||
const (
|
||||
ChangeTypeExpiry = "expiry"
|
||||
ChangeTypeSSL = "ssl"
|
||||
ChangeTypeDNS = "dns"
|
||||
ChangeTypeRegistrar = "registrar"
|
||||
ChangeTypeIP = "ip"
|
||||
ChangeTypeHost = "host"
|
||||
ChangeTypeStatus = "status"
|
||||
)
|
||||
|
||||
// Domain status constants
|
||||
const (
|
||||
DomainStatusActive = "active"
|
||||
DomainStatusExpiring = "expiring" // Within alert_days_before
|
||||
DomainStatusExpired = "expired"
|
||||
DomainStatusUnknown = "unknown"
|
||||
DomainStatusPaused = "paused"
|
||||
)
|
||||
|
||||
// IsExpiring returns true if the domain is expiring within the alert window
|
||||
func (d *Domain) IsExpiring() bool {
|
||||
if d.ExpiryDate == nil || d.AlertDaysBefore <= 0 {
|
||||
return false
|
||||
}
|
||||
alertDate := time.Now().AddDate(0, 0, d.AlertDaysBefore)
|
||||
return d.ExpiryDate.Before(alertDate) && d.ExpiryDate.After(time.Now())
|
||||
}
|
||||
|
||||
// IsExpired returns true if the domain has expired
|
||||
func (d *Domain) IsExpired() bool {
|
||||
if d.ExpiryDate == nil {
|
||||
return false
|
||||
}
|
||||
return d.ExpiryDate.Before(time.Now())
|
||||
}
|
||||
|
||||
// DaysUntilExpiry returns the number of days until expiry
|
||||
func (d *Domain) DaysUntilExpiry() int {
|
||||
if d.ExpiryDate == nil {
|
||||
return -1
|
||||
}
|
||||
return int(time.Until(*d.ExpiryDate).Hours() / 24)
|
||||
}
|
||||
|
||||
// SSLDaysUntilExpiry returns days until SSL expiry
|
||||
func (d *Domain) SSLDaysUntilExpiry() int {
|
||||
if d.SSLValidTo == nil {
|
||||
return -1
|
||||
}
|
||||
return int(time.Until(*d.SSLValidTo).Hours() / 24)
|
||||
}
|
||||
|
||||
// GetStatus returns the current domain status
|
||||
func (d *Domain) GetStatus() string {
|
||||
if !d.Active {
|
||||
return DomainStatusPaused
|
||||
}
|
||||
if d.IsExpired() {
|
||||
return DomainStatusExpired
|
||||
}
|
||||
if d.IsExpiring() {
|
||||
return DomainStatusExpiring
|
||||
}
|
||||
if d.ExpiryDate == nil {
|
||||
return DomainStatusUnknown
|
||||
}
|
||||
return DomainStatusActive
|
||||
}
|
||||
Reference in New Issue
Block a user