Browse Source

2020-02-06 11:35

zry 4 years ago
parent
commit
a0fdc186cd

+ 2 - 0
.idea/.gitignore

@@ -0,0 +1,2 @@
+# Default ignored files
+/workspace.xml

+ 82 - 0
.idea/markdown-navigator.xml

@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="MarkdownProjectSettings" wasCopied="false">
+    <PreviewSettings splitEditorLayout="SPLIT" splitEditorPreview="PREVIEW" useGrayscaleRendering="false" zoomFactor="1.0" maxImageWidth="0" showGitHubPageIfSynced="false" allowBrowsingInPreview="false" synchronizePreviewPosition="true" highlightPreviewType="NONE" highlightFadeOut="5" highlightOnTyping="true" synchronizeSourcePosition="true" verticallyAlignSourceAndPreviewSyncPosition="true" showSearchHighlightsInPreview="false" showSelectionInPreview="true" openRemoteLinks="true" replaceUnicodeEmoji="false" lastLayoutSetsDefault="false">
+      <PanelProvider>
+        <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.panel" providerName="Default - Swing" />
+      </PanelProvider>
+    </PreviewSettings>
+    <ParserSettings gitHubSyntaxChange="false" emojiShortcuts="1" emojiImages="0">
+      <PegdownExtensions>
+        <option name="ABBREVIATIONS" value="false" />
+        <option name="ANCHORLINKS" value="true" />
+        <option name="ASIDE" value="false" />
+        <option name="ATXHEADERSPACE" value="true" />
+        <option name="AUTOLINKS" value="true" />
+        <option name="DEFINITIONS" value="false" />
+        <option name="DEFINITION_BREAK_DOUBLE_BLANK_LINE" value="false" />
+        <option name="FENCED_CODE_BLOCKS" value="true" />
+        <option name="FOOTNOTES" value="false" />
+        <option name="HARDWRAPS" value="false" />
+        <option name="HTML_DEEP_PARSER" value="false" />
+        <option name="INSERTED" value="false" />
+        <option name="QUOTES" value="false" />
+        <option name="RELAXEDHRULES" value="true" />
+        <option name="SMARTS" value="false" />
+        <option name="STRIKETHROUGH" value="true" />
+        <option name="SUBSCRIPT" value="false" />
+        <option name="SUPERSCRIPT" value="false" />
+        <option name="SUPPRESS_HTML_BLOCKS" value="false" />
+        <option name="SUPPRESS_INLINE_HTML" value="false" />
+        <option name="TABLES" value="true" />
+        <option name="TASKLISTITEMS" value="true" />
+        <option name="TOC" value="false" />
+        <option name="WIKILINKS" value="true" />
+      </PegdownExtensions>
+      <ParserOptions>
+        <option name="ADMONITION_EXT" value="false" />
+        <option name="ATTRIBUTES_EXT" value="false" />
+        <option name="COMMONMARK_LISTS" value="true" />
+        <option name="DUMMY" value="false" />
+        <option name="EMOJI_SHORTCUTS" value="true" />
+        <option name="ENUMERATED_REFERENCES_EXT" value="false" />
+        <option name="FLEXMARK_FRONT_MATTER" value="false" />
+        <option name="GFM_LOOSE_BLANK_LINE_AFTER_ITEM_PARA" value="false" />
+        <option name="GFM_TABLE_RENDERING" value="true" />
+        <option name="GITBOOK_URL_ENCODING" value="false" />
+        <option name="GITHUB_LISTS" value="false" />
+        <option name="GITHUB_WIKI_LINKS" value="true" />
+        <option name="GITLAB_EXT" value="false" />
+        <option name="GITLAB_MATH_EXT" value="false" />
+        <option name="GITLAB_MERMAID_EXT" value="false" />
+        <option name="HEADER_ID_NO_DUPED_DASHES" value="false" />
+        <option name="JEKYLL_FRONT_MATTER" value="false" />
+        <option name="MACROS_EXT" value="false" />
+        <option name="NO_TEXT_ATTRIBUTES" value="false" />
+        <option name="PARSE_HTML_ANCHOR_ID" value="false" />
+        <option name="SIM_TOC_BLANK_LINE_SPACER" value="true" />
+      </ParserOptions>
+    </ParserSettings>
+    <HtmlSettings headerTopEnabled="false" headerBottomEnabled="false" bodyTopEnabled="false" bodyBottomEnabled="false" embedUrlContent="false" addPageHeader="true" embedImages="false" embedHttpImages="false" imageUriSerials="false" addDocTypeHtml="true">
+      <GeneratorProvider>
+        <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.generator" providerName="Default Swing HTML Generator" />
+      </GeneratorProvider>
+      <headerTop />
+      <headerBottom />
+      <bodyTop />
+      <bodyBottom />
+    </HtmlSettings>
+    <CssSettings previewScheme="UI_SCHEME" cssUri="" isCssUriEnabled="false" isCssUriSerial="true" isCssTextEnabled="false" isDynamicPageWidth="true">
+      <StylesheetProvider>
+        <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.css" providerName="Default Swing Stylesheet" />
+      </StylesheetProvider>
+      <ScriptProviders />
+      <cssText />
+      <cssUriHistory />
+    </CssSettings>
+    <HtmlExportSettings updateOnSave="false" parentDir="" targetDir="" cssDir="" scriptDir="" plainHtml="false" imageDir="" copyLinkedImages="false" imageUniquifyType="0" targetExt="" useTargetExt="false" noCssNoScripts="false" linkToExportedHtml="true" exportOnSettingsChange="true" regenerateOnProjectOpen="false" linkFormatType="HTTP_ABSOLUTE" />
+    <LinkMapSettings>
+      <textMaps />
+    </LinkMapSettings>
+  </component>
+</project>

