config.go 9.7 KB
Newer Older
1 2 3
package beego

import (
A
astaxie 已提交
4
	"fmt"
5 6
	"html/template"
	"os"
7
	"path/filepath"
8 9 10
	"runtime"
	"strconv"
	"strings"
P
Pengfei Xue 已提交
11 12

	"github.com/astaxie/beego/config"
13
	"github.com/astaxie/beego/logs"
P
Pengfei Xue 已提交
14
	"github.com/astaxie/beego/session"
15
	"github.com/astaxie/beego/utils"
16 17 18
)

var (
傅小黑 已提交
19 20 21
	BeeApp                 *App // beego application
	AppName                string
	AppPath                string
22
	workPath               string
傅小黑 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
	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)
	HttpAddr               string
	HttpPort               int
	HttpTLS                bool
	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.
A
astaxie 已提交
46
	SessionAutoSetCookie   bool             // auto setcookie
傅小黑 已提交
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
	UseFcgi                bool
	MaxMemory              int64
	EnableGzip             bool // flag of enable gzip
	DirectoryIndex         bool // flag of display directory index. default is false.
	EnableHotUpdate        bool // flag of hot update checking by app self. 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
64 65
	FlashName              string // name of the flash variable found in response header and cookie
	FlashSeperator         string // used to seperate flash key:value
66 67
)

A
astaxie 已提交
68
func init() {
69
	// create beego application
A
astaxie 已提交
70
	BeeApp = NewApp()
P
Pengfei Xue 已提交
71

72 73
	workPath, _ = os.Getwd()
	workPath, _ = filepath.Abs(workPath)
P
Pengfei Xue 已提交
74
	// initialize default configurations
75
	AppPath, _ = filepath.Abs(filepath.Dir(os.Args[0]))
76 77 78 79 80 81 82 83 84 85

	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")
		}
	}
P
Pengfei Xue 已提交
86

87
	StaticDir = make(map[string]string)
P
Pengfei Xue 已提交
88
	StaticDir["/static"] = "static"
89

F
Francois 已提交
90
	StaticExtensionsToGzip = []string{".css", ".js"}
P
Pengfei Xue 已提交
91

A
typo  
astaxie 已提交
92
	TemplateCache = make(map[string]*template.Template)
P
Pengfei Xue 已提交
93 94

	// set this to 0.0.0.0 to make this app available to externally
A
astaxie 已提交
95
	HttpAddr = ""
96
	HttpPort = 8080
P
Pengfei Xue 已提交
97

98
	AppName = "beego"
P
Pengfei Xue 已提交
99

100
	RunMode = "dev" //default runmod
P
Pengfei Xue 已提交
101

102
	AutoRender = true
P
Pengfei Xue 已提交
103

104
	RecoverPanic = true
P
Pengfei Xue 已提交
105

106
	ViewsPath = "views"
P
Pengfei Xue 已提交
107

108 109 110 111 112 113 114
	SessionOn = false
	SessionProvider = "memory"
	SessionName = "beegosessionID"
	SessionGCMaxLifetime = 3600
	SessionSavePath = ""
	SessionHashFunc = "sha1"
	SessionHashKey = "beegoserversessionkey"
A
astaxie 已提交
115
	SessionCookieLifeTime = 0 //set cookie default is the brower life
A
astaxie 已提交
116
	SessionAutoSetCookie = true
P
Pengfei Xue 已提交
117

118
	UseFcgi = false
P
Pengfei Xue 已提交
119

傅小黑 已提交
120
	MaxMemory = 1 << 26 //64MB
P
Pengfei Xue 已提交
121

122
	EnableGzip = false
P
Pengfei Xue 已提交
123

124
	HttpServerTimeOut = 0
P
Pengfei Xue 已提交
125

126
	ErrorsShow = true
P
Pengfei Xue 已提交
127

128 129
	XSRFKEY = "beegoxsrf"
	XSRFExpire = 0
P
Pengfei Xue 已提交
130

131 132
	TemplateLeft = "{{"
	TemplateRight = "}}"
P
Pengfei Xue 已提交
133

134
	BeegoServerName = "beegoServer"
P
Pengfei Xue 已提交
135

136
	EnableAdmin = false
P
Pengfei Xue 已提交
137
	AdminHttpAddr = "127.0.0.1"
138
	AdminHttpPort = 8088
P
Pengfei Xue 已提交
139

140 141 142
	FlashName = "BEEGO_FLASH"
	FlashSeperator = "BEEGOFLASH"

143
	runtime.GOMAXPROCS(runtime.NumCPU())
P
Pengfei Xue 已提交
144

145 146
	// init BeeLogger
	BeeLogger = logs.NewLogger(10000)
A
astaxie 已提交
147 148 149 150
	err := BeeLogger.SetLogger("console", "")
	if err != nil {
		fmt.Println("init console log error:", err)
	}
151

A
astaxie 已提交
152
	err = ParseConfig()
P
Pengfei Xue 已提交
153
	if err != nil && !os.IsNotExist(err) {
154 155
		// for init if doesn't have app.conf will not panic
		Info(err)
P
Pengfei Xue 已提交
156
	}
157 158
}

159 160
// ParseConfig parsed default config file.
// now only support ini, next will support json.
161 162 163
func ParseConfig() (err error) {
	AppConfig, err = config.NewConfig("ini", AppConfigPath)
	if err != nil {
164
		AppConfig = config.NewFakeConfig()
165 166
		return err
	} else {
167
		HttpAddr = AppConfig.String("HttpAddr")
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281

		if v, err := AppConfig.Int("HttpPort"); err == nil {
			HttpPort = v
		}

		if maxmemory, err := AppConfig.Int64("MaxMemory"); err == nil {
			MaxMemory = maxmemory
		}

		if appname := AppConfig.String("AppName"); appname != "" {
			AppName = appname
		}

		if runmode := AppConfig.String("RunMode"); runmode != "" {
			RunMode = runmode
		}

		if autorender, err := AppConfig.Bool("AutoRender"); err == nil {
			AutoRender = autorender
		}

		if autorecover, err := AppConfig.Bool("RecoverPanic"); err == nil {
			RecoverPanic = autorecover
		}

		if views := AppConfig.String("ViewsPath"); views != "" {
			ViewsPath = views
		}

		if sessionon, err := AppConfig.Bool("SessionOn"); err == nil {
			SessionOn = sessionon
		}

		if sessProvider := AppConfig.String("SessionProvider"); sessProvider != "" {
			SessionProvider = sessProvider
		}

		if sessName := AppConfig.String("SessionName"); sessName != "" {
			SessionName = sessName
		}

		if sesssavepath := AppConfig.String("SessionSavePath"); sesssavepath != "" {
			SessionSavePath = sesssavepath
		}

		if sesshashfunc := AppConfig.String("SessionHashFunc"); sesshashfunc != "" {
			SessionHashFunc = sesshashfunc
		}

		if sesshashkey := AppConfig.String("SessionHashKey"); sesshashkey != "" {
			SessionHashKey = sesshashkey
		}

		if sessMaxLifeTime, err := AppConfig.Int("SessionGCMaxLifetime"); err == nil && sessMaxLifeTime != 0 {
			int64val, _ := strconv.ParseInt(strconv.Itoa(sessMaxLifeTime), 10, 64)
			SessionGCMaxLifetime = int64val
		}

		if sesscookielifetime, err := AppConfig.Int("SessionCookieLifeTime"); err == nil && sesscookielifetime != 0 {
			SessionCookieLifeTime = sesscookielifetime
		}

		if usefcgi, err := AppConfig.Bool("UseFcgi"); err == nil {
			UseFcgi = usefcgi
		}

		if enablegzip, err := AppConfig.Bool("EnableGzip"); err == nil {
			EnableGzip = enablegzip
		}

		if directoryindex, err := AppConfig.Bool("DirectoryIndex"); err == nil {
			DirectoryIndex = directoryindex
		}

		if hotupdate, err := AppConfig.Bool("HotUpdate"); err == nil {
			EnableHotUpdate = hotupdate
		}

		if timeout, err := AppConfig.Int64("HttpServerTimeOut"); err == nil {
			HttpServerTimeOut = timeout
		}

		if errorsshow, err := AppConfig.Bool("ErrorsShow"); err == nil {
			ErrorsShow = errorsshow
		}

		if copyrequestbody, err := AppConfig.Bool("CopyRequestBody"); err == nil {
			CopyRequestBody = copyrequestbody
		}

		if xsrfkey := AppConfig.String("XSRFKEY"); xsrfkey != "" {
			XSRFKEY = xsrfkey
		}

		if enablexsrf, err := AppConfig.Bool("EnableXSRF"); err == nil {
			EnableXSRF = enablexsrf
		}

		if expire, err := AppConfig.Int("XSRFExpire"); err == nil {
			XSRFExpire = expire
		}

		if tplleft := AppConfig.String("TemplateLeft"); tplleft != "" {
			TemplateLeft = tplleft
		}

		if tplright := AppConfig.String("TemplateRight"); tplright != "" {
			TemplateRight = tplright
		}

		if httptls, err := AppConfig.Bool("HttpTLS"); err == nil {
			HttpTLS = httptls
		}

282
		if certfile := AppConfig.String("HttpCertFile"); certfile != "" {
283 284 285 286 287 288 289 290 291 292 293
			HttpCertFile = certfile
		}

		if keyfile := AppConfig.String("HttpKeyFile"); keyfile != "" {
			HttpKeyFile = keyfile
		}

		if serverName := AppConfig.String("BeegoServerName"); serverName != "" {
			BeegoServerName = serverName
		}

294 295 296 297 298 299 300 301
		if flashname := AppConfig.String("FlashName"); flashname != "" {
			FlashName = flashname
		}

		if flashseperator := AppConfig.String("FlashSeperator"); flashseperator != "" {
			FlashSeperator = flashseperator
		}

302 303 304 305 306 307 308 309 310 311 312 313 314
		if sd := AppConfig.String("StaticDir"); sd != "" {
			for k := range StaticDir {
				delete(StaticDir, k)
			}
			sds := strings.Fields(sd)
			for _, v := range sds {
				if url2fsmap := strings.SplitN(v, ":", 2); len(url2fsmap) == 2 {
					StaticDir["/"+url2fsmap[0]] = url2fsmap[1]
				} else {
					StaticDir["/"+url2fsmap[0]] = url2fsmap[0]
				}
			}
		}
315

F
Francois 已提交
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
		if sgz := AppConfig.String("StaticExtensionsToGzip"); sgz != "" {
			extensions := strings.Split(sgz, ",")
			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)
				}
			}
		}
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346

		if enableadmin, err := AppConfig.Bool("EnableAdmin"); err == nil {
			EnableAdmin = enableadmin
		}

		if adminhttpaddr := AppConfig.String("AdminHttpAddr"); adminhttpaddr != "" {
			AdminHttpAddr = adminhttpaddr
		}

		if adminhttpport, err := AppConfig.Int("AdminHttpPort"); err == nil {
			AdminHttpPort = adminhttpport
		}
	}
	return nil
}