func Connect(adapter Adapter, backoffStrategy retrystrategy.RetryStrategy, logger *gosteno.Logger, maxRetries int) error { timer := time.NewTimer(backoffStrategy(0)) defer timer.Stop() numberOfTries := 0 for { err := adapter.Connect() if err == nil { logger.Info("Connected to etcd") return nil } numberOfTries++ sleepDuration := backoffStrategy(numberOfTries) logger.Warnd(map[string]interface{}{ "error": err.Error(), }, fmt.Sprintf("Failed to connect to etcd. Number of tries: %d. Backing off for %v.", numberOfTries, sleepDuration)) timer.Reset(sleepDuration) <-timer.C if numberOfTries >= maxRetries { return fmt.Errorf("Failed to connect to etcd after %d tries.", numberOfTries) } } }
func newTokenFetcher(c *config.Config, logger *steno.Logger) token_fetcher.TokenFetcher { if c.RoutingApi.AuthDisabled { logger.Info("using noop token fetcher") return token_fetcher.NewNoOpTokenFetcher() } tokenFetcher := token_fetcher.NewTokenFetcher(&c.OAuth) logger.Info("using uaa token fetcher") return tokenFetcher }
func waitOnErrOrSignal(c *config.Config, logger *steno.Logger, errChan <-chan error, router *router.Router) { signals := make(chan os.Signal, 1) signal.Notify(signals, syscall.SIGTERM, syscall.SIGINT, syscall.SIGUSR1) select { case err := <-errChan: if err != nil { logger.Errorf("Error occurred: %s", err.Error()) os.Exit(1) } case sig := <-signals: go func() { for sig := range signals { logger.Infod( map[string]interface{}{ "signal": sig.String(), }, "gorouter.signal.ignored", ) } }() if sig == syscall.SIGUSR1 { logger.Infod( map[string]interface{}{ "timeout": (c.DrainTimeout).String(), }, "gorouter.draining", ) router.Drain(c.DrainTimeout) } stoppingAt := time.Now() logger.Info("gorouter.stopping") router.Stop() logger.Infod( map[string]interface{}{ "took": time.Since(stoppingAt).String(), }, "gorouter.stopped", ) } }
func newTokenFetcher(logger *steno.Logger, clock clock.Clock, c *config.Config) token_fetcher.TokenFetcher { if c.RoutingApi.AuthDisabled { logger.Info("using noop token fetcher") return token_fetcher.NewNoOpTokenFetcher() } tokenFetcherConfig := token_fetcher.TokenFetcherConfig{ MaxNumberOfRetries: c.TokenFetcherMaxRetries, RetryInterval: c.TokenFetcherRetryInterval, ExpirationBufferTime: c.TokenFetcherExpirationBufferTimeInSeconds, } cfLogger, _ := cf_lager.New("token_fetcher") tokenFetcher, err := token_fetcher.NewTokenFetcher(cfLogger, &c.OAuth, tokenFetcherConfig, clock) if err != nil { logger.Errorf("Error creating token fetcher: %s\n", err) os.Exit(1) } logger.Info("using uaa token fetcher") return tokenFetcher }
func generateCert(logger *gosteno.Logger) { // see: http://golang.org/src/pkg/crypto/tls/generate_cert.go host := "localhost" validFrom := "Jan 1 15:04:05 2011" validFor := 10 * 365 * 24 * time.Hour isCA := true rsaBits := 1024 if len(host) == 0 { logger.Fatalf("Missing required --host parameter") } priv, err := rsa.GenerateKey(rand.Reader, rsaBits) if err != nil { logger.Fatalf("failed to generate private key: %s", err) panic(err) } var notBefore time.Time if len(validFrom) == 0 { notBefore = time.Now() } else { notBefore, err = time.Parse("Jan 2 15:04:05 2006", validFrom) if err != nil { logger.Fatalf("Failed to parse creation date: %s\n", err) panic(err) } } notAfter := notBefore.Add(validFor) // end of ASN.1 time endOfTime := time.Date(2049, 12, 31, 23, 59, 59, 0, time.UTC) if notAfter.After(endOfTime) { notAfter = endOfTime } template := x509.Certificate{ SerialNumber: new(big.Int).SetInt64(0), Subject: pkix.Name{ Organization: []string{"Loggregator TrafficController TEST"}, }, NotBefore: notBefore, NotAfter: notAfter, KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, BasicConstraintsValid: true, } hosts := strings.Split(host, ",") for _, h := range hosts { if ip := net.ParseIP(h); ip != nil { template.IPAddresses = append(template.IPAddresses, ip) } else { template.DNSNames = append(template.DNSNames, h) } } if isCA { template.IsCA = true template.KeyUsage |= x509.KeyUsageCertSign } derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv) if err != nil { logger.Fatalf("Failed to create certificate: %s", err) panic(err) } certOut, err := os.Create("cert.pem") if err != nil { logger.Fatalf("failed to open cert.pem for writing: %s", err) panic(err) } pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) certOut.Close() logger.Info("written cert.pem\n") keyOut, err := os.OpenFile("key.pem", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) if err != nil { logger.Fatalf("failed to open key.pem for writing: %s", err) panic(err) } pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv)}) keyOut.Close() logger.Info("written key.pem\n") }