mirror of https://github.com/allinssl/allinssl
265 lines
6.6 KiB
Go
265 lines
6.6 KiB
Go
package monitor
|
|
|
|
import (
|
|
"ALLinSSL/backend/public"
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
func GetSqlite() (*public.Sqlite, error) {
|
|
s, err := public.NewSqlite("data/monitor.db", "")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
s.TableName = "monitor"
|
|
return s, nil
|
|
}
|
|
|
|
func GetList(search string, p, limit int64) ([]map[string]any, int, error) {
|
|
var data []map[string]any
|
|
var count int64
|
|
s, err := GetSqlite()
|
|
if err != nil {
|
|
return data, 0, err
|
|
}
|
|
defer s.Close()
|
|
|
|
var limits []int64
|
|
if p >= 0 && limit >= 0 {
|
|
limits = []int64{0, limit}
|
|
if p > 1 {
|
|
limits[0] = (p - 1) * limit
|
|
limits[1] = limit
|
|
}
|
|
}
|
|
|
|
if search != "" {
|
|
count, err = s.Where("name like ? or target like ?", []interface{}{"%" + search + "%", "%" + search + "%"}).Count()
|
|
data, err = s.Where("name like ? or target like ?", []interface{}{"%" + search + "%", "%" + search + "%"}).Order("update_time", "desc").Limit(limits).Select()
|
|
} else {
|
|
count, err = s.Count()
|
|
data, err = s.Order("update_time", "desc").Limit(limits).Select()
|
|
}
|
|
if err != nil {
|
|
return data, 0, err
|
|
}
|
|
for _, v := range data {
|
|
info, ok := v["info"].(string)
|
|
if !ok || info == "" {
|
|
continue
|
|
}
|
|
var certInfo CertInfo
|
|
err := json.Unmarshal([]byte(info), &certInfo)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
v["common_name"] = certInfo.CommonName
|
|
v["ca"] = certInfo.CA
|
|
v["not_before"] = certInfo.NotBefore
|
|
v["not_after"] = certInfo.NotAfter
|
|
v["days_left"] = certInfo.DaysLeft
|
|
v["sans"] = certInfo.SANs
|
|
//v["valid"] = certInfo.Valid
|
|
delete(v, "info")
|
|
}
|
|
return data, int(count), nil
|
|
}
|
|
|
|
func GetInfo(id string) (map[string]any, error) {
|
|
s, err := GetSqlite()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer s.Close()
|
|
data, err := s.Where("id=?", []interface{}{id}).Select()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(data) == 0 || data[0] == nil {
|
|
return nil, fmt.Errorf("未找到对应的监控记录")
|
|
}
|
|
dataMap := data[0]
|
|
|
|
monitorInfo := map[string]any{
|
|
"id": dataMap["id"],
|
|
"name": dataMap["name"],
|
|
"target": dataMap["target"],
|
|
"monitor_type": dataMap["monitor_type"],
|
|
"valid": dataMap["valid"],
|
|
"last_time": dataMap["last_time"],
|
|
}
|
|
|
|
info, ok := dataMap["info"].(string)
|
|
if !ok || info == "" {
|
|
return monitorInfo, nil
|
|
}
|
|
var certInfo CertInfo
|
|
err = json.Unmarshal([]byte(info), &certInfo)
|
|
if err != nil {
|
|
return monitorInfo, fmt.Errorf("解析证书信息失败: %v", err)
|
|
}
|
|
monitorInfo["common_name"] = certInfo.CommonName
|
|
monitorInfo["ca"] = certInfo.CA
|
|
monitorInfo["not_before"] = certInfo.NotBefore
|
|
monitorInfo["not_after"] = certInfo.NotAfter
|
|
monitorInfo["days_left"] = certInfo.DaysLeft
|
|
monitorInfo["sans"] = certInfo.SANs
|
|
//monitorInfo["valid"] = certInfo.Valid
|
|
monitorInfo["verify_error"] = certInfo.VerifyError
|
|
monitorInfo["cert_chain"] = certInfo.CertChain
|
|
|
|
// 查询异常次数
|
|
// 计算7天前的时间
|
|
sevenDaysAgo := time.Now().AddDate(0, 0, -7).Format("2006-01-02 15:04:05")
|
|
s.TableName = "err_record"
|
|
errCount, err := s.Where("monitor_id=? and create_time >= ?", []interface{}{id, sevenDaysAgo}).Count()
|
|
if err != nil {
|
|
errCount = 0
|
|
}
|
|
monitorInfo["err_count"] = errCount
|
|
|
|
return monitorInfo, nil
|
|
}
|
|
|
|
// AddMonitor 添加新的监控记录
|
|
func AddMonitor(name, target, monitorType, reportTypes, cycle, repeatSendGap, active, advanceDay string) error {
|
|
s, err := GetSqlite()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer s.Close()
|
|
data := map[string]any{
|
|
"name": name,
|
|
"target": target,
|
|
"monitor_type": monitorType,
|
|
"report_types": reportTypes,
|
|
"cycle": cycle,
|
|
"repeat_send_gap": repeatSendGap,
|
|
"active": active,
|
|
"advance_day": advanceDay,
|
|
"create_time": time.Now().Format("2006-01-02 15:04:05"),
|
|
"update_time": time.Now().Format("2006-01-02 15:04:05"),
|
|
}
|
|
if _, err := s.Insert(data); err != nil {
|
|
return fmt.Errorf("添加监控记录失败: %v", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// UpdMonitor 更新监控记录
|
|
func UpdMonitor(id, name, target, reportTypes, cycle, repeatSendGap, active, advanceDay string) error {
|
|
s, err := GetSqlite()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer s.Close()
|
|
data := map[string]any{
|
|
"name": name,
|
|
"target": target,
|
|
"report_types": reportTypes,
|
|
"cycle": cycle,
|
|
"repeat_send_gap": repeatSendGap,
|
|
"active": active,
|
|
"advance_day": advanceDay,
|
|
"update_time": time.Now().Format("2006-01-02 15:04:05"),
|
|
"info": "", // 清空 info 字段
|
|
}
|
|
_, err = s.Where("id=?", []interface{}{id}).Update(data)
|
|
if err != nil {
|
|
return fmt.Errorf("更新监控记录失败: %v", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func DelMonitor(id string) error {
|
|
s, err := GetSqlite()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer s.Close()
|
|
_, err = s.Where("id=?", []interface{}{id}).Delete()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
s.TableName = "err_record"
|
|
_, err = s.Where("monitor_id=?", []interface{}{id}).Delete()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func SetMonitor(id string, active int) error {
|
|
s, err := GetSqlite()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer s.Close()
|
|
_, err = s.Where("id=?", []interface{}{id}).Update(map[string]any{
|
|
"active": active,
|
|
"update_time": time.Now().Format("2006-01-02 15:04:05"),
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func GetErrRecord(id, p, limit int64) ([]map[string]any, int, error) {
|
|
var data []map[string]any
|
|
var count int64
|
|
s, err := public.NewSqlite("data/monitor.db", "")
|
|
if err != nil {
|
|
return data, 0, err
|
|
}
|
|
defer s.Close()
|
|
s.TableName = "err_record"
|
|
|
|
var limits []int64
|
|
if p >= 0 && limit >= 0 {
|
|
limits = []int64{0, limit}
|
|
if p > 1 {
|
|
limits[0] = (p - 1) * limit
|
|
limits[1] = limit
|
|
}
|
|
}
|
|
|
|
count, err = s.Where("monitor_id=?", []any{id}).Count()
|
|
if err != nil {
|
|
return data, 0, err
|
|
}
|
|
data, err = s.Where("monitor_id=?", []any{id}).Order("create_time", "desc").Limit(limits).Select()
|
|
if err != nil {
|
|
return data, 0, err
|
|
}
|
|
return data, int(count), nil
|
|
}
|
|
|
|
func MultiAddMonitor(monitors []*Monitor) error {
|
|
s, err := GetSqlite()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer s.Close()
|
|
|
|
for _, monitor := range monitors {
|
|
data := map[string]any{
|
|
"name": monitor.Name,
|
|
"target": monitor.Target,
|
|
"monitor_type": monitor.MonitorType,
|
|
"report_types": monitor.ReportTypes,
|
|
"cycle": monitor.Cycle,
|
|
"repeat_send_gap": monitor.RepeatSendGap,
|
|
"active": monitor.Active,
|
|
"advance_day": monitor.AdvanceDay,
|
|
"create_time": time.Now().Format("2006-01-02 15:04:05"),
|
|
"update_time": time.Now().Format("2006-01-02 15:04:05"),
|
|
}
|
|
if _, err := s.Insert(data); err != nil {
|
|
return fmt.Errorf("添加监控记录失败: %v", err)
|
|
}
|
|
}
|
|
return nil
|
|
}
|