func updatePasswd() { log.Println("updating password") newconfig, err := ss.ParseConfig(configFile) if err != nil { log.Printf("error parsing config file %s to update password: %v\n", configFile, err) return } oldconfig := config config = newconfig if err = unifyPortPassword(config); err != nil { return } for port, passwd := range config.PortPassword { passwdManager.updatePortPasswd(port, passwd) if oldconfig.PortPassword != nil { delete(oldconfig.PortPassword, port) } } // port password still left in the old config should be closed for port, _ := range oldconfig.PortPassword { log.Printf("closing port %s as it's deleted\n", port) passwdManager.del(port) } log.Println("password updated") }
func main() { log.SetOutput(os.Stdout) var configFile, cmdServer, cmdLocal string var cmdConfig ss.Config var printVer bool flag.BoolVar(&printVer, "version", false, "print version") flag.StringVar(&configFile, "c", "config.json", "specify config file") flag.StringVar(&cmdServer, "s", "", "server address") flag.StringVar(&cmdLocal, "b", "", "local address, listen only to this address if specified") flag.StringVar(&cmdConfig.Password, "k", "", "password") flag.IntVar(&cmdConfig.ServerPort, "p", 0, "server port") flag.IntVar(&cmdConfig.Timeout, "t", 300, "timeout in seconds") flag.IntVar(&cmdConfig.LocalPort, "l", 0, "local socks5 proxy port") flag.StringVar(&cmdConfig.Method, "m", "", "encryption method, default: aes-256-cfb") flag.BoolVar((*bool)(&debug), "d", false, "print debug message") flag.Parse() if printVer { ss.PrintVersion() os.Exit(0) } cmdConfig.Server = cmdServer ss.SetDebug(debug) exists, err := ss.IsFileExists(configFile) // If no config file in current directory, try search it in the binary directory // Note there's no portable way to detect the binary directory. binDir := path.Dir(os.Args[0]) if (!exists || err != nil) && binDir != "" && binDir != "." { oldConfig := configFile configFile = path.Join(binDir, "config.json") log.Printf("%s not found, try config file %s\n", oldConfig, configFile) } config, err := ss.ParseConfig(configFile) if err != nil { config = &cmdConfig if !os.IsNotExist(err) { fmt.Fprintf(os.Stderr, "error reading %s: %v\n", configFile, err) os.Exit(1) } } else { ss.UpdateConfig(config, &cmdConfig) } if config.Method == "" { config.Method = "aes-256-cfb" } if len(config.ServerPassword) == 0 { if !enoughOptions(config) { fmt.Fprintln(os.Stderr, "must specify server address, password and both server/local port") os.Exit(1) } } else { if config.Password != "" || config.ServerPort != 0 || config.GetServerArray() != nil { fmt.Fprintln(os.Stderr, "given server_password, ignore server, server_port and password option:", config) } if config.LocalPort == 0 { fmt.Fprintln(os.Stderr, "must specify local port") os.Exit(1) } } parseServerConfig(config) run(cmdLocal + ":" + strconv.Itoa(config.LocalPort)) }
func main() { log.SetOutput(os.Stdout) log.SetFlags(log.Lshortfile | log.Ldate | log.Ltime) var cmdConfig ss.Config var printVer bool var core int var toInstall bool var toRemove bool flag.BoolVar(&printVer, "version", false, "print version") flag.StringVar(&configFile, "c", "./config.json", "specify config file") flag.StringVar(&cmdConfig.Password, "k", "", "password") flag.IntVar(&cmdConfig.ServerPort, "p", 0, "server port") flag.IntVar(&cmdConfig.Timeout, "t", 300, "timeout in seconds") flag.StringVar(&cmdConfig.Method, "m", "", "encryption method, default: aes-256-cfb") flag.IntVar(&core, "core", 0, "maximum number of CPU cores to use, default is determinied by Go runtime") flag.BoolVar((*bool)(&debug), "d", false, "print debug message") flag.BoolVar((*bool)(&toInstall), "install", false, "install as service") flag.BoolVar((*bool)(&toRemove), "uninstall", false, "uninstall service") flag.Parse() if printVer { ss.PrintVersion() os.Exit(0) } if toInstall { if cmdConfig.Password != "" && cmdConfig.ServerPort != 0 { var istr string = `{"server_port":%d,"password":"******","method":"aes-256-cfb","timeout":300}` wstr := fmt.Sprintf(istr, cmdConfig.ServerPort, cmdConfig.Password) err := ioutil.WriteFile("./config.json", []byte(wstr), 0644) if err != nil { fmt.Println(err) } else { install() } } else { fmt.Println(`you must specify port and password to install as service. example: ./shadowsocks-server -install -k password -p 1288`) } os.Exit(0) } if toRemove { remove() os.Exit(0) } ss.SetDebug(debug) var err error config, err = ss.ParseConfig(configFile) if err != nil { if !os.IsNotExist(err) { fmt.Fprintf(os.Stderr, "error reading %s: %v\n", configFile, err) os.Exit(1) } config = &cmdConfig } else { ss.UpdateConfig(config, &cmdConfig) } if config.Method == "" { config.Method = "aes-256-cfb" } if err = ss.CheckCipherMethod(config.Method); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } if err = unifyPortPassword(config); err != nil { os.Exit(1) } if core > 0 { runtime.GOMAXPROCS(core) } for port, password := range config.PortPassword { go run(port, password) } waitSignal() }