Files
monibuca/plugin/mp4/exception.go
T
pg 0913df7b8c fix:
1.recordmode:Change "recordmode" from the original "1, 0" to "auto, event".
original is :1 is event record,0 is auto record.
2.eventleve:Change "eventlevel" from the original "0, 1" to "high, low".
original is :1 is event low,0 is event high.
2024-12-22 17:40:30 +08:00

156 lines
5.4 KiB
Go

package plugin_mp4
import (
"os"
"time"
"github.com/shirou/gopsutil/v4/disk"
"gorm.io/gorm"
"m7s.live/v5"
"m7s.live/v5/pkg/task"
)
// mysql数据库里Exception 定义异常结构体
type Exception struct {
CreateTime string `json:"createTime" gorm:"type:varchar(50)"`
AlarmType string `json:"alarmType" gorm:"type:varchar(50)"`
AlarmDesc string `json:"alarmDesc" gorm:"type:varchar(50)"`
ServerIP string `json:"serverIP" gorm:"type:varchar(50)"`
StreamPath string `json:"streamPath" gorm:"type:varchar(50)"`
}
// // 向第三方发送异常报警
// func (p *MP4Plugin) SendToThirdPartyAPI(exception *Exception) {
// exception.CreateTime = time.Now().Format("2006-01-02 15:04:05")
// exception.ServerIP = p.GetCommonConf().PublicIP
// data, err := json.Marshal(exception)
// if err != nil {
// p.Error("SendToThirdPartyAPI", " marshalling exception error", err.Error())
// return
// }
// err = p.DB.Create(&exception).Error
// if err != nil {
// p.Error("SendToThirdPartyAPI", "insert into db error", err.Error())
// return
// }
// resp, err := http.Post(p.ExceptionPostUrl, "application/json", bytes.NewBuffer(data))
// if err != nil {
// p.Error("SendToThirdPartyAPI", "Error sending exception to third party API error", err.Error())
// return
// }
// defer resp.Body.Close()
// if resp.StatusCode != http.StatusOK {
// p.Error("SendToThirdPartyAPI", "Failed to send exception, status code:", resp.StatusCode)
// } else {
// p.Info("SendToThirdPartyAPI", "Exception sent successfully!")
// }
// }
// // 磁盘超上限报警
// func (p *DeleteRecordTask) getDisckException(streamPath string) bool {
// if p.getDiskOutOfSpace(p.DiskMaxPercent) {
// exceptionChannel <- &Exception{AlarmType: "disk alarm", AlarmDesc: "disk is full", StreamPath: streamPath}
// return true
// }
// return false
// }
// 判断磁盘使用量是否中超限
func (p *DeleteRecordTask) getDiskOutOfSpace(max float64) bool {
exePath, err := os.Getwd()
//pwd, _ := os.Getwd()
//fmt.Printf("当前pwd是: %v\n", pwd)
//if err != nil {
// fmt.Printf("Error getting executable path: %v\n", err)
// return false
//}
//// 获取路径的根目录部分
//root := filepath.VolumeName(exePath)
//if root == "" {
// // 在Unix-like系统中,根目录是 "/"
// root = "/"
//}
d, err := disk.Usage(exePath)
if err != nil {
p.Error("getDiskOutOfSpace", "error", err)
}
p.Debug("getDiskOutOfSpace", "current path", exePath, "disk UsedPercent", d.UsedPercent, "total disk space", d.Total,
"disk free", d.Free, "disk usage", d.Used, "AutoOverWriteDiskPercent", p.AutoOverWriteDiskPercent, "DiskMaxPercent", p.DiskMaxPercent)
if d.UsedPercent >= max {
return true
} else {
return false
}
}
func (p *DeleteRecordTask) deleteOldestFile() {
//当当前磁盘使用量大于AutoOverWriteDiskPercent自动覆盖磁盘使用量配置时,自动删除最旧的文件
//连续录像删除最旧的文件
for p.getDiskOutOfSpace(p.AutoOverWriteDiskPercent) {
queryRecord := m7s.RecordStream{
EventLevel: m7s.EventLevelLow, // 查询条件:event_level = 1,非重要事件
}
var eventRecords []m7s.RecordStream
err := p.DB.Where(&queryRecord).Where("end_time != '1970-01-01 00:00:00'").Order("end_time ASC").Limit(1).Find(&eventRecords).Error
if err == nil {
if len(eventRecords) > 0 {
for _, record := range eventRecords {
p.Info("deleteOldestFile", "ready to delete oldestfile,ID", record.ID, "create time", record.EndTime, "filepath", record.FilePath)
err = os.Remove(record.FilePath)
if err != nil {
p.Error("deleteOldestFile", "delete file from disk error", err)
}
err = p.DB.Delete(&record).Error
if err != nil {
p.Error("deleteOldestFile", "delete record from disk error", err)
}
}
}
} else {
p.Error("deleteOldestFile", "search record from db error", err)
}
time.Sleep(time.Second * 3)
}
}
type DeleteRecordTask struct {
task.TickTask
DiskMaxPercent float64
AutoOverWriteDiskPercent float64
RecordFileExpireDays int
DB *gorm.DB
}
func (t *DeleteRecordTask) GetTickInterval() time.Duration {
return 1 * time.Minute
}
func (t *DeleteRecordTask) Tick(any) {
t.deleteOldestFile()
if t.RecordFileExpireDays <= 0 {
return
}
//搜索event_records表中event_level值为1的(非重要)数据,并将其create_time与当前时间比对,大于RecordFileExpireDays则进行删除,数据库标记is_delete为1,磁盘上删除录像文件
var eventRecords []m7s.RecordStream
expireTime := time.Now().AddDate(0, 0, -t.RecordFileExpireDays)
t.Debug("RecordFileExpireDays is set to auto delete oldestfile", "expireTime", expireTime.Format("2006-01-02 15:04:05"))
queryRecord := m7s.RecordStream{
EventLevel: m7s.EventLevelLow, // 查询条件:event_level = low,非重要事件
}
err := t.DB.Where(&queryRecord).Find(&eventRecords, "end_time < ? AND end_time != '1970-01-01 00:00:00'", expireTime).Error
if err == nil {
for _, record := range eventRecords {
t.Info("RecordFileExpireDays is set to auto delete oldestfile", "ID", record.ID, "create time", record.EndTime, "filepath", record.FilePath)
err = os.Remove(record.FilePath)
if err != nil {
t.Error("RecordFileExpireDays set to auto delete oldestfile", "delete file from disk error", err)
}
err = t.DB.Delete(&record).Error
if err != nil {
t.Error("RecordFileExpireDays set to auto delete oldestfile", "delete record from db error", err)
}
}
}
}