github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/catgo/cat-go/cat/config.go (about) 1 package cat 2 3 import ( 4 "encoding/xml" 5 "io/ioutil" 6 "net" 7 "os" 8 ) 9 10 type Config struct { 11 domain string 12 hostname string 13 env string 14 ip string 15 ipHex string 16 17 httpServerPort int 18 httpServerAddresses []serverAddress 19 20 serverAddress []serverAddress 21 } 22 23 type XMLConfig struct { 24 Name xml.Name `xml:"config"` 25 Servers XMLConfigServers `xml:"servers"` 26 } 27 28 type XMLConfigServers struct { 29 Servers []XMLConfigServer `xml:"server"` 30 } 31 32 type XMLConfigServer struct { 33 Host string `xml:"ip,attr"` 34 Port int `xml:"port,attr"` 35 } 36 37 var config = Config{ 38 domain: defaultAppKey, 39 hostname: defaultHostname, 40 env: defaultEnv, 41 ip: defaultIp, 42 ipHex: defaultIpHex, 43 44 httpServerPort: 8080, 45 httpServerAddresses: []serverAddress{}, 46 47 serverAddress: []serverAddress{}, 48 } 49 50 func loadConfigFromLocalFile(filename string) (data []byte, err error) { 51 file, err := os.Open(filename) 52 if err != nil { 53 logger.Warning("Unable to open file `%s`.", filename) 54 return 55 } 56 defer func() { 57 if err := file.Close(); err != nil { 58 logger.Warning("Cannot close local client.xml file.") 59 } 60 }() 61 62 data, err = ioutil.ReadAll(file) 63 if err != nil { 64 logger.Warning("Unable to read content from file `%s`", filename) 65 } 66 return 67 } 68 69 func loadConfig() (data []byte, err error) { 70 if data, err = loadConfigFromLocalFile(defaultXmlFile); err != nil { 71 logger.Error("Failed to load local config file.") 72 return 73 } 74 return 75 } 76 77 func parseXMLConfig(data []byte) (err error) { 78 c := XMLConfig{} 79 err = xml.Unmarshal(data, &c) 80 if err != nil { 81 logger.Warning("Failed to parse xml content") 82 } 83 84 for _, x := range c.Servers.Servers { 85 config.httpServerAddresses = append(config.httpServerAddresses, serverAddress{ 86 host: x.Host, 87 port: x.Port, 88 }) 89 } 90 91 logger.Info("Server addresses: %s", config.httpServerAddresses) 92 return 93 } 94 95 func (config *Config) Init(domain string, findService bool) (err error) { 96 config.domain = domain 97 98 defer func() { 99 if err == nil { 100 logger.Info("Cat has been initialized successfully with appkey: %s", config.domain) 101 } else { 102 logger.Error("Failed to initialize cat.") 103 } 104 }() 105 106 // TODO load env. 107 108 var ip net.IP 109 if ip, err = getLocalhostIp(); err != nil { 110 config.ip = defaultIp 111 config.ipHex = defaultIpHex 112 logger.Warning("Error while getting local ip, using default ip: %s", defaultIp) 113 } else { 114 config.ip = ip2String(ip) 115 config.ipHex = ip2HexString(ip) 116 logger.Info("Local ip has been configured to %s", config.ip) 117 } 118 119 if config.hostname, err = os.Hostname(); err != nil { 120 config.hostname = defaultHostname 121 logger.Warning("Error while getting hostname, using default hostname: %s", defaultHostname) 122 } else { 123 logger.Info("Hostname has been configured to %s", config.hostname) 124 } 125 126 if !findService { 127 return 128 } 129 130 var data []byte 131 if data, err = loadConfig(); err != nil { 132 return 133 } 134 135 // Print config content to log file. 136 logger.Info("\n%s", data) 137 138 if err = parseXMLConfig(data); err != nil { 139 return 140 } 141 142 return 143 }