config.go 13.2 KB
Newer Older
A
astaxie 已提交
1
// Copyright 2014 beego Author. All Rights Reserved.
A
astaxie 已提交
2
//
A
astaxie 已提交
3 4 5
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
A
astaxie 已提交
6
//
A
astaxie 已提交
7
//      http://www.apache.org/licenses/LICENSE-2.0
A
astaxie 已提交
8
//
A
astaxie 已提交
9 10 11 12 13 14
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

15 16 17 18 19
package beego

import (
	"html/template"
	"os"
20
	"path/filepath"
21
	"strings"
P
Pengfei Xue 已提交
22 23 24

	"github.com/astaxie/beego/config"
	"github.com/astaxie/beego/session"
25
	"github.com/astaxie/beego/utils"
26 27
)

A
astaxie 已提交
28 29 30
type BeegoConfig struct {
	AppName             string //Application name
	RunMode             string //Running Mode: dev | prod
31
	RouterCaseSensitive bool
A
astaxie 已提交
32 33 34 35 36 37 38 39 40
	ServerName          string
	RecoverPanic        bool
	CopyRequestBody     bool
	EnableGzip          bool
	MaxMemory           int64
	EnableErrorsShow    bool
	Listen              Listen
	WebConfig           WebConfig
	Log                 LogConfig
A
astaxie 已提交
41 42
}

A
astaxie 已提交
43 44 45 46
type Listen struct {
	Graceful      bool // Graceful means use graceful module to start the server
	ServerTimeOut int64
	ListenTCP4    bool
A
astaxie 已提交
47
	EnableHTTP    bool
A
astaxie 已提交
48 49
	HTTPAddr      string
	HTTPPort      int
A
astaxie 已提交
50
	EnableHTTPS   bool
A
astaxie 已提交
51 52 53 54
	HTTPSAddr     string
	HTTPSPort     int
	HTTPSCertFile string
	HTTPSKeyFile  string
A
astaxie 已提交
55
	EnableAdmin   bool
A
astaxie 已提交
56 57 58 59
	AdminAddr     string
	AdminPort     int
	EnableFcgi    bool
	EnableStdIo   bool // EnableStdIo works with EnableFcgi Use FCGI via standard I/O
A
astaxie 已提交
60 61
}

A
astaxie 已提交
62 63 64 65
type WebConfig struct {
	AutoRender             bool
	EnableDocs             bool
	FlashName              string
J
JessonChan 已提交
66
	FlashSeparator         string
A
astaxie 已提交
67 68 69 70 71 72 73
	DirectoryIndex         bool
	StaticDir              map[string]string
	StaticExtensionsToGzip []string
	TemplateLeft           string
	TemplateRight          string
	ViewsPath              string
	EnableXSRF             bool
J
JessonChan 已提交
74
	XSRFKey                string
A
astaxie 已提交
75 76
	XSRFExpire             int
	Session                SessionConfig
A
astaxie 已提交
77 78
}

A
astaxie 已提交
79 80 81 82 83 84 85 86 87
type SessionConfig struct {
	SessionOn             bool
	SessionProvider       string
	SessionName           string
	SessionGCMaxLifetime  int64
	SessionProviderConfig string
	SessionCookieLifeTime int
	SessionAutoSetCookie  bool
	SessionDomain         string
A
astaxie 已提交
88 89
}

A
astaxie 已提交
90 91 92
type LogConfig struct {
	AccessLogs  bool
	FileLineNum bool
A
astaxie 已提交
93
	Outputs     map[string]string // Store Adaptor : config
A
astaxie 已提交
94 95
}

A
astaxie 已提交
96 97 98 99 100 101 102 103 104 105 106 107 108 109
var (
	// BConfig is the default config for Application
	BConfig *BeegoConfig
	// AppConfig is the instance of Config, store the config information from file
	AppConfig *beegoAppConfig
	// AppConfigPath is the path to the config files
	AppConfigPath string
	// AppConfigProvider is the provider for the config, default is ini
	AppConfigProvider = "ini"
	// TemplateCache stores template caching
	TemplateCache map[string]*template.Template
	// GlobalSessions is the instance for the session manager
	GlobalSessions *session.Manager
)
A
astaxie 已提交
110

