api_sync/main.go

80 lines
1.9 KiB
Go

package main
import (
"log"
"sync"
_ "github.com/lib/pq" // PostgreSQL driver
)
func main() {
log.Println("Start sync sp_info")
db, err := dbConnect()
if err != nil {
log.Fatal(err)
}
defer db.Close()
clients, err := loadClients(db)
if err != nil {
log.Fatal(err)
}
// Собираем все SID для обработки
var allSIDs []int64
for _, client := range clients {
ids, err := loadL7IDs(db, client)
if err != nil {
log.Println("binding error:", err)
continue
}
allSIDs = append(allSIDs, ids...)
}
log.Printf("Total SIDs to process: %d", len(allSIDs))
log.Printf("Using %d concurrent workers", maxConcurrentWorkers)
// Создаём канал для заданий и WaitGroup для ожидания
sidChan := make(chan int64, len(allSIDs))
var wg sync.WaitGroup
// Запускаем воркеры
for i := 0; i < maxConcurrentWorkers; i++ {
wg.Add(1)
go func(workerID int) {
defer wg.Done()
for sid := range sidChan {
log.Printf("[Worker %d] Processing SID %d", workerID, sid)
if err := processSID(db, sid); err != nil {
log.Printf("[Worker %d] SID %d error: %v", workerID, sid, err)
}
}
}(i)
}
// Отправляем все SID в канал
for _, sid := range allSIDs {
sidChan <- sid
}
close(sidChan)
// Ждём завершения всех воркеров
wg.Wait()
log.Println("Finish sync sp_info")
// Удаляем из sp_info ресурсы, которых больше нет в apps_settings
log.Println("Start cleanup of removed SIDs")
if err := cleanupRemovedSIDs(db, allSIDs); err != nil {
log.Printf("Cleanup error: %v", err)
}
log.Println("Finish cleanup of removed SIDs")
// Обновление WAF whitelist
log.Println("Start WAF whitelist update")
if err := updateWAFWhitelist(db); err != nil {
log.Printf("WAF whitelist update error: %v", err)
}
log.Println("Finish WAF whitelist update")
}