main.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package main
  2. import (
  3. "fmt"
  4. "git.swzry.com/zry/pathutils"
  5. "gopkg.in/natefinch/lumberjack.v2"
  6. "gopkg.in/yaml.v2"
  7. "io"
  8. "io/ioutil"
  9. "os/exec"
  10. "sync"
  11. )
  12. var ConfigData ConfigYAML
  13. var FrontendShellLogger *lumberjack.Logger
  14. var BackendShellLogger *lumberjack.Logger
  15. var mainWaitGroup sync.WaitGroup
  16. func main() {
  17. fmt.Println("zDWSI Launcher Start.")
  18. CheckInit()
  19. LoadYAML()
  20. StartFrontend()
  21. StartBackend()
  22. fmt.Println("Launcher Sleeping.")
  23. RoutineSleep()
  24. }
  25. func CheckInit() {
  26. pe, err := pathutils.PathExists("/data/config.yaml")
  27. if err == nil && pe {
  28. return
  29. }
  30. fmt.Println("Initializing Container...")
  31. pathutils.MkDirIfNotExist("/data/frontend/", 0777)
  32. pathutils.MkDirIfNotExist("/data/backend/", 0777)
  33. pathutils.MkDirIfNotExist("/data/wwwroot/", 0777)
  34. pathutils.MkDirIfNotExist("/data/logs/", 0777)
  35. pathutils.CopyFile("/data/config.yaml", "/rel/config.default.yaml")
  36. pathutils.CopyFile("/data/wwwroot/index.html", "/rel/index.default.html")
  37. pathutils.CopyFile("/data/frontend/zDWSIFrontend", "/rel/zDWSIFrontend_linux")
  38. pathutils.CopyFile("/data/frontend/zdwsi.frontend.config.yaml", "/rel/zdwsi.frontend.config.default.yaml")
  39. fmt.Println("Container Initialized. Please Edit 'config.yaml'.")
  40. }
  41. func LoadYAML() {
  42. fmt.Println("Load Config '/data/config.yaml'")
  43. jdata, err := ioutil.ReadFile("/data/config.yaml")
  44. if err != nil {
  45. fmt.Println("failed read file 'config.yaml': ", err)
  46. Dead()
  47. }
  48. err = yaml.Unmarshal(jdata, &ConfigData)
  49. if err != nil {
  50. fmt.Println("failed parse 'config.yaml': ", err)
  51. Dead()
  52. }
  53. fmt.Println("Config Loaded.")
  54. }
  55. func Dead() {
  56. fmt.Println("Program Dead By Fatal Error. Please Restart.")
  57. FailureServer()
  58. }
  59. func RoutineSleep() {
  60. mainWaitGroup.Wait()
  61. fmt.Println("All GoRoutine Stopped. Please Restart.")
  62. FailureServer()
  63. }
  64. func InitLogger(cfg LumberjackLoggerYAML) *lumberjack.Logger {
  65. ljl := &lumberjack.Logger{
  66. Filename: cfg.FileName,
  67. MaxSize: cfg.MaxSize,
  68. MaxAge: cfg.MaxAge,
  69. MaxBackups: cfg.MaxBackups,
  70. LocalTime: cfg.UseLocalTime,
  71. Compress: cfg.Compress,
  72. }
  73. return ljl
  74. }
  75. func StartFrontend() {
  76. if !ConfigData.Frontend.Enable {
  77. fmt.Println("Frontend Not Enable.")
  78. return
  79. }
  80. pe, err := pathutils.PathExists(ConfigData.Frontend.EntryPoint)
  81. if err != nil || !pe {
  82. fmt.Println("frontend entrypoint not exists")
  83. return
  84. }
  85. FrontendShellLogger = InitLogger(ConfigData.Frontend.ShellLog)
  86. mainWaitGroup.Add(1)
  87. go func() {
  88. runenv := make([]string, 0)
  89. runenv = append(runenv, makeEnvMember("listen", ConfigData.Frontend.ListenAddr))
  90. runenv = append(runenv, makeEnvMember("wwwroot", ConfigData.Frontend.WWWRoot))
  91. runenv = append(runenv, makeEnvMember("backend_prefix", ConfigData.Frontend.BackendProxy.Prefix))
  92. runenv = append(runenv, makeEnvMember("backend_target", ConfigData.Frontend.BackendProxy.ProxyTaret))
  93. err = StartProcess(ConfigData.Frontend.EntryPoint, runenv, FrontendShellLogger)
  94. if err != nil {
  95. fmt.Println("failed start frontend or frontend exited with error: ", err)
  96. }
  97. mainWaitGroup.Done()
  98. }()
  99. }
  100. func makeEnvMember(key string, value string) string {
  101. return fmt.Sprintf("%s=%s", key, value)
  102. }
  103. func StartBackend() {
  104. if !ConfigData.Backend.Enable {
  105. fmt.Println("Backend Not Enable.")
  106. return
  107. }
  108. pe, err := pathutils.PathExists(ConfigData.Backend.EntryPoint)
  109. if err != nil || !pe {
  110. fmt.Println("backend entrypoint not exists")
  111. return
  112. }
  113. BackendShellLogger = InitLogger(ConfigData.Backend.ShellLog)
  114. mainWaitGroup.Add(1)
  115. go func() {
  116. runenv := make([]string, 0)
  117. runenv = append(runenv, makeEnvMember("listen", ConfigData.Backend.ListenAddr))
  118. err = StartProcess(ConfigData.Backend.EntryPoint, runenv, BackendShellLogger)
  119. if err != nil {
  120. fmt.Println("failed start backend or backend exited with error: ", err)
  121. }
  122. mainWaitGroup.Done()
  123. }()
  124. }
  125. func StartProcess(entry string, runenv []string, logger io.Writer) error {
  126. cmd := exec.Command(entry)
  127. cmd.Env = runenv
  128. pipe_r, pipe_w := io.Pipe()
  129. cmd.Stdout = pipe_w
  130. cmd.Stderr = pipe_w
  131. go func() {
  132. io.Copy(logger, pipe_r)
  133. }()
  134. err := cmd.Start()
  135. if err != nil {
  136. return err
  137. }
  138. err = cmd.Wait()
  139. return err
  140. }