package pages import ( "embed" "html/template" "net/http" "strings" "github.com/0xJacky/Nginx-UI/settings" "github.com/gin-gonic/gin" ) //go:embed *.tmpl var tmplFS embed.FS // MaintenancePageData maintenance page data structure type MaintenancePageData struct { Title string `json:"title"` Message string `json:"message"` Description string `json:"description"` ICPNumber string `json:"icp_number"` PublicSecurityNumber string `json:"public_security_number"` } const ( Title = "System Maintenance" Message = "We are currently performing system maintenance to improve your experience." Description = "Please check back later. Thank you for your understanding and patience." ) // MaintenancePage returns a maintenance page func MaintenancePage(c *gin.Context) { // Prepare template data data := MaintenancePageData{ Title: Title, Message: Message, Description: Description, ICPNumber: settings.NodeSettings.ICPNumber, PublicSecurityNumber: settings.NodeSettings.PublicSecurityNumber, } // Check User-Agent userAgent := c.GetHeader("User-Agent") isBrowser := len(userAgent) > 0 && (contains(userAgent, "Mozilla") || contains(userAgent, "Chrome") || contains(userAgent, "Safari") || contains(userAgent, "Edge") || contains(userAgent, "Firefox") || contains(userAgent, "Opera")) if !isBrowser { c.JSON(http.StatusServiceUnavailable, data) return } // Parse template tmpl, err := template.ParseFS(tmplFS, "maintenance.tmpl") if err != nil { c.String(http.StatusInternalServerError, "503 Service Unavailable") return } // Set content type c.Header("Content-Type", "text/html; charset=utf-8") c.Status(http.StatusServiceUnavailable) // Render template err = tmpl.Execute(c.Writer, data) if err != nil { c.String(http.StatusInternalServerError, "503 Service Unavailable") return } } // Helper function to check if a string contains a substring func contains(s, substr string) bool { return strings.Contains(s, substr) }