conf_util.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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. "httppull": khome + "/etc/sources/httppull.yaml",
  16. "mqtt_source": khome + "/etc/mqtt_source.yaml",
  17. "kuiper": khome + "/etc/kuiper.yaml",
  18. "client": khome + "/etc/client.yaml",
  19. }
  20. var file_keys_map = map[string]map[string]string{
  21. "edgex": {
  22. "SERVICESERVER": "serviceServer",
  23. "CLIENTID": "ClientId",
  24. "USERNAME": "Username",
  25. "PASSWORD": "Password",
  26. "QOS": "Qos",
  27. "KEEPALIVE": "KeepAlive",
  28. "RETAINED": "Retained",
  29. "CONNECTIONPAYLOAD": "ConnectionPayload",
  30. "CERTFILE": "CertFile",
  31. "KEYFILE": "KeyFile",
  32. "CERTPEMBLOCK": "CertPEMBlock",
  33. "KEYPEMBLOCK": "KeyPEMBlock",
  34. "SKIPCERTVERIFY": "SkipCertVerify",
  35. },
  36. "mqtt_source": {
  37. "SHAREDSUBSCRIPTION": "sharedSubscription",
  38. "CERTIFICATIONPATH": "certificationPath",
  39. "PRIVATEKEYPATH": "privateKeyPath",
  40. "KUBEEDGEVERSION": "kubeedgeVersion",
  41. "KUBEEDGEMODELFILE": "kubeedgeModelFile",
  42. },
  43. "kuiper": {
  44. "CONSOLELOG": "consoleLog",
  45. "FILELOG": "fileLog",
  46. "RESTPORT": "restPort",
  47. "RESTTLS": "restTls",
  48. "PROMETHEUSPORT": "prometheusPort",
  49. "PLUGINHOSTS": "pluginHosts",
  50. "CHECKPOINTINTERVAL": "checkpointInterval",
  51. "CACHETHRESHOLD": "cacheThreshold",
  52. "CACHETRIGGERCOUNT": "cacheTriggerCount",
  53. "DISABLECACHE": "disableCache",
  54. },
  55. }
  56. func main() {
  57. fmt.Println(fileMap["edgex"])
  58. files := make(map[string]map[interface{}]interface{})
  59. ProcessEnv(files, os.Environ())
  60. for f, v := range files {
  61. if bs, err := yaml.Marshal(v); err != nil {
  62. fmt.Println(err)
  63. } else {
  64. message := fmt.Sprintf("-------------------\nConf file %s: \n %s", f, toPrintableString(v))
  65. fmt.Println(message)
  66. if fname, ok := fileMap[f]; ok {
  67. if e := ioutil.WriteFile(fname, bs, 0644); e != nil {
  68. fmt.Println(e)
  69. } else {
  70. fmt.Printf("%s updated", fname)
  71. }
  72. }
  73. }
  74. }
  75. }
  76. func printable(m map[interface{}]interface{}) map[interface{}]interface{} {
  77. printableMap := make(map[interface{}]interface{})
  78. for k, v := range m {
  79. ks, ok := k.(string)
  80. if ok && strings.ToLower(ks) == "password" {
  81. printableMap[k] = "*"
  82. } else {
  83. if vm, ok := v.(map[interface{}]interface{}); ok {
  84. printableMap[k] = printable(vm)
  85. } else {
  86. printableMap[k] = v
  87. }
  88. }
  89. }
  90. return printableMap
  91. }
  92. func toPrintableString(m map[interface{}]interface{}) string {
  93. p := printable(m)
  94. b, _ := yaml.Marshal(p)
  95. return string(b)
  96. }
  97. func ProcessEnv(files map[string]map[interface{}]interface{}, vars []string) {
  98. for _, e := range vars {
  99. pair := strings.SplitN(e, "=", 2)
  100. if len(pair) != 2 {
  101. fmt.Printf("invalid env %s, skip it.\n", e)
  102. continue
  103. }
  104. valid := false
  105. for k, _ := range fileMap {
  106. if strings.HasPrefix(pair[0], strings.ToUpper(k)) {
  107. valid = true
  108. break
  109. }
  110. }
  111. if !valid {
  112. continue
  113. } else {
  114. fmt.Printf("Find env: %s, start to handle it.\n", e)
  115. }
  116. env_v := strings.ReplaceAll(pair[0], "__", ".")
  117. keys := strings.Split(env_v, ".")
  118. for i, v := range keys {
  119. keys[i] = v
  120. }
  121. if len(keys) < 2 {
  122. fmt.Printf("not concerned env %s, skip it.\n", e)
  123. continue
  124. } else {
  125. k := strings.ToLower(keys[0])
  126. if v, ok := files[k]; !ok {
  127. if data, err := ioutil.ReadFile(fileMap[k]); err != nil {
  128. fmt.Printf("%s\n", err)
  129. } else {
  130. m := make(map[interface{}]interface{})
  131. err = yaml.Unmarshal(data, &m)
  132. if err != nil {
  133. fmt.Println(err)
  134. }
  135. files[k] = m
  136. Handle(k, m, keys[1:], pair[1])
  137. }
  138. } else {
  139. Handle(k, v, keys[1:], pair[1])
  140. }
  141. }
  142. }
  143. }
  144. func Handle(file string, conf map[interface{}]interface{}, skeys []string, val string) {
  145. key := getKey(file, skeys[0])
  146. if len(skeys) == 1 {
  147. conf[key] = getValueType(val)
  148. } else if len(skeys) >= 2 {
  149. if v, ok := conf[key]; ok {
  150. if v1, ok1 := v.(map[interface{}]interface{}); ok1 {
  151. Handle(file, v1, skeys[1:], val)
  152. } else {
  153. fmt.Printf("Not expected map: %v\n", v)
  154. }
  155. } else {
  156. v1 := make(map[interface{}]interface{})
  157. conf[key] = v1
  158. Handle(file, v1, skeys[1:], val)
  159. }
  160. }
  161. }
  162. func getKey(file string, key string) string {
  163. if m, ok := file_keys_map[file][key]; ok {
  164. return m
  165. } else {
  166. return strings.ToLower(key)
  167. }
  168. }
  169. func getValueType(val string) interface{} {
  170. val = strings.Trim(val, " ")
  171. if strings.HasPrefix(val, "[") && strings.HasSuffix(val, "]") {
  172. val = strings.ReplaceAll(val, "[", "")
  173. val = strings.ReplaceAll(val, "]", "")
  174. vals := strings.Split(val, ",")
  175. var ret []interface{}
  176. for _, v := range vals {
  177. if i, err := strconv.ParseInt(v, 10, 64); err == nil {
  178. ret = append(ret, i)
  179. } else if b, err := strconv.ParseBool(v); err == nil {
  180. ret = append(ret, b)
  181. } else if f, err := strconv.ParseFloat(v, 64); err == nil {
  182. ret = append(ret, f)
  183. } else {
  184. ret = append(ret, v)
  185. }
  186. }
  187. return ret
  188. } else if i, err := strconv.ParseInt(val, 10, 64); err == nil {
  189. return i
  190. } else if b, err := strconv.ParseBool(val); err == nil {
  191. return b
  192. } else if f, err := strconv.ParseFloat(val, 64); err == nil {
  193. return f
  194. }
  195. return val
  196. }