config.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. // Copyright 2014 beego Author. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package beego
  15. import (
  16. "fmt"
  17. "os"
  18. "path/filepath"
  19. "strings"
  20. "github.com/astaxie/beego/config"
  21. "github.com/astaxie/beego/session"
  22. "github.com/astaxie/beego/utils"
  23. )
  24. // Config is the main struct for BConfig
  25. type Config struct {
  26. AppName string //Application name
  27. RunMode string //Running Mode: dev | prod
  28. RouterCaseSensitive bool
  29. ServerName string
  30. RecoverPanic bool
  31. CopyRequestBody bool
  32. EnableGzip bool
  33. MaxMemory int64
  34. EnableErrorsShow bool
  35. Listen Listen
  36. WebConfig WebConfig
  37. Log LogConfig
  38. }
  39. // Listen holds for http and https related config
  40. type Listen struct {
  41. Graceful bool // Graceful means use graceful module to start the server
  42. ServerTimeOut int64
  43. ListenTCP4 bool
  44. EnableHTTP bool
  45. HTTPAddr string
  46. HTTPPort int
  47. EnableHTTPS bool
  48. HTTPSAddr string
  49. HTTPSPort int
  50. HTTPSCertFile string
  51. HTTPSKeyFile string
  52. EnableAdmin bool
  53. AdminAddr string
  54. AdminPort int
  55. EnableFcgi bool
  56. EnableStdIo bool // EnableStdIo works with EnableFcgi Use FCGI via standard I/O
  57. }
  58. // WebConfig holds web related config
  59. type WebConfig struct {
  60. AutoRender bool
  61. EnableDocs bool
  62. FlashName string
  63. FlashSeparator string
  64. DirectoryIndex bool
  65. StaticDir map[string]string
  66. StaticExtensionsToGzip []string
  67. TemplateLeft string
  68. TemplateRight string
  69. ViewsPath string
  70. EnableXSRF bool
  71. XSRFKey string
  72. XSRFExpire int
  73. Session SessionConfig
  74. }
  75. // SessionConfig holds session related config
  76. type SessionConfig struct {
  77. SessionOn bool
  78. SessionProvider string
  79. SessionName string
  80. SessionGCMaxLifetime int64
  81. SessionProviderConfig string
  82. SessionCookieLifeTime int
  83. SessionAutoSetCookie bool
  84. SessionDomain string
  85. }
  86. // LogConfig holds Log related config
  87. type LogConfig struct {
  88. AccessLogs bool
  89. FileLineNum bool
  90. Outputs map[string]string // Store Adaptor : config
  91. }
  92. var (
  93. // BConfig is the default config for Application
  94. BConfig *Config
  95. // AppConfig is the instance of Config, store the config information from file
  96. AppConfig *beegoAppConfig
  97. // AppPath is the absolute path to the app
  98. AppPath string
  99. // GlobalSessions is the instance for the session manager
  100. GlobalSessions *session.Manager
  101. // appConfigPath is the path to the config files
  102. appConfigPath string
  103. // appConfigProvider is the provider for the config, default is ini
  104. appConfigProvider = "ini"
  105. )
  106. func init() {
  107. AppPath, _ = filepath.Abs(filepath.Dir(os.Args[0]))
  108. os.Chdir(AppPath)
  109. BConfig = &Config{
  110. AppName: "beego",
  111. RunMode: DEV,
  112. RouterCaseSensitive: true,
  113. ServerName: "beegoServer:" + VERSION,
  114. RecoverPanic: true,
  115. CopyRequestBody: false,
  116. EnableGzip: false,
  117. MaxMemory: 1 << 26, //64MB
  118. EnableErrorsShow: true,
  119. Listen: Listen{
  120. Graceful: false,
  121. ServerTimeOut: 0,
  122. ListenTCP4: false,
  123. EnableHTTP: true,
  124. HTTPAddr: "",
  125. HTTPPort: 8080,
  126. EnableHTTPS: false,
  127. HTTPSAddr: "",
  128. HTTPSPort: 10443,
  129. HTTPSCertFile: "",
  130. HTTPSKeyFile: "",
  131. EnableAdmin: false,
  132. AdminAddr: "",
  133. AdminPort: 8088,
  134. EnableFcgi: false,
  135. EnableStdIo: false,
  136. },
  137. WebConfig: WebConfig{
  138. AutoRender: true,
  139. EnableDocs: false,
  140. FlashName: "BEEGO_FLASH",
  141. FlashSeparator: "BEEGOFLASH",
  142. DirectoryIndex: false,
  143. StaticDir: map[string]string{"/static": "static"},
  144. StaticExtensionsToGzip: []string{".css", ".js"},
  145. TemplateLeft: "{{",
  146. TemplateRight: "}}",
  147. ViewsPath: "views",
  148. EnableXSRF: false,
  149. XSRFKey: "beegoxsrf",
  150. XSRFExpire: 0,
  151. Session: SessionConfig{
  152. SessionOn: false,
  153. SessionProvider: "memory",
  154. SessionName: "beegosessionID",
  155. SessionGCMaxLifetime: 3600,
  156. SessionProviderConfig: "",
  157. SessionCookieLifeTime: 0, //set cookie default is the browser life
  158. SessionAutoSetCookie: true,
  159. SessionDomain: "",
  160. },
  161. },
  162. Log: LogConfig{
  163. AccessLogs: false,
  164. FileLineNum: true,
  165. Outputs: map[string]string{"console": ""},
  166. },
  167. }
  168. appConfigPath = filepath.Join(AppPath, "conf", "app.conf")
  169. if !utils.FileExists(appConfigPath) {
  170. AppConfig = &beegoAppConfig{innerConfig: config.NewFakeConfig()}
  171. return
  172. }
  173. if err := parseConfig(appConfigPath); err != nil {
  174. panic(err)
  175. }
  176. }
  177. // now only support ini, next will support json.
  178. func parseConfig(appConfigPath string) (err error) {
  179. AppConfig, err = newAppConfig(appConfigProvider, appConfigPath)
  180. if err != nil {
  181. return err
  182. }
  183. // set the run mode first
  184. if envRunMode := os.Getenv("BEEGO_RUNMODE"); envRunMode != "" {
  185. BConfig.RunMode = envRunMode
  186. } else if runMode := AppConfig.String("RunMode"); runMode != "" {
  187. BConfig.RunMode = runMode
  188. }
  189. BConfig.AppName = AppConfig.DefaultString("AppName", BConfig.AppName)
  190. BConfig.RecoverPanic = AppConfig.DefaultBool("RecoverPanic", BConfig.RecoverPanic)
  191. BConfig.RouterCaseSensitive = AppConfig.DefaultBool("RouterCaseSensitive", BConfig.RouterCaseSensitive)
  192. BConfig.ServerName = AppConfig.DefaultString("ServerName", BConfig.ServerName)
  193. BConfig.EnableGzip = AppConfig.DefaultBool("EnableGzip", BConfig.EnableGzip)
  194. BConfig.EnableErrorsShow = AppConfig.DefaultBool("EnableErrorsShow", BConfig.EnableErrorsShow)
  195. BConfig.CopyRequestBody = AppConfig.DefaultBool("CopyRequestBody", BConfig.CopyRequestBody)
  196. BConfig.MaxMemory = AppConfig.DefaultInt64("MaxMemory", BConfig.MaxMemory)
  197. BConfig.Listen.Graceful = AppConfig.DefaultBool("Graceful", BConfig.Listen.Graceful)
  198. BConfig.Listen.HTTPAddr = AppConfig.String("HTTPAddr")
  199. BConfig.Listen.HTTPPort = AppConfig.DefaultInt("HTTPPort", BConfig.Listen.HTTPPort)
  200. BConfig.Listen.ListenTCP4 = AppConfig.DefaultBool("ListenTCP4", BConfig.Listen.ListenTCP4)
  201. BConfig.Listen.EnableHTTP = AppConfig.DefaultBool("EnableHTTP", BConfig.Listen.EnableHTTP)
  202. BConfig.Listen.EnableHTTPS = AppConfig.DefaultBool("EnableHTTPS", BConfig.Listen.EnableHTTPS)
  203. BConfig.Listen.HTTPSAddr = AppConfig.DefaultString("HTTPSAddr", BConfig.Listen.HTTPSAddr)
  204. BConfig.Listen.HTTPSPort = AppConfig.DefaultInt("HTTPSPort", BConfig.Listen.HTTPSPort)
  205. BConfig.Listen.HTTPSCertFile = AppConfig.DefaultString("HTTPSCertFile", BConfig.Listen.HTTPSCertFile)
  206. BConfig.Listen.HTTPSKeyFile = AppConfig.DefaultString("HTTPSKeyFile", BConfig.Listen.HTTPSKeyFile)
  207. BConfig.Listen.EnableAdmin = AppConfig.DefaultBool("EnableAdmin", BConfig.Listen.EnableAdmin)
  208. BConfig.Listen.AdminAddr = AppConfig.DefaultString("AdminAddr", BConfig.Listen.AdminAddr)
  209. BConfig.Listen.AdminPort = AppConfig.DefaultInt("AdminPort", BConfig.Listen.AdminPort)
  210. BConfig.Listen.EnableFcgi = AppConfig.DefaultBool("EnableFcgi", BConfig.Listen.EnableFcgi)
  211. BConfig.Listen.EnableStdIo = AppConfig.DefaultBool("EnableStdIo", BConfig.Listen.EnableStdIo)
  212. BConfig.Listen.ServerTimeOut = AppConfig.DefaultInt64("ServerTimeOut", BConfig.Listen.ServerTimeOut)
  213. BConfig.WebConfig.AutoRender = AppConfig.DefaultBool("AutoRender", BConfig.WebConfig.AutoRender)
  214. BConfig.WebConfig.ViewsPath = AppConfig.DefaultString("ViewsPath", BConfig.WebConfig.ViewsPath)
  215. BConfig.WebConfig.DirectoryIndex = AppConfig.DefaultBool("DirectoryIndex", BConfig.WebConfig.DirectoryIndex)
  216. BConfig.WebConfig.FlashName = AppConfig.DefaultString("FlashName", BConfig.WebConfig.FlashName)
  217. BConfig.WebConfig.FlashSeparator = AppConfig.DefaultString("FlashSeparator", BConfig.WebConfig.FlashSeparator)
  218. BConfig.WebConfig.EnableDocs = AppConfig.DefaultBool("EnableDocs", BConfig.WebConfig.EnableDocs)
  219. BConfig.WebConfig.XSRFKey = AppConfig.DefaultString("XSRFKEY", BConfig.WebConfig.XSRFKey)
  220. BConfig.WebConfig.EnableXSRF = AppConfig.DefaultBool("EnableXSRF", BConfig.WebConfig.EnableXSRF)
  221. BConfig.WebConfig.XSRFExpire = AppConfig.DefaultInt("XSRFExpire", BConfig.WebConfig.XSRFExpire)
  222. BConfig.WebConfig.TemplateLeft = AppConfig.DefaultString("TemplateLeft", BConfig.WebConfig.TemplateLeft)
  223. BConfig.WebConfig.TemplateRight = AppConfig.DefaultString("TemplateRight", BConfig.WebConfig.TemplateRight)
  224. BConfig.WebConfig.Session.SessionOn = AppConfig.DefaultBool("SessionOn", BConfig.WebConfig.Session.SessionOn)
  225. BConfig.WebConfig.Session.SessionProvider = AppConfig.DefaultString("SessionProvider", BConfig.WebConfig.Session.SessionProvider)
  226. BConfig.WebConfig.Session.SessionName = AppConfig.DefaultString("SessionName", BConfig.WebConfig.Session.SessionName)
  227. BConfig.WebConfig.Session.SessionProviderConfig = AppConfig.DefaultString("SessionProviderConfig", BConfig.WebConfig.Session.SessionProviderConfig)
  228. BConfig.WebConfig.Session.SessionGCMaxLifetime = AppConfig.DefaultInt64("SessionGCMaxLifetime", BConfig.WebConfig.Session.SessionGCMaxLifetime)
  229. BConfig.WebConfig.Session.SessionCookieLifeTime = AppConfig.DefaultInt("SessionCookieLifeTime", BConfig.WebConfig.Session.SessionCookieLifeTime)
  230. BConfig.WebConfig.Session.SessionAutoSetCookie = AppConfig.DefaultBool("SessionAutoSetCookie", BConfig.WebConfig.Session.SessionAutoSetCookie)
  231. BConfig.WebConfig.Session.SessionDomain = AppConfig.DefaultString("SessionDomain", BConfig.WebConfig.Session.SessionDomain)
  232. BConfig.Log.AccessLogs = AppConfig.DefaultBool("LogAccessLogs", BConfig.Log.AccessLogs)
  233. BConfig.Log.FileLineNum = AppConfig.DefaultBool("LogFileLineNum", BConfig.Log.FileLineNum)
  234. if sd := AppConfig.String("StaticDir"); sd != "" {
  235. for k := range BConfig.WebConfig.StaticDir {
  236. delete(BConfig.WebConfig.StaticDir, k)
  237. }
  238. sds := strings.Fields(sd)
  239. for _, v := range sds {
  240. if url2fsmap := strings.SplitN(v, ":", 2); len(url2fsmap) == 2 {
  241. BConfig.WebConfig.StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[1]
  242. } else {
  243. BConfig.WebConfig.StaticDir["/"+strings.TrimRight(url2fsmap[0], "/")] = url2fsmap[0]
  244. }
  245. }
  246. }
  247. if sgz := AppConfig.String("StaticExtensionsToGzip"); sgz != "" {
  248. extensions := strings.Split(sgz, ",")
  249. fileExts := []string{}
  250. for _, ext := range extensions {
  251. ext = strings.TrimSpace(ext)
  252. if ext == "" {
  253. continue
  254. }
  255. if !strings.HasPrefix(ext, ".") {
  256. ext = "." + ext
  257. }
  258. fileExts = append(fileExts, ext)
  259. }
  260. if len(fileExts) > 0 {
  261. BConfig.WebConfig.StaticExtensionsToGzip = fileExts
  262. }
  263. }
  264. if lo := AppConfig.String("LogOutputs"); lo != "" {
  265. los := strings.Split(lo, ";")
  266. for _, v := range los {
  267. if logType2Config := strings.SplitN(v, ",", 2); len(logType2Config) == 2 {
  268. BConfig.Log.Outputs[logType2Config[0]] = logType2Config[1]
  269. } else {
  270. continue
  271. }
  272. }
  273. }
  274. //init log
  275. BeeLogger.Reset()
  276. for adaptor, config := range BConfig.Log.Outputs {
  277. err = BeeLogger.SetLogger(adaptor, config)
  278. if err != nil {
  279. fmt.Printf("%s with the config `%s` got err:%s\n", adaptor, config, err)
  280. }
  281. }
  282. SetLogFuncCall(BConfig.Log.FileLineNum)
  283. return nil
  284. }
  285. // LoadAppConfig allow developer to apply a config file
  286. func LoadAppConfig(adapterName, configPath string) error {
  287. absConfigPath, err := filepath.Abs(configPath)
  288. if err != nil {
  289. return err
  290. }
  291. if !utils.FileExists(absConfigPath) {
  292. return fmt.Errorf("the target config file: %s don't exist", configPath)
  293. }
  294. if absConfigPath == appConfigPath {
  295. return nil
  296. }
  297. appConfigPath = absConfigPath
  298. appConfigProvider = adapterName
  299. return parseConfig(appConfigPath)
  300. }
  301. type beegoAppConfig struct {
  302. innerConfig config.Configer
  303. }
  304. func newAppConfig(appConfigProvider, appConfigPath string) (*beegoAppConfig, error) {
  305. ac, err := config.NewConfig(appConfigProvider, appConfigPath)
  306. if err != nil {
  307. return nil, err
  308. }
  309. return &beegoAppConfig{ac}, nil
  310. }
  311. func (b *beegoAppConfig) Set(key, val string) error {
  312. if err := b.innerConfig.Set(BConfig.RunMode+"::"+key, val); err != nil {
  313. return err
  314. }
  315. return b.innerConfig.Set(key, val)
  316. }
  317. func (b *beegoAppConfig) String(key string) string {
  318. if v := b.innerConfig.String(BConfig.RunMode + "::" + key); v != "" {
  319. return v
  320. }
  321. return b.innerConfig.String(key)
  322. }
  323. func (b *beegoAppConfig) Strings(key string) []string {
  324. if v := b.innerConfig.Strings(BConfig.RunMode + "::" + key); v[0] != "" {
  325. return v
  326. }
  327. return b.innerConfig.Strings(key)
  328. }
  329. func (b *beegoAppConfig) Int(key string) (int, error) {
  330. if v, err := b.innerConfig.Int(BConfig.RunMode + "::" + key); err == nil {
  331. return v, nil
  332. }
  333. return b.innerConfig.Int(key)
  334. }
  335. func (b *beegoAppConfig) Int64(key string) (int64, error) {
  336. if v, err := b.innerConfig.Int64(BConfig.RunMode + "::" + key); err == nil {
  337. return v, nil
  338. }
  339. return b.innerConfig.Int64(key)
  340. }
  341. func (b *beegoAppConfig) Bool(key string) (bool, error) {
  342. if v, err := b.innerConfig.Bool(BConfig.RunMode + "::" + key); err == nil {
  343. return v, nil
  344. }
  345. return b.innerConfig.Bool(key)
  346. }
  347. func (b *beegoAppConfig) Float(key string) (float64, error) {
  348. if v, err := b.innerConfig.Float(BConfig.RunMode + "::" + key); err == nil {
  349. return v, nil
  350. }
  351. return b.innerConfig.Float(key)
  352. }
  353. func (b *beegoAppConfig) DefaultString(key string, defaultVal string) string {
  354. if v := b.String(key); v != "" {
  355. return v
  356. }
  357. return defaultVal
  358. }
  359. func (b *beegoAppConfig) DefaultStrings(key string, defaultVal []string) []string {
  360. if v := b.Strings(key); len(v) != 0 {
  361. return v
  362. }
  363. return defaultVal
  364. }
  365. func (b *beegoAppConfig) DefaultInt(key string, defaultVal int) int {
  366. if v, err := b.Int(key); err == nil {
  367. return v
  368. }
  369. return defaultVal
  370. }
  371. func (b *beegoAppConfig) DefaultInt64(key string, defaultVal int64) int64 {
  372. if v, err := b.Int64(key); err == nil {
  373. return v
  374. }
  375. return defaultVal
  376. }
  377. func (b *beegoAppConfig) DefaultBool(key string, defaultVal bool) bool {
  378. if v, err := b.Bool(key); err == nil {
  379. return v
  380. }
  381. return defaultVal
  382. }
  383. func (b *beegoAppConfig) DefaultFloat(key string, defaultVal float64) float64 {
  384. if v, err := b.Float(key); err == nil {
  385. return v
  386. }
  387. return defaultVal
  388. }
  389. func (b *beegoAppConfig) DIY(key string) (interface{}, error) {
  390. return b.innerConfig.DIY(key)
  391. }
  392. func (b *beegoAppConfig) GetSection(section string) (map[string]string, error) {
  393. return b.innerConfig.GetSection(section)
  394. }
  395. func (b *beegoAppConfig) SaveConfigFile(filename string) error {
  396. return b.innerConfig.SaveConfigFile(filename)
  397. }