From b758b3d9ac9f9debc3bed0775d424527e4af7d4d Mon Sep 17 00:00:00 2001 From: Septs Date: Wed, 9 Nov 2016 17:11:26 +0800 Subject: [PATCH] add configure file support --- cmd/gost/main.go | 65 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/cmd/gost/main.go b/cmd/gost/main.go index ae15b9e..528d420 100644 --- a/cmd/gost/main.go +++ b/cmd/gost/main.go @@ -2,51 +2,64 @@ package main import ( "crypto/tls" + "encoding/json" "flag" "fmt" "github.com/ginuerzh/gost" "github.com/golang/glog" "golang.org/x/net/http2" + "io/ioutil" "os" "runtime" "sync" ) var ( - chainNodes stringlist - serverNodes stringlist - pv bool + options struct { + ChainNodes, ServeNodes flagStringList + } ) func init() { - flag.Var(&serverNodes, "L", "listen address, can listen on multiple ports") - flag.Var(&chainNodes, "F", "forward address, can make a forward chain") - flag.BoolVar(&pv, "V", false, "print version") + var ( + configureFile string + printVersion bool + ) + + flag.StringVar(&configureFile, "C", "", "configure file") + flag.Var(&options.ChainNodes, "F", "forward address, can make a forward chain") + flag.Var(&options.ServeNodes, "L", "listen address, can listen on multiple ports") + flag.BoolVar(&printVersion, "V", false, "print version") flag.Parse() + if err := loadConfigureFile(configureFile); err != nil { + glog.Fatal(err) + } + if glog.V(5) { http2.VerboseLogs = true } -} -func main() { if flag.NFlag() == 0 { flag.PrintDefaults() return } - if pv { - fmt.Fprintf(os.Stderr, "gost %s (%s)\n", gost.Version, runtime.Version()) + + if printVersion { + fmt.Fprintf(os.Stderr, "GOST %s (%s)\n", gost.Version, runtime.Version()) return } +} +func main() { chain := gost.NewProxyChain() - if err := chain.AddProxyNodeString(chainNodes...); err != nil { + if err := chain.AddProxyNodeString(options.ChainNodes...); err != nil { glog.Fatal(err) } chain.Init() var wg sync.WaitGroup - for _, ns := range serverNodes { + for _, ns := range options.ServeNodes { serverNode, err := gost.ParseProxyNode(ns) if err != nil { glog.Fatal(err) @@ -73,12 +86,26 @@ func main() { wg.Wait() } -type stringlist []string - -func (list *stringlist) String() string { - return fmt.Sprintf("%s", *list) -} -func (list *stringlist) Set(value string) error { - *list = append(*list, value) +func loadConfigureFile(configureFile string) error { + if configureFile == "" { + return nil + } + content, err := ioutil.ReadFile(configureFile) + if err != nil { + return err + } + if err := json.Unmarshal(content, &options); err != nil { + return err + } + return nil +} + +type flagStringList []string + +func (this *flagStringList) String() string { + return fmt.Sprintf("%s", *this) +} +func (this *flagStringList) Set(value string) error { + *this = append(*this, value) return nil }