Bläddra i källkod

use external config converter first, and then fallback to the internal one

Darien Raymond 8 år sedan
förälder
incheckning
268d7264e8
4 ändrade filer med 63 tillägg och 10 borttagningar
  1. 7 0
      common/platform/others.go
  2. 9 7
      common/platform/platform.go
  3. 8 0
      common/platform/windows.go
  4. 39 3
      main/config_json.go

+ 7 - 0
common/platform/others.go

@@ -4,6 +4,7 @@ package platform
 
 import (
 	"os"
+	"path/filepath"
 )
 
 func ExpandEnv(s string) string {
@@ -13,3 +14,9 @@ func ExpandEnv(s string) string {
 func LineSeparator() string {
 	return "\n"
 }
+
+func GetToolLocation(file string) string {
+	const name = "v2ray.location.tool"
+	toolPath := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(getExecutableDir)
+	return filepath.Join(toolPath, file)
+}

+ 9 - 7
common/platform/platform.go

@@ -45,14 +45,16 @@ func NormalizeEnvName(name string) string {
 	return strings.Replace(strings.ToUpper(strings.TrimSpace(name)), ".", "_", -1)
 }
 
+func getExecutableDir() string {
+	exec, err := os.Executable()
+	if err != nil {
+		return ""
+	}
+	return filepath.Dir(exec)
+}
+
 func GetAssetLocation(file string) string {
 	const name = "v2ray.location.asset"
-	assetPath := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(func() string {
-		exec, err := os.Executable()
-		if err != nil {
-			return ""
-		}
-		return filepath.Dir(exec)
-	})
+	assetPath := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(getExecutableDir)
 	return filepath.Join(assetPath, file)
 }

+ 8 - 0
common/platform/windows.go

@@ -2,6 +2,8 @@
 
 package platform
 
+import "path/filepath"
+
 func ExpandEnv(s string) string {
 	// TODO
 	return s
@@ -10,3 +12,9 @@ func ExpandEnv(s string) string {
 func LineSeparator() string {
 	return "\r\n"
 }
+
+func GetToolLocation(file string) string {
+	const name = "v2ray.location.tool"
+	toolPath := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(getExecutableDir)
+	return filepath.Join(toolPath, file+".exe")
+}

+ 39 - 3
main/config_json.go

@@ -1,5 +1,41 @@
-// +build json
-
 package main
 
-import _ "v2ray.com/core/tools/conf"
+import (
+	"io"
+	"os"
+	"os/exec"
+
+	"v2ray.com/core"
+	"v2ray.com/core/app/log"
+	"v2ray.com/core/common/platform"
+	jsonconf "v2ray.com/ext/tools/conf/serial"
+)
+
+func jsonToProto(input io.Reader) (*core.Config, error) {
+	v2ctl := platform.GetToolLocation("v2ctl")
+	_, err := os.Stat(v2ctl)
+	if err != nil {
+		return nil, err
+	}
+	cmd := exec.Command(v2ctl, "config")
+	cmd.Stdin = input
+	cmd.Stderr = os.Stderr
+
+	stdoutReader, err := cmd.StdoutPipe()
+	if err != nil {
+		return nil, err
+	}
+	defer stdoutReader.Close()
+	return core.LoadConfig(core.ConfigFormat_Protobuf, stdoutReader)
+}
+
+func init() {
+	core.RegisterConfigLoader(core.ConfigFormat_JSON, func(input io.Reader) (*core.Config, error) {
+		config, err := jsonToProto(input)
+		if err != nil {
+			log.Trace(newError("failed to execute v2ctl to convert config file.").Base(err).AtWarning())
+			return jsonconf.LoadJSONConfig(input)
+		}
+		return config, nil
+	})
+}