Files
be.ems/lib/config/psap.go
2025-07-08 14:45:46 +08:00

286 lines
7.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package config
import (
"bufio"
"fmt"
"os"
"reflect"
"strings"
"be.ems/lib/email"
"gopkg.in/yaml.v3"
)
// PsapConfig PSAP配置结构体
type PsapConfig struct {
Ticket struct {
TicketNotification email.EmailConfig `yaml:"ticketNotification" json:"ticketNotification"` // 注意:配置文件中是 "ticketNotification",保持一致
TicketTimeout TicketTimeout `yaml:"ticketTimeout" json:"ticketTimeout"` // 注意:配置文件中是 "ticketTimeout",保持一致{
} `yaml:"ticket" json:"ticket"` // PSAP工单相关配置
}
type TicketTimeout struct {
New int `yaml:"new" json:"new"` // NEW状态超时时间分钟
InProgress int `yaml:"inProgress" json:"inProgress"` // IN_PROGRESS状态超时时间分钟
NoAnswer1 int `yaml:"noAnswer1" json:"noAnswer1"` // NO_ANSWER_1状态超时时间分钟
NoAnswer2 int `yaml:"noAnswer2" json:"noAnswer2"` // NO_ANSWER_2状态超时时间分钟
NearlyTimeout int `yaml:"nearlyTimeout" json:"nearlyTimeout"` // 提前提醒时间(分钟)
}
var psapConfig *PsapConfig
var PsapYamlConfigInfo YamlConfigFile = YamlConfigFile{}
// ReadPsapConfig 读取PSAP配置文件
func ReadPsapConfig(configFile string) (*PsapConfig, error) {
PsapYamlConfigInfo.FilePath = configFile
yamlFile, err := os.ReadFile(configFile)
if err != nil {
return nil, fmt.Errorf("read psap config file error: %w", err)
}
var config PsapConfig
err = yaml.Unmarshal(yamlFile, &config)
if err != nil {
return nil, fmt.Errorf("unmarshal psap config error: %w", err)
}
psapConfig = &config
// PsapYamlConfigInfo.ConfigLines = config
// 读取原始文件行
err = ReadPsapOriginalConfig(configFile)
if err != nil {
return nil, fmt.Errorf("read psap original config error: %w", err)
}
return &config, nil
}
// ReadPsapOriginalConfig 读取PSAP原始配置文件行
func ReadPsapOriginalConfig(configFile string) error {
inputFile, err := os.Open(configFile)
if err != nil {
return fmt.Errorf("failed to open psap config file: %w", err)
}
defer inputFile.Close()
// 清空之前的内容
PsapYamlConfigInfo.OrignalLines = nil
scanner := bufio.NewScanner(inputFile)
for scanner.Scan() {
PsapYamlConfigInfo.OrignalLines = append(PsapYamlConfigInfo.OrignalLines, scanner.Text())
}
if err := scanner.Err(); err != nil {
return fmt.Errorf("failed to scan psap config file: %w", err)
}
return nil
}
// WritePsapOriginalConfig 写回PSAP原始配置文件
func WritePsapOriginalConfig(configFile string, paramName string, paramData map[string]any) error {
lines := PsapYamlConfigInfo.OrignalLines
for i, line := range lines {
if strings.Contains(line, paramName) {
for k, v := range paramData {
// 在paramName附近查找对应的字段
for j := i + 1; j < len(lines); j++ {
// 跳过注释行
trimmedLine := strings.TrimSpace(lines[j])
if strings.HasPrefix(trimmedLine, "#") {
continue
}
if strings.Contains(lines[j], k+":") {
index := strings.Index(lines[j], k)
// 根据v的类型确定格式
switch v := v.(type) {
case string:
lines[j] = lines[j][:index] + fmt.Sprintf("%s: \"%s\"", k, v)
case bool:
lines[j] = lines[j][:index] + fmt.Sprintf("%s: %t", k, v)
default:
lines[j] = lines[j][:index] + fmt.Sprintf("%s: %v", k, v)
}
break
}
}
}
break
}
}
// 写回yaml文件
outputFile, err := os.Create(configFile)
if err != nil {
return fmt.Errorf("failed to create psap config file: %w", err)
}
defer outputFile.Close()
writer := bufio.NewWriter(outputFile)
for _, line := range PsapYamlConfigInfo.OrignalLines {
writer.WriteString(line + "\n")
}
return writer.Flush()
}
// UpdatePsapStructFromMap 更新PSAP结构体字段
func UpdatePsapStructFromMap(s any, updates map[string]any) {
v := reflect.ValueOf(s).Elem()
t := v.Type()
for key, value := range updates {
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
if field.Tag.Get("json") == key {
structField := v.FieldByName(field.Name)
if structField.IsValid() && structField.CanSet() {
// 转换值为适当的类型
convertedValue := reflect.ValueOf(value).Convert(structField.Type())
if structField.Type() == convertedValue.Type() {
structField.Set(convertedValue)
}
}
break
}
}
}
}
// GetPsapConfig 获取PSAP配置
func GetPsapConfig() *PsapConfig {
if psapConfig == nil {
// 如果配置未加载,尝试从默认位置加载
config, err := ReadPsapConfig("./etc/psap.yaml")
if err != nil {
fmt.Printf("Failed to load PSAP config: %v\n", err)
return nil
}
psapConfig = config
}
return psapConfig
}
// GetSMTPConfig 获取SMTP配置
func GetSMTPConfig() *email.EmailConfig {
config := GetPsapConfig()
if config == nil {
return nil
}
return &config.Ticket.TicketNotification
}
// GetTimeoutConfig 获取超时配置
func GetTimeoutConfig() *TicketTimeout {
config := GetPsapConfig()
if config == nil {
return nil
}
return &config.Ticket.TicketTimeout
}
// 以下是具体的配置获取方法
// GetNewTicketTimeoutMicros 获取NEW状态超时时间微秒
func GetNewTicketTimeoutMicros() int64 {
config := GetTimeoutConfig()
if config == nil {
return 60 * 60 * 1000000 // 默认60分钟
}
return int64(config.New) * 60 * 1000000 // 分钟转微秒
}
// GetInProgressTicketTimeoutMicros 获取IN_PROGRESS状态超时时间微秒
func GetInProgressTicketTimeoutMicros() int64 {
config := GetTimeoutConfig()
if config == nil {
return 60 * 60 * 1000000 // 默认60分钟
}
return int64(config.InProgress) * 60 * 1000000
}
// GetNoAnswer1TicketTimeoutMicros 获取NO_ANSWER_1状态超时时间微秒
func GetNoAnswer1TicketTimeoutMicros() int64 {
config := GetTimeoutConfig()
if config == nil {
return 4 * 60 * 60 * 1000000 // 默认4小时
}
return int64(config.NoAnswer1) * 60 * 1000000
}
// GetNoAnswer2TicketTimeoutMicros 获取NO_ANSWER_2状态超时时间微秒
func GetNoAnswer2TicketTimeoutMicros() int64 {
config := GetTimeoutConfig()
if config == nil {
return 8 * 60 * 60 * 1000000 // 默认8小时
}
return int64(config.NoAnswer2) * 60 * 1000000
}
// GetNearlyTimeoutMicros 获取提前提醒时间(微秒)
func GetNearlyTimeoutMicros() int64 {
config := GetTimeoutConfig()
if config == nil {
return 20 * 60 * 1000000 // 默认20分钟
}
return int64(config.NearlyTimeout) * 60 * 1000000
}
// IsSMTPEnabled 检查SMTP是否启用
func IsSMTPEnabled() bool {
config := GetSMTPConfig()
if config == nil {
return false
}
return config.Enabled
}
// GetSMTPHost 获取SMTP主机
func GetSMTPHost() string {
config := GetSMTPConfig()
if config == nil {
return ""
}
return config.Host
}
// GetSMTPPort 获取SMTP端口
func GetSMTPPort() int {
config := GetSMTPConfig()
if config == nil {
return 25
}
return config.Port
}
// GetSMTPUser 获取SMTP用户名
func GetSMTPUsername() string {
config := GetSMTPConfig()
if config == nil {
return ""
}
return config.Username
}
// GetSMTPPassword 获取SMTP密码
func GetSMTPPassword() string {
config := GetSMTPConfig()
if config == nil {
return ""
}
return config.Password
}
// GetSMTPFrom 获取SMTP发件人
func GetSMTPFrom() string {
config := GetSMTPConfig()
if config == nil {
return ""
}
return config.From
}