|
@@ -0,0 +1,135 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+ "git.swzry.com/zry/pathutils"
|
|
|
+ "gopkg.in/natefinch/lumberjack.v2"
|
|
|
+ "io"
|
|
|
+ "io/ioutil"
|
|
|
+ "os/exec"
|
|
|
+)
|
|
|
+
|
|
|
+var ConfigData ConfigJSON
|
|
|
+var FrontendShellLogger *lumberjack.Logger
|
|
|
+var BackendShellLogger *lumberjack.Logger
|
|
|
+
|
|
|
+func main() {
|
|
|
+ fmt.Println("zDWSI Launcher Start.")
|
|
|
+ CheckInit()
|
|
|
+ LoadJSON()
|
|
|
+ StartFrontend()
|
|
|
+ StartBackend()
|
|
|
+ fmt.Println("Launcher Sleeping.")
|
|
|
+ RoutineSleep()
|
|
|
+}
|
|
|
+
|
|
|
+func CheckInit() {
|
|
|
+ pe, err := pathutils.PathExists("/data/config.json")
|
|
|
+ if err == nil && pe {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ fmt.Println("Initializing Container...")
|
|
|
+ pathutils.MkDirIfNotExist("/data/frontend/", 0777)
|
|
|
+ pathutils.MkDirIfNotExist("/data/backend/", 0777)
|
|
|
+ pathutils.MkDirIfNotExist("/data/wwwroot/", 0777)
|
|
|
+ pathutils.MkDirIfNotExist("/data/logs/", 0777)
|
|
|
+ pathutils.CopyFile("/data/config.json", "/rel/config.default.json")
|
|
|
+ pathutils.CopyFile("/data/wwwroot/index.html", "/rel/index.default.html")
|
|
|
+ pathutils.CopyFile("/data/frontend/zDWSIFrontend", "/rel/zDWSIFrontend_linux")
|
|
|
+ fmt.Println("Container Initialized. Please Edit 'config.json'.")
|
|
|
+}
|
|
|
+
|
|
|
+func LoadJSON() {
|
|
|
+ fmt.Println("Load Config '/data/config.json'")
|
|
|
+ jdata, err := ioutil.ReadFile("/data/config.json")
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("failed read file 'config.json': ", err)
|
|
|
+ Dead()
|
|
|
+ }
|
|
|
+ err = json.Unmarshal(jdata, &ConfigData)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("failed parse 'config.json': ", err)
|
|
|
+ Dead()
|
|
|
+ }
|
|
|
+ fmt.Println("Config Loaded.")
|
|
|
+}
|
|
|
+
|
|
|
+func Dead() {
|
|
|
+ fmt.Println("Program Dead By Fatal Error. Please Restart.")
|
|
|
+ RoutineSleep()
|
|
|
+}
|
|
|
+
|
|
|
+func RoutineSleep() {
|
|
|
+ c := make(chan int)
|
|
|
+ <-c
|
|
|
+}
|
|
|
+
|
|
|
+func InitLogger(cfg LumberjackLoggerJSON) *lumberjack.Logger {
|
|
|
+ ljl := &lumberjack.Logger{
|
|
|
+ Filename: cfg.FileName,
|
|
|
+ MaxSize: cfg.MaxSize,
|
|
|
+ MaxAge: cfg.MaxAge,
|
|
|
+ MaxBackups: cfg.MaxBackups,
|
|
|
+ LocalTime: cfg.UseLocalTime,
|
|
|
+ Compress: cfg.Compress,
|
|
|
+ }
|
|
|
+ return ljl
|
|
|
+}
|
|
|
+
|
|
|
+func StartFrontend() {
|
|
|
+ if !ConfigData.Frontend.Enable {
|
|
|
+ fmt.Println("Frontend Not Enable.")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ pe, err := pathutils.PathExists(ConfigData.Frontend.EntryPoint)
|
|
|
+ if err != nil || !pe {
|
|
|
+ fmt.Println("frontend entrypoint not exists")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ FrontendShellLogger = InitLogger(ConfigData.Frontend.ShellLog)
|
|
|
+ go func() {
|
|
|
+ runenv := make([]string, 0)
|
|
|
+ err = StartProcess(ConfigData.Frontend.EntryPoint, runenv, FrontendShellLogger)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("failed start frontend or frontend exited with error: ", err)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+}
|
|
|
+
|
|
|
+func StartBackend() {
|
|
|
+ if !ConfigData.Backend.Enable {
|
|
|
+ fmt.Println("Backend Not Enable.")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ pe, err := pathutils.PathExists(ConfigData.Backend.EntryPoint)
|
|
|
+ if err != nil || !pe {
|
|
|
+ fmt.Println("backend entrypoint not exists")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ BackendShellLogger = InitLogger(ConfigData.Backend.ShellLog)
|
|
|
+ go func() {
|
|
|
+ runenv := make([]string, 0)
|
|
|
+ err = StartProcess(ConfigData.Backend.EntryPoint, runenv, BackendShellLogger)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("failed start backend or backend exited with error: ", err)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+}
|
|
|
+
|
|
|
+func StartProcess(entry string, runenv []string, logger io.Writer) error {
|
|
|
+ cmd := exec.Command(entry)
|
|
|
+ cmd.Env = runenv
|
|
|
+ pipe_r, pipe_w := io.Pipe()
|
|
|
+ cmd.Stdout = pipe_w
|
|
|
+ cmd.Stderr = pipe_w
|
|
|
+ go func() {
|
|
|
+ io.Copy(logger, pipe_r)
|
|
|
+ }()
|
|
|
+ err := cmd.Start()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ err = cmd.Wait()
|
|
|
+ return err
|
|
|
+}
|