+ 0 - 4
.idea/misc.xml

@@ -3,8 +3,4 @@
   <component name="JavaScriptSettings">
     <option name="languageLevel" value="ES6" />
   </component>
-  <component name="RustProjectSettings">
-    <option name="explicitPathToStdlib" value="Z:\Public\Rust\Rust\lib\" />
-    <option name="toolchainHomeDirectory" value="$PROJECT_DIR$/../../../../../../Rust/Rust/bin" />
-  </component>
 </project>

+ 122 - 0
defaultFrontend/access_log.go

@@ -0,0 +1,122 @@
+package main
+
+import (
+	"fmt"
+	"io"
+	"strconv"
+)
+
+type AccessLoggerLevelConfig struct {
+	OutputLevel        DWSILogLevel
+	SuccessLevel       DWSILogLevel
+	NotFoundLevel      DWSILogLevel
+	ForbiddenLevel     DWSILogLevel
+	GatewayErrorLevel  DWSILogLevel
+	InternalErrorLevel DWSILogLevel
+}
+
+func transLevelStringIntoLevel(lvstr string) DWSILogLevel {
+	switch lvstr {
+	case "FATAL":
+		return LogLv_FATAL
+	case "PANIC":
+		return LogLv_PANIC
+	case "ERROR":
+		return LogLv_ERROR
+	case "WARN":
+		return LogLv_WARN
+	case "INFO":
+		return LogLv_INFO
+	case "DEBUG":
+		return LogLv_DEBUG
+	default:
+		return LogLv_INVALID
+	}
+}
+
+func transLevelIntoLevelString(lv DWSILogLevel) string {
+	switch lv {
+	case LogLv_FATAL:
+		return "FATAL"
+	case LogLv_PANIC:
+		return "PANIC"
+	case LogLv_ERROR:
+		return "ERROR"
+	case LogLv_WARN:
+		return "WARN"
+	case LogLv_INFO:
+		return "INFO"
+	case LogLv_DEBUG:
+		return "DEBUG"
+	default:
+		return ""
+	}
+}
+
+func ConvertLogLevelConfig(yamldata AccessLoggerConfigYAML) (error, *AccessLoggerLevelConfig) {
+	o := &AccessLoggerLevelConfig{}
+	o.OutputLevel = transLevelStringIntoLevel(yamldata.OutputLevel)
+	o.SuccessLevel = transLevelStringIntoLevel(yamldata.SuccessLevel)
+	o.NotFoundLevel = transLevelStringIntoLevel(yamldata.NotFoundLevel)
+	o.ForbiddenLevel = transLevelStringIntoLevel(yamldata.ForbiddenLevel)
+	o.GatewayErrorLevel = transLevelStringIntoLevel(yamldata.GatewayErrorLevel)
+	o.InternalErrorLevel = transLevelStringIntoLevel(yamldata.InternalErrorLevel)
+	if o.OutputLevel == 0 {
+		return fmt.Errorf("invalid level name '%s' for output_level", yamldata.OutputLevel), o
+	}
+	if o.SuccessLevel == 0 {
+		return fmt.Errorf("invalid level name '%s' for success_level", yamldata.SuccessLevel), o
+	}
+	if o.NotFoundLevel == 0 {
+		return fmt.Errorf("invalid level name '%s' for not_found_level", yamldata.NotFoundLevel), o
+	}
+	if o.ForbiddenLevel == 0 {
+		return fmt.Errorf("invalid level name '%s' for forbidden_level", yamldata.ForbiddenLevel), o
+	}
+	if o.GatewayErrorLevel == 0 {
+		return fmt.Errorf("invalid level name '%s' for gateway_error_level", yamldata.GatewayErrorLevel), o
+	}
+	if o.InternalErrorLevel == 0 {
+		return fmt.Errorf("invalid level name '%s' for internal_error_level", yamldata.InternalErrorLevel), o
+	}
+	return nil, o
+}
+
+type AccessLogger struct {
+	enable       bool
+	level_config *AccessLoggerLevelConfig
+	commonLogger *CommonLogger
+}
+
+func NewAccessLogger() *AccessLogger {
+	return &AccessLogger{
+		enable:       false,
+		level_config: nil,
+		commonLogger: nil,
+	}
+}
+
+func (this *AccessLogger) UseLogger(wr io.Writer, lvcfg *AccessLoggerLevelConfig) {
+	this.enable = true
+	this.level_config = lvcfg
+	this.commonLogger = NewCommonLogger(lvcfg.OutputLevel, wr)
+}
+
+func (this *AccessLogger) Emit(level DWSILogLevel, url string, status int) {
+	if this.enable {
+		if level == LogLv_INVALID {
+			return
+		}
+		lvstr := transLevelIntoLevelString(level)
+		exd := map[string]string{
+			"level":  lvstr,
+			"status": strconv.Itoa(status),
+			"url":    url,
+		}
+		this.commonLogger.RawEmit(level, exd)
+	}
+}
+
+func (this *AccessLogger) LogResponse() {
+	// TODO: Fix
+}

