forked from Meituan-Dianping/cat-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.go
138 lines (115 loc) · 2.92 KB
/
config.go
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
135
136
137
138
package cat
import (
"encoding/xml"
"io/ioutil"
"net"
"os"
)
type Config struct {
domain string
hostname string
env string
ip string
ipHex string
httpServerPort int
httpServerAddresses serverAddresses
}
type XMLConfig struct {
Name xml.Name `xml:"config"`
Servers XMLConfigServers `xml:"servers"`
}
type XMLConfigServers struct {
Servers []XMLConfigServer `xml:"server"`
}
type XMLConfigServer struct {
Host string `xml:"ip,attr"`
Port int `xml:"port,attr"`
}
var config = Config{
domain: defaultAppKey,
hostname: defaultHostname,
env: defaultEnv,
ip: defaultIp,
ipHex: defaultIpHex,
httpServerPort: 8080,
httpServerAddresses: []serverAddress{},
}
func loadConfigFromLocalFile(filename string) (data []byte, err error) {
file, err := os.Open(filename)
if err != nil {
logger.Warning("Unable to open file `%s`.", filename)
return
}
defer func() {
if err := file.Close(); err != nil {
logger.Warning("Cannot close local client.xml file.")
}
}()
data, err = ioutil.ReadAll(file)
if err != nil {
logger.Warning("Unable to read content from file `%s`", filename)
}
return
}
func loadConfig(xmlFilePath string) (data []byte, err error) {
if xmlFilePath == "" {
xmlFilePath = defaultXmlFile
}
if data, err = loadConfigFromLocalFile(defaultXmlFile); err != nil {
logger.Error("Failed to load local config file.")
return
}
return
}
func parseXMLConfig(data []byte) (err error) {
c := XMLConfig{}
err = xml.Unmarshal(data, &c)
if err != nil {
logger.Warning("Failed to parse xml content")
}
for _, x := range c.Servers.Servers {
config.httpServerAddresses = append(config.httpServerAddresses, serverAddress{
host: x.Host,
port: x.Port,
})
}
logger.Info("Server addresses: %s", config.httpServerAddresses.String())
return
}
func (config *Config) Init(domain string, xmlFilePath string) (err error) {
config.domain = domain
defer func() {
if err == nil {
logger.Info("Cat has been initialized successfully with appkey: %s", config.domain)
} else {
logger.Error("Failed to initialize cat.")
}
}()
// TODO load env.
var ip net.IP
if ip, err = getLocalhostIp(); err != nil {
config.ip = defaultIp
config.ipHex = defaultIpHex
logger.Warning("Error while getting local ip, using default ip: %s", defaultIp)
} else {
config.ip = ip2String(ip)
config.ipHex = ip2HexString(ip)
logger.Info("Local ip has been configured to %s", config.ip)
}
if config.hostname, err = os.Hostname(); err != nil {
config.hostname = defaultHostname
logger.Warning("Error while getting hostname, using default hostname: %s", defaultHostname)
} else {
logger.Info("Hostname has been configured to %s", config.hostname)
}
var data []byte
if data, err = loadConfig(xmlFilePath); err != nil {
return
}
// Print config content to log file.
logger.Info("\n%s", data)
if err = parseXMLConfig(data); err != nil {
return
}
return
}