434 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			434 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2014 beego Author. All Rights Reserved.
 | 
						|
//
 | 
						|
// 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
 | 
						|
//
 | 
						|
//      http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
//
 | 
						|
// 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 (
 | 
						|
	"errors"
 | 
						|
	"fmt"
 | 
						|
	"html/template"
 | 
						|
	"os"
 | 
						|
	"path/filepath"
 | 
						|
	"runtime"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/astaxie/beego/config"
 | 
						|
	"github.com/astaxie/beego/logs"
 | 
						|
	"github.com/astaxie/beego/session"
 | 
						|
	"github.com/astaxie/beego/utils"
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	BeeApp                 *App // beego application
 | 
						|
	AppName                string
 | 
						|
	AppPath                string
 | 
						|
	workPath               string
 | 
						|
	AppConfigPath          string
 | 
						|
	StaticDir              map[string]string
 | 
						|
	TemplateCache          map[string]*template.Template // template caching map
 | 
						|
	StaticExtensionsToGzip []string                      // files with should be compressed with gzip (.js,.css,etc)
 | 
						|
	EnableHttpListen       bool
 | 
						|
	HttpAddr               string
 | 
						|
	HttpPort               int
 | 
						|
	EnableHttpTLS          bool
 | 
						|
	HttpsPort              int
 | 
						|
	HttpCertFile           string
 | 
						|
	HttpKeyFile            string
 | 
						|
	RecoverPanic           bool // flag of auto recover panic
 | 
						|
	AutoRender             bool // flag of render template automatically
 | 
						|
	ViewsPath              string
 | 
						|
	RunMode                string // run mode, "dev" or "prod"
 | 
						|
	AppConfig              config.ConfigContainer
 | 
						|
	GlobalSessions         *session.Manager // global session mananger
 | 
						|
	SessionOn              bool             // flag of starting session auto. default is false.
 | 
						|
	SessionProvider        string           // default session provider, memory, mysql , redis ,etc.
 | 
						|
	SessionName            string           // the cookie name when saving session id into cookie.
 | 
						|
	SessionGCMaxLifetime   int64            // session gc time for auto cleaning expired session.
 | 
						|
	SessionSavePath        string           // if use mysql/redis/file provider, define save path to connection info.
 | 
						|
	SessionHashFunc        string           // session hash generation func.
 | 
						|
	SessionHashKey         string           // session hash salt string.
 | 
						|
	SessionCookieLifeTime  int              // the life time of session id in cookie.
 | 
						|
	SessionAutoSetCookie   bool             // auto setcookie
 | 
						|
	SessionDomain          string           // the cookie domain default is empty
 | 
						|
	UseFcgi                bool
 | 
						|
	MaxMemory              int64
 | 
						|
	EnableGzip             bool // flag of enable gzip
 | 
						|
	DirectoryIndex         bool // flag of display directory index. default is false.
 | 
						|
	HttpServerTimeOut      int64
 | 
						|
	ErrorsShow             bool   // flag of show errors in page. if true, show error and trace info in page rendered with error template.
 | 
						|
	XSRFKEY                string // xsrf hash salt string.
 | 
						|
	EnableXSRF             bool   // flag of enable xsrf.
 | 
						|
	XSRFExpire             int    // the expiry of xsrf value.
 | 
						|
	CopyRequestBody        bool   // flag of copy raw request body in context.
 | 
						|
	TemplateLeft           string
 | 
						|
	TemplateRight          string
 | 
						|
	BeegoServerName        string // beego server name exported in response header.
 | 
						|
	EnableAdmin            bool   // flag of enable admin module to log every request info.
 | 
						|
	AdminHttpAddr          string // http server configurations for admin module.
 | 
						|
	AdminHttpPort          int
 | 
						|
	FlashName              string // name of the flash variable found in response header and cookie
 | 
						|
	FlashSeperator         string // used to seperate flash key:value
 | 
						|
	AppConfigProvider      string // config provider
 | 
						|
	EnableDocs             bool   // enable generate docs & server docs API Swagger
 | 
						|
)
 | 
						|
 | 
						|
