Files
checkcle/server/service-operation/ssl-monitoring/monitor.go
T
Tola Leng 933e70a3f6 feat: Implement comprehensive multi-channel notification system with templating and SSL monitoring
- Add robust notification system supporting 7+ communication channels with intelligent message templating, resource monitoring, and SSL certificate alerts. Notification Channels: (Telegram, Discord, Slack, Signal, Email, Google Chat, Webhooks).

- This notification system provides enterprise-grade alerting capabilities with extensive customization options and multi-channel redundancy for critical service monitoring.
2025-08-14 20:50:31 +07:00

98 lines
2.7 KiB
Go

package sslmonitoring
import (
"time"
"service-operation/pocketbase"
)
// SSLMonitor monitors SSL certificates and sends notifications
type SSLMonitor struct {
client *SSLClient
notificationService *SSLNotificationService
checkInterval time.Duration
stopChan chan bool
}
// NewSSLMonitor creates a new SSL monitor
func NewSSLMonitor(pbClient *pocketbase.PocketBaseClient) *SSLMonitor {
// Initialize SSL client
sslClient := NewSSLClient(pbClient)
// Initialize notification service
notificationService := NewSSLNotificationService(sslClient, pbClient)
// Set check interval to 30 seconds to match other services
checkInterval := 30 * time.Second
return &SSLMonitor{
client: sslClient,
notificationService: notificationService,
checkInterval: checkInterval,
stopChan: make(chan bool, 1),
}
}
// Start begins monitoring SSL certificates
func (sm *SSLMonitor) Start() {
// log.Printf("🚀 [SSL-MONITOR] Starting with check interval: %v", sm.checkInterval)
// log.Printf("⏰ [SSL-MONITOR] Startup grace period: 2 minutes (no notifications for valid certificates)")
// Run initial check
sm.checkCertificates()
// Set up periodic checking every 30 seconds
ticker := time.NewTicker(sm.checkInterval)
defer ticker.Stop()
for {
select {
case <-ticker.C:
sm.checkCertificates()
case <-sm.stopChan:
// log.Println("🛑 [SSL-MONITOR] Monitoring stopped")
return
}
}
}
// Stop gracefully stops the SSL monitoring
func (sm *SSLMonitor) Stop() {
// log.Printf("🛑 [SSL-MONITOR] Stopping SSL monitoring...")
select {
case sm.stopChan <- true:
default:
}
}
// checkCertificates fetches all SSL certificates and checks their notification requirements
func (sm *SSLMonitor) checkCertificates() {
// log.Printf("🔍 [SSL-CHECK] Checking SSL certificates for expiration alerts...")
certificates, err := sm.client.GetSSLCertificates()
if err != nil {
// log.Printf("❌ [SSL-ERROR] Failed to fetch SSL certificates: %v", err)
return
}
// log.Printf("📊 [SSL-CERTIFICATES] Found %d certificates to check", len(certificates))
successCount := 0
errorCount := 0
for _, cert := range certificates {
// Check each certificate for notification requirements
if err := sm.notificationService.CheckAndNotifySSLCertificate(cert); err != nil {
// log.Printf("❌ [SSL-FAILED] Failed to process certificate %s: %v", cert.Domain, err)
errorCount++
} else {
successCount++
}
}
// log.Printf("✅ [SSL-SUMMARY] Processed %d certificates (success: %d, errors: %d)",
// len(certificates), successCount, errorCount)
_ = successCount // Prevent unused variable warning
_ = errorCount // Prevent unused variable warning
}