1
0
mirror of https://github.com/astaxie/beego.git synced 2024-06-01 23:33:27 +00:00
Beego/config.go

512 lines
13 KiB
Go
Raw Normal View History

2014-08-18 08:41:43 +00:00
// Copyright 2014 beego Author. All Rights Reserved.
2014-07-03 15:40:21 +00:00
//
2014-08-18 08:41:43 +00:00
// 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
2014-07-03 15:40:21 +00:00
//
2014-08-18 08:41:43 +00:00
// http://www.apache.org/licenses/LICENSE-2.0
2014-07-03 15:40:21 +00:00
//
2014-08-18 08:41:43 +00:00
// 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.
package beego
import (
"html/template"
"os"
"path/filepath"
"strings"
2013-12-03 11:26:51 +00:00
"github.com/astaxie/beego/config"
"github.com/astaxie/beego/session"
"github.com/astaxie/beego/utils"
)
2015-12-09 15:35:04 +00:00
type BeegoConfig struct {
AppName string //Application name
RunMode string //Running Mode: dev | prod
RouterCaseSensitive bool
2015-12-09 15:35:04 +00:00
ServerName string
RecoverPanic bool
CopyRequestBody bool
EnableGzip bool
MaxMemory int64
EnableErrorsShow bool
Listen Listen
WebConfig WebConfig
Log LogConfig
2014-10-01 14:10:33 +00:00
}
2015-12-09 15:35:04 +00:00
type Listen struct {
Graceful bool // Graceful means use graceful module to start the server
ServerTimeOut int64
ListenTCP4 bool
HTTPEnable bool
HTTPAddr string
HTTPPort int
HTTPSEnable bool
HTTPSAddr string
HTTPSPort int
HTTPSCertFile string
HTTPSKeyFile string
AdminEnable bool
AdminAddr string
AdminPort int
EnableFcgi bool
EnableStdIo bool // EnableStdIo works with EnableFcgi Use FCGI via standard I/O
2014-10-01 14:10:33 +00:00
}
2015-12-09 15:35:04 +00:00
type WebConfig struct {
AutoRender bool
EnableDocs bool
FlashName string
FlashSeperator string
DirectoryIndex bool
StaticDir map[string]string
StaticExtensionsToGzip []string
TemplateLeft string
TemplateRight string
ViewsPath string
EnableXSRF bool
XSRFKEY string
XSRFExpire int
Session SessionConfig
2014-10-01 14:10:33 +00:00
}
2015-12-09 15:35:04 +00:00
type SessionConfig struct {
SessionOn bool
SessionProvider string
SessionName string
SessionGCMaxLifetime int64
SessionProviderConfig string
SessionCookieLifeTime int
SessionAutoSetCookie bool
SessionDomain string
2014-10-01 14:10:33 +00:00
}
2015-12-09 15:35:04 +00:00
type LogConfig struct {
AccessLogs bool
FileLineNum bool
Output map[string]string // Store Adaptor : config
2014-10-01 14:10:33 +00:00
}
2015-12-09 15:35:04 +00:00
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
)
2014-10-01 14:10:33 +00:00
2015-12-09 15:35:04 +00:00
func init() {
BConfig = &BeegoConfig{
AppName: "beego",
RunMode: "dev",
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,
HTTPEnable: true,
HTTPAddr: "",
HTTPPort: 8080,
HTTPSEnable: false,
HTTPSAddr: "",
HTTPSPort: 10443,
HTTPSCertFile: "",
HTTPSKeyFile: "",
AdminEnable: false,
AdminAddr: "",
AdminPort: 8088,
EnableFcgi: false,
EnableStdIo: false,
},
WebConfig: WebConfig{
AutoRender: true,
EnableDocs: false,
FlashName: "BEEGO_FLASH",
FlashSeperator: "BEEGOFLASH",
DirectoryIndex: false,
StaticDir: map[string]string{"/static": "static"},
StaticExtensionsToGzip: []string{".css", ".js"},
TemplateLeft: "{{",
TemplateRight: "}}",
ViewsPath: "views",
EnableXSRF: false,
XSRFKEY: "beegoxsrf",
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,
Output: map[string]string{"console": ""},
},
2015-04-05 15:21:13 +00:00
}
2014-10-01 14:10:33 +00:00
}
2015-12-09 15:35:04 +00:00
// 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")
} else {
ac := config.NewFakeConfig()
AppConfig = &beegoAppConfig{ac}
2015-12-09 15:35:04 +00:00
return
}
2013-12-04 15:53:36 +00:00
}
2014-10-24 11:03:27 +00:00
AppConfig, err = newAppConfig(AppConfigProvider, AppConfigPath)
if err != nil {
return err
}
2014-10-09 13:17:10 +00:00
envRunMode := os.Getenv("BEEGO_RUNMODE")
2014-10-01 14:10:33 +00:00
// set the runmode first
2014-10-09 13:17:10 +00:00
if envRunMode != "" {
2015-12-09 15:35:04 +00:00
BConfig.RunMode = envRunMode
} else if runmode := AppConfig.String("RunMode"); runmode != "" {
2015-12-09 15:35:04 +00:00
BConfig.RunMode = runmode
2014-10-01 14:10:33 +00:00
}
2015-12-09 15:35:04 +00:00
BConfig.Listen.HTTPAddr = AppConfig.String("HTTPAddr")
if v, err := AppConfig.Int("HTTPPort"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.Listen.HTTPPort = v
2014-10-01 14:10:33 +00:00
}
2014-05-20 07:30:17 +00:00
if v, err := AppConfig.Bool("ListenTCP4"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.Listen.ListenTCP4 = v
}
if v, err := AppConfig.Bool("EnableHTTPListen"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.Listen.HTTPEnable = v
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if maxmemory, err := AppConfig.Int64("MaxMemory"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.MaxMemory = maxmemory
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if appname := AppConfig.String("AppName"); appname != "" {
2015-12-09 15:35:04 +00:00
BConfig.AppName = appname
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if autorender, err := AppConfig.Bool("AutoRender"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.AutoRender = autorender
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if autorecover, err := AppConfig.Bool("RecoverPanic"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.RecoverPanic = autorecover
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if views := AppConfig.String("ViewsPath"); views != "" {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.ViewsPath = views
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if sessionon, err := AppConfig.Bool("SessionOn"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.Session.SessionOn = sessionon
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if sessProvider := AppConfig.String("SessionProvider"); sessProvider != "" {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.Session.SessionProvider = sessProvider
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if sessName := AppConfig.String("SessionName"); sessName != "" {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.Session.SessionName = sessName
2014-10-01 14:10:33 +00:00
}
if sessProvConfig := AppConfig.String("SessionProviderConfig"); sessProvConfig != "" {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.Session.SessionProviderConfig = sessProvConfig
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if sessMaxLifeTime, err := AppConfig.Int64("SessionGCMaxLifetime"); err == nil && sessMaxLifeTime != 0 {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.Session.SessionGCMaxLifetime = sessMaxLifeTime
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if sesscookielifetime, err := AppConfig.Int("SessionCookieLifeTime"); err == nil && sesscookielifetime != 0 {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.Session.SessionCookieLifeTime = sesscookielifetime
2014-10-01 14:10:33 +00:00
}
2015-11-03 15:43:34 +00:00
if enableFcgi, err := AppConfig.Bool("EnableFcgi"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.Listen.EnableFcgi = enableFcgi
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if enablegzip, err := AppConfig.Bool("EnableGzip"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.EnableGzip = enablegzip
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if directoryindex, err := AppConfig.Bool("DirectoryIndex"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.DirectoryIndex = directoryindex
2014-10-01 14:10:33 +00:00
}
if timeout, err := AppConfig.Int64("HTTPServerTimeOut"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.Listen.ServerTimeOut = timeout
2014-10-01 14:10:33 +00:00
}
if errorsshow, err := AppConfig.Bool("EnableErrorsShow"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.EnableErrorsShow = errorsshow
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if copyrequestbody, err := AppConfig.Bool("CopyRequestBody"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.CopyRequestBody = copyrequestbody
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if xsrfkey := AppConfig.String("XSRFKEY"); xsrfkey != "" {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.XSRFKEY = xsrfkey
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if enablexsrf, err := AppConfig.Bool("EnableXSRF"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.EnableXSRF = enablexsrf
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if expire, err := AppConfig.Int("XSRFExpire"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.XSRFExpire = expire
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if tplleft := AppConfig.String("TemplateLeft"); tplleft != "" {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.TemplateLeft = tplleft
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if tplright := AppConfig.String("TemplateRight"); tplright != "" {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.TemplateRight = tplright
2014-10-01 14:10:33 +00:00
}
if httptls, err := AppConfig.Bool("EnableHTTPTLS"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.Listen.HTTPSEnable = httptls
2014-10-01 14:10:33 +00:00
}
2014-05-20 07:30:17 +00:00
if httpsport, err := AppConfig.Int("HTTPSPort"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.Listen.HTTPSPort = httpsport
2014-10-01 14:10:33 +00:00
}
if certfile := AppConfig.String("HTTPCertFile"); certfile != "" {
2015-12-09 15:35:04 +00:00
BConfig.Listen.HTTPSCertFile = certfile
2014-10-01 14:10:33 +00:00
}
if keyfile := AppConfig.String("HTTPKeyFile"); keyfile != "" {
2015-12-09 15:35:04 +00:00
BConfig.Listen.HTTPSKeyFile = keyfile
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if serverName := AppConfig.String("BeegoServerName"); serverName != "" {
2015-12-09 15:35:04 +00:00
BConfig.ServerName = serverName
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if flashname := AppConfig.String("FlashName"); flashname != "" {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.FlashName = flashname
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if flashseperator := AppConfig.String("FlashSeperator"); flashseperator != "" {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.FlashSeperator = flashseperator
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if sd := AppConfig.String("StaticDir"); sd != "" {
2015-12-09 15:35:04 +00:00
for k := range BConfig.WebConfig.StaticDir {
delete(BConfig.WebConfig.StaticDir, k)
2014-10-01 14:10:33 +00:00
}
sds := strings.Fields(sd)
for _, v := range sds {
if url2fsmap := strings.SplitN(v, ":", 2); len(url2fsmap) == 2 {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[1]
2014-10-01 14:10:33 +00:00
} else {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[0]
}
}
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if sgz := AppConfig.String("StaticExtensionsToGzip"); sgz != "" {
extensions := strings.Split(sgz, ",")
2015-09-22 05:27:35 +00:00
fileExts := []string{}
2015-09-22 03:59:48 +00:00
for _, ext := range extensions {
ext = strings.TrimSpace(ext)
if ext == "" {
continue
2013-12-14 18:34:27 +00:00
}
2015-09-22 03:59:48 +00:00
if !strings.HasPrefix(ext, ".") {
ext = "." + ext
}
2015-09-22 05:27:35 +00:00
fileExts = append(fileExts, ext)
}
if len(fileExts) > 0 {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.StaticExtensionsToGzip = fileExts
2013-12-14 18:34:27 +00:00
}
2014-10-01 14:10:33 +00:00
}
2014-10-01 14:10:33 +00:00
if enableadmin, err := AppConfig.Bool("EnableAdmin"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.Listen.AdminEnable = enableadmin
2014-10-01 14:10:33 +00:00
}
if adminhttpaddr := AppConfig.String("AdminHTTPAddr"); adminhttpaddr != "" {
2015-12-09 15:35:04 +00:00
BConfig.Listen.AdminAddr = adminhttpaddr
2014-10-01 14:10:33 +00:00
}
2014-06-16 08:05:15 +00:00
if adminhttpport, err := AppConfig.Int("AdminHTTPPort"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.Listen.AdminPort = adminhttpport
2014-10-01 14:10:33 +00:00
}
2014-09-28 14:10:43 +00:00
2014-10-01 14:10:33 +00:00
if enabledocs, err := AppConfig.Bool("EnableDocs"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.WebConfig.EnableDocs = enabledocs
}
2014-10-01 14:10:33 +00:00
if casesensitive, err := AppConfig.Bool("RouterCaseSensitive"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.RouterCaseSensitive = casesensitive
}
if graceful, err := AppConfig.Bool("Graceful"); err == nil {
2015-12-09 15:35:04 +00:00
BConfig.Listen.Graceful = graceful
}
2014-10-01 14:10:33 +00:00
return nil
}
2015-12-09 15:35:04 +00:00
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
}
rac := &beegoAppConfig{ac}
return rac, nil
}
func (b *beegoAppConfig) Set(key, val string) error {
err := b.innerConfig.Set(BConfig.RunMode+"::"+key, val)
if err == nil {
return err
}
return b.innerConfig.Set(key, val)
}
func (b *beegoAppConfig) String(key string) string {
v := b.innerConfig.String(BConfig.RunMode + "::" + key)
if v == "" {
return b.innerConfig.String(key)
}
return v
}
func (b *beegoAppConfig) Strings(key string) []string {
v := b.innerConfig.Strings(BConfig.RunMode + "::" + key)
if v[0] == "" {
return b.innerConfig.Strings(key)
}
return v
}
func (b *beegoAppConfig) Int(key string) (int, error) {
v, err := b.innerConfig.Int(BConfig.RunMode + "::" + key)
if err != nil {
return b.innerConfig.Int(key)
}
return v, nil
}
func (b *beegoAppConfig) Int64(key string) (int64, error) {
v, err := b.innerConfig.Int64(BConfig.RunMode + "::" + key)
if err != nil {
return b.innerConfig.Int64(key)
}
return v, nil
}
func (b *beegoAppConfig) Bool(key string) (bool, error) {
v, err := b.innerConfig.Bool(BConfig.RunMode + "::" + key)
if err != nil {
return b.innerConfig.Bool(key)
}
return v, nil
}
func (b *beegoAppConfig) Float(key string) (float64, error) {
v, err := b.innerConfig.Float(BConfig.RunMode + "::" + key)
if err != nil {
return b.innerConfig.Float(key)
}
return v, nil
}
func (b *beegoAppConfig) DefaultString(key string, defaultval string) string {
v := b.String(key)
if v != "" {
return v
}
return defaultval
}
func (b *beegoAppConfig) DefaultStrings(key string, defaultval []string) []string {
v := b.Strings(key)
if len(v) != 0 {
return v
}
return defaultval
}
func (b *beegoAppConfig) DefaultInt(key string, defaultval int) int {
v, err := b.Int(key)
if err == nil {
return v
}
return defaultval
}
func (b *beegoAppConfig) DefaultInt64(key string, defaultval int64) int64 {
v, err := b.Int64(key)
if err == nil {
return v
}
return defaultval
}
func (b *beegoAppConfig) DefaultBool(key string, defaultval bool) bool {
v, err := b.Bool(key)
if err == nil {
return v
}
return defaultval
}
func (b *beegoAppConfig) DefaultFloat(key string, defaultval float64) float64 {
v, err := b.Float(key)
if err == nil {
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)
}