func init() {
 | 
						|
	// create beego application
 | 
						|
	BeeApp = NewApp()
 | 
						|
 | 
						|
	workPath, _ = os.Getwd()
 | 
						|
	workPath, _ = filepath.Abs(workPath)
 | 
						|
	// initialize default configurations
 | 
						|
	AppPath, _ = filepath.Abs(filepath.Dir(os.Args[0]))
 | 
						|
 | 
						|
	AppConfigPath = filepath.Join(AppPath, "conf", "app.conf")
 | 
						|
 | 
						|
	if workPath != AppPath {
 | 
						|
		if utils.FileExists(AppConfigPath) {
 | 
						|
			os.Chdir(AppPath)
 | 
						|
		} else {
 | 
						|
			AppConfigPath = filepath.Join(workPath, "conf", "app.conf")
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	AppConfigProvider = "ini"
 | 
						|
 | 
						|
	StaticDir = make(map[string]string)
 | 
						|
	StaticDir["/static"] = "static"
 | 
						|
 | 
						|
	StaticExtensionsToGzip = []string{".css", ".js"}
 | 
						|
 | 
						|
	TemplateCache = make(map[string]*template.Template)
 | 
						|
 | 
						|
	// set this to 0.0.0.0 to make this app available to externally
 | 
						|
	EnableHttpListen = true //default enable http Listen
 | 
						|
 | 
						|
	HttpAddr = ""
 | 
						|
	HttpPort = 8080
 | 
						|
 | 
						|
	HttpsPort = 10443
 | 
						|
 | 
						|
	AppName = "beego"
 | 
						|
 | 
						|
	RunMode = "dev" //default runmod
 | 
						|
 | 
						|
	AutoRender = true
 | 
						|
 | 
						|
	RecoverPanic = true
 | 
						|
 | 
						|
	ViewsPath = "views"
 | 
						|
 | 
						|
	SessionOn = false
 | 
						|
	SessionProvider = "memory"
 | 
						|
	SessionName = "beegosessionID"
 | 
						|
	SessionGCMaxLifetime = 3600
 | 
						|
	SessionSavePath = ""
 | 
						|
	SessionHashFunc = "sha1"
 | 
						|
	SessionHashKey = "beegoserversessionkey"
 | 
						|
	SessionCookieLifeTime = 0 //set cookie default is the brower life
 | 
						|
	SessionAutoSetCookie = true
 | 
						|
 | 
						|
	UseFcgi = false
 | 
						|
 | 
						|
	MaxMemory = 1 << 26 //64MB
 | 
						|
 | 
						|
	EnableGzip = false
 | 
						|
 | 
						|
	HttpServerTimeOut = 0
 | 
						|
 | 
						|
	ErrorsShow = true
 | 
						|
 | 
						|
	XSRFKEY = "beegoxsrf"
 | 
						|
	XSRFExpire = 0
 | 
						|
 | 
						|
	TemplateLeft = "{{"
 | 
						|
	TemplateRight = "}}"
 | 
						|
 | 
						|
	BeegoServerName = "beegoServer:" + VERSION
 | 
						|
 | 
						|
	EnableAdmin = false
 | 
						|
	AdminHttpAddr = "127.0.0.1"
 | 
						|
	AdminHttpPort = 8088
 | 
						|
 | 
						|
	FlashName = "BEEGO_FLASH"
 | 
						|
	FlashSeperator = "BEEGOFLASH"
 | 
						|
 | 
						|
	runtime.GOMAXPROCS(runtime.NumCPU())
 | 
						|
 | 
						|
	// init BeeLogger
 | 
						|
	BeeLogger = logs.NewLogger(10000)
 | 
						|
	err := BeeLogger.SetLogger("console", "")
 | 
						|
	if err != nil {
 | 
						|
		fmt.Println("init console log error:", err)
 | 
						|
	}
 | 
						|
 | 
						|
	err = ParseConfig()
 | 
						|
	if err != nil && !os.IsNotExist(err) {
 | 
						|
		// for init if doesn't have app.conf will not panic
 | 
						|
		Info(err)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// ParseConfig parsed default config file.
 | 
						|
// now only support ini, next will support json.
 | 
						|
func ParseConfig() (err error) {
 | 
						|
	AppConfig, err = config.NewConfig(AppConfigProvider, AppConfigPath)
 | 
						|
	if err != nil {
 | 
						|
		AppConfig = config.NewFakeConfig()
 | 
						|
		return err
 | 
						|
	} else {
 | 
						|
 | 
						|
		if v, err := GetConfig("string", "HttpAddr"); err == nil {
 | 
						|
			HttpAddr = v.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if v, err := GetConfig("int", "HttpPort"); err == nil {
 | 
						|
			HttpPort = v.(int)
 | 
						|
		}
 | 
						|
 | 
						|
		if v, err := GetConfig("bool", "EnableHttpListen"); err == nil {
 | 
						|
			EnableHttpListen = v.(bool)
 | 
						|
		}
 | 
						|
 | 
						|
		if maxmemory, err := GetConfig("int64", "MaxMemory"); err == nil {
 | 
						|
			MaxMemory = maxmemory.(int64)
 | 
						|
		}
 | 
						|
 | 
						|
		if appname, _ := GetConfig("string", "AppName"); appname != "" {
 | 
						|
			AppName = appname.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if runmode, _ := GetConfig("string", "RunMode"); runmode != "" {
 | 
						|
			RunMode = runmode.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if autorender, err := GetConfig("bool", "AutoRender"); err == nil {
 | 
						|
			AutoRender = autorender.(bool)
 | 
						|
		}
 | 
						|
 | 
						|
		if autorecover, err := GetConfig("bool", "RecoverPanic"); err == nil {
 | 
						|
			RecoverPanic = autorecover.(bool)
 | 
						|
		}
 | 
						|
 | 
						|
		if views, _ := GetConfig("string", "ViewsPath"); views != "" {
 | 
						|
			ViewsPath = views.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if sessionon, err := GetConfig("bool", "SessionOn"); err == nil {
 | 
						|
			SessionOn = sessionon.(bool)
 | 
						|
		}
 | 
						|
 | 
						|
		if sessProvider, _ := GetConfig("string", "SessionProvider"); sessProvider != "" {
 | 
						|
			SessionProvider = sessProvider.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if sessName, _ := GetConfig("string", "SessionName"); sessName != "" {
 | 
						|
			SessionName = sessName.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if sesssavepath, _ := GetConfig("string", "SessionSavePath"); sesssavepath != "" {
 | 
						|
			SessionSavePath = sesssavepath.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if sesshashfunc, _ := GetConfig("string", "SessionHashFunc"); sesshashfunc != "" {
 | 
						|
			SessionHashFunc = sesshashfunc.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if sesshashkey, _ := GetConfig("string", "SessionHashKey"); sesshashkey != "" {
 | 
						|
			SessionHashKey = sesshashkey.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if sessMaxLifeTime, err := GetConfig("int64", "SessionGCMaxLifetime"); err == nil && sessMaxLifeTime != 0 {
 | 
						|
			SessionGCMaxLifetime = sessMaxLifeTime.(int64)
 | 
						|
		}
 | 
						|
 | 
						|
		if sesscookielifetime, err := GetConfig("int", "SessionCookieLifeTime"); err == nil && sesscookielifetime != 0 {
 | 
						|
			SessionCookieLifeTime = sesscookielifetime.(int)
 | 
						|
		}
 | 
						|
 | 
						|
		if usefcgi, err := GetConfig("bool", "UseFcgi"); err == nil {
 | 
						|
			UseFcgi = usefcgi.(bool)
 | 
						|
		}
 | 
						|
 | 
						|
		if enablegzip, err := GetConfig("bool", "EnableGzip"); err == nil {
 | 
						|
			EnableGzip = enablegzip.(bool)
 | 
						|
		}
 | 
						|
 | 
						|
		if directoryindex, err := GetConfig("bool", "DirectoryIndex"); err == nil {
 | 
						|
			DirectoryIndex = directoryindex.(bool)
 | 
						|
		}
 | 
						|
 | 
						|
		if timeout, err := GetConfig("int64", "HttpServerTimeOut"); err == nil {
 | 
						|
			HttpServerTimeOut = timeout.(int64)
 | 
						|
		}
 | 
						|
 | 
						|
		if errorsshow, err := GetConfig("bool", "ErrorsShow"); err == nil {
 | 
						|
			ErrorsShow = errorsshow.(bool)
 | 
						|
		}
 | 
						|
 | 
						|
		if copyrequestbody, err := GetConfig("bool", "CopyRequestBody"); err == nil {
 | 
						|
			CopyRequestBody = copyrequestbody.(bool)
 | 
						|
		}
 | 
						|
 | 
						|
		if xsrfkey, _ := GetConfig("string", "XSRFKEY"); xsrfkey != "" {
 | 
						|
			XSRFKEY = xsrfkey.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if enablexsrf, err := GetConfig("bool", "EnableXSRF"); err == nil {
 | 
						|
			EnableXSRF = enablexsrf.(bool)
 | 
						|
		}
 | 
						|
 | 
						|
		if expire, err := GetConfig("int", "XSRFExpire"); err == nil {
 | 
						|
			XSRFExpire = expire.(int)
 | 
						|
		}
 | 
						|
 | 
						|
		if tplleft, _ := GetConfig("string", "TemplateLeft"); tplleft != "" {
 | 
						|
			TemplateLeft = tplleft.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if tplright, _ := GetConfig("string", "TemplateRight"); tplright != "" {
 | 
						|
			TemplateRight = tplright.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if httptls, err := GetConfig("bool", "EnableHttpTLS"); err == nil {
 | 
						|
			EnableHttpTLS = httptls.(bool)
 | 
						|
		}
 | 
						|
 | 
						|
		if httpsport, err := GetConfig("int", "HttpsPort"); err == nil {
 | 
						|
			HttpsPort = httpsport.(int)
 | 
						|
		}
 | 
						|
 | 
						|
		if certfile, _ := GetConfig("string", "HttpCertFile"); certfile != "" {
 | 
						|
			HttpCertFile = certfile.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if keyfile, _ := GetConfig("string", "HttpKeyFile"); keyfile != "" {
 | 
						|
			HttpKeyFile = keyfile.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if serverName, _ := GetConfig("string", "BeegoServerName"); serverName != "" {
 | 
						|
			BeegoServerName = serverName.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if flashname, _ := GetConfig("string", "FlashName"); flashname != "" {
 | 
						|
			FlashName = flashname.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if flashseperator, _ := GetConfig("string", "FlashSeperator"); flashseperator != "" {
 | 
						|
			FlashSeperator = flashseperator.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if sd, _ := GetConfig("string", "StaticDir"); sd != "" {
 | 
						|
			for k := range StaticDir {
 | 
						|
				delete(StaticDir, k)
 | 
						|
			}
 | 
						|
			sds := strings.Fields(sd.(string))
 | 
						|
			for _, v := range sds {
 | 
						|
				if url2fsmap := strings.SplitN(v, ":", 2); len(url2fsmap) == 2 {
 | 
						|
					StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[1]
 | 
						|
				} else {
 | 
						|
					StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[0]
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if sgz, _ := GetConfig("string", "StaticExtensionsToGzip"); sgz != "" {
 | 
						|
			extensions := strings.Split(sgz.(string), ",")
 | 
						|
			if len(extensions) > 0 {
 | 
						|
				StaticExtensionsToGzip = []string{}
 | 
						|
				for _, ext := range extensions {
 | 
						|
					if len(ext) == 0 {
 | 
						|
						continue
 | 
						|
					}
 | 
						|
					extWithDot := ext
 | 
						|
					if extWithDot[:1] != "." {
 | 
						|
						extWithDot = "." + extWithDot
 | 
						|
					}
 | 
						|
					StaticExtensionsToGzip = append(StaticExtensionsToGzip, extWithDot)
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if enableadmin, err := GetConfig("bool", "EnableAdmin"); err == nil {
 | 
						|
			EnableAdmin = enableadmin.(bool)
 | 
						|
		}
 | 
						|
 | 
						|
		if adminhttpaddr, _ := GetConfig("string", "AdminHttpAddr"); adminhttpaddr != "" {
 | 
						|
			AdminHttpAddr = adminhttpaddr.(string)
 | 
						|
		}
 | 
						|
 | 
						|
		if adminhttpport, err := GetConfig("int", "AdminHttpPort"); err == nil {
 | 
						|
			AdminHttpPort = adminhttpport.(int)
 | 
						|
		}
 | 
						|
 | 
						|
		if enabledocs, err := GetConfig("bool", "EnableDocs"); err == nil {
 | 
						|
			EnableDocs = enabledocs.(bool)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// Getconfig throw the Runmode
 | 
						|
// [dev]
 | 
						|
// name = astaixe
 | 
						|
// IsEnable = false
 | 
						|
// [prod]
 | 
						|
// name = slene
 | 
						|
// IsEnable = true
 | 
						|
//
 | 
						|
// usage:
 | 
						|
// GetConfig("string", "name")
 | 
						|
// GetConfig("bool", "IsEnable")
 | 
						|
func GetConfig(typ, key string) (interface{}, error) {
 | 
						|
	switch typ {
 | 
						|
	case "string":
 | 
						|
		v := AppConfig.String(RunMode + "::" + key)
 | 
						|
		if v == "" {
 | 
						|
			v = AppConfig.String(key)
 | 
						|
		}
 | 
						|
		return v, nil
 | 
						|
	case "strings":
 | 
						|
		v := AppConfig.Strings(RunMode + "::" + key)
 | 
						|
		if len(v) == 0 {
 | 
						|
			v = AppConfig.Strings(key)
 | 
						|
		}
 | 
						|
		return v, nil
 | 
						|
	case "int":
 | 
						|
		v, err := AppConfig.Int(RunMode + "::" + key)
 | 
						|
		if err != nil || v == 0 {
 | 
						|
			return AppConfig.Int(key)
 | 
						|
		}
 | 
						|
		return v, nil
 | 
						|
	case "bool":
 | 
						|
		v, err := AppConfig.Bool(RunMode + "::" + key)
 | 
						|
		if err != nil {
 | 
						|
			return AppConfig.Bool(key)
 | 
						|
		}
 | 
						|
		return v, nil
 | 
						|
	case "int64":
 | 
						|
		v, err := AppConfig.Int64(RunMode + "::" + key)
 | 
						|
		if err != nil || v == 0 {
 | 
						|
			return AppConfig.Int64(key)
 | 
						|
		}
 | 
						|
		return v, nil
 | 
						|
	case "float":
 | 
						|
		v, err := AppConfig.Float(RunMode + "::" + key)
 | 
						|
		if err != nil || v == 0 {
 | 
						|
			return AppConfig.Float(key)
 | 
						|
		}
 | 
						|
		return v, nil
 | 
						|
	}
 | 
						|
	return "", errors.New("not support type")
 | 
						|
}
 |