main.go 3.2 KB

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