You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by ro...@apache.org on 2018/05/17 22:41:37 UTC

[incubator-trafficcontrol] 18/19: change config error handling so all are logged and add default ldap timeout

This is an automated email from the ASF dual-hosted git repository.

rob pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-trafficcontrol.git

commit 7e4d4ec2bb4268ff3609be1bb2f9d99399f8aeca
Author: Dylan Volz <Dy...@comcast.com>
AuthorDate: Tue May 15 09:16:14 2018 -0600

    change config error handling so all are logged and add default ldap timeout
---
 traffic_ops/traffic_ops_golang/config/config.go    | 44 +++++++++++++++-------
 .../traffic_ops_golang/traffic_ops_golang.go       | 26 +++++++------
 2 files changed, 44 insertions(+), 26 deletions(-)

diff --git a/traffic_ops/traffic_ops_golang/config/config.go b/traffic_ops/traffic_ops_golang/config/config.go
index 64d7a34..d85d20c 100644
--- a/traffic_ops/traffic_ops_golang/config/config.go
+++ b/traffic_ops/traffic_ops_golang/config/config.go
@@ -28,6 +28,8 @@ import (
 	"github.com/apache/incubator-trafficcontrol/lib/go-log"
 	"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/riaksvc"
 	"github.com/basho/riak-go-client"
+	"path/filepath"
+	"os"
 )
 
 // Config reflects the structure of the cdn.conf file
@@ -97,6 +99,8 @@ type ConfigLDAP struct {
 	LDAPTimeoutSecs int    `json:"ldap_timeout_secs"`
 }
 
