]> source.dussan.org Git - gitea.git/commitdiff
All configuration reload-able
authorUnknown <joe2010xtmf@163.com>
Fri, 21 Mar 2014 05:48:10 +0000 (01:48 -0400)
committerUnknown <joe2010xtmf@163.com>
Fri, 21 Mar 2014 05:48:10 +0000 (01:48 -0400)
13 files changed:
README.md
models/models.go
models/models_test.go
models/repo.go
modules/base/conf.go
modules/mailer/mailer.go
routers/admin/admin.go
templates/admin/config.tmpl [new file with mode: 0644]
templates/admin/dashboard.tmpl
templates/admin/nav.tmpl [new file with mode: 0644]
templates/admin/repos.tmpl
templates/admin/users.tmpl
web.go

index 3668ae899833c317bd9033de0c1cc12fa4fd2301..e78ce8fe99b348990e6856ae564c461193e5a6c6 100644 (file)
--- a/README.md
+++ b/README.md
@@ -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
index 8df230975f3f12a4ad3f445194ce1b14f3e56fd3..bb0015d3dea8a39f64e10f507d87b85af8af70c2 100644 (file)
@@ -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 {
index c44ef476c6742408f4c76bcbcae70bb2080fb778..d0f734d678ff838707bbc92768866d83b70d346d 100644 (file)
@@ -13,6 +13,9 @@ import (
 )
 
 func init() {
+       LoadModelsConfig()
+       NewEngine()
+
        var err error
        orm, err = xorm.NewEngine("sqlite3", "./test.db")
        if err != nil {
index 93f68ceddfbba1a54a38963262b516e649f1613b..f25200478597b8bf4c9f4cdc5ae1c77082b27113 100644 (file)
@@ -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.
index 41b66b69f82ee4597335c693a503c00a4c02ea6a..42d50da4f3cf74fd649778dafd7cfc777b8c44ab 100644 (file)
@@ -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 {
index 150607f8c404e449f2950fae93df7dd859bfe7c9..da63e01d2a98d2ba8f66ce33307bfb775766fc71 100644 (file)
@@ -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()
 }
index a37f1207c9717a9f9e1906ab1af52d0cde85323f..1095a599b9fdccbebaaf854da7ba7e19214ca669 100644 (file)
@@ -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")
+}
diff --git a/templates/admin/config.tmpl b/templates/admin/config.tmpl
new file mode 100644 (file)
index 0000000..d209bcd
--- /dev/null
@@ -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" .}}
\ No newline at end of file
index 6a914b65f7791f2aa8a9bcf9085e44854e9b1a5b..8950f50cac8a39d03bd8f7b0415baf13c9a1dfb5 100644 (file)
@@ -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">
diff --git a/templates/admin/nav.tmpl b/templates/admin/nav.tmpl
new file mode 100644 (file)
index 0000000..bb704ee
--- /dev/null
@@ -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>
\ No newline at end of file
index f4834c9060730dd83030f8693fe1e9331f99bc99..a1f41d8365a495ba18c124aad95a9dfc4342b34c 100644 (file)
@@ -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">
index b690e1771e1cb71ca828812adecd952a52057b5d..ae2b5bbb6587055fd0d1acdde2e4975e7511e92e 100644 (file)
@@ -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">
diff --git a/web.go b/web.go
index a5a8305aee6c3e748584fcae3e6488a506efe745..648cb9d79cc6c619fbf6e8a8aeb5709212518f6f 100644 (file)
--- a/web.go
+++ b/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)