|
@@ -15,14 +15,11 @@
|
|
|
package sub
|
|
|
|
|
|
import (
|
|
|
- "bytes"
|
|
|
"context"
|
|
|
"fmt"
|
|
|
- "io/ioutil"
|
|
|
"net"
|
|
|
"os"
|
|
|
"os/signal"
|
|
|
- "path/filepath"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
"syscall"
|
|
@@ -132,25 +129,6 @@ func handleSignal(svr *client.Service) {
|
|
|
close(kcpDoneCh)
|
|
|
}
|
|
|
|
|
|
-func parseClientCommonCfg(fileType int, source []byte) (cfg config.ClientCommonConf, err error) {
|
|
|
- if fileType == CfgFileTypeIni {
|
|
|
- cfg, err = config.UnmarshalClientConfFromIni(source)
|
|
|
- } else if fileType == CfgFileTypeCmd {
|
|
|
- cfg, err = parseClientCommonCfgFromCmd()
|
|
|
- }
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- cfg.Complete()
|
|
|
- err = cfg.Validate()
|
|
|
- if err != nil {
|
|
|
- err = fmt.Errorf("Parse config error: %v", err)
|
|
|
- return
|
|
|
- }
|
|
|
- return
|
|
|
-}
|
|
|
-
|
|
|
func parseClientCommonCfgFromCmd() (cfg config.ClientCommonConf, err error) {
|
|
|
cfg = config.GetDefaultClientConf()
|
|
|
|
|
@@ -179,89 +157,22 @@ func parseClientCommonCfgFromCmd() (cfg config.ClientCommonConf, err error) {
|
|
|
cfg.Token = token
|
|
|
cfg.TLSEnable = tlsEnable
|
|
|
|
|
|
+ cfg.Complete()
|
|
|
+ if err = cfg.Validate(); err != nil {
|
|
|
+ err = fmt.Errorf("Parse config error: %v", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
return
|
|
|
}
|
|
|
|
|
|
func runClient(cfgFilePath string) error {
|
|
|
- cfg, pxyCfgs, visitorCfgs, err := parseConfig(cfgFilePath)
|
|
|
+ cfg, pxyCfgs, visitorCfgs, err := config.ParseClientConfig(cfgFilePath)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
return startService(cfg, pxyCfgs, visitorCfgs, cfgFilePath)
|
|
|
}
|
|
|
|
|
|
-func parseConfig(cfgFilePath string) (
|
|
|
- cfg config.ClientCommonConf,
|
|
|
- pxyCfgs map[string]config.ProxyConf,
|
|
|
- visitorCfgs map[string]config.VisitorConf,
|
|
|
- err error,
|
|
|
-) {
|
|
|
- var content []byte
|
|
|
- content, err = config.GetRenderedConfFromFile(cfgFilePath)
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
- configBuffer := bytes.NewBuffer(nil)
|
|
|
- configBuffer.Write(content)
|
|
|
-
|
|
|
- // Parse common section.
|
|
|
- cfg, err = parseClientCommonCfg(CfgFileTypeIni, content)
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // Aggregate proxy configs from include files.
|
|
|
- var buf []byte
|
|
|
- buf, err = getIncludeContents(cfg.IncludeConfigFiles)
|
|
|
- if err != nil {
|
|
|
- err = fmt.Errorf("getIncludeContents error: %v", err)
|
|
|
- return
|
|
|
- }
|
|
|
- configBuffer.WriteString("\n")
|
|
|
- configBuffer.Write(buf)
|
|
|
-
|
|
|
- // Parse all proxy and visitor configs.
|
|
|
- pxyCfgs, visitorCfgs, err = config.LoadAllProxyConfsFromIni(cfg.User, configBuffer.Bytes(), cfg.Start)
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
- return
|
|
|
-}
|
|
|
-
|
|
|
-// getIncludeContents renders all configs from paths.
|
|
|
-// files format can be a single file path or directory or regex path.
|
|
|
-func getIncludeContents(paths []string) ([]byte, error) {
|
|
|
- out := bytes.NewBuffer(nil)
|
|
|
- for _, path := range paths {
|
|
|
- absDir, err := filepath.Abs(filepath.Dir(path))
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- if _, err := os.Stat(absDir); os.IsNotExist(err) {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- files, err := ioutil.ReadDir(absDir)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- for _, fi := range files {
|
|
|
- if fi.IsDir() {
|
|
|
- continue
|
|
|
- }
|
|
|
- absFile := filepath.Join(absDir, fi.Name())
|
|
|
- if matched, _ := filepath.Match(filepath.Join(absDir, filepath.Base(path)), absFile); matched {
|
|
|
- tmpContent, err := config.GetRenderedConfFromFile(absFile)
|
|
|
- if err != nil {
|
|
|
- return nil, fmt.Errorf("render extra config %s error: %v", absFile, err)
|
|
|
- }
|
|
|
- out.Write(tmpContent)
|
|
|
- out.WriteString("\n")
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return out.Bytes(), nil
|
|
|
-}
|
|
|
-
|
|
|
func startService(
|
|
|
cfg config.ClientCommonConf,
|
|
|
pxyCfgs map[string]config.ProxyConf,
|