add custom help message
change the command line and config fiie priority add custom usage textmaster
parent
f79d8627f6
commit
fb73158f76
@ -1,37 +1,91 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"flag"
|
||||||
"github.com/go-yaml/yaml"
|
"github.com/go-yaml/yaml"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// stringSlice implemnts the flag.Value interface
|
||||||
|
// used to hold multiple command line arguments
|
||||||
|
type stringSlice []string
|
||||||
|
|
||||||
|
func (lf *stringSlice) Set(val string) error {
|
||||||
|
ss := strings.Split(val, ",")
|
||||||
|
|
||||||
|
if len(*lf) == 0 {
|
||||||
|
*lf = append(*lf, ss...)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp := []string{}
|
||||||
|
for _, s1 := range ss {
|
||||||
|
exists := false
|
||||||
|
for _, s2 := range *lf {
|
||||||
|
if s1 == s2 {
|
||||||
|
exists = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !exists {
|
||||||
|
tmp = append(tmp, s1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(tmp) > 0 {
|
||||||
|
*lf = append(*lf, tmp...)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (lf *stringSlice) String() string {
|
||||||
|
return strings.Join(*lf, ",")
|
||||||
|
}
|
||||||
|
|
||||||
type config struct {
|
type config struct {
|
||||||
Host string `yaml:"host"`
|
Host string `yaml:"host"`
|
||||||
Port int `yaml:"port"`
|
Port int `yaml:"port"`
|
||||||
PrivateKey string `yaml:"private_key"`
|
PrivateKey string `yaml:"private_key"`
|
||||||
ObfsMethod string `yaml:"obfs_method"`
|
ObfsMethod string `yaml:"obfs_method"`
|
||||||
ObfsKey string `yaml:"obfs_key"`
|
ObfsKey string `yaml:"obfs_key"`
|
||||||
Username string `yaml:"username"`
|
Username string `yaml:"username"`
|
||||||
Password string `yaml:"password"`
|
Password string `yaml:"password"`
|
||||||
KeepaliveInterval int `yaml:"keepalive_interval"`
|
KeepaliveInterval int `yaml:"keepalive_interval"`
|
||||||
KeepaliveMax int `yaml:"keepalive_max"`
|
KeepaliveMax int `yaml:"keepalive_max"`
|
||||||
Debug bool `yaml:"debug"`
|
Debug bool `yaml:"debug"`
|
||||||
DisableObfsAfterHandshake bool `yaml:"disable_obfs_after_handshake"`
|
DisableObfsAfterHandshake bool `yaml:"disable_obfs_after_handshake"`
|
||||||
NotRunCmd bool `yaml:"not_run_cmd"`
|
NotRunCmd bool `yaml:"not_run_cmd"`
|
||||||
LocalForward []string `yaml:"local_forward"`
|
LocalForwards stringSlice `yaml:"local_forward"`
|
||||||
RemoteForward []string `yaml:"remote_forward"`
|
RemoteForwards stringSlice `yaml:"remote_forward"`
|
||||||
DynamicForward []string `yaml:"dynamic_forward"`
|
DynamicForwards stringSlice `yaml:"dynamic_forward"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadConfig(f string) (*config, error) {
|
// loadConfig load config from config file
|
||||||
|
// it will save the commandline argument and
|
||||||
|
// restore it after load the config file
|
||||||
|
func loadConfig(cfg *config, f string) error {
|
||||||
|
// save commandline arguments
|
||||||
|
savedCommandline := map[string]string{}
|
||||||
|
flag.Visit(func(f *flag.Flag) {
|
||||||
|
savedCommandline[f.Name] = f.Value.String()
|
||||||
|
})
|
||||||
|
|
||||||
|
// load config file
|
||||||
buf, err := ioutil.ReadFile(f)
|
buf, err := ioutil.ReadFile(f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
var c config
|
|
||||||
err = yaml.Unmarshal(buf, &c)
|
err = yaml.Unmarshal(buf, cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// restore commandline arguments
|
||||||
|
for k, v := range savedCommandline {
|
||||||
|
flag.Set(k, v)
|
||||||
}
|
}
|
||||||
return &c, nil
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue