check_expired.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package cert
  2. import (
  3. "time"
  4. "github.com/0xJacky/Nginx-UI/internal/notification"
  5. "github.com/0xJacky/Nginx-UI/query"
  6. "github.com/uozi-tech/cosy/logger"
  7. )
  8. func CertExpiredNotify() {
  9. c := query.Cert
  10. certs, err := c.Find()
  11. if err != nil {
  12. logger.Errorf("CertExpiredNotify: Err: %v\n", err)
  13. return
  14. }
  15. for _, certModel := range certs {
  16. if certModel.SSLCertificatePath == "" {
  17. continue
  18. }
  19. certInfo, err := GetCertInfo(certModel.SSLCertificatePath)
  20. if err != nil {
  21. continue
  22. }
  23. now := time.Now()
  24. // Calculate days until expiration
  25. daysUntilExpiration := int(certInfo.NotAfter.Sub(now).Hours() / 24)
  26. // ignore expired certificate
  27. if daysUntilExpiration < -1 {
  28. continue
  29. }
  30. mask := map[string]any{
  31. "name": certModel.Name,
  32. "days": daysUntilExpiration,
  33. }
  34. // Check if certificate is already expired
  35. if now.After(certInfo.NotAfter) {
  36. notification.Error("Certificate Expired", "Certificate %{name} has expired", mask)
  37. continue
  38. }
  39. // Send notifications based on remaining days
  40. switch {
  41. case daysUntilExpiration <= 14:
  42. notification.Info("Certificate Expiration Notice",
  43. "Certificate %{name} will expire in %{days} days", mask)
  44. case daysUntilExpiration <= 7:
  45. notification.Warning("Certificate Expiring Soon",
  46. "Certificate %{name} will expire in %{days} days", mask)
  47. case daysUntilExpiration <= 3:
  48. notification.Warning("Certificate Expiring Soon",
  49. "Certificate %{name} will expire in %{days} days", mask)
  50. case daysUntilExpiration <= 1:
  51. notification.Error("Certificate Expiring Soon",
  52. "Certificate %{name} will expire in 1 day", mask)
  53. }
  54. }
  55. }