126 lines
2.5 KiB
Go
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 || 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
|
|
}
|