123 lines
2.7 KiB
Go
123 lines
2.7 KiB
Go
package config
|
||
|
||
import (
|
||
"flag"
|
||
"fmt"
|
||
"log/slog"
|
||
"net"
|
||
"os"
|
||
"strings"
|
||
|
||
"github.com/spf13/viper"
|
||
"joylink.club/bj-rtsts-server/dto"
|
||
)
|
||
|
||
type AppConfig struct {
|
||
Env string
|
||
Server server
|
||
Datasource datasource
|
||
Logging log
|
||
Messaging messaging
|
||
Dynamics dynamics
|
||
Vobc vobc
|
||
Interlock interlock
|
||
}
|
||
type server struct {
|
||
Port int
|
||
}
|
||
type datasource struct {
|
||
Dsn string
|
||
}
|
||
type log struct {
|
||
Level string // 日志打印级别 debug info warn error
|
||
Format string // 输出日志格式 logfmt, json
|
||
Path string // 输出日志文件路径
|
||
FileName string // 输出日志文件名称
|
||
FileMaxSize int // 【日志分割】单个日志文件最多存储量 单位(mb)
|
||
FileMaxBackups int // 【日志分割】日志备份文件最多数量
|
||
MaxAge int // 日志保留时间,单位: 天 (day)
|
||
Compress bool // 是否压缩日志
|
||
Stdout bool // 是否输出到控制台
|
||
}
|
||
|
||
type messaging struct {
|
||
Centrifugo centrifugo
|
||
}
|
||
type centrifugo struct {
|
||
TokenSecret string
|
||
ApiKey string
|
||
ApiEndpoint string
|
||
Address string
|
||
}
|
||
type dynamics struct {
|
||
Ip string
|
||
UdpLocalPort int
|
||
UdpRemotePort int
|
||
UdpRemoteTrainPort int
|
||
HttpPort int
|
||
Open bool
|
||
}
|
||
type vobc struct {
|
||
Ip string
|
||
LocalPort int
|
||
RemotePort int
|
||
Open bool
|
||
}
|
||
|
||
type interlock struct {
|
||
Ip string
|
||
LocalPort int
|
||
RemotePort int
|
||
Open bool
|
||
}
|
||
|
||
var Config AppConfig
|
||
|
||
var SimulationId_prefix = (func() string {
|
||
ip := "127.0.0.1"
|
||
addrList, err := net.InterfaceAddrs()
|
||
if err != nil {
|
||
panic(dto.ErrorDto{Code: dto.DataOperationError, Message: err.Error()})
|
||
}
|
||
for _, address := range addrList {
|
||
if ipNet, ok := address.(*net.IPNet); ok && !ipNet.IP.IsLoopback() {
|
||
if ipNet.IP.To4() != nil {
|
||
ip = ipNet.IP.String()
|
||
}
|
||
}
|
||
}
|
||
ipArr := strings.Split(ip, ".")
|
||
return ipArr[2] + "_" + ipArr[3]
|
||
})()
|
||
|
||
// 获取配置文件名称,从运行flag参数config中获取,若未提供,使用默认'dev'
|
||
func getConfigName() string {
|
||
configName := ""
|
||
flag.StringVar(&configName, "config", "dev", "config name, eg: -config test")
|
||
flag.Parse()
|
||
if configName == "" {
|
||
configName = "dev"
|
||
}
|
||
slog.Info("读取配置文件", "配置文件名称", configName)
|
||
return configName
|
||
}
|
||
|
||
// 加载配置
|
||
func LoadConfig() {
|
||
cnf := viper.New()
|
||
cnf.SetConfigName(getConfigName())
|
||
cnf.SetConfigType("yml")
|
||
cnf.AddConfigPath("./config/")
|
||
cnf.AddConfigPath(".")
|
||
err := cnf.ReadInConfig()
|
||
if err != nil {
|
||
panic(fmt.Errorf("读取配置文件错误: %w", err))
|
||
}
|
||
fmt.Println(os.Args)
|
||
err = cnf.Unmarshal(&Config)
|
||
if err != nil {
|
||
panic(fmt.Errorf("解析配置文件错误: %w", err))
|
||
}
|
||
slog.Info("成功加载配置", "config", Config)
|
||
}
|