func runServers(t *testing.T) (srvA, srvB *server.Server, optsA, optsB *server.Options) { optsA, _ = server.ProcessConfigFile("./configs/srv_a.conf") optsB, _ = server.ProcessConfigFile("./configs/srv_b.conf") optsA.NoSigs, optsA.NoLog = true, true optsB.NoSigs, optsB.NoLog = true, true srvA = RunServer(optsA) srvB = RunServer(optsB) return }
func configureServerOptions(opts *server.Options, configFile string, routeHosts []string) (mergedOpts *server.Options, err error) { // Parse config if given if configFile != "" { var fileOpts *server.Options if fileOpts, err = server.ProcessConfigFile(configFile); err != nil { return } mergedOpts = server.MergeOptions(fileOpts, opts) } // Configure routes for _, v := range routeHosts { var r *url.URL if r, err = url.Parse(fmt.Sprintf("nats-route://%s:%d", v, mergedOpts.ClusterPort)); err != nil { return } mergedOpts.Routes = append(mergedOpts.Routes, r) } // Remove any host/ip that points to itself in Route var newroutes []*url.URL if newroutes, err = server.RemoveSelfReference(mergedOpts.ClusterPort, mergedOpts.Routes); err != nil { return } mergedOpts.Routes = newroutes return }
func LoadConfig(configFile string) (opts *server.Options) { opts, err := server.ProcessConfigFile(configFile) if err != nil { panic(fmt.Sprintf("Error processing configuration file: %v", err)) } opts.NoSigs, opts.NoLog = true, true return }
func RunServerWithConfig(configFile string) (srv *server.Server, opts *server.Options) { opts, err := server.ProcessConfigFile(configFile) if err != nil { panic(fmt.Sprintf("Error processing configuration file: %v", err)) } opts.NoSigs, opts.NoLog = true, true srv = RunServer(opts) return }
func runRouteServer(t *testing.T) (*server.Server, *server.Options) { opts, err := server.ProcessConfigFile("./configs/cluster.conf") // Override for running in Go routine. opts.NoSigs = true opts.Debug = true opts.Trace = true opts.NoLog = true if err != nil { t.Fatalf("Error parsing config file: %v\n", err) } return RunServer(opts), opts }
func RunServerWithConfig(configFile string) (srv *server.Server, opts *server.Options) { opts, err := server.ProcessConfigFile(configFile) if err != nil { panic(fmt.Sprintf("Error processing configuration file: %v", err)) } opts.NoSigs, opts.NoLog = true, true // Check for auth var a server.Auth if opts.Authorization != "" { a = &auth.Token{Token: opts.Authorization} } if opts.Username != "" { a = &auth.Plain{Username: opts.Username, Password: opts.Password} } srv = RunServerWithAuth(opts, a) return }
func TestTLSStressConnect(t *testing.T) { opts, err := server.ProcessConfigFile("./configs/tls.conf") if err != nil { panic(fmt.Sprintf("Error processing configuration file: %v", err)) } opts.NoSigs, opts.NoLog = true, true // For this test, remove the authorization opts.Authorization = "" // Increase ssl timeout opts.TLSTimeout = 2.0 srv := RunServer(opts) defer srv.Shutdown() nurl := fmt.Sprintf("tls://%s:%d", opts.Host, opts.Port) threadCount := 3 errCh := make(chan error, threadCount) var wg sync.WaitGroup wg.Add(threadCount) for i := 0; i < threadCount; i++ { go stressConnect(t, &wg, errCh, nurl, i) } wg.Wait() var lastError error lastError = nil for i := 0; i < threadCount; i++ { err := <-errCh if err != nil { lastError = err } } if lastError != nil { t.Fatalf("%v\n", lastError) } }
func main() { // Server Options opts := server.Options{} var showVersion bool var debugAndTrace bool var configFile string var showTLSHelp bool // Parse flags flag.IntVar(&opts.Port, "port", 0, "Port to listen on.") flag.IntVar(&opts.Port, "p", 0, "Port to listen on.") flag.StringVar(&opts.Host, "addr", "", "Network host to listen on.") flag.StringVar(&opts.Host, "a", "", "Network host to listen on.") flag.StringVar(&opts.Host, "net", "", "Network host to listen on.") flag.BoolVar(&opts.Debug, "D", false, "Enable Debug logging.") flag.BoolVar(&opts.Debug, "debug", false, "Enable Debug logging.") flag.BoolVar(&opts.Trace, "V", false, "Enable Trace logging.") flag.BoolVar(&opts.Trace, "trace", false, "Enable Trace logging.") flag.BoolVar(&debugAndTrace, "DV", false, "Enable Debug and Trace logging.") flag.BoolVar(&opts.Logtime, "T", true, "Timestamp log entries.") flag.BoolVar(&opts.Logtime, "logtime", true, "Timestamp log entries.") flag.StringVar(&opts.Username, "user", "", "Username required for connection.") flag.StringVar(&opts.Password, "pass", "", "Password required for connection.") flag.StringVar(&opts.Authorization, "auth", "", "Authorization token required for connection.") flag.IntVar(&opts.HTTPPort, "m", 0, "HTTP Port for /varz, /connz endpoints.") flag.IntVar(&opts.HTTPPort, "http_port", 0, "HTTP Port for /varz, /connz endpoints.") flag.IntVar(&opts.HTTPSPort, "ms", 0, "HTTPS Port for /varz, /connz endpoints.") flag.IntVar(&opts.HTTPSPort, "https_port", 0, "HTTPS Port for /varz, /connz endpoints.") flag.StringVar(&configFile, "c", "", "Configuration file.") flag.StringVar(&configFile, "config", "", "Configuration file.") flag.StringVar(&opts.PidFile, "P", "", "File to store process pid.") flag.StringVar(&opts.PidFile, "pid", "", "File to store process pid.") flag.StringVar(&opts.LogFile, "l", "", "File to store logging output.") flag.StringVar(&opts.LogFile, "log", "", "File to store logging output.") flag.BoolVar(&opts.Syslog, "s", false, "Enable syslog as log method.") flag.BoolVar(&opts.Syslog, "syslog", false, "Enable syslog as log method..") flag.StringVar(&opts.RemoteSyslog, "r", "", "Syslog server addr (udp://localhost:514).") flag.StringVar(&opts.RemoteSyslog, "remote_syslog", "", "Syslog server addr (udp://localhost:514).") flag.BoolVar(&showVersion, "version", false, "Print version information.") flag.BoolVar(&showVersion, "v", false, "Print version information.") flag.IntVar(&opts.ProfPort, "profile", 0, "Profiling HTTP port") flag.StringVar(&opts.RoutesStr, "routes", "", "Routes to actively solicit a connection.") flag.StringVar(&opts.ClusterListenStr, "cluster", "", "Cluster url from which members can solicit routes.") flag.StringVar(&opts.ClusterListenStr, "cluster_listen", "", "Cluster url from which members can solicit routes.") flag.BoolVar(&showTLSHelp, "help_tls", false, "TLS help.") flag.BoolVar(&opts.TLS, "tls", false, "Enable TLS.") flag.BoolVar(&opts.TLSVerify, "tlsverify", false, "Enable TLS with client verification.") flag.StringVar(&opts.TLSCert, "tlscert", "", "Server certificate file.") flag.StringVar(&opts.TLSKey, "tlskey", "", "Private key for server certificate.") flag.StringVar(&opts.TLSCaCert, "tlscacert", "", "Client certificate CA for verification.") flag.Usage = usage flag.Parse() // Show version and exit if showVersion { server.PrintServerAndExit() } if showTLSHelp { server.PrintTLSHelpAndDie() } // One flag can set multiple options. if debugAndTrace { opts.Trace, opts.Debug = true, true } // Process args looking for non-flag options, // 'version' and 'help' only for now for _, arg := range flag.Args() { switch strings.ToLower(arg) { case "version": server.PrintServerAndExit() case "help": usage() } } // Parse config if given if configFile != "" { fileOpts, err := server.ProcessConfigFile(configFile) if err != nil { server.PrintAndDie(err.Error()) } opts = *server.MergeOptions(fileOpts, &opts) } // Remove any host/ip that points to itself in Route newroutes, err := server.RemoveSelfReference(opts.ClusterPort, opts.Routes) if err != nil { server.PrintAndDie(err.Error()) } opts.Routes = newroutes // Configure TLS based on any present flags configureTLS(&opts) // Configure cluster opts if explicitly set via flags. err = configureClusterOpts(&opts) if err != nil { server.PrintAndDie(err.Error()) } // Create the server with appropriate options. s := server.New(&opts) // Configure the authentication mechanism configureAuth(s, &opts) // Configure the logger based on the flags configureLogger(s, &opts) // Start things up. Block here until done. s.Start() }
func main() { // Server Options opts := server.Options{} var showVersion bool var debugAndTrace bool var configFile string // Parse flags flag.IntVar(&opts.Port, "port", 0, "Port to listen on.") flag.IntVar(&opts.Port, "p", 0, "Port to listen on.") flag.StringVar(&opts.Host, "addr", "", "Network host to listen on.") flag.StringVar(&opts.Host, "a", "", "Network host to listen on.") flag.StringVar(&opts.Host, "net", "", "Network host to listen on.") flag.BoolVar(&opts.Debug, "D", false, "Enable Debug logging.") flag.BoolVar(&opts.Debug, "debug", false, "Enable Debug logging.") flag.BoolVar(&opts.Trace, "V", false, "Enable Trace logging.") flag.BoolVar(&opts.Trace, "trace", false, "Enable Trace logging.") flag.BoolVar(&debugAndTrace, "DV", false, "Enable Debug and Trace logging.") flag.BoolVar(&opts.Logtime, "T", true, "Timestamp log entries.") flag.BoolVar(&opts.Logtime, "logtime", true, "Timestamp log entries.") flag.StringVar(&opts.Username, "user", "", "Username required for connection.") flag.StringVar(&opts.Password, "pass", "", "Password required for connection.") flag.StringVar(&opts.Authorization, "auth", "", "Authorization token required for connection.") flag.IntVar(&opts.HTTPPort, "m", 0, "HTTP Port for /varz, /connz endpoints.") flag.IntVar(&opts.HTTPPort, "http_port", 0, "HTTP Port for /varz, /connz endpoints.") flag.StringVar(&configFile, "c", "", "Configuration file.") flag.StringVar(&configFile, "config", "", "Configuration file.") flag.StringVar(&opts.PidFile, "P", "", "File to store process pid.") flag.StringVar(&opts.PidFile, "pid", "", "File to store process pid.") flag.StringVar(&opts.LogFile, "l", "", "File to store logging output.") flag.StringVar(&opts.LogFile, "log", "", "File to store logging output.") flag.BoolVar(&opts.Syslog, "s", false, "Enable syslog as log method.") flag.BoolVar(&opts.Syslog, "syslog", false, "Enable syslog as log method..") flag.StringVar(&opts.RemoteSyslog, "r", "", "Syslog server addr (udp://localhost:514).") flag.StringVar(&opts.RemoteSyslog, "remote_syslog", "", "Syslog server addr (udp://localhost:514).") flag.BoolVar(&showVersion, "version", false, "Print version information.") flag.BoolVar(&showVersion, "v", false, "Print version information.") flag.IntVar(&opts.ProfPort, "profile", 0, "Profiling HTTP port") flag.StringVar(&opts.RoutesStr, "routes", "", "Routes to actively solicit a connection.") // Not public per se, will be replaced with dynamic system, but can be used to lower memory footprint when // lots of connections present. flag.IntVar(&opts.BufSize, "bs", 0, "Read/Write buffer size per client connection.") flag.Usage = server.Usage flag.Parse() // Show version and exit if showVersion { server.PrintServerAndExit() } // One flag can set multiple options. if debugAndTrace { opts.Trace, opts.Debug = true, true } // Process args looking for non-flag options, // 'version' and 'help' only for now for _, arg := range flag.Args() { switch strings.ToLower(arg) { case "version": server.PrintServerAndExit() case "help": server.Usage() } } // Parse config if given if configFile != "" { fileOpts, err := server.ProcessConfigFile(configFile) if err != nil { server.PrintAndDie(err.Error()) } opts = *server.MergeOptions(fileOpts, &opts) } // Remove any host/ip that points to itself in Route newroutes, err := server.RemoveSelfReference(opts.ClusterPort, opts.Routes) if err != nil { server.PrintAndDie(err.Error()) } opts.Routes = newroutes // Create the server with appropriate options. s := server.New(&opts) // Configure the authentication mechanism configureAuth(s, &opts) // Configure the logger based on the flags configureLogger(s, &opts) // Start things up. Block here until done. s.Start() }