| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | package modelimport (	"strconv"	"strings")type HealthCheckConfig struct {	// Protocol settings	Protocol string            `json:"protocol"`                       // http, https, grpc	Method   string            `json:"method"`                         // GET, POST, PUT, etc.	Path     string            `json:"path"`                           // URL path to check	Headers  map[string]string `json:"headers" gorm:"serializer:json"` // Custom headers	Body     string            `json:"body"`                           // Request body for POST/PUT	// Response validation	ExpectedStatus  []int  `json:"expected_status" gorm:"serializer:json"` // Expected HTTP status codes	ExpectedText    string `json:"expected_text"`                          // Text that should be present in response	NotExpectedText string `json:"not_expected_text"`                      // Text that should NOT be present	ValidateSSL     bool   `json:"validate_ssl"`                           // Validate SSL certificate	// GRPC specific settings	GRPCService string `json:"grpc_service"` // GRPC service name	GRPCMethod  string `json:"grpc_method"`  // GRPC method name	// Advanced settings	DNSResolver    string `json:"dns_resolver"`    // Custom DNS resolver	SourceIP       string `json:"source_ip"`       // Source IP for requests	VerifyHostname bool   `json:"verify_hostname"` // Verify hostname in SSL cert	ClientCert     string `json:"client_cert"`     // Client certificate path	ClientKey      string `json:"client_key"`      // Client key path}type SiteConfig struct {	Model	Host               string             `gorm:"index" json:"host"`            // host:port format	Port               int                `gorm:"index" json:"port"`            // port number	Scheme             string             `gorm:"default:'http'" json:"scheme"` // http, https, grpc, grpcs	DisplayURL         string             `json:"display_url"`                  // computed URL for display	CustomOrder        int                `gorm:"default:0" json:"custom_order"`	HealthCheckEnabled bool               `gorm:"default:true" json:"health_check_enabled"`	CheckInterval      int                `gorm:"default:300" json:"check_interval"` // seconds	Timeout            int                `gorm:"default:10" json:"timeout"`         // seconds	UserAgent          string             `gorm:"default:'Nginx-UI Site Checker/1.0'" json:"user_agent"`	MaxRedirects       int                `gorm:"default:3" json:"max_redirects"`	FollowRedirects    bool               `gorm:"default:true" json:"follow_redirects"`	CheckFavicon       bool               `gorm:"default:true" json:"check_favicon"`	HealthCheckConfig  *HealthCheckConfig `gorm:"serializer:json" json:"health_check_config"`}// GetURL returns the computed URL for this site configfunc (sc *SiteConfig) GetURL() string {	if sc.DisplayURL != "" {		return sc.DisplayURL	}	return sc.Scheme + "://" + sc.Host}// SetFromURL parses a URL and sets the Host, Port, and Scheme fieldsfunc (sc *SiteConfig) SetFromURL(url string) error {	// Parse URL to extract host, port, and scheme	// This is a simplified implementation - you may want to use net/url package	if url == "" {		return nil	}	// Store the original URL as display URL for backward compatibility	sc.DisplayURL = url	// Extract scheme	if strings.HasPrefix(url, "https://") {		sc.Scheme = "https"		url = strings.TrimPrefix(url, "https://")	} else if strings.HasPrefix(url, "http://") {		sc.Scheme = "http"		url = strings.TrimPrefix(url, "http://")	} else if strings.HasPrefix(url, "grpcs://") {		sc.Scheme = "grpcs"		url = strings.TrimPrefix(url, "grpcs://")	} else if strings.HasPrefix(url, "grpc://") {		sc.Scheme = "grpc"		url = strings.TrimPrefix(url, "grpc://")	} else {		sc.Scheme = "http" // default	}	// Extract host and port	if strings.Contains(url, "/") {		url = strings.Split(url, "/")[0]	}	if strings.Contains(url, ":") {		parts := strings.Split(url, ":")		sc.Host = parts[0] + ":" + parts[1]		if len(parts) > 1 {			if port, err := strconv.Atoi(parts[1]); err == nil {				sc.Port = port			}		}	} else {		sc.Host = url + ":80" // default port		sc.Port = 80		if sc.Scheme == "https" || sc.Scheme == "grpcs" {			sc.Host = url + ":443"			sc.Port = 443		}	}	return nil}
 |