forked from TykTechnologies/tyk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
config_utils.go
122 lines (106 loc) · 3.66 KB
/
config_utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package main
import (
"encoding/json"
"github.com/kelseyhightower/envconfig"
"github.com/nu7hatch/gouuid"
"io/ioutil"
"net"
"net/http"
"strings"
"time"
)
const ENV_PREVIX string = "TYK_GW"
// WriteDefaultConf will create a default configuration file and set the storage type to "memory"
func WriteDefaultConf(configStruct *Config) {
configStruct.ListenAddress = ""
configStruct.ListenPort = 8080
configStruct.Secret = "352d20ee67be67f6340b4c0605b044b7"
configStruct.TemplatePath = "./templates"
configStruct.TykJSPath = "./js/tyk.js"
configStruct.MiddlewarePath = "./middleware"
configStruct.Storage.Type = "redis"
configStruct.AppPath = "./apps/"
configStruct.Storage.Host = "localhost"
configStruct.Storage.Username = ""
configStruct.Storage.Password = ""
configStruct.Storage.Database = 0
configStruct.Storage.MaxIdle = 100
configStruct.Storage.Port = 6379
configStruct.EnableAnalytics = false
configStruct.HealthCheck.EnableHealthChecks = true
configStruct.HealthCheck.HealthCheckValueTimeout = 60
configStruct.AnalyticsConfig.IgnoredIPs = make([]string, 0)
configStruct.UseAsyncSessionWrite = false
configStruct.HideGeneratorHeader = false
configStruct.OauthRedirectUriSeparator = ""
newConfig, err := json.MarshalIndent(configStruct, "", " ")
overrideErr := envconfig.Process(ENV_PREVIX, &configStruct)
if overrideErr != nil {
log.Error("Failed to process environment variables: ", overrideErr)
}
if err != nil {
log.Error("Problem marshalling default configuration!")
log.Error(err)
} else {
ioutil.WriteFile("tyk.conf", newConfig, 0644)
}
}
// LoadConfig will load the configuration file from filePath, if it can't open
// the file for reading, it assumes there is no configuration file and will try to create
// one on the default path (tyk.conf in the local directory)
func loadConfig(filePath string, configStruct *Config) {
configuration, err := ioutil.ReadFile(filePath)
if err != nil {
log.Error("Couldn't load configuration file")
log.Error(err)
log.Info("Writing a default file to ./tyk.conf")
WriteDefaultConf(configStruct)
log.Info("Loading default configuration...")
loadConfig("tyk.conf", configStruct)
} else {
err := json.Unmarshal(configuration, &configStruct)
if err != nil {
log.Error("Couldn't unmarshal configuration")
log.Error(err)
}
overrideErr := envconfig.Process(ENV_PREVIX, configStruct)
if overrideErr != nil {
log.Error("Failed to process environment variables after file load: ", overrideErr)
}
}
if configStruct.SlaveOptions.CallTimeout == 0 {
configStruct.SlaveOptions.CallTimeout = 30
}
if configStruct.SlaveOptions.PingTimeout == 0 {
configStruct.SlaveOptions.PingTimeout = 60
}
GlobalRPCPingTimeout = time.Second * time.Duration(configStruct.SlaveOptions.PingTimeout)
GlobalRPCCallTimeout = time.Second * time.Duration(configStruct.SlaveOptions.CallTimeout)
configStruct.EventTriggers = InitGenericEventHandlers(configStruct.EventHandlers)
}
func (c *Config) loadIgnoredIPs() {
c.AnalyticsConfig.ignoredIPsCompiled = make(map[string]bool, len(c.AnalyticsConfig.IgnoredIPs))
for _, ip := range c.AnalyticsConfig.IgnoredIPs {
c.AnalyticsConfig.ignoredIPsCompiled[ip] = true
}
}
func (c *Config) TestShowIPs() {
log.Warning(c.AnalyticsConfig.ignoredIPsCompiled)
}
func (c Config) StoreAnalytics(r *http.Request) bool {
if !c.EnableAnalytics {
return false
}
ip, _, _ := net.SplitHostPort(r.RemoteAddr)
forwarded := r.Header.Get("X-FORWARDED-FOR")
if forwarded != "" {
ips := strings.Split(forwarded, ", ")
ip = ips[0]
}
_, ignore := c.AnalyticsConfig.ignoredIPsCompiled[ip]
return !ignore
}
func generateRandomNodeID() string {
u, _ := uuid.NewV4()
return "solo-" + u.String()
}