conf.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package base
  5. import (
  6. "fmt"
  7. "os"
  8. "os/exec"
  9. "path"
  10. "path/filepath"
  11. "strings"
  12. "github.com/Unknwon/com"
  13. "github.com/Unknwon/goconfig"
  14. qlog "github.com/qiniu/log"
  15. "github.com/gogits/cache"
  16. "github.com/gogits/session"
  17. "github.com/gogits/gogs/modules/log"
  18. )
  19. // Mailer represents mail service.
  20. type Mailer struct {
  21. Name string
  22. Host string
  23. User, Passwd string
  24. }
  25. // Oauther represents oauth service.
  26. type Oauther struct {
  27. GitHub struct {
  28. Enabled bool
  29. ClientId, ClientSecret string
  30. }
  31. }
  32. var (
  33. AppVer string
  34. AppName string
  35. AppLogo string
  36. AppUrl string
  37. Domain string
  38. SecretKey string
  39. RunUser string
  40. RepoRootPath string
  41. InstallLock bool
  42. LogInRememberDays int
  43. CookieUserName string
  44. CookieRememberName string
  45. Cfg *goconfig.ConfigFile
  46. MailService *Mailer
  47. OauthService *Oauther
  48. LogMode string
  49. LogConfig string
  50. Cache cache.Cache
  51. CacheAdapter string
  52. CacheConfig string
  53. SessionProvider string
  54. SessionConfig *session.Config
  55. SessionManager *session.Manager
  56. PictureService string
  57. )
  58. var Service struct {
  59. RegisterEmailConfirm bool
  60. DisenableRegisteration bool
  61. RequireSignInView bool
  62. EnableCacheAvatar bool
  63. NotifyMail bool
  64. ActiveCodeLives int
  65. ResetPwdCodeLives int
  66. }
  67. func ExecDir() (string, error) {
  68. file, err := exec.LookPath(os.Args[0])
  69. if err != nil {
  70. return "", err
  71. }
  72. p, err := filepath.Abs(file)
  73. if err != nil {
  74. return "", err
  75. }
  76. return path.Dir(strings.Replace(p, "\\", "/", -1)), nil
  77. }
  78. var logLevels = map[string]string{
  79. "Trace": "0",
  80. "Debug": "1",
  81. "Info": "2",
  82. "Warn": "3",
  83. "Error": "4",
  84. "Critical": "5",
  85. }
  86. func newService() {
  87. Service.ActiveCodeLives = Cfg.MustInt("service", "ACTIVE_CODE_LIVE_MINUTES", 180)
  88. Service.ResetPwdCodeLives = Cfg.MustInt("service", "RESET_PASSWD_CODE_LIVE_MINUTES", 180)
  89. Service.DisenableRegisteration = Cfg.MustBool("service", "DISENABLE_REGISTERATION", false)
  90. Service.RequireSignInView = Cfg.MustBool("service", "REQUIRE_SIGNIN_VIEW", false)
  91. Service.EnableCacheAvatar = Cfg.MustBool("service", "ENABLE_CACHE_AVATAR", false)
  92. }
  93. func newLogService() {
  94. // Get and check log mode.
  95. LogMode = Cfg.MustValue("log", "MODE", "console")
  96. modeSec := "log." + LogMode
  97. if _, err := Cfg.GetSection(modeSec); err != nil {
  98. qlog.Fatalf("Unknown log mode: %s\n", LogMode)
  99. }
  100. // Log level.
  101. levelName := Cfg.MustValue("log."+LogMode, "LEVEL", "Trace")
  102. level, ok := logLevels[levelName]
  103. if !ok {
  104. qlog.Fatalf("Unknown log level: %s\n", levelName)
  105. }
  106. // Generate log configuration.
  107. switch LogMode {
  108. case "console":
  109. LogConfig = fmt.Sprintf(`{"level":%s}`, level)
  110. case "file":
  111. logPath := Cfg.MustValue(modeSec, "FILE_NAME", "log/gogs.log")
  112. os.MkdirAll(path.Dir(logPath), os.ModePerm)
  113. LogConfig = fmt.Sprintf(
  114. `{"level":%s,"filename":"%s","rotate":%v,"maxlines":%d,"maxsize":%d,"daily":%v,"maxdays":%d}`, level,
  115. logPath,
  116. Cfg.MustBool(modeSec, "LOG_ROTATE", true),
  117. Cfg.MustInt(modeSec, "MAX_LINES", 1000000),
  118. 1<<uint(Cfg.MustInt(modeSec, "MAX_SIZE_SHIFT", 28)),
  119. Cfg.MustBool(modeSec, "DAILY_ROTATE", true),
  120. Cfg.MustInt(modeSec, "MAX_DAYS", 7))
  121. case "conn":
  122. LogConfig = fmt.Sprintf(`{"level":"%s","reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level,
  123. Cfg.MustBool(modeSec, "RECONNECT_ON_MSG", false),
  124. Cfg.MustBool(modeSec, "RECONNECT", false),
  125. Cfg.MustValue(modeSec, "PROTOCOL", "tcp"),
  126. Cfg.MustValue(modeSec, "ADDR", ":7020"))
  127. case "smtp":
  128. LogConfig = fmt.Sprintf(`{"level":"%s","username":"%s","password":"%s","host":"%s","sendTos":"%s","subject":"%s"}`, level,
  129. Cfg.MustValue(modeSec, "USER", "example@example.com"),
  130. Cfg.MustValue(modeSec, "PASSWD", "******"),
  131. Cfg.MustValue(modeSec, "HOST", "127.0.0.1:25"),
  132. Cfg.MustValue(modeSec, "RECEIVERS", "[]"),
  133. Cfg.MustValue(modeSec, "SUBJECT", "Diagnostic message from serve"))
  134. case "database":
  135. LogConfig = fmt.Sprintf(`{"level":"%s","driver":"%s","conn":"%s"}`, level,
  136. Cfg.MustValue(modeSec, "Driver"),
  137. Cfg.MustValue(modeSec, "CONN"))
  138. }
  139. log.Info("%s %s", AppName, AppVer)
  140. log.NewLogger(Cfg.MustInt64("log", "BUFFER_LEN", 10000), LogMode, LogConfig)
  141. log.Info("Log Mode: %s(%s)", strings.Title(LogMode), levelName)
  142. }
  143. func newCacheService() {
  144. CacheAdapter = Cfg.MustValue("cache", "ADAPTER", "memory")
  145. switch CacheAdapter {
  146. case "memory":
  147. CacheConfig = fmt.Sprintf(`{"interval":%d}`, Cfg.MustInt("cache", "INTERVAL", 60))
  148. case "redis", "memcache":
  149. CacheConfig = fmt.Sprintf(`{"conn":"%s"}`, Cfg.MustValue("cache", "HOST"))
  150. default:
  151. qlog.Fatalf("Unknown cache adapter: %s\n", CacheAdapter)
  152. }
  153. var err error
  154. Cache, err = cache.NewCache(CacheAdapter, CacheConfig)
  155. if err != nil {
  156. qlog.Fatalf("Init cache system failed, adapter: %s, config: %s, %v\n",
  157. CacheAdapter, CacheConfig, err)
  158. }
  159. log.Info("Cache Service Enabled")
  160. }
  161. func newSessionService() {
  162. SessionProvider = Cfg.MustValue("session", "PROVIDER", "memory")
  163. SessionConfig = new(session.Config)
  164. SessionConfig.ProviderConfig = Cfg.MustValue("session", "PROVIDER_CONFIG")
  165. SessionConfig.CookieName = Cfg.MustValue("session", "COOKIE_NAME", "i_like_gogits")
  166. SessionConfig.CookieSecure = Cfg.MustBool("session", "COOKIE_SECURE")
  167. SessionConfig.EnableSetCookie = Cfg.MustBool("session", "ENABLE_SET_COOKIE", true)
  168. SessionConfig.GcIntervalTime = Cfg.MustInt64("session", "GC_INTERVAL_TIME", 86400)
  169. SessionConfig.SessionLifeTime = Cfg.MustInt64("session", "SESSION_LIFE_TIME", 86400)
  170. SessionConfig.SessionIDHashFunc = Cfg.MustValue("session", "SESSION_ID_HASHFUNC", "sha1")
  171. SessionConfig.SessionIDHashKey = Cfg.MustValue("session", "SESSION_ID_HASHKEY")
  172. if SessionProvider == "file" {
  173. os.MkdirAll(path.Dir(SessionConfig.ProviderConfig), os.ModePerm)
  174. }
  175. var err error
  176. SessionManager, err = session.NewManager(SessionProvider, *SessionConfig)
  177. if err != nil {
  178. qlog.Fatalf("Init session system failed, provider: %s, %v\n",
  179. SessionProvider, err)
  180. }
  181. log.Info("Session Service Enabled")
  182. }
  183. func newMailService() {
  184. // Check mailer setting.
  185. if !Cfg.MustBool("mailer", "ENABLED") {
  186. return
  187. }
  188. MailService = &Mailer{
  189. Name: Cfg.MustValue("mailer", "NAME", AppName),
  190. Host: Cfg.MustValue("mailer", "HOST"),
  191. User: Cfg.MustValue("mailer", "USER"),
  192. Passwd: Cfg.MustValue("mailer", "PASSWD"),
  193. }
  194. log.Info("Mail Service Enabled")
  195. }
  196. func newRegisterMailService() {
  197. if !Cfg.MustBool("service", "REGISTER_EMAIL_CONFIRM") {
  198. return
  199. } else if MailService == nil {
  200. log.Warn("Register Mail Service: Mail Service is not enabled")
  201. return
  202. }
  203. Service.RegisterEmailConfirm = true
  204. log.Info("Register Mail Service Enabled")
  205. }
  206. func newNotifyMailService() {
  207. if !Cfg.MustBool("service", "ENABLE_NOTIFY_MAIL") {
  208. return
  209. } else if MailService == nil {
  210. log.Warn("Notify Mail Service: Mail Service is not enabled")
  211. return
  212. }
  213. Service.NotifyMail = true
  214. log.Info("Notify Mail Service Enabled")
  215. }
  216. func newOauthService() {
  217. if !Cfg.MustBool("oauth", "ENABLED") {
  218. return
  219. }
  220. OauthService = &Oauther{}
  221. oauths := make([]string, 0, 10)
  222. // GitHub.
  223. if Cfg.MustBool("oauth.github", "ENABLED") {
  224. OauthService.GitHub.Enabled = true
  225. OauthService.GitHub.ClientId = Cfg.MustValue("oauth.github", "CLIENT_ID")
  226. OauthService.GitHub.ClientSecret = Cfg.MustValue("oauth.github", "CLIENT_SECRET")
  227. oauths = append(oauths, "GitHub")
  228. }
  229. log.Info("Oauth Service Enabled %s", oauths)
  230. }
  231. func NewConfigContext() {
  232. //var err error
  233. workDir, err := ExecDir()
  234. if err != nil {
  235. qlog.Fatalf("Fail to get work directory: %s\n", err)
  236. }
  237. cfgPath := filepath.Join(workDir, "conf/app.ini")
  238. Cfg, err = goconfig.LoadConfigFile(cfgPath)
  239. if err != nil {
  240. qlog.Fatalf("Cannot load config file(%s): %v\n", cfgPath, err)
  241. }
  242. Cfg.BlockMode = false
  243. cfgPath = filepath.Join(workDir, "custom/conf/app.ini")
  244. if com.IsFile(cfgPath) {
  245. if err = Cfg.AppendFiles(cfgPath); err != nil {
  246. qlog.Fatalf("Cannot load config file(%s): %v\n", cfgPath, err)
  247. }
  248. }
  249. AppName = Cfg.MustValue("", "APP_NAME", "Gogs: Go Git Service")
  250. AppLogo = Cfg.MustValue("", "APP_LOGO", "img/favicon.png")
  251. AppUrl = Cfg.MustValue("server", "ROOT_URL")
  252. Domain = Cfg.MustValue("server", "DOMAIN")
  253. SecretKey = Cfg.MustValue("security", "SECRET_KEY")
  254. InstallLock = Cfg.MustBool("security", "INSTALL_LOCK", false)
  255. RunUser = Cfg.MustValue("", "RUN_USER")
  256. curUser := os.Getenv("USERNAME")
  257. if len(curUser) == 0 {
  258. curUser = os.Getenv("USER")
  259. }
  260. // Does not check run user when the install lock is off.
  261. if InstallLock && RunUser != curUser {
  262. qlog.Fatalf("Expect user(%s) but current user is: %s\n", RunUser, curUser)
  263. }
  264. LogInRememberDays = Cfg.MustInt("security", "LOGIN_REMEMBER_DAYS")
  265. CookieUserName = Cfg.MustValue("security", "COOKIE_USERNAME")
  266. CookieRememberName = Cfg.MustValue("security", "COOKIE_REMEMBER_NAME")
  267. PictureService = Cfg.MustValue("picture", "SERVICE")
  268. // Determine and create root git reposiroty path.
  269. homeDir, err := com.HomeDir()
  270. if err != nil {
  271. qlog.Fatalf("Fail to get home directory): %v\n", err)
  272. }
  273. RepoRootPath = Cfg.MustValue("repository", "ROOT", filepath.Join(homeDir, "gogs-repositories"))
  274. if err = os.MkdirAll(RepoRootPath, os.ModePerm); err != nil {
  275. qlog.Fatalf("Fail to create RepoRootPath(%s): %v\n", RepoRootPath, err)
  276. }
  277. }
  278. func NewServices() {
  279. newService()
  280. newLogService()
  281. newCacheService()
  282. newSessionService()
  283. newMailService()
  284. newRegisterMailService()
  285. newNotifyMailService()
  286. newOauthService()
  287. }