mirror of
https://gitee.com/mirrors/AllinSSL.git
synced 2026-03-08 07:41:10 +08:00
修改监控为证书监控支持文件导入和smtp监控
监控支持多渠道通知 将静态文件打包到二进制文件
This commit is contained in:
124
backend/internal/monitor/file_handle.go
Normal file
124
backend/internal/monitor/file_handle.go
Normal file
@@ -0,0 +1,124 @@
|
||||
package monitor
|
||||
|
||||
import (
|
||||
"encoding/csv"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/tealeg/xlsx"
|
||||
"io"
|
||||
"mime/multipart"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func ParseMonitorFile(fileHeader *multipart.FileHeader) ([]*Monitor, error) {
|
||||
ext := strings.ToLower(filepath.Ext(fileHeader.Filename))
|
||||
|
||||
file, err := fileHeader.Open()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("无法打开文件: %v", err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
switch ext {
|
||||
case ".csv", ".txt":
|
||||
return parseCSV(file)
|
||||
case ".json":
|
||||
return parseJSON(file)
|
||||
case ".xlsx":
|
||||
return parseXLSX(file)
|
||||
default:
|
||||
return nil, fmt.Errorf("不支持的文件类型: %s", ext)
|
||||
}
|
||||
}
|
||||
|
||||
func parseCSV(reader io.Reader) ([]*Monitor, error) {
|
||||
csvReader := csv.NewReader(reader)
|
||||
var monitors []*Monitor
|
||||
isHeader := true
|
||||
|
||||
for {
|
||||
record, err := csvReader.Read()
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("CSV 解析失败: %v", err)
|
||||
}
|
||||
|
||||
if isHeader {
|
||||
isHeader = false
|
||||
continue
|
||||
}
|
||||
|
||||
if len(record) < 8 {
|
||||
continue
|
||||
}
|
||||
|
||||
monitor := &Monitor{
|
||||
Name: record[0],
|
||||
Target: record[1],
|
||||
MonitorType: record[2],
|
||||
ReportTypes: record[3],
|
||||
Cycle: record[4],
|
||||
RepeatSendGap: record[5],
|
||||
Active: record[6],
|
||||
AdvanceDay: record[7],
|
||||
}
|
||||
monitors = append(monitors, monitor)
|
||||
}
|
||||
|
||||
return monitors, nil
|
||||
}
|
||||
|
||||
func parseJSON(reader io.Reader) ([]*Monitor, error) {
|
||||
var monitors []*Monitor
|
||||
err := json.NewDecoder(reader).Decode(&monitors)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("JSON 解析失败: %v", err)
|
||||
}
|
||||
return monitors, nil
|
||||
}
|
||||
|
||||
func parseXLSX(file multipart.File) ([]*Monitor, error) {
|
||||
var monitors []*Monitor
|
||||
|
||||
// 读取文件内容到内存
|
||||
data, err := io.ReadAll(file)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 解析 XLSX 内容
|
||||
xlFile, err := xlsx.OpenBinary(data)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("解析 xlsx 失败: %v", err)
|
||||
}
|
||||
|
||||
if len(xlFile.Sheets) == 0 {
|
||||
return nil, fmt.Errorf("未找到工作表")
|
||||
}
|
||||
|
||||
sheet := xlFile.Sheets[0]
|
||||
for i, row := range sheet.Rows {
|
||||
if i == 0 {
|
||||
continue // 跳过表头
|
||||
}
|
||||
if len(row.Cells) < 8 {
|
||||
continue
|
||||
}
|
||||
monitor := &Monitor{
|
||||
Name: row.Cells[0].String(),
|
||||
Target: row.Cells[1].String(),
|
||||
MonitorType: row.Cells[2].String(),
|
||||
ReportTypes: row.Cells[3].String(),
|
||||
Cycle: row.Cells[4].String(),
|
||||
RepeatSendGap: row.Cells[5].String(),
|
||||
Active: row.Cells[6].String(),
|
||||
AdvanceDay: row.Cells[7].String(),
|
||||
}
|
||||
monitors = append(monitors, monitor)
|
||||
}
|
||||
|
||||
return monitors, nil
|
||||
}
|
||||
Reference in New Issue
Block a user