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.
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user