A
astaxie 已提交
111 112 113
func init() {
	BConfig = &BeegoConfig{
		AppName:             "beego",
114
		RunMode:             DEV,
A
astaxie 已提交
115 116 117 118 119 120 121 122 123 124 125
		RouterCaseSensitive: true,
		ServerName:          "beegoServer:" + VERSION,
		RecoverPanic:        true,
		CopyRequestBody:     false,
		EnableGzip:          false,
		MaxMemory:           1 << 26, //64MB
		EnableErrorsShow:    true,
		Listen: Listen{
			Graceful:      false,
			ServerTimeOut: 0,
			ListenTCP4:    false,
A
astaxie 已提交
126
			EnableHTTP:    true,
A
astaxie 已提交
127 128
			HTTPAddr:      "",
			HTTPPort:      8080,
A
astaxie 已提交
129
			EnableHTTPS:   false,
A
astaxie 已提交
130 131 132 133
			HTTPSAddr:     "",
			HTTPSPort:     10443,
			HTTPSCertFile: "",
			HTTPSKeyFile:  "",
A
astaxie 已提交
134
			EnableAdmin:   false,
A
astaxie 已提交
135 136 137 138 139 140 141 142 143
			AdminAddr:     "",
			AdminPort:     8088,
			EnableFcgi:    false,
			EnableStdIo:   false,
		},
		WebConfig: WebConfig{
			AutoRender:             true,
			EnableDocs:             false,
			FlashName:              "BEEGO_FLASH",
J
JessonChan 已提交
144
			FlashSeparator:         "BEEGOFLASH",
A
astaxie 已提交
145 146 147 148 149 150 151
			DirectoryIndex:         false,
			StaticDir:              map[string]string{"/static": "static"},
			StaticExtensionsToGzip: []string{".css", ".js"},
			TemplateLeft:           "{{",
			TemplateRight:          "}}",
			ViewsPath:              "views",
			EnableXSRF:             false,
J
JessonChan 已提交
152
			XSRFKey:                "beegoxsrf",
A
astaxie 已提交
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
			XSRFExpire:             0,
			Session: SessionConfig{
				SessionOn:             false,
				SessionProvider:       "memory",
				SessionName:           "beegosessionID",
				SessionGCMaxLifetime:  3600,
				SessionProviderConfig: "",
				SessionCookieLifeTime: 0, //set cookie default is the brower life
				SessionAutoSetCookie:  true,
				SessionDomain:         "",
			},
		},
		Log: LogConfig{
			AccessLogs:  false,
			FileLineNum: true,
A
astaxie 已提交
168
			Outputs:     map[string]string{"console": ""},
A
astaxie 已提交
169
		},
A
astaxie 已提交
170
	}
A
astaxie 已提交
171
	ParseConfig()
A
astaxie 已提交
172 173
}

