Files
srs-spi/pkg/config/config.go
haibo.chen b0fce4380f fix warn
2025-10-14 16:51:37 +08:00

126 lines
2.5 KiB
Go

package config
import (
"fmt"
"net"
"os"
"gopkg.in/yaml.v3"
)
// 通用配置
type CommonConfig struct {
LogLevel string `yaml:"log-level"`
LogFile string `yaml:"log-file"`
}
// GB28181配置
type GB28181AuthConfig struct {
Enable bool `yaml:"enable"`
Password string `yaml:"password"`
}
type GB28181Config struct {
Serial string `yaml:"serial"`
Realm string `yaml:"realm"`
Host string `yaml:"host"`
Port int `yaml:"port"`
Auth GB28181AuthConfig `yaml:"auth"`
}
// HTTP服务配置
type HttpConfig struct {
Port int `yaml:"listen"`
Dir string `yaml:"dir"`
}
// 主配置结构
type MainConfig struct {
Common CommonConfig `yaml:"common"`
GB28181 GB28181Config `yaml:"gb28181"`
Http HttpConfig `yaml:"http"`
}
// 获取默认配置
func DefaultConfig() *MainConfig {
return &MainConfig{
Common: CommonConfig{
LogLevel: "info",
LogFile: "app.log",
},
GB28181: GB28181Config{
Serial: "34020000002000000001",
Realm: "3402000000",
Host: "0.0.0.0",
Port: 5060,
Auth: GB28181AuthConfig{
Enable: false,
Password: "123456",
},
},
Http: HttpConfig{
Port: 8025,
Dir: "./html",
},
}
}
func LoadConfig(filename string) (*MainConfig, error) {
// 如果配置文件不存在,返回默认配置
if _, err := os.Stat(filename); os.IsNotExist(err) {
return DefaultConfig(), nil
}
data, err := os.ReadFile(filename)
if err != nil {
return nil, fmt.Errorf("read config file failed: %v", err)
}
var config MainConfig
if err := yaml.Unmarshal(data, &config); err != nil {
return nil, fmt.Errorf("parse config file failed: %v", err)
}
return &config, nil
}
func GetLocalIP() (string, error) {
ifaces, err := net.Interfaces()
if err != nil {
return "", nil
}
type Iface struct {
Name string
Addr net.IP
}
var candidates []Iface
for _, ifc := range ifaces {
if ifc.Flags&net.FlagUp == 0 {
continue
}
if ifc.Flags&(net.FlagPointToPoint|net.FlagLoopback) != 0 {
continue
}
addrs, err := ifc.Addrs()
if err != nil {
continue
}
for _, addr := range addrs {
ipnet, ok := addr.(*net.IPNet)
if !ok {
continue
}
if ip4 := ipnet.IP.To4(); ip4 != nil {
candidates = append(candidates, Iface{
Name: ifc.Name, Addr: ip4,
})
//logger.Tf("considering interface", "iface", ifc.Name, "ip", ip4)
}
}
}
if len(candidates) == 0 {
return "", fmt.Errorf("No local IP found")
}
return candidates[0].Addr.String(), nil
}