+ 97 - 0
defaultFrontend/common_log.go

@@ -0,0 +1,97 @@
+package main
+
+import (
+	"fmt"
+	"git.swzry.com/zry/YAGTF/yagtf/tfelem"
+	"git.swzry.com/zry/YAGTF/yagtf/timefmt"
+	"io"
+	"time"
+)
+
+type DWSILogLevel uint8
+
+const (
+	LogLv_INVALID DWSILogLevel = 0
+	LogLv_FATAL   DWSILogLevel = 1
+	LogLv_PANIC   DWSILogLevel = 2
+	LogLv_ERROR   DWSILogLevel = 3
+	LogLv_WARN    DWSILogLevel = 4
+	LogLv_INFO    DWSILogLevel = 5
+	LogLv_DEBUG   DWSILogLevel = 6
+)
+
+const loggerDefaultFormatString = "[!<y>-<mon>-<d> <h24>:<min>:<s>.<us> <tz> <tzA>] <lt><level><gt>{<unit>} <msg><br>"
+
+type CommonLogger struct {
+	log_writter  io.Writer
+	output_level DWSILogLevel
+	formatter    *timefmt.TimeFormatterEx
+}
+
+func NewCommonLogger(outlv DWSILogLevel, outwr io.Writer) *CommonLogger {
+	cl := &CommonLogger{}
+	cl.SetOutputLevel(outlv)
+	cl.SetWriter(outwr)
+	cl.SetDefaultFormatter()
+	return cl
+}
+
+func (this *CommonLogger) SetOutputLevel(outlv DWSILogLevel) {
+	if outlv < 7 {
+		this.output_level = outlv
+	} else {
+		this.output_level = 0
+	}
+}
+
+func (this *CommonLogger) SetWriter(wr io.Writer) {
+	this.log_writter = wr
+}
+
+func (this *CommonLogger) SetFormatter(fmtstr string) {
+	tpe := timefmt.NewTimePrinterEx()
+	parser := timefmt.NewFormatParser(true)
+	parser.AddExDataTag("level", func() timefmt.TimeElementEx {
+		return tfelem.NewExDataElement(8, "level")
+	})
+	parser.AddExDataTag("unit", func() timefmt.TimeElementEx {
+		return tfelem.NewExDataElement(32, "unit")
+	})
+	parser.AddExDataTag("msg", func() timefmt.TimeElementEx {
+		return tfelem.NewExDataElement(2048, "msg")
+	})
+	tfe := timefmt.NewTimeFormatterEx(tpe, parser, true)
+	this.formatter = tfe
+}
+
+func (this *CommonLogger) SetDefaultFormatter() {
+	this.SetFormatter(loggerDefaultFormatString)
+}
+
+func (this *CommonLogger) RawEmit(lv DWSILogLevel, exdata map[string]string) {
+	s := this.formatter.Format(time.Now(), exdata)
+	_, _ = this.log_writter.Write([]byte(s))
+}
+
+func (this *CommonLogger) Emit(lv DWSILogLevel, unit string, msg string) {
+	if lv == LogLv_INVALID {
+		return
+	}
+	lvstr := transLevelIntoLevelString(lv)
+	exd := map[string]string{
+		"level": lvstr,
+		"unit":  unit,
+		"msg":   msg,
+	}
+	this.RawEmit(lv, exd)
+}
+
+func (this *CommonLogger) EmitF(lv DWSILogLevel, unit string, fmtstr string, a ...interface{}) {
+	s := fmt.Sprintf(fmtstr, a...)
+	this.Emit(lv, unit, s)
+}
+
+func (this *CommonLogger) EmitN(lv DWSILogLevel, unit string, a ...interface{}) {
+	s := fmt.Sprint(a...)
+	this.Emit(lv, unit, s)
+}