A
astaxie 已提交
174 175 176 177 178 179
// ParseConfig parsed default config file.
// now only support ini, next will support json.
func ParseConfig() (err error) {
	if AppConfigPath == "" {
		if utils.FileExists(filepath.Join("conf", "app.conf")) {
			AppConfigPath = filepath.Join("conf", "app.conf")
180
		} else {
F
fuxiaohei 已提交
181
			AppConfig = &beegoAppConfig{config.NewFakeConfig()}
A
astaxie 已提交
182
			return
R
Ryan A. Chapman 已提交
183
		}
P
Pengfei Xue 已提交
184
	}
A
astaxie 已提交
185 186 187 188
	AppConfig, err = newAppConfig(AppConfigProvider, AppConfigPath)
	if err != nil {
		return err
	}
A
astaxie 已提交
189
	// set the runmode first
F
fuxiaohei 已提交
190
	if envRunMode := os.Getenv("BEEGO_RUNMODE"); envRunMode != "" {
A
astaxie 已提交
191
		BConfig.RunMode = envRunMode
192
	} else if runmode := AppConfig.String("RunMode"); runmode != "" {
A
astaxie 已提交
193
		BConfig.RunMode = runmode
A
astaxie 已提交
194
	}
195

A
astaxie 已提交
196 197 198
	BConfig.AppName = AppConfig.DefaultString("AppName", BConfig.AppName)
	BConfig.RecoverPanic = AppConfig.DefaultBool("RecoverPanic", BConfig.RecoverPanic)
	BConfig.RouterCaseSensitive = AppConfig.DefaultBool("RouterCaseSensitive", BConfig.RouterCaseSensitive)
A
astaxie 已提交
199
	BConfig.ServerName = AppConfig.DefaultString("ServerName", BConfig.ServerName)
A
astaxie 已提交
200 201 202 203 204
	BConfig.EnableGzip = AppConfig.DefaultBool("EnableGzip", BConfig.EnableGzip)
	BConfig.EnableErrorsShow = AppConfig.DefaultBool("EnableErrorsShow", BConfig.EnableErrorsShow)
	BConfig.CopyRequestBody = AppConfig.DefaultBool("CopyRequestBody", BConfig.CopyRequestBody)
	BConfig.MaxMemory = AppConfig.DefaultInt64("MaxMemory", BConfig.MaxMemory)
	BConfig.Listen.Graceful = AppConfig.DefaultBool("Graceful", BConfig.Listen.Graceful)
A
astaxie 已提交
205
	BConfig.Listen.HTTPAddr = AppConfig.String("HTTPAddr")
A
astaxie 已提交
206 207
	BConfig.Listen.HTTPPort = AppConfig.DefaultInt("HTTPPort", BConfig.Listen.HTTPPort)
	BConfig.Listen.ListenTCP4 = AppConfig.DefaultBool("ListenTCP4", BConfig.Listen.ListenTCP4)
A
astaxie 已提交
208 209
	BConfig.Listen.EnableHTTP = AppConfig.DefaultBool("EnableHTTP", BConfig.Listen.EnableHTTP)
	BConfig.Listen.EnableHTTPS = AppConfig.DefaultBool("EnableHTTPS", BConfig.Listen.EnableHTTPS)
A
astaxie 已提交
210
	BConfig.Listen.HTTPSAddr = AppConfig.DefaultString("HTTPSAddr", BConfig.Listen.HTTPSAddr)
A
astaxie 已提交
211
	BConfig.Listen.HTTPSPort = AppConfig.DefaultInt("HTTPSPort", BConfig.Listen.HTTPSPort)
A
astaxie 已提交
212 213 214 215 216
	BConfig.Listen.HTTPSCertFile = AppConfig.DefaultString("HTTPSCertFile", BConfig.Listen.HTTPSCertFile)
	BConfig.Listen.HTTPSKeyFile = AppConfig.DefaultString("HTTPSKeyFile", BConfig.Listen.HTTPSKeyFile)
	BConfig.Listen.EnableAdmin = AppConfig.DefaultBool("EnableAdmin", BConfig.Listen.EnableAdmin)
	BConfig.Listen.AdminAddr = AppConfig.DefaultString("AdminAddr", BConfig.Listen.AdminAddr)
	BConfig.Listen.AdminPort = AppConfig.DefaultInt("AdminPort", BConfig.Listen.AdminPort)
A
astaxie 已提交
217
	BConfig.Listen.EnableFcgi = AppConfig.DefaultBool("EnableFcgi", BConfig.Listen.EnableFcgi)
A
astaxie 已提交
218
	BConfig.Listen.EnableStdIo = AppConfig.DefaultBool("EnableStdIo", BConfig.Listen.EnableStdIo)
A
astaxie 已提交
219
	BConfig.Listen.ServerTimeOut = AppConfig.DefaultInt64("ServerTimeOut", BConfig.Listen.ServerTimeOut)
A
astaxie 已提交
220 221 222
	BConfig.WebConfig.AutoRender = AppConfig.DefaultBool("AutoRender", BConfig.WebConfig.AutoRender)
	BConfig.WebConfig.ViewsPath = AppConfig.DefaultString("ViewsPath", BConfig.WebConfig.ViewsPath)
	BConfig.WebConfig.DirectoryIndex = AppConfig.DefaultBool("DirectoryIndex", BConfig.WebConfig.DirectoryIndex)
A
astaxie 已提交
223
	BConfig.WebConfig.FlashName = AppConfig.DefaultString("FlashName", BConfig.WebConfig.FlashName)
J
JessonChan 已提交
224
	BConfig.WebConfig.FlashSeparator = AppConfig.DefaultString("FlashSeparator", BConfig.WebConfig.FlashSeparator)
A
astaxie 已提交
225
	BConfig.WebConfig.EnableDocs = AppConfig.DefaultBool("EnableDocs", BConfig.WebConfig.EnableDocs)
J
JessonChan 已提交
226
	BConfig.WebConfig.XSRFKey = AppConfig.DefaultString("XSRFKEY", BConfig.WebConfig.XSRFKey)
A
astaxie 已提交
227 228 229 230 231 232 233 234 235 236
	BConfig.WebConfig.EnableXSRF = AppConfig.DefaultBool("EnableXSRF", BConfig.WebConfig.EnableXSRF)
	BConfig.WebConfig.XSRFExpire = AppConfig.DefaultInt("XSRFExpire", BConfig.WebConfig.XSRFExpire)
	BConfig.WebConfig.TemplateLeft = AppConfig.DefaultString("TemplateLeft", BConfig.WebConfig.TemplateLeft)
	BConfig.WebConfig.TemplateRight = AppConfig.DefaultString("TemplateRight", BConfig.WebConfig.TemplateRight)
	BConfig.WebConfig.Session.SessionOn = AppConfig.DefaultBool("SessionOn", BConfig.WebConfig.Session.SessionOn)
	BConfig.WebConfig.Session.SessionProvider = AppConfig.DefaultString("SessionProvider", BConfig.WebConfig.Session.SessionProvider)
	BConfig.WebConfig.Session.SessionName = AppConfig.DefaultString("SessionName", BConfig.WebConfig.Session.SessionName)
	BConfig.WebConfig.Session.SessionProviderConfig = AppConfig.DefaultString("SessionProviderConfig", BConfig.WebConfig.Session.SessionProviderConfig)
	BConfig.WebConfig.Session.SessionGCMaxLifetime = AppConfig.DefaultInt64("SessionGCMaxLifetime", BConfig.WebConfig.Session.SessionGCMaxLifetime)
	BConfig.WebConfig.Session.SessionCookieLifeTime = AppConfig.DefaultInt("SessionCookieLifeTime", BConfig.WebConfig.Session.SessionCookieLifeTime)
A
astaxie 已提交
237 238
	BConfig.WebConfig.Session.SessionAutoSetCookie = AppConfig.DefaultBool("SessionAutoSetCookie", BConfig.WebConfig.Session.SessionAutoSetCookie)
	BConfig.WebConfig.Session.SessionDomain = AppConfig.DefaultString("SessionDomain", BConfig.WebConfig.Session.SessionDomain)
A
astaxie 已提交
239

A
astaxie 已提交
240
	if sd := AppConfig.String("StaticDir"); sd != "" {
A
astaxie 已提交
241 242
		for k := range BConfig.WebConfig.StaticDir {
			delete(BConfig.WebConfig.StaticDir, k)
A
astaxie 已提交
243 244 245 246
		}
		sds := strings.Fields(sd)
		for _, v := range sds {
			if url2fsmap := strings.SplitN(v, ":", 2); len(url2fsmap) == 2 {
A
astaxie 已提交
247
				BConfig.WebConfig.StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[1]
A
astaxie 已提交
248
			} else {
A
astaxie 已提交
249
				BConfig.WebConfig.StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[0]
250 251
			}
		}
A
astaxie 已提交
252
	}
253

A
astaxie 已提交
254 255
	if sgz := AppConfig.String("StaticExtensionsToGzip"); sgz != "" {
		extensions := strings.Split(sgz, ",")
J
JessonChan 已提交
256
		fileExts := []string{}
J
JessonChan 已提交
257 258 259 260
		for _, ext := range extensions {
			ext = strings.TrimSpace(ext)
			if ext == "" {
				continue
F
Francois 已提交
261
			}
J
JessonChan 已提交
262 263 264
			if !strings.HasPrefix(ext, ".") {
				ext = "." + ext
			}
J
JessonChan 已提交
265 266 267
			fileExts = append(fileExts, ext)
		}
		if len(fileExts) > 0 {
A
astaxie 已提交
268
			BConfig.WebConfig.StaticExtensionsToGzip = fileExts
F
Francois 已提交
269
		}
A
astaxie 已提交
270 271
	}
	return nil
272
}
A
astaxie 已提交
273 274 275 276 277 278 279 280 281 282

