Browse Source

Merge branch 'raymaster' into flymaster

vcptr 5 years ago
parent
commit
3ca28ce2d8

+ 3 - 2
common/platform/ctlcmd/ctlcmd.go

@@ -4,6 +4,7 @@ import (
 	"io"
 	"os"
 	"os/exec"
+	"strings"
 
 	"v2ray.com/core/common/buf"
 	"v2ray.com/core/common/platform"
@@ -35,14 +36,14 @@ func Run(args []string, input io.Reader) (buf.MultiBuffer, error) {
 	if err := cmd.Wait(); err != nil {
 		msg := "failed to execute v2ctl"
 		if errBuffer.Len() > 0 {
-			msg += ": " + errBuffer.MultiBuffer.String()
+			msg += ": \n" + strings.TrimSpace(errBuffer.MultiBuffer.String())
 		}
 		return nil, newError(msg).Base(err)
 	}
 
 	// log stderr, info message
 	if !errBuffer.IsEmpty() {
-		newError("v2ctl > \n", errBuffer.MultiBuffer.String()).AtInfo().WriteToLog()
+		newError("<v2ctl message> \n", strings.TrimSpace(errBuffer.MultiBuffer.String())).AtInfo().WriteToLog()
 	}
 
 	return outBuffer.MultiBuffer, nil

+ 7 - 0
common/platform/platform.go

@@ -83,3 +83,10 @@ func GetConfigurationPath() string {
 	configPath := NewEnvFlag(name).GetValue(getExecutableDir)
 	return filepath.Join(configPath, "config.json")
 }
+
+// GetConfDirPath reads "v2ray.location.confdir"
+func GetConfDirPath() string {
+	const name = "v2ray.location.confdir"
+	configPath := NewEnvFlag(name).GetValue(func() string { return "" })
+	return configPath
+}

+ 4 - 2
core.go

@@ -13,10 +13,12 @@ package core
 //go:generate errorgen
 
 import (
+	"runtime"
+
 	"v2ray.com/core/common/serial"
 )
 
-const (
+var (
 	version  = "4.22.0"
 	build    = "Custom"
 	codename = "V2Fly, a community-driven edition of V2Ray."
@@ -32,7 +34,7 @@ func Version() string {
 // VersionStatement returns a list of strings representing the full version info.
 func VersionStatement() []string {
 	return []string{
-		serial.Concat("V2Ray ", Version(), " (", codename, ") ", build),
+		serial.Concat("V2Ray ", Version(), " (", codename, ") ", build, " (", runtime.Version(), " ", runtime.GOOS, "/", runtime.GOARCH, ")"),
 		intro,
 	}
 }

+ 9 - 5
infra/conf/v2ray.go

@@ -2,6 +2,8 @@ package conf
 
 import (
 	"encoding/json"
+	"log"
+	"os"
 	"strings"
 
 	"v2ray.com/core"
@@ -31,6 +33,8 @@ var (
 		"mtproto":     func() interface{} { return new(MTProtoClientConfig) },
 		"dns":         func() interface{} { return new(DnsOutboundConfig) },
 	}, "protocol", "settings")
+
+	ctllog = log.New(os.Stderr, "v2ctl> ", 0)
 )
 
 func toProtocolList(s []string) ([]proxyman.KnownProtocols, error) {
@@ -361,10 +365,10 @@ func (c *Config) Override(o *Config, fn string) {
 		if len(c.InboundConfigs) > 0 && len(o.InboundConfigs) == 1 {
 			if idx := c.findInboundTag(o.InboundConfigs[0].Tag); idx > -1 {
 				c.InboundConfigs[idx] = o.InboundConfigs[0]
-				newError("<", fn, "> updated inbound with tag: ", o.InboundConfigs[0].Tag).AtInfo().WriteToLog()
+				ctllog.Println("[", fn, "] updated inbound with tag: ", o.InboundConfigs[0].Tag)
 			} else {
 				c.InboundConfigs = append(c.InboundConfigs, o.InboundConfigs[0])
-				newError("<", fn, "> appended inbound with tag: ", o.InboundConfigs[0].Tag).AtInfo().WriteToLog()
+				ctllog.Println("[", fn, "] appended inbound with tag: ", o.InboundConfigs[0].Tag)
 			}
 		} else {
 			c.InboundConfigs = o.InboundConfigs
@@ -376,14 +380,14 @@ func (c *Config) Override(o *Config, fn string) {
 		if len(c.OutboundConfigs) > 0 && len(o.OutboundConfigs) == 1 {
 			if idx := c.findOutboundTag(o.OutboundConfigs[0].Tag); idx > -1 {
 				c.OutboundConfigs[idx] = o.OutboundConfigs[0]
-				newError("<", fn, "> updated outbound with tag: ", o.OutboundConfigs[0].Tag).AtInfo().WriteToLog()
+				ctllog.Println("[", fn, "] updated outbound with tag: ", o.OutboundConfigs[0].Tag)
 			} else {
 				if strings.Contains(strings.ToLower(fn), "tail") {
 					c.OutboundConfigs = append(c.OutboundConfigs, o.OutboundConfigs[0])
-					newError("<", fn, "> appended outbound with tag: ", o.OutboundConfigs[0].Tag).AtInfo().WriteToLog()
+					ctllog.Println("[", fn, "] appended outbound with tag: ", o.OutboundConfigs[0].Tag)
 				} else {
 					c.OutboundConfigs = append(o.OutboundConfigs, c.OutboundConfigs...)
-					newError("<", fn, "> prepended outbound with tag: ", o.OutboundConfigs[0].Tag).AtInfo().WriteToLog()
+					ctllog.Println("[", fn, "] prepended outbound with tag: ", o.OutboundConfigs[0].Tag)
 				}
 			}
 		} else {

+ 3 - 0
infra/control/command.go

@@ -2,6 +2,8 @@ package control
 
 import (
 	"fmt"
+	"log"
+	"os"
 	"strings"
 )
 
@@ -18,6 +20,7 @@ type Command interface {
 
 var (
 	commandRegistry = make(map[string]Command)
+	ctllog          = log.New(os.Stderr, "v2ctl> ", 0)
 )
 
 func RegisterCommand(cmd Command) error {

+ 4 - 2
infra/control/config.go

@@ -37,11 +37,13 @@ func (c *ConfigCommand) Execute(args []string) error {
 
 	conf := &conf.Config{}
 	for _, arg := range args {
-		newError("Reading config: ", arg).AtInfo().WriteToLog()
+		ctllog.Println("Read config: ", arg)
 		r, err := c.LoadArg(arg)
 		common.Must(err)
 		c, err := serial.DecodeJSONConfig(r)
-		common.Must(err)
+		if err != nil {
+			ctllog.Fatalln(err)
+		}
 		conf.Override(c, arg)
 	}
 

+ 38 - 6
main/main.go

@@ -5,8 +5,11 @@ package main
 import (
 	"flag"
 	"fmt"
+	"io/ioutil"
+	"log"
 	"os"
 	"os/signal"
+	"path"
 	"path/filepath"
 	"runtime"
 	"strings"
@@ -20,10 +23,10 @@ import (
 
 var (
 	configFiles cmdarg.Arg // "Config file for V2Ray.", the option is customed type, parse in main
+	configDir   string
 	version     = flag.Bool("version", false, "Show current version of V2Ray.")
 	test        = flag.Bool("test", false, "Test config file only, without launching V2Ray server.")
 	format      = flag.String("format", "json", "Format of input file.")
-	errNoConfig = newError("no valid config")
 )
 
 func fileExists(file string) bool {
@@ -31,7 +34,27 @@ func fileExists(file string) bool {
 	return err == nil && !info.IsDir()
 }
 
+func dirExists(file string) bool {
+	info, err := os.Stat(file)
+	return err == nil && info.IsDir()
+}
+
+func readConfDir(dirPath string) {
+	confs, err := ioutil.ReadDir(dirPath)
+	if err != nil {
+		log.Fatalln(err)
+	}
+	for _, f := range confs {
+		if strings.HasSuffix(f.Name(), ".json") {
+			configFiles.Set(path.Join(dirPath, f.Name()))
+		}
+	}
+}
+
 func getConfigFilePath() (cmdarg.Arg, error) {
+	if dirExists(configDir) {
+		readConfDir(configDir)
+	}
 	if len(configFiles) > 0 {
 		return configFiles, nil
 	}
@@ -39,14 +62,25 @@ func getConfigFilePath() (cmdarg.Arg, error) {
 	if workingDir, err := os.Getwd(); err == nil {
 		configFile := filepath.Join(workingDir, "config.json")
 		if fileExists(configFile) {
+			log.Println("Using default config: ", configFile)
 			return cmdarg.Arg{configFile}, nil
 		}
 	}
 
 	if configFile := platform.GetConfigurationPath(); fileExists(configFile) {
+		log.Println("Using config from env: ", configFile)
 		return cmdarg.Arg{configFile}, nil
 	}
 
+	if envConfDir := platform.GetConfDirPath(); dirExists(envConfDir) {
+		log.Println("Using confdir from env: ", envConfDir)
+		readConfDir(envConfDir)
+		if len(configFiles) > 0 {
+			return configFiles, nil
+		}
+	}
+
+	log.Println("Using config from STDIN")
 	return cmdarg.Arg{"stdin:"}, nil
 }
 
@@ -87,7 +121,8 @@ func printVersion() {
 
 func main() {
 	flag.Var(&configFiles, "config", "Config file for V2Ray. Multiple assign is accepted (only json). Latter ones overrides the former ones.")
-	flag.Var(&configFiles, "c", "short alias of -config")
+	flag.Var(&configFiles, "c", "Short alias of -config")
+	flag.StringVar(&configDir, "confdir", "", "A dir with multiple json config")
 	flag.Parse()
 
 	printVersion()
@@ -98,11 +133,8 @@ func main() {
 
 	server, err := startV2Ray()
 	if err != nil {
-		fmt.Println(err.Error())
+		fmt.Println(err)
 		// Configuration error. Exit with a special value to prevent systemd from restarting.
-		if err == errNoConfig {
-			flag.PrintDefaults()
-		}
 		os.Exit(23)
 	}
 

+ 9 - 13
release/user-package.sh

@@ -17,9 +17,11 @@ __root="$(cd "$(dirname "${__dir}")" && pwd)" # <-- change this as it depends on
 
 NOW=$(date '+%Y%m%d-%H%M%S')
 TMP=$(mktemp -d)
+SRCDIR=$(pwd)
 
 CODENAME="user"
 BUILDNAME=$NOW
+VERSIONTAG=$(git describe --tags)
 GOPATH=$(go env GOPATH)
 
 cleanup () { rm -rf $TMP; }
@@ -28,27 +30,21 @@ trap cleanup INT TERM ERR
 get_source() {
 	echo ">>> Getting v2ray sources ..."
 	go get -insecure -v -t v2ray.com/core/...
+	SRCDIR="$GOPATH/src/v2ray.com/core"
 }
 
 build_v2() {
-	pushd $GOPATH/src/v2ray.com/core
-	echo ">>> Update source code name ..."
-	sed -i "s/^[ \t]\+codename.\+$/\tcodename = \"${CODENAME}\"/;s/^[ \t]\+build.\+$/\tbuild = \"${BUILDNAME}\"/;" core.go
+	pushd $SRCDIR
+	LDFLAGS="-s -w -X v2ray.com/core.codename=${CODENAME} -X v2ray.com/core.build=${BUILDNAME}  -X v2ray.com/core.version=${VERSIONTAG}"
 
 	echo ">>> Compile v2ray ..."
-	pushd $GOPATH/src/v2ray.com/core/main
-	env CGO_ENABLED=0 go build -o $TMP/v2ray${EXESUFFIX} -ldflags "-s -w"
+	env CGO_ENABLED=0 go build -o $TMP/v2ray${EXESUFFIX} -ldflags "$LDFLAGS" ./main
 	if [[ $GOOS == "windows" ]];then
-	  env CGO_ENABLED=0 go build -o $TMP/wv2ray${EXESUFFIX} -ldflags "-s -w -H windowsgui"
+	  env CGO_ENABLED=0 go build -o $TMP/wv2ray${EXESUFFIX} -ldflags "-H windowsgui $LDFLAGS" ./main
 	fi
-	popd
-
-	git checkout -- core.go
-	popd
 
 	echo ">>> Compile v2ctl ..."
-	pushd $GOPATH/src/v2ray.com/core/infra/control/main
-	env CGO_ENABLED=0 go build -o $TMP/v2ctl${EXESUFFIX} -tags confonly -ldflags "-s -w"
+	env CGO_ENABLED=0 go build -o $TMP/v2ctl${EXESUFFIX} -tags confonly -ldflags "$LDFLAGS" ./infra/control/main
 	popd
 }
 
@@ -66,7 +62,7 @@ build_dat() {
 
 copyconf() {
 	echo ">>> Copying config..."
-	pushd $GOPATH/src/v2ray.com/core/release/config
+	pushd $SRCDIR/release/config
 	tar c --exclude "*.dat" . | tar x -C $TMP
 }