zhangzengfei
2024-06-06 0b932b8af021e1f97a27c85d823f828fbf854a39
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package config
 
import (
    "fmt"
    "gat1400Exchange/pkg/logger"
 
    "github.com/fsnotify/fsnotify"
    "github.com/spf13/viper"
)
 
type serve struct {
    ID       string `mapstructure:"id"`
    Mode     string `mapstructure:"mode"`
    Host     string `mapstructure:"host"`
    Port     string `mapstructure:"port"`
    Realm    string `mapstructure:"realm"`
    Username string `mapstructure:"username"`
    Password string `mapstructure:"password"`
    Role     string `mapstructure:"role"` // agent 设备端, proxy 1400中转 不处理deivce, server 全功能
}
 
type client struct {
    ServerId           string `mapstructure:"server-id"`
    DeviceID           string `mapstructure:"device-id"`
    Username           string `mapstructure:"username"`
    Password           string `mapstructure:"password"`
    ServerAddr         string `mapstructure:"server-addr"`
    ServerPort         string `mapstructure:"server-port"`
    Proto              string `mapstructure:"proto" `             // http, https
    UploadType         string `mapstructure:"upload-type"`        // binary, url
    ChannelNo          string `mapstructure:"channel-number"`     // 通道号, 同id
    HeartbeatInterval  int    `mapstructure:"heartbeat-interval"` // 心跳周期
    HeartbeatFailCount int    `mapstructure:"heartbeat-count"`    // 心跳超时次数
    AddFloorToFaceId   bool   `mapstructure:"add-floor-faceId"`
    Enable             bool   `mapstructure:"enable"`
}
 
type logConfig struct {
    LogWay string `mapstructure:"log-way"` // 日志输出
    Path   string `mapstructure:"path"`    // 日志存储路径
    Level  string `mapstructure:"level"`   // 日志等级
    MaxAge int64  `mapstructure:"max-age"` // 保留压缩包天数
}
 
type forward struct {
    SyncServer     string `mapstructure:"sync-server"`
    ReportServer   string `mapstructure:"report-server"`
    ReportInterval int    `mapstructure:"report-interval"`
    RetryInterval  int    `mapstructure:"retry-interval"`
    Enable         bool   `mapstructure:"enable"`
}
 
type image struct {
    CutFaceImage bool `mapstructure:"cut-face-image"`
    Enlarge      int  `mapstructure:"enlarge"`
}
 
// 梯控设备
type nvcs struct {
    Model string `mapstructure:"model"` // 型号
    Port  string `mapstructure:"port"`  // 端口
    OSD   string `mapstructure:"osd"`
}
 
type rateLimitConfig struct {
    FillInterval int64 `mapstructure:"fill-interval" json:"fillInterval"`
    Capacity     int64 `mapstructure:"capacity" json:"capacity"`
}
 
var ServeConf = &serve{}
var LogConf = &logConfig{}
var ForwardConf = &forward{}
var RateLimitConf = &rateLimitConfig{}
var ClientConf = &client{}
var NVCSConf = &nvcs{}
var ImageConf = &image{}
 
// Init is an exported method that takes the environment starts the viper
// (external lib) and returns the configuration struct.
func init() {
    var err error
    v := viper.New()
    v.SetConfigType("yaml")
    v.SetConfigName("gat1400")
    v.AddConfigPath("./")
    v.AddConfigPath("./config/")
    v.AddConfigPath("../config/")
    err = v.ReadInConfig()
    if err != nil {
        fmt.Println("error on parsing configuration file", err)
    }
 
    read2Conf(v)
    v.WatchConfig()
    v.OnConfigChange(func(e fsnotify.Event) {
        read2Conf(v)
    })
}
 
func read2Conf(v *viper.Viper) {
    v.UnmarshalKey("serve", ServeConf)
    v.UnmarshalKey("log", LogConf)
    v.UnmarshalKey("forward", ForwardConf)
    v.UnmarshalKey("rate-limit", RateLimitConf)
    v.UnmarshalKey("client", ClientConf)
    v.UnmarshalKey("nvcs", NVCSConf)
    v.UnmarshalKey("image", ImageConf)
 
    if LogConf.Level == "" {
        LogConf.Level = "info"
    }
 
    if ForwardConf.ReportInterval == 0 {
        ForwardConf.ReportInterval = 10
    }
 
    if ForwardConf.RetryInterval == 0 {
        ForwardConf.RetryInterval = 5
    }
 
    if ClientConf.HeartbeatInterval == 0 {
        ClientConf.HeartbeatInterval = 30
    }
 
    if ClientConf.Proto == "" {
        ClientConf.Proto = "http"
    }
 
    if ImageConf.Enlarge == 0 {
        ImageConf.Enlarge = 100
    }
 
    logger.SetLogLevel(LogConf.Level)
}