conf_util.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/go-yaml/yaml"
  5. "io/ioutil"
  6. "os"
  7. "strconv"
  8. "strings"
  9. )
  10. var khome = os.Getenv("KUIPER_HOME")
  11. var fileMap = map[string]string{
  12. "edgex": khome + "/etc/sources/edgex.yaml",
  13. "random": khome + "/etc/sources/random.yaml",
  14. "zmq": khome + "/etc/sources/zmq.yaml",
  15. "mqtt_source": khome + "/etc/mqtt_source.yaml",
  16. "kuiper": khome + "/etc/kuiper.yaml",
  17. "client": khome + "/etc/client.yaml",
  18. }
  19. var file_keys_map = map[string]map[string]string{
  20. "edgex": {
  21. "CLIENTID": "ClientId",
  22. "USERNAME": "Username",
  23. "PASSWORD": "Password",
  24. "QOS": "Qos",
  25. "KEEPALIVE": "KeepAlive",
  26. "RETAINED": "Retained",
  27. "CONNECTIONPAYLOAD": "ConnectionPayload",
  28. "CERTFILE": "CertFile",
  29. "KEYFILE": "KeyFile",
  30. "CERTPEMBLOCK": "CertPEMBlock",
  31. "KEYPEMBLOCK": "KeyPEMBlock",
  32. "SKIPCERTVERIFY": "SkipCertVerify",
  33. },
  34. "mqtt_source": {
  35. "SHAREDSUBSCRIPTION": "sharedSubscription",
  36. "CERTIFICATIONPATH": "certificationPath",
  37. "PRIVATEKEYPATH": "privateKeyPath",
  38. },
  39. "kuiper": {
  40. "CONSOLELOG": "consoleLog",
  41. "FILELOG": "fileLog",
  42. "RESTPORT": "restPort",
  43. "RESTTLS": "restTls",
  44. "PROMETHEUSPORT": "prometheusPort",
  45. },
  46. }
  47. func fileExists(filename string) bool {
  48. info, err := os.Stat(filename)
  49. if os.IsNotExist(err) {
  50. return false
  51. }
  52. return !info.IsDir()
  53. }
  54. func deleteFile(path string) {
  55. // delete file
  56. var err = os.Remove(path)
  57. if err != nil {
  58. fmt.Printf("Failed to delete original file: %s due to error %s... The conf util is going to exit.\n", path, err)
  59. os.Exit(0)
  60. return
  61. }
  62. fmt.Println("File Deleted")
  63. }
  64. func main() {
  65. fmt.Println(fileMap["edgex"])
  66. files := make(map[string]map[interface{}]interface{})
  67. ProcessEnv(files, os.Environ())
  68. for f, v := range files {
  69. if bs, err := yaml.Marshal(v); err != nil {
  70. fmt.Println(err)
  71. } else {
  72. message := fmt.Sprintf("-------------------\nConf file %s: \n %s", f, string(bs))
  73. fmt.Println(message)
  74. if fname, ok := fileMap[f]; ok {
  75. if fileExists(fname) {
  76. deleteFile(fname)
  77. }
  78. if e := ioutil.WriteFile(fname, bs, 0644); e != nil {
  79. fmt.Println(e)
  80. }
  81. }
  82. }
  83. }
  84. }
  85. func ProcessEnv(files map[string]map[interface{}]interface{}, vars []string) {
  86. for _, e := range vars {
  87. pair := strings.SplitN(e, "=", 2)
  88. if len(pair) != 2 {
  89. fmt.Printf("invalid env %s, skip it.\n", e)
  90. continue
  91. }
  92. valid := false
  93. for k, _ := range fileMap {
  94. if strings.HasPrefix(pair[0], strings.ToUpper(k)) {
  95. valid = true
  96. break
  97. }
  98. }
  99. if !valid {
  100. continue
  101. } else {
  102. fmt.Printf("Find env: %s, start to handle it.\n", e)
  103. }
  104. env_v := strings.ReplaceAll(pair[0], "__", ".")
  105. keys := strings.Split(env_v, ".")
  106. for i, v := range keys {
  107. keys[i] = v
  108. }
  109. if len(keys) < 2 {
  110. fmt.Printf("not concerned env %s, skip it.\n", e)
  111. continue
  112. } else {
  113. k := strings.ToLower(keys[0])
  114. if v, ok := files[k]; !ok {
  115. if data, err := ioutil.ReadFile(fileMap[k]); err != nil {
  116. fmt.Printf("%s\n", err)
  117. } else {
  118. m := make(map[interface{}]interface{})
  119. err = yaml.Unmarshal([]byte(data), &m)
  120. if err != nil {
  121. fmt.Println(err)
  122. }
  123. files[k] = m
  124. Handle(k, m, keys[1:], pair[1])
  125. }
  126. } else {
  127. Handle(k, v, keys[1:], pair[1])
  128. }
  129. }
  130. }
  131. }
  132. func Handle(file string, conf map[interface{}]interface{}, skeys []string, val string) {
  133. key := getKey(file, skeys[0])
  134. if len(skeys) == 1 {
  135. conf[key] = getValueType(val)
  136. } else if len(skeys) >= 2 {
  137. if v, ok := conf[key]; ok {
  138. if v1, ok1 := v.(map[interface{}]interface{}); ok1 {
  139. Handle(file, v1, skeys[1:], val)
  140. } else {
  141. fmt.Printf("Not expected map: %v\n", v)
  142. }
  143. } else {
  144. v1 := make(map[interface{}]interface{})
  145. conf[key] = v1
  146. Handle(file, v1, skeys[1:], val)
  147. }
  148. }
  149. }
  150. func getKey(file string, key string) string {
  151. if m, ok := file_keys_map[file][key]; ok {
  152. return m
  153. } else {
  154. return strings.ToLower(key)
  155. }
  156. }
  157. func getValueType(val string) interface{} {
  158. if i, err := strconv.ParseInt(val, 10, 64); err == nil {
  159. return i
  160. } else if b, err := strconv.ParseBool(val); err == nil {
  161. return b
  162. } else if f, err := strconv.ParseFloat(val, 64); err == nil {
  163. return f
  164. }
  165. return val
  166. }