All configuration reload-able
This commit is contained in:
parent
369ddf76a8
commit
f6596f11c4
13 changed files with 88 additions and 45 deletions
|
@ -28,6 +28,7 @@ There are some very good products in this category such as [gitlab](http://gitla
|
|||
- Repository viewer.
|
||||
- Gravatar support.
|
||||
- Mail service(register).
|
||||
- Administration panel.
|
||||
- Supports MySQL, PostgreSQL and SQLite3(binary release only).
|
||||
|
||||
## Installation
|
||||
|
|
|
@ -16,30 +16,39 @@ import (
|
|||
"github.com/gogits/gogs/modules/base"
|
||||
)
|
||||
|
||||
var orm *xorm.Engine
|
||||
var (
|
||||
orm *xorm.Engine
|
||||
|
||||
dbCfg struct {
|
||||
Type, Host, Name, User, Pwd, Path, SslMode string
|
||||
}
|
||||
)
|
||||
|
||||
func LoadModelsConfig() {
|
||||
dbCfg.Type = base.Cfg.MustValue("database", "DB_TYPE")
|
||||
dbCfg.Host = base.Cfg.MustValue("database", "HOST")
|
||||
dbCfg.Name = base.Cfg.MustValue("database", "NAME")
|
||||
dbCfg.User = base.Cfg.MustValue("database", "USER")
|
||||
dbCfg.Pwd = base.Cfg.MustValue("database", "PASSWD")
|
||||
dbCfg.Path = base.Cfg.MustValue("database", "PATH", "data/gogs.db")
|
||||
dbCfg.SslMode = base.Cfg.MustValue("database", "SSL_MODE")
|
||||
}
|
||||
|
||||
func setEngine() {
|
||||
dbType := base.Cfg.MustValue("database", "DB_TYPE")
|
||||
dbHost := base.Cfg.MustValue("database", "HOST")
|
||||
dbName := base.Cfg.MustValue("database", "NAME")
|
||||
dbUser := base.Cfg.MustValue("database", "USER")
|
||||
dbPwd := base.Cfg.MustValue("database", "PASSWD")
|
||||
dbPath := base.Cfg.MustValue("database", "PATH", "data/gogs.db")
|
||||
sslMode := base.Cfg.MustValue("database", "SSL_MODE")
|
||||
|
||||
var err error
|
||||
switch dbType {
|
||||
switch dbCfg.Type {
|
||||
case "mysql":
|
||||
orm, err = xorm.NewEngine("mysql", fmt.Sprintf("%s:%s@%s/%s?charset=utf8",
|
||||
dbUser, dbPwd, dbHost, dbName))
|
||||
dbCfg.User, dbCfg.Pwd, dbCfg.Host, dbCfg.Name))
|
||||
case "postgres":
|
||||
orm, err = xorm.NewEngine("postgres", fmt.Sprintf("user=%s password=%s dbname=%s sslmode=%s",
|
||||
dbUser, dbPwd, dbName, sslMode))
|
||||
dbCfg.User, dbCfg.Pwd, dbCfg.Name, dbCfg.SslMode))
|
||||
case "sqlite3":
|
||||
os.MkdirAll(path.Dir(dbPath), os.ModePerm)
|
||||
orm, err = xorm.NewEngine("sqlite3", dbPath)
|
||||
os.MkdirAll(path.Dir(dbCfg.Path), os.ModePerm)
|
||||
orm, err = xorm.NewEngine("sqlite3", dbCfg.Path)
|
||||
default:
|
||||
fmt.Printf("Unknown database type: %s\n", dbType)
|
||||
fmt.Printf("Unknown database type: %s\n", dbCfg.Type)
|
||||
os.Exit(2)
|
||||
}
|
||||
if err != nil {
|
||||
|
@ -61,7 +70,7 @@ func setEngine() {
|
|||
orm.ShowSQL = true
|
||||
}
|
||||
|
||||
func init() {
|
||||
func NewEngine() {
|
||||
setEngine()
|
||||
if err := orm.Sync(new(User), new(PublicKey), new(Repository), new(Watch),
|
||||
new(Action), new(Access)); err != nil {
|
||||
|
|
|
@ -13,6 +13,9 @@ import (
|
|||
)
|
||||
|
||||
func init() {
|
||||
LoadModelsConfig()
|
||||
NewEngine()
|
||||
|
||||
var err error
|
||||
orm, err = xorm.NewEngine("sqlite3", "./test.db")
|
||||
if err != nil {
|
||||
|
|
|
@ -41,10 +41,12 @@ var (
|
|||
LanguageIgns, Licenses []string
|
||||
)
|
||||
|
||||
func init() {
|
||||
func LoadRepoConfig() {
|
||||
LanguageIgns = strings.Split(base.Cfg.MustValue("repository", "LANG_IGNS"), "|")
|
||||
Licenses = strings.Split(base.Cfg.MustValue("repository", "LICENSES"), "|")
|
||||
}
|
||||
|
||||
func NewRepoContext() {
|
||||
zip.Verbose = false
|
||||
|
||||
// Check if server has basic git setting.
|
||||
|
|
|
@ -148,7 +148,7 @@ func newRegisterMailService() {
|
|||
log.Info("Register Mail Service Enabled")
|
||||
}
|
||||
|
||||
func init() {
|
||||
func NewConfigContext() {
|
||||
var err error
|
||||
workDir, err := exeDir()
|
||||
if err != nil {
|
||||
|
|
|
@ -40,7 +40,7 @@ func (m Message) Content() string {
|
|||
|
||||
var mailQueue chan *Message
|
||||
|
||||
func init() {
|
||||
func NewMailerContext() {
|
||||
mailQueue = make(chan *Message, base.Cfg.MustInt("mailer", "SEND_BUFFER_LEN", 10))
|
||||
go processMailQueue()
|
||||
}
|
||||
|
|
|
@ -11,12 +11,14 @@ import (
|
|||
|
||||
func Dashboard(ctx *middleware.Context) {
|
||||
ctx.Data["Title"] = "Admin Dashboard"
|
||||
ctx.Data["PageIsDashboard"] = true
|
||||
ctx.Data["Stats"] = models.GetStatistic()
|
||||
ctx.HTML(200, "admin/dashboard")
|
||||
}
|
||||
|
||||
func Users(ctx *middleware.Context) {
|
||||
ctx.Data["Title"] = "User Management"
|
||||
ctx.Data["PageIsUsers"] = true
|
||||
|
||||
var err error
|
||||
ctx.Data["Users"], err = models.GetUsers(100, 0)
|
||||
|
@ -29,6 +31,8 @@ func Users(ctx *middleware.Context) {
|
|||
|
||||
func Repositories(ctx *middleware.Context) {
|
||||
ctx.Data["Title"] = "Repository Management"
|
||||
ctx.Data["PageIsRepos"] = true
|
||||
|
||||
var err error
|
||||
ctx.Data["Repos"], err = models.GetRepos(100, 0)
|
||||
if err != nil {
|
||||
|
@ -37,3 +41,9 @@ func Repositories(ctx *middleware.Context) {
|
|||
}
|
||||
ctx.HTML(200, "admin/repos")
|
||||
}
|
||||
|
||||
func Config(ctx *middleware.Context) {
|
||||
ctx.Data["Title"] = "Server Configuration"
|
||||
ctx.Data["PageIsConfig"] = true
|
||||
ctx.HTML(200, "admin/config")
|
||||
}
|
||||
|
|
17
templates/admin/config.tmpl
Normal file
17
templates/admin/config.tmpl
Normal file
|
@ -0,0 +1,17 @@
|
|||
{{template "base/head" .}}
|
||||
{{template "base/navbar" .}}
|
||||
<div id="gogs-body" class="container" data-page="admin">
|
||||
{{template "admin/nav" .}}
|
||||
<div id="gogs-admin-container" class="col-md-9">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
Server Configuration
|
||||
</div>
|
||||
|
||||
<div class="panel-body">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{template "base/footer" .}}
|
|
@ -1,14 +1,7 @@
|
|||
{{template "base/head" .}}
|
||||
{{template "base/navbar" .}}
|
||||
<div id="gogs-body" class="container" data-page="admin">
|
||||
<div id="gogs-user-setting-nav" class="col-md-3">
|
||||
<ul class="list-group" data-init="tabs">
|
||||
<li class="list-group-item active"><a href="/admin"><i class="fa fa-tachometer fa-lg"></i> Dashboard</a></li>
|
||||
<li class="list-group-item"><a href="/admin/users"><i class="fa fa-users fa-lg"></i> Users</a></li>
|
||||
<li class="list-group-item"><a href="/admin/repos"><i class="fa fa-book fa-lg"></i> Repositories</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{{template "admin/nav" .}}
|
||||
<div id="gogs-admin-container" class="col-md-9">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
|
|
8
templates/admin/nav.tmpl
Normal file
8
templates/admin/nav.tmpl
Normal file
|
@ -0,0 +1,8 @@
|
|||
<div id="gogs-user-setting-nav" class="col-md-3">
|
||||
<ul class="list-group" data-init="tabs">
|
||||
<li class="list-group-item{{if .PageIsDashboard}} active{{end}}"><a href="/admin"><i class="fa fa-tachometer fa-lg"></i> Dashboard</a></li>
|
||||
<li class="list-group-item{{if .PageIsUsers}} active{{end}}"><a href="/admin/users"><i class="fa fa-users fa-lg"></i> Users</a></li>
|
||||
<li class="list-group-item{{if .PageIsRepos}} active{{end}}"><a href="/admin/repos"><i class="fa fa-book fa-lg"></i> Repositories</a></li>
|
||||
<li class="list-group-item{{if .PageIsConfig}} active{{end}}"><a href="/admin/config"><i class="fa fa-cogs fa-lg"></i> Configuration</a></li>
|
||||
</ul>
|
||||
</div>
|
|
@ -1,14 +1,7 @@
|
|||
{{template "base/head" .}}
|
||||
{{template "base/navbar" .}}
|
||||
<div id="gogs-body" class="container" data-page="admin">
|
||||
<div id="gogs-user-setting-nav" class="col-md-3">
|
||||
<ul class="list-group" data-init="tabs">
|
||||
<li class="list-group-item"><a href="/admin"><i class="fa fa-tachometer fa-lg"></i> Dashboard</a></li>
|
||||
<li class="list-group-item"><a href="/admin/users"><i class="fa fa-users fa-lg"></i> Users</a></li>
|
||||
<li class="list-group-item active"><a href="/admin/repos"><i class="fa fa-book fa-lg"></i> Repositories</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{{template "admin/nav" .}}
|
||||
<div id="gogs-admin-container" class="col-md-9">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
|
|
|
@ -1,14 +1,7 @@
|
|||
{{template "base/head" .}}
|
||||
{{template "base/navbar" .}}
|
||||
<div id="gogs-body" class="container" data-page="admin">
|
||||
<div id="gogs-user-setting-nav" class="col-md-3">
|
||||
<ul class="list-group" data-init="tabs">
|
||||
<li class="list-group-item"><a href="/admin"><i class="fa fa-tachometer fa-lg"></i> Dashboard</a></li>
|
||||
<li class="list-group-item active"><a href="/admin/users"><i class="fa fa-users fa-lg"></i> Users</a></li>
|
||||
<li class="list-group-item"><a href="/admin/repos"><i class="fa fa-book fa-lg"></i> Repositories</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{{template "admin/nav" .}}
|
||||
<div id="gogs-admin-container" class="col-md-9">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
|
|
20
web.go
20
web.go
|
@ -16,9 +16,11 @@ import (
|
|||
|
||||
"github.com/gogits/binding"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/auth"
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/log"
|
||||
"github.com/gogits/gogs/modules/mailer"
|
||||
"github.com/gogits/gogs/modules/middleware"
|
||||
"github.com/gogits/gogs/routers"
|
||||
"github.com/gogits/gogs/routers/admin"
|
||||
|
@ -36,6 +38,16 @@ gogs web`,
|
|||
Flags: []cli.Flag{},
|
||||
}
|
||||
|
||||
// globalInit is for global configuration reload-able.
|
||||
func globalInit() {
|
||||
base.NewConfigContext()
|
||||
mailer.NewMailerContext()
|
||||
models.LoadModelsConfig()
|
||||
models.LoadRepoConfig()
|
||||
models.NewRepoContext()
|
||||
models.NewEngine()
|
||||
}
|
||||
|
||||
// Check run mode(Default of martini is Dev).
|
||||
func checkRunMode() {
|
||||
switch base.Cfg.MustValue("", "RUN_MODE") {
|
||||
|
@ -59,6 +71,7 @@ func newMartini() *martini.ClassicMartini {
|
|||
}
|
||||
|
||||
func runWeb(*cli.Context) {
|
||||
globalInit()
|
||||
base.NewServices()
|
||||
checkRunMode()
|
||||
log.Info("%s %s", base.AppName, base.AppVer)
|
||||
|
@ -101,9 +114,10 @@ func runWeb(*cli.Context) {
|
|||
m.Get("/help", routers.Help)
|
||||
|
||||
adminReq := middleware.AdminRequire()
|
||||
m.Any("/admin", reqSignIn, adminReq, admin.Dashboard)
|
||||
m.Any("/admin/users", reqSignIn, adminReq, admin.Users)
|
||||
m.Any("/admin/repos", reqSignIn, adminReq, admin.Repositories)
|
||||
m.Get("/admin", reqSignIn, adminReq, admin.Dashboard)
|
||||
m.Get("/admin/users", reqSignIn, adminReq, admin.Users)
|
||||
m.Get("/admin/repos", reqSignIn, adminReq, admin.Repositories)
|
||||
m.Get("/admin/config", reqSignIn, adminReq, admin.Config)
|
||||
|
||||
m.Post("/:username/:reponame/settings", reqSignIn, middleware.RepoAssignment(true), repo.SettingPost)
|
||||
m.Get("/:username/:reponame/settings", reqSignIn, middleware.RepoAssignment(true), repo.Setting)
|
||||
|
|
Reference in a new issue