type beegoAppConfig struct {
	innerConfig config.Configer
}

func newAppConfig(AppConfigProvider, AppConfigPath string) (*beegoAppConfig, error) {
	ac, err := config.NewConfig(AppConfigProvider, AppConfigPath)
	if err != nil {
		return nil, err
	}
F
fuxiaohei 已提交
283
	return &beegoAppConfig{ac}, nil
A
astaxie 已提交
284 285 286
}

func (b *beegoAppConfig) Set(key, val string) error {
F
fuxiaohei 已提交
287
	if err := b.innerConfig.Set(BConfig.RunMode+"::"+key, val); err != nil {
A
astaxie 已提交
288 289 290 291 292 293
		return err
	}
	return b.innerConfig.Set(key, val)
}

func (b *beegoAppConfig) String(key string) string {
F
fuxiaohei 已提交
294 295
	if v := b.innerConfig.String(BConfig.RunMode + "::" + key); v != "" {
		return v
A
astaxie 已提交
296
	}
F
fuxiaohei 已提交
297
	return b.innerConfig.String(key)
A
astaxie 已提交
298 299 300
}

func (b *beegoAppConfig) Strings(key string) []string {
F
fuxiaohei 已提交
301
	if v := b.innerConfig.Strings(BConfig.RunMode + "::" + key); v[0] != "" {
F
fud 已提交
302
		return v
A
astaxie 已提交
303
	}
F
fuxiaohei 已提交
304
	return b.innerConfig.Strings(key)
A
astaxie 已提交
305 306 307
}

