main.go 4.2 KB

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