Доработка. Использование стандартных путей Linux
This commit is contained in:
@@ -10,15 +10,13 @@ import (
|
||||
)
|
||||
|
||||
type Retention struct {
|
||||
dataDir string
|
||||
maxAgeHours int // максимальный возраст файлов в часах
|
||||
maxSizeBytes int64 // максимальный размер всех файлов в байтах
|
||||
maxAgeHours int
|
||||
maxSizeBytes int64
|
||||
eventLogger *EventLogger
|
||||
}
|
||||
|
||||
func NewRetention(dataDir string, maxAgeHours int, maxSizeMB int, eventLogger *EventLogger) *Retention {
|
||||
func NewRetention(maxAgeHours int, maxSizeMB int, eventLogger *EventLogger) *Retention {
|
||||
return &Retention{
|
||||
dataDir: dataDir,
|
||||
maxAgeHours: maxAgeHours,
|
||||
maxSizeBytes: int64(maxSizeMB) * 1024 * 1024,
|
||||
eventLogger: eventLogger,
|
||||
@@ -41,29 +39,38 @@ func (r *Retention) Start() {
|
||||
}
|
||||
|
||||
func (r *Retention) Cleanup() {
|
||||
// Получаем директорию с данными
|
||||
dataDir, err := GetDataLogsDir()
|
||||
if err != nil {
|
||||
if r.eventLogger != nil {
|
||||
r.eventLogger.Event("ОШИБКА_ПОЛУЧЕНИЯ_ДИРЕКТОРИИ")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if r.eventLogger != nil {
|
||||
r.eventLogger.Event("ЗАПУЩЕНА_ОЧИСТКА_ЛОГОВ")
|
||||
}
|
||||
|
||||
// 1. Удаляем старые файлы
|
||||
deletedByAge := r.cleanByAge()
|
||||
deletedByAge := r.cleanByAge(dataDir)
|
||||
|
||||
// 2. Проверяем общий размер и удаляем самые старые если превышен лимит
|
||||
deletedBySize := r.cleanBySize()
|
||||
deletedBySize := r.cleanBySize(dataDir)
|
||||
|
||||
if r.eventLogger != nil && (deletedByAge > 0 || deletedBySize > 0) {
|
||||
r.eventLogger.Event("УДАЛЕНО_ФАЙЛОВ")
|
||||
log.Printf("🧹 Очистка логов: удалено %d файлов (по возрасту: %d, по размеру: %d)",
|
||||
log.Printf("Очистка логов: удалено %d файлов (по возрасту: %d, по размеру: %d)",
|
||||
deletedByAge+deletedBySize, deletedByAge, deletedBySize)
|
||||
}
|
||||
}
|
||||
|
||||
func (r *Retention) cleanByAge() int {
|
||||
func (r *Retention) cleanByAge(dataDir string) int {
|
||||
cutoff := time.Now().Add(-time.Duration(r.maxAgeHours) * time.Hour)
|
||||
deleted := 0
|
||||
|
||||
// Получаем все .bin файлы
|
||||
files, err := filepath.Glob(filepath.Join(r.dataDir, "gpio-*.bin"))
|
||||
files, err := filepath.Glob(filepath.Join(dataDir, "gpio-*.bin"))
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
@@ -93,9 +100,9 @@ func (r *Retention) cleanByAge() int {
|
||||
return deleted
|
||||
}
|
||||
|
||||
func (r *Retention) cleanBySize() int {
|
||||
func (r *Retention) cleanBySize(dataDir string) int {
|
||||
// Получаем все файлы
|
||||
files, err := filepath.Glob(filepath.Join(r.dataDir, "gpio-*.bin"))
|
||||
files, err := filepath.Glob(filepath.Join(dataDir, "gpio-*.bin"))
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
@@ -104,7 +111,7 @@ func (r *Retention) cleanBySize() int {
|
||||
return 0
|
||||
}
|
||||
|
||||
// Сортируем по времени (старые первыми)
|
||||
// Сортируем по времени (старыми первыми)
|
||||
type fileInfo struct {
|
||||
path string
|
||||
time time.Time
|
||||
@@ -172,33 +179,4 @@ func (r *Retention) parseFilenameTime(filename string) time.Time {
|
||||
hour, _ := time.Parse("15", parts[4])
|
||||
|
||||
return time.Date(year.Year(), month.Month(), day.Day(), hour.Hour(), 0, 0, 0, time.Local)
|
||||
}
|
||||
|
||||
// GetAvailableRange возвращает диапазон доступных данных
|
||||
func (r *Retention) GetAvailableRange() (oldest, newest time.Time, count int) {
|
||||
files, err := filepath.Glob(filepath.Join(r.dataDir, "gpio-*.bin"))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
count = len(files)
|
||||
if count == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
for _, file := range files {
|
||||
fileTime := r.parseFilenameTime(file)
|
||||
if fileTime.IsZero() {
|
||||
continue
|
||||
}
|
||||
|
||||
if oldest.IsZero() || fileTime.Before(oldest) {
|
||||
oldest = fileTime
|
||||
}
|
||||
if newest.IsZero() || fileTime.After(newest) {
|
||||
newest = fileTime
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user