+const DefaultLDAPTimeoutSecs = 60
+
 // ErrorLog - critical messages
 func (c Config) ErrorLog() log.LogLocation {
 	return log.LogLocation(c.LogLocationError)
@@ -120,53 +124,66 @@ func (c Config) EventLog() log.LogLocation {
 	return log.LogLocation(c.LogLocationEvent)
 }
 
+const BlockStartup = true
+const AllowStartup = false
 // LoadConfig - reads the config file into the Config struct
 
-func LoadConfig(cdnConfPath string, dbConfPath string, riakConfPath string, appVersion string) (Config, error) {
+func LoadConfig(cdnConfPath string, dbConfPath string, riakConfPath string, appVersion string) (Config, []error, bool) {
 	// load json from cdn.conf
 	confBytes, err := ioutil.ReadFile(cdnConfPath)
 	if err != nil {
-		return Config{}, fmt.Errorf("reading CDN conf '%s': %v", cdnConfPath, err)
+		return Config{}, []error{fmt.Errorf("reading CDN conf '%s': %v", cdnConfPath, err)}, BlockStartup
 	}
 
 	cfg := Config{Version: appVersion}
 	err = json.Unmarshal(confBytes, &cfg)
 	if err != nil {
-		return Config{}, fmt.Errorf("unmarshalling '%s': %v", cdnConfPath, err)
+		return Config{}, []error{fmt.Errorf("unmarshalling '%s': %v", cdnConfPath, err)}, BlockStartup
 	}
 
 	// load json from database.conf
 	dbConfBytes, err := ioutil.ReadFile(dbConfPath)
 	if err != nil {
-		return Config{}, fmt.Errorf("reading db conf '%s': %v", dbConfPath, err)
+		return Config{}, []error{fmt.Errorf("reading db conf '%s': %v", dbConfPath, err)}, BlockStartup
 	}
 	err = json.Unmarshal(dbConfBytes, &cfg.DB)
 	if err != nil {
-		return Config{}, fmt.Errorf("unmarshalling '%s': %v", dbConfPath, err)
+		return Config{}, []error{fmt.Errorf("unmarshalling '%s': %v", dbConfPath, err)}, BlockStartup
 	}
 	cfg, err = ParseConfig(cfg)
 	if err != nil {
-		return Config{}, fmt.Errorf("parsing config '%s': %v", dbConfPath, err)
+		return Config{}, []error{fmt.Errorf("parsing config '%s': %v", dbConfPath, err)}, BlockStartup
 	}
 
 	if riakConfPath != "" {
 		cfg.RiakEnabled, cfg.RiakAuthOptions, err = riaksvc.GetRiakConfig(riakConfPath)
 		if err != nil {
-			return Config{}, fmt.Errorf("parsing config '%s': %v", riakConfPath, err)
+			return Config{}, []error{fmt.Errorf("parsing config '%s': %v", riakConfPath, err)}, BlockStartup
 		}
 	}
-
+	// check for and load ldap.conf
 	if cfg.LDAPConfPath != "" {
 		cfg.LDAPEnabled, cfg.ConfigLDAP, err = GetLDAPConfig(cfg.LDAPConfPath)
 		if err != nil {
 			cfg.LDAPEnabled = false
-			return cfg, fmt.Errorf("parsing ldap config '%s': %v", cfg.LDAPConfPath, err)
+			return cfg, []error{fmt.Errorf("parsing ldap config '%s': %v", cfg.LDAPConfPath, err)}, BlockStartup
+		}
+	} else { // ldap config location not specified in cdn.conf, check in directory with cdn.conf for backwards compatibility with perl.
+		confDir := filepath.Dir(cdnConfPath)
+		genericLDAPConfPath := filepath.Join(confDir,"cdn.conf")
+		if _, err := os.Stat(genericLDAPConfPath); !os.IsNotExist(err) { // ldap.conf exists and we should error if it is not readable/parseable.
+			cfg.LDAPEnabled, cfg.ConfigLDAP, err = GetLDAPConfig(genericLDAPConfPath)
+			if err != nil { // no config or unparseable, do not enable LDAP
+				cfg.LDAPEnabled = false
+				return cfg, []error{err}, BlockStartup
+			}
+		} else {
+			cfg.LDAPEnabled = false
+			return cfg, []error{}, AllowStartup // no ldap.conf, disable and allow startup
 		}
-	} else {
-		cfg.LDAPEnabled = false
 	}
 
-	return cfg, err
+	return cfg, []error{}, AllowStartup
 }
 
 // GetCertPath - extracts path to cert .cert file
@@ -254,7 +271,6 @@ func ParseConfig(cfg Config) (Config, error) {
 func GetLDAPConfig(LDAPConfPath string) (bool, *ConfigLDAP, error) {
 	LDAPConfBytes, err := ioutil.ReadFile(LDAPConfPath)
 	if err != nil {
-
 		return false, nil, fmt.Errorf("reading LDAP conf '%v': %v", LDAPConfPath, err)
 	}
 	LDAPconf, err := getLDAPConf(string(LDAPConfBytes))
@@ -265,7 +281,7 @@ func GetLDAPConfig(LDAPConfPath string) (bool, *ConfigLDAP, error) {
 }
 
 func getLDAPConf(s string) (*ConfigLDAP, error) {
-	ldapConf := ConfigLDAP{}
+	ldapConf := ConfigLDAP{LDAPTimeoutSecs: DefaultLDAPTimeoutSecs} //if the field is not set in the config we use the default instead of 0
 	err := json.Unmarshal([]byte(s), &ldapConf)
 	return &ldapConf, err
 }
diff --git a/traffic_ops/traffic_ops_golang/traffic_ops_golang.go b/traffic_ops/traffic_ops_golang/traffic_ops_golang.go
index 9de1055..782e991 100644
--- a/traffic_ops/traffic_ops_golang/traffic_ops_golang.go
+++ b/traffic_ops/traffic_ops_golang/traffic_ops_golang.go
@@ -25,7 +25,6 @@ import (
 	"fmt"
 	"net/http"
 	"os"
-	"strings"
 	"time"
 
 	"github.com/apache/incubator-trafficcontrol/lib/go-log"
@@ -59,23 +58,25 @@ func main() {
 		os.Exit(1)
 	}
 
-	var cfg config.Config
-	var err error
-	var errorToLog error
-
-	if cfg, err = config.LoadConfig(*configFileName, *dbConfigFileName, *riakConfigFileName, version); err != nil {
-		if !strings.Contains(err.Error(), "riak conf") {
-			fmt.Println("Error loading config: " + err.Error())
-			return
+	cfg, errsToLog, blockStart := config.LoadConfig(*configFileName, *dbConfigFileName, *riakConfigFileName, version)
+	if blockStart {
+		for _, err := range errsToLog {
+			fmt.Println(err)
 		}
-		errorToLog = err
+		os.Exit(1)
 	}
 
+
 	if err := log.InitCfg(cfg); err != nil {
 		fmt.Printf("Error initializing loggers: %v\n", err)
+		for _, err := range errsToLog {
+			fmt.Println(err)
+		}
 		return
 	}
-	log.Warnln(errorToLog)
+	for _, err := range errsToLog {
+		log.Warnln(err)
+	}
 
 	log.Infof(`Using Config values:
 		Port:                 %s
@@ -100,7 +101,8 @@ func main() {
 		Warn Log:             %s
 		Info Log:             %s
 		Debug Log:            %s
-		Event Log:            %s`, cfg.Port, cfg.DB.Hostname, cfg.DB.User, cfg.DB.DBName, cfg.DB.SSL, cfg.MaxDBConnections, cfg.Listen[0], cfg.Insecure, cfg.CertPath, cfg.KeyPath, time.Duration(cfg.ProxyTimeout)*time.Second, time.Duration(cfg.ProxyKeepAlive)*time.Second, time.Duration(cfg.ProxyTLSTimeout)*time.Second, time.Duration(cfg.ProxyReadHeaderTimeout)*time.Second, time.Duration(cfg.ReadTimeout)*time.Second, time.Duration(cfg.ReadHeaderTimeout)*time.Second, time.Duration(cfg.WriteTimeou [...]
+		Event Log:            %s
+		LDAP Enabled:         %v`, cfg.Port, cfg.DB.Hostname, cfg.DB.User, cfg.DB.DBName, cfg.DB.SSL, cfg.MaxDBConnections, cfg.Listen[0], cfg.Insecure, cfg.CertPath, cfg.KeyPath, time.Duration(cfg.ProxyTimeout)*time.Second, time.Duration(cfg.ProxyKeepAlive)*time.Second, time.Duration(cfg.ProxyTLSTimeout)*time.Second, time.Duration(cfg.ProxyReadHeaderTimeout)*time.Second, time.Duration(cfg.ReadTimeout)*time.Second, time.Duration(cfg.ReadHeaderTimeout)*time.Second, time.Duration(cfg.WriteTimeou [...]
 
 	sslStr := "require"
 	if !cfg.DB.SSL {

-- 
To stop receiving notification emails like this one, please contact
rob@apache.org.