+ 7 - 0
defaultFrontend/exit_code.go

@@ -0,0 +1,7 @@
+package main
+
+const (
+	ExitCode_YAMLFileReadError  = -1
+	ExitCode_YAMLParseError     = -2
+	ExitCode_YAMLSemanticsError = -3
+)

+ 7 - 0
defaultFrontend/midware.go

@@ -0,0 +1,7 @@
+package main
+
+import "github.com/gin-gonic/gin"
+
+func CustomRecoveryMidware() gin.HandlerFunc {
+
+}

+ 10 - 0
defaultFrontend/server.go

@@ -0,0 +1,10 @@
+package main
+
+import "github.com/gin-gonic/gin"
+
+var ServerEngine *gin.Engine
+
+func StartServer() {
+	ServerEngine = gin.New()
+	ServerEngine.Use(gin.Recovery())
+}

+ 41 - 0
defaultFrontend/yamldef.go

@@ -0,0 +1,41 @@
+package main
+
+type FrontendConfigYAML struct {
+	LogConfig LogConfigYAML `yaml:"log"`
+}
+
+type LogConfigYAML struct {
+	AccessLogEnable          bool                    `yaml:"access_log_enable"`
+	RollingLogConfig         RollingLoggerConfigYAML `yaml:"rolling_logger_config"`
+	AccessLoggerDetailConfig AccessLoggerConfigYAML  `yaml:"access_logger_config"`
+	ErrorLoggerDetailConfig  ErrorLoggerConfigYAML   `yaml:"error_logger_config"`
+}
+
+type RollingLoggerConfigYAML struct {
+	ErrLogCfg    LumberjackLoggerYAML `yaml:"error_log"`
+	AccessLogCfg LumberjackLoggerYAML `yaml:"access_log"`
+}
+
+type LumberjackLoggerYAML struct {
+	FileName     string `yaml:"file"`
+	MaxSize      int    `yaml:"max_size"`
+	MaxAge       int    `yaml:"max_age"`
+	MaxBackups   int    `yaml:"max_backups"`
+	UseLocalTime bool   `yaml:"use_local_time"`
+	Compress     bool   `yaml:"compress_history"`
+}
+
+type AccessLoggerConfigYAML struct {
+	OutputLevel        string `yaml:"output_level"`
+	SuccessLevel       string `yaml:"success_level"`
+	NotFoundLevel      string `yaml:"not_found_level"`
+	ForbiddenLevel     string `yaml:"forbidden_level"`
+	GatewayErrorLevel  string `yaml:"gateway_error_level"`
+	InternalErrorLevel string `yaml:"internal_error_level"`
+	LogFormat          string `yaml:"log_format"`
+}
+
+type ErrorLoggerConfigYAML struct {
+	OutputLevel string `yaml:"output_level"`
+	LogFormat   string `yaml:"log_format"`
+}