func (b *beegoAppConfig) Int(key string) (int, error) {
F
fuxiaohei 已提交
308 309
	if v, err := b.innerConfig.Int(BConfig.RunMode + "::" + key); err == nil {
		return v, nil
A
astaxie 已提交
310
	}
F
fuxiaohei 已提交
311
	return b.innerConfig.Int(key)
A
astaxie 已提交
312 313 314
}

func (b *beegoAppConfig) Int64(key string) (int64, error) {
F
fuxiaohei 已提交
315 316
	if v, err := b.innerConfig.Int64(BConfig.RunMode + "::" + key); err == nil {
		return v, nil
A
astaxie 已提交
317
	}
F
fuxiaohei 已提交
318
	return b.innerConfig.Int64(key)
A
astaxie 已提交
319 320 321
}

func (b *beegoAppConfig) Bool(key string) (bool, error) {
F
fuxiaohei 已提交
322 323
	if v, err := b.innerConfig.Bool(BConfig.RunMode + "::" + key); err == nil {
		return v, nil
A
astaxie 已提交
324
	}
F
fuxiaohei 已提交
325
	return b.innerConfig.Bool(key)
A
astaxie 已提交
326 327 328
}

func (b *beegoAppConfig) Float(key string) (float64, error) {
F
fuxiaohei 已提交
329 330
	if v, err := b.innerConfig.Float(BConfig.RunMode + "::" + key); err == nil {
		return v, nil
A
astaxie 已提交
331
	}
F
fuxiaohei 已提交
332
	return b.innerConfig.Float(key)
A
astaxie 已提交
333 334 335
}

func (b *beegoAppConfig) DefaultString(key string, defaultval string) string {
F
fuxiaohei 已提交
336
	if v := b.String(key); v != "" {
A
astaxie 已提交
337 338 339 340 341 342
		return v
	}
	return defaultval
}

func (b *beegoAppConfig) DefaultStrings(key string, defaultval []string) []string {
F
fuxiaohei 已提交
343
	if v := b.Strings(key); len(v) != 0 {
A
astaxie 已提交
344 345 346 347 348 349
		return v
	}
	return defaultval
}

func (b *beegoAppConfig) DefaultInt(key string, defaultval int) int {
F
fuxiaohei 已提交
350
	if v, err := b.Int(key); err == nil {
A
astaxie 已提交
351 352 353 354 355 356
		return v
	}
	return defaultval
}

func (b *beegoAppConfig) DefaultInt64(key string, defaultval int64) int64 {
F
fuxiaohei 已提交
357
	if v, err := b.Int64(key); err == nil {
A
astaxie 已提交
358 359 360 361 362 363
		return v
	}
	return defaultval
}

func (b *beegoAppConfig) DefaultBool(key string, defaultval bool) bool {
F
fuxiaohei 已提交
364
	if v, err := b.Bool(key); err == nil {
A
astaxie 已提交
365 366 367 368 369 370
		return v
	}
	return defaultval
}

func (b *beegoAppConfig) DefaultFloat(key string, defaultval float64) float64 {
F
fuxiaohei 已提交
371
	if v, err := b.Float(key); err == nil {
A
astaxie 已提交
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387
		return v
	}
	return defaultval
}

func (b *beegoAppConfig) DIY(key string) (interface{}, error) {
	return b.innerConfig.DIY(key)
}

func (b *beegoAppConfig) GetSection(section string) (map[string]string, error) {
	return b.innerConfig.GetSection(section)
}

func (b *beegoAppConfig) SaveConfigFile(filename string) error {
	return b.innerConfig.SaveConfigFile(filename)
}