You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

install.go 9.5 kB

11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
10 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
10 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  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 routers
  5. import (
  6. "errors"
  7. "os"
  8. "os/exec"
  9. "path"
  10. "path/filepath"
  11. "strings"
  12. "github.com/Unknwon/com"
  13. "github.com/Unknwon/macaron"
  14. "github.com/go-xorm/xorm"
  15. "gopkg.in/ini.v1"
  16. "github.com/gogits/gogs/models"
  17. "github.com/gogits/gogs/models/cron"
  18. "github.com/gogits/gogs/modules/auth"
  19. "github.com/gogits/gogs/modules/base"
  20. "github.com/gogits/gogs/modules/log"
  21. "github.com/gogits/gogs/modules/mailer"
  22. "github.com/gogits/gogs/modules/middleware"
  23. "github.com/gogits/gogs/modules/setting"
  24. "github.com/gogits/gogs/modules/social"
  25. "github.com/gogits/gogs/modules/user"
  26. )
  27. const (
  28. INSTALL base.TplName = "install"
  29. )
  30. func checkRunMode() {
  31. switch setting.Cfg.Section("").Key("RUN_MODE").String() {
  32. case "prod":
  33. macaron.Env = macaron.PROD
  34. macaron.ColorLog = false
  35. setting.ProdMode = true
  36. }
  37. log.Info("Run Mode: %s", strings.Title(macaron.Env))
  38. }
  39. func NewServices() {
  40. setting.NewServices()
  41. social.NewOauthService()
  42. }
  43. // GlobalInit is for global configuration reload-able.
  44. func GlobalInit() {
  45. setting.NewConfigContext()
  46. log.Trace("Custom path: %s", setting.CustomPath)
  47. log.Trace("Log path: %s", setting.LogRootPath)
  48. mailer.NewMailerContext()
  49. models.LoadModelsConfig()
  50. NewServices()
  51. if setting.InstallLock {
  52. models.LoadRepoConfig()
  53. models.NewRepoContext()
  54. if err := models.NewEngine(); err != nil {
  55. log.Fatal(4, "Fail to initialize ORM engine: %v", err)
  56. }
  57. models.HasEngine = true
  58. cron.NewCronContext()
  59. models.InitDeliverHooks()
  60. log.NewGitLogger(path.Join(setting.LogRootPath, "http.log"))
  61. }
  62. if models.EnableSQLite3 {
  63. log.Info("SQLite3 Supported")
  64. }
  65. checkRunMode()
  66. }
  67. func InstallInit(ctx *middleware.Context) {
  68. if setting.InstallLock {
  69. ctx.Handle(404, "Install", errors.New("Installation is prohibited"))
  70. return
  71. }
  72. ctx.Data["Title"] = ctx.Tr("install.install")
  73. ctx.Data["PageIsInstall"] = true
  74. ctx.Data["DbOptions"] = []string{"MySQL", "PostgreSQL", "SQLite3"}
  75. }
  76. func Install(ctx *middleware.Context) {
  77. form := auth.InstallForm{}
  78. // Database settings
  79. form.DbHost = models.DbCfg.Host
  80. form.DbUser = models.DbCfg.User
  81. form.DbName = models.DbCfg.Name
  82. form.DbPath = models.DbCfg.Path
  83. if models.EnableSQLite3 {
  84. ctx.Data["CurDbOption"] = "SQLite3" // Default when enabled.
  85. } else {
  86. ctx.Data["CurDbOption"] = "MySQL"
  87. }
  88. // Application general settings
  89. form.AppName = setting.AppName
  90. form.RepoRootPath = setting.RepoRootPath
  91. // Note(unknwon): it's hard for Windows users change a running user,
  92. // so just use current one if config says default.
  93. if setting.IsWindows && setting.RunUser == "git" {
  94. form.RunUser = user.CurrentUsername()
  95. } else {
  96. form.RunUser = setting.RunUser
  97. }
  98. form.Domain = setting.Domain
  99. form.SSHPort = setting.SSHPort
  100. form.HTTPPort = setting.HttpPort
  101. form.AppUrl = setting.AppUrl
  102. // E-mail service settings
  103. if setting.MailService != nil {
  104. form.SMTPHost = setting.MailService.Host
  105. form.SMTPFrom = setting.MailService.From
  106. form.SMTPEmail = setting.MailService.User
  107. }
  108. form.RegisterConfirm = setting.Service.RegisterEmailConfirm
  109. form.MailNotify = setting.Service.EnableNotifyMail
  110. // Server and other services settings
  111. form.OfflineMode = setting.OfflineMode
  112. form.DisableGravatar = setting.DisableGravatar
  113. form.DisableRegistration = setting.Service.DisableRegistration
  114. form.RequireSignInView = setting.Service.RequireSignInView
  115. auth.AssignForm(form, ctx.Data)
  116. ctx.HTML(200, INSTALL)
  117. }
  118. func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
  119. ctx.Data["CurDbOption"] = form.DbType
  120. if ctx.HasError() {
  121. if ctx.HasValue("Err_SMTPEmail") {
  122. ctx.Data["Err_SMTP"] = true
  123. }
  124. if ctx.HasValue("Err_AdminName") ||
  125. ctx.HasValue("Err_AdminPasswd") ||
  126. ctx.HasValue("Err_AdminEmail") {
  127. ctx.Data["Err_Admin"] = true
  128. }
  129. ctx.HTML(200, INSTALL)
  130. return
  131. }
  132. if _, err := exec.LookPath("git"); err != nil {
  133. ctx.RenderWithErr(ctx.Tr("install.test_git_failed", err), INSTALL, &form)
  134. return
  135. }
  136. // Pass basic check, now test configuration.
  137. // Test database setting.
  138. dbTypes := map[string]string{"MySQL": "mysql", "PostgreSQL": "postgres", "SQLite3": "sqlite3"}
  139. models.DbCfg.Type = dbTypes[form.DbType]
  140. models.DbCfg.Host = form.DbHost
  141. models.DbCfg.User = form.DbUser
  142. models.DbCfg.Passwd = form.DbPasswd
  143. models.DbCfg.Name = form.DbName
  144. models.DbCfg.SSLMode = form.SSLMode
  145. models.DbCfg.Path = form.DbPath
  146. if models.DbCfg.Type == "sqlite3" && len(models.DbCfg.Path) == 0 {
  147. ctx.Data["Err_DbPath"] = true
  148. ctx.RenderWithErr(ctx.Tr("install.err_empty_sqlite_path"), INSTALL, &form)
  149. return
  150. }
  151. // Set test engine.
  152. var x *xorm.Engine
  153. if err := models.NewTestEngine(x); err != nil {
  154. if strings.Contains(err.Error(), `Unknown database type: sqlite3`) {
  155. ctx.Data["Err_DbType"] = true
  156. ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available", "http://gogs.io/docs/installation/install_from_binary.html"), INSTALL, &form)
  157. } else {
  158. ctx.Data["Err_DbSetting"] = true
  159. ctx.RenderWithErr(ctx.Tr("install.invalid_db_setting", err), INSTALL, &form)
  160. }
  161. return
  162. }
  163. // Test repository root path.
  164. if err := os.MkdirAll(form.RepoRootPath, os.ModePerm); err != nil {
  165. ctx.Data["Err_RepoRootPath"] = true
  166. ctx.RenderWithErr(ctx.Tr("install.invalid_repo_path", err), INSTALL, &form)
  167. return
  168. }
  169. // Check run user.
  170. curUser := user.CurrentUsername()
  171. if form.RunUser != curUser {
  172. ctx.Data["Err_RunUser"] = true
  173. ctx.RenderWithErr(ctx.Tr("install.run_user_not_match", form.RunUser, curUser), INSTALL, &form)
  174. return
  175. }
  176. // Check admin password.
  177. if form.AdminPasswd != form.AdminConfirmPasswd {
  178. ctx.Data["Err_Admin"] = true
  179. ctx.Data["Err_AdminPasswd"] = true
  180. ctx.RenderWithErr(ctx.Tr("form.password_not_match"), INSTALL, form)
  181. return
  182. }
  183. if form.AppUrl[len(form.AppUrl)-1] != '/' {
  184. form.AppUrl += "/"
  185. }
  186. // Save settings.
  187. cfg := ini.Empty()
  188. if com.IsFile(setting.CustomConf) {
  189. // Keeps custom settings if there is already something.
  190. if err := cfg.Append(setting.CustomConf); err != nil {
  191. log.Error(4, "Fail to load custom conf '%s': %v", setting.CustomConf, err)
  192. }
  193. }
  194. cfg.Section("database").Key("DB_TYPE").SetValue(models.DbCfg.Type)
  195. cfg.Section("database").Key("HOST").SetValue(models.DbCfg.Host)
  196. cfg.Section("database").Key("NAME").SetValue(models.DbCfg.Name)
  197. cfg.Section("database").Key("USER").SetValue(models.DbCfg.User)
  198. cfg.Section("database").Key("PASSWD").SetValue(models.DbCfg.Passwd)
  199. cfg.Section("database").Key("SSL_MODE").SetValue(models.DbCfg.SSLMode)
  200. cfg.Section("database").Key("PATH").SetValue(models.DbCfg.Path)
  201. cfg.Section("").Key("APP_NAME").SetValue(form.AppName)
  202. cfg.Section("repository").Key("ROOT").SetValue(form.RepoRootPath)
  203. cfg.Section("").Key("RUN_USER").SetValue(form.RunUser)
  204. cfg.Section("server").Key("DOMAIN").SetValue(form.Domain)
  205. cfg.Section("server").Key("HTTP_PORT").SetValue(form.HTTPPort)
  206. cfg.Section("server").Key("ROOT_URL").SetValue(form.AppUrl)
  207. if form.SSHPort == 0 {
  208. cfg.Section("server").Key("DISABLE_SSH").SetValue("true")
  209. } else {
  210. cfg.Section("server").Key("DISABLE_SSH").SetValue("false")
  211. cfg.Section("server").Key("SSH_PORT").SetValue(com.ToStr(form.SSHPort))
  212. }
  213. if len(strings.TrimSpace(form.SMTPHost)) > 0 {
  214. cfg.Section("mailer").Key("ENABLED").SetValue("true")
  215. cfg.Section("mailer").Key("HOST").SetValue(form.SMTPHost)
  216. cfg.Section("mailer").Key("FROM").SetValue(form.SMTPFrom)
  217. cfg.Section("mailer").Key("USER").SetValue(form.SMTPEmail)
  218. cfg.Section("mailer").Key("PASSWD").SetValue(form.SMTPPasswd)
  219. } else {
  220. cfg.Section("mailer").Key("ENABLED").SetValue("false")
  221. }
  222. cfg.Section("service").Key("REGISTER_EMAIL_CONFIRM").SetValue(com.ToStr(form.RegisterConfirm))
  223. cfg.Section("service").Key("ENABLE_NOTIFY_MAIL").SetValue(com.ToStr(form.MailNotify))
  224. cfg.Section("server").Key("OFFLINE_MODE").SetValue(com.ToStr(form.OfflineMode))
  225. cfg.Section("picture").Key("DISABLE_GRAVATAR").SetValue(com.ToStr(form.DisableGravatar))
  226. cfg.Section("service").Key("DISABLE_REGISTRATION").SetValue(com.ToStr(form.DisableRegistration))
  227. cfg.Section("service").Key("REQUIRE_SIGNIN_VIEW").SetValue(com.ToStr(form.RequireSignInView))
  228. cfg.Section("").Key("RUN_MODE").SetValue("prod")
  229. cfg.Section("session").Key("PROVIDER").SetValue("file")
  230. cfg.Section("log").Key("MODE").SetValue("file")
  231. cfg.Section("log").Key("LEVEL").SetValue("Info")
  232. cfg.Section("security").Key("INSTALL_LOCK").SetValue("true")
  233. cfg.Section("security").Key("SECRET_KEY").SetValue(base.GetRandomString(15))
  234. os.MkdirAll(filepath.Dir(setting.CustomConf), os.ModePerm)
  235. if err := cfg.SaveTo(setting.CustomConf); err != nil {
  236. ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), INSTALL, &form)
  237. return
  238. }
  239. GlobalInit()
  240. // Create admin account.
  241. if len(form.AdminName) > 0 {
  242. if err := models.CreateUser(&models.User{
  243. Name: form.AdminName,
  244. Email: form.AdminEmail,
  245. Passwd: form.AdminPasswd,
  246. IsAdmin: true,
  247. IsActive: true,
  248. }); err != nil {
  249. if !models.IsErrUserAlreadyExist(err) {
  250. setting.InstallLock = false
  251. ctx.Data["Err_AdminName"] = true
  252. ctx.Data["Err_AdminEmail"] = true
  253. ctx.RenderWithErr(ctx.Tr("install.invalid_admin_setting", err), INSTALL, &form)
  254. return
  255. }
  256. log.Info("Admin account already exist")
  257. }
  258. }
  259. log.Info("First-time run install finished!")
  260. ctx.Flash.Success(ctx.Tr("install.install_success"))
  261. ctx.Redirect(form.AppUrl + "user/login")
  262. }