+ 0 - 33
dist/rel/config.default.json

@@ -1,33 +0,0 @@
-{
-  "frontend":{
-    "enable": true,
-    "entry": "/data/frontend/zDWSIFrontend",
-    "shell_log":{
-      "file": "/data/logs/frontend.shell.log",
-      "max_size": 16,
-      "max_age": 30,
-      "max_backups": 50,
-      "use_local_time": true,
-      "compress_history": true
-    },
-    "listen": ":8080",
-    "wwwroot": "/data/wwwroot/",
-    "backend_proxy":{
-      "prefix": "api",
-      "target": "localhost:9090"
-    }
-  },
-  "backend":{
-    "enable": false,
-    "entry": "/data/backend/Backend",
-    "listen": ":9090",
-    "shell_log":{
-      "file": "/data/logs/backend.shell.log",
-      "max_size": 16,
-      "max_age": 30,
-      "max_backups": 50,
-      "use_local_time": true,
-      "compress_history": true
-    }
-  }
-}

+ 60 - 0
dist/rel/config.default.yaml

@@ -0,0 +1,60 @@
+# config for frontend
+frontend:
+  # 'true' for enable frontend startup, 'false' for disable.
+  enable: true
+  # absolute path to the frontend executable file
+  entry: "data/frontend/zDWSIFrontend"
+  # config for logger of frontend startup shell
+  shell_log:
+    # absolute path to shell log (log rotating will append infix into filename)
+    file: "/data/logs/frontend.shell.log"
+    # max size per log file (MegaBytes)
+    max_size: 16
+    # max days for rotating
+    max_age: 30
+    # max backups for rotating remain
+    max_backups: 50
+    # 'true' for using local time for rotating
+    use_local_time: true
+    # 'true' for compress rotating history into zip files
+    compress_history: true
+  # listening address
+  # (will set environment variable 'listen' when startup frontend)
+  listen: ":8080"
+  # root path for frontend
+  # (will set environment variable 'wwwroot' when startup frontend)
+  wwwroot: "/data/wwwroot/"
+  # config for backend reverse proxy
+  backend_proxy:
+    # backend forward prefix
+    # (will set environment variable 'backend_prefix' when startup frontend)
+    # e.g. : if using default frontend program, set this with 'api'
+    # the URL under http://hostname:port/api/ will be forwarding to backend
+    prefix: "api"
+    # backend forward target
+    # (will set environment variable 'backend_target' when startup frontend)
+    target: "http://localhost:9090/"
+
+# config for backend
+backend:
+  # 'true' for enable backend startup, 'false' for disable.
+  enable: false,
+  # absolute path to the backend executable file
+  entry: "/data/backend/Backend",
+  # listening address
+  # (will set environment variable 'listen' when startup backend)
+  listen: ":9090",
+  # config for logger of backend startup shell
+  shell_log":
+    # absolute path to shell log (log rotating will append infix into filename)
+    file: "/data/logs/backend.shell.log",
+    # max size per log file (MegaBytes)
+    max_size: 16,
+    # max days for rotating
+    max_age: 30,
+    # max backups for rotating remain
+    max_backups: 50,
+    # 'true' for using local time for rotating
+    use_local_time: true,
+    # 'true' for compress rotating history into zip files
+    compress_history: true

+ 71 - 0
dist/rel/zdwsi.frontend.config.default.yaml

@@ -0,0 +1,71 @@
+# config for log
+log:
+  # 'true' for enable access log, 'false' for disable access log
+  access_log_enable: true,
+  # config for log rolling
+  rolling_log_config:
+    # config for error log rolling
+    error_log:
+      # absolute path to log (log rotating will append infix into filename)
+      file: "/data/logs/frontend.err.log"
+      # max size per log file (MegaBytes)
+      max_size: 16
+      # max days for rotating
+      max_age: 30
+      # max backups for rotating remain
+      max_backups: 50
+      # 'true' for using local time for rotating
+      use_local_time: true
+      # 'true' for compress rotating history into zip files
+      compress_history: true
+    # config for access log rolling
+    access_log:
+      # absolute path to log (log rotating will append infix into filename)
+      file: "/data/logs/frontend.access.log"
+      # max size per log file (MegaBytes)
+      max_size: 16
+      # max days for rotating
+      max_age: 30
+      # max backups for rotating remain
+      max_backups: 50
+      # 'true' for using local time for rotating
+      use_local_time: true
+      # 'true' for compress rotating history into zip files
+      compress_history: true
+  # detail config for access log
+  error_logger_config:
+    # the log emitting level, the message which level below this will be emitted
+    # optional value: 'DEBUG', 'INFO', 'WARN', 'ERROR', 'PANIC', 'FATAL'
+    # all level option below should be one of these values
+    output_level: "INFO"
+    # format string for log. this formation using YAGTF.
+    # Reference: http://git.swzry.com/zry/YAGTF
+    # Expanded Tags: <level>, <unit>, <msg>
+    log_format: "[!<y>-<mon>-<d> <h24>:<min>:<s>.<us> <tz> <tzA>] <lt><level><gt>{<unit>} <msg><br>"
+  # detail config for access log
+  access_logger_config:
+    # the log emitting level, the message which level below this will be emitted
+    # optional value: 'DEBUG', 'INFO', 'WARN', 'ERROR', 'PANIC', 'FATAL'
+    # all level option below should be one of these values
+    output_level: "INFO"
+    # level for HTTP 200
+    success_level: "INFO"
+    # level for HTTP 404
+    not_found_level: "WARN"
+    # level for HTTP 403
+    forbidden_level: "WARN"
+    # level for HTTP 502/503
+    gateway_error_level: "ERROR"
+    # level for HTTP 500
+    internal_error_level: "ERROR"
+    # level for logging before response
+    prelog_level: "DEBUG"
+    # format string for log. this formation using YAGTF.
+    # Reference: http://git.swzry.com/zry/YAGTF
+    # Expanded Tags: <level>, <url>, <status>
+    # Example: "{<q>time<q>: <q>!<y>-<mon>-<d> <h24>:<min>:<s>.<us> <tz> <tzA><q>, <q>level<q>: <q><level><q>, <q>status<q>: <status>, <q>url<q>: <q><url><q>}<br>"
+    # Output example for this example: {"time": "2019-09-19 11:45:14.191981000 +0800 CST", "level": "INFO", "status": 200, "url": "/"}
+    log_format: "{<q>time<q>: <q>!<y>-<mon>-<d> <h24>:<min>:<s>.<us> <tz> <tzA><q>, <q>level<q>: <q><level><q>, <q>status<q>: <status>, <q>url<q>: <q><url><q>}<br>"
+
+
+

+ 0 - 36
launcher/jsondef.go

@@ -1,36 +0,0 @@
-package main
-
-type ConfigJSON struct {
-	Frontend FrontendJSON `json:"frontend"`
-	Backend  BackendJSON  `json:"backend"`
-}
-
-type FrontendJSON struct {
-	Enable       bool                 `json:"enable"`
-	EntryPoint   string               `json:"entry"`
-	ListenAddr   string               `json:"listen"`
-	WWWRoot      string               `json:"wwwroot"`
-	BackendProxy BackendProxyJSON     `json:"backend_proxy"`
-	ShellLog     LumberjackLoggerJSON `json:"shell_log"`
-}
-
-type BackendJSON struct {
-	Enable     bool                 `json:"enable"`
-	EntryPoint string               `json:"entry"`
-	ListenAddr string               `json:"listen"`
-	ShellLog   LumberjackLoggerJSON `json:"shell_log"`
-}
-
-type BackendProxyJSON struct {
-	Prefix     string `json:"prefix"`
-	ProxyTaret string `json:"target"`
-}
-
-type LumberjackLoggerJSON struct {
-	FileName     string `json:"file"`
-	MaxSize      int    `json:"max_size"`
-	MaxAge       int    `json:"max_age"`
-	MaxBackups   int    `json:"max_backups"`
-	UseLocalTime bool   `json:"use_local_time"`
-	Compress     bool   `json:"compress_history"`
-}

+ 14 - 13
launcher/main.go

@@ -1,17 +1,17 @@
 package main
 
 import (
-	"encoding/json"
 	"fmt"
 	"git.swzry.com/zry/pathutils"
 	"gopkg.in/natefinch/lumberjack.v2"
+	"gopkg.in/yaml.v2"
 	"io"
 	"io/ioutil"
 	"os/exec"
 	"sync"
 )
 
-var ConfigData ConfigJSON
+var ConfigData ConfigYAML
 var FrontendShellLogger *lumberjack.Logger
 var BackendShellLogger *lumberjack.Logger
 var mainWaitGroup sync.WaitGroup
@@ -19,7 +19,7 @@ var mainWaitGroup sync.WaitGroup
 func main() {
 	fmt.Println("zDWSI Launcher Start.")
 	CheckInit()
-	LoadJSON()
+	LoadYAML()
 	StartFrontend()
 	StartBackend()
 	fmt.Println("Launcher Sleeping.")
@@ -27,7 +27,7 @@ func main() {
 }
 
 func CheckInit() {
-	pe, err := pathutils.PathExists("/data/config.json")
+	pe, err := pathutils.PathExists("/data/config.yaml")
 	if err == nil && pe {
 		return
 	}
@@ -36,22 +36,23 @@ func CheckInit() {
 	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/config.yaml", "/rel/config.default.yaml")
 	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'.")
+	pathutils.CopyFile("/data/frontend/zdwsi.frontend.config.yaml", "/rel/zdwsi.frontend.config.default.yaml")
+	fmt.Println("Container Initialized. Please Edit 'config.yaml'.")
 }
 
-func LoadJSON() {
-	fmt.Println("Load Config '/data/config.json'")
-	jdata, err := ioutil.ReadFile("/data/config.json")
+func LoadYAML() {
+	fmt.Println("Load Config '/data/config.yaml'")
+	jdata, err := ioutil.ReadFile("/data/config.yaml")
 	if err != nil {
-		fmt.Println("failed read file 'config.json': ", err)
+		fmt.Println("failed read file 'config.yaml': ", err)
 		Dead()
 	}
-	err = json.Unmarshal(jdata, &ConfigData)
+	err = yaml.Unmarshal(jdata, &ConfigData)
 	if err != nil {
-		fmt.Println("failed parse 'config.json': ", err)
+		fmt.Println("failed parse 'config.yaml': ", err)
 		Dead()
 	}
 	fmt.Println("Config Loaded.")
@@ -68,7 +69,7 @@ func RoutineSleep() {
 	FailureServer()
 }
 
-func InitLogger(cfg LumberjackLoggerJSON) *lumberjack.Logger {
+func InitLogger(cfg LumberjackLoggerYAML) *lumberjack.Logger {
 	ljl := &lumberjack.Logger{
 		Filename:   cfg.FileName,
 		MaxSize:    cfg.MaxSize,

+ 36 - 0
launcher/yamldef.go

@@ -0,0 +1,36 @@
+package main
+
+type ConfigYAML struct {
+	Frontend FrontendYAML `yaml:"frontend"`
+	Backend  BackendYAML  `yaml:"backend"`
+}
+
+type FrontendYAML struct {
+	Enable       bool                 `yaml:"enable"`
+	EntryPoint   string               `yaml:"entry"`
+	ListenAddr   string               `yaml:"listen"`
+	WWWRoot      string               `yaml:"wwwroot"`
+	BackendProxy BackendProxyYAML     `yaml:"backend_proxy"`
+	ShellLog     LumberjackLoggerYAML `yaml:"shell_log"`
+}
+
+type BackendYAML struct {
+	Enable     bool                 `yaml:"enable"`
+	EntryPoint string               `yaml:"entry"`
+	ListenAddr string               `yaml:"listen"`
+	ShellLog   LumberjackLoggerYAML `yaml:"shell_log"`
+}
+
+type BackendProxyYAML struct {
+	Prefix     string `yaml:"prefix"`
+	ProxyTaret string `yaml:"target"`
+}
+
+type LumberjackLoggerYAML struct {
+	FileName     string `yaml:"file"`
+	MaxSize      int    `yaml:"max_size"`
+	MaxAge       int    `yaml:"max_age"`
+	MaxBackups   int    `yaml:"max_backups"`
+	UseLocalTime bool   `yaml:"use_local_time"`
+	Compress     bool   `yaml:"compress_history"`
+}