2014-03-20 15:50:26 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package admin
import (
2014-03-22 15:42:24 +04:00
"fmt"
"runtime"
2014-03-21 11:27:59 +04:00
"strings"
2014-03-22 15:42:24 +04:00
"time"
2014-03-21 11:27:59 +04:00
2014-03-30 20:11:28 +04:00
"github.com/go-martini/martini"
2014-03-21 11:27:59 +04:00
2014-03-21 00:04:56 +04:00
"github.com/gogits/gogs/models"
2014-03-21 11:27:59 +04:00
"github.com/gogits/gogs/modules/base"
2014-03-20 15:50:26 +04:00
"github.com/gogits/gogs/modules/middleware"
2014-05-26 04:11:25 +04:00
"github.com/gogits/gogs/modules/setting"
2014-03-20 15:50:26 +04:00
)
2014-03-22 17:21:57 +04:00
var startTime = time . Now ( )
2014-03-22 15:42:24 +04:00
var sysStatus struct {
2014-03-22 17:21:57 +04:00
Uptime string
2014-03-22 15:42:24 +04:00
NumGoroutine int
// General statistics.
MemAllocated string // bytes allocated and still in use
MemTotal string // bytes allocated (even if freed)
MemSys string // bytes obtained from system (sum of XxxSys below)
Lookups uint64 // number of pointer lookups
MemMallocs uint64 // number of mallocs
MemFrees uint64 // number of frees
// Main allocation heap statistics.
HeapAlloc string // bytes allocated and still in use
HeapSys string // bytes obtained from system
HeapIdle string // bytes in idle spans
HeapInuse string // bytes in non-idle span
HeapReleased string // bytes released to the OS
HeapObjects uint64 // total number of allocated objects
// Low-level fixed-size structure allocator statistics.
// Inuse is bytes used now.
// Sys is bytes obtained from system.
StackInuse string // bootstrap stacks
StackSys string
MSpanInuse string // mspan structures
MSpanSys string
MCacheInuse string // mcache structures
MCacheSys string
BuckHashSys string // profiling bucket hash table
GCSys string // GC metadata
OtherSys string // other system allocations
// Garbage collector statistics.
NextGC string // next run in HeapAlloc time (bytes)
LastGC string // last run in absolute time (ns)
PauseTotalNs string
PauseNs string // circular buffer of recent GC pause times, most recent at [(NumGC+255)%256]
NumGC uint32
}
func updateSystemStatus ( ) {
2014-03-22 17:21:57 +04:00
sysStatus . Uptime = base . TimeSincePro ( startTime )
2014-03-22 15:42:24 +04:00
m := new ( runtime . MemStats )
runtime . ReadMemStats ( m )
sysStatus . NumGoroutine = runtime . NumGoroutine ( )
sysStatus . MemAllocated = base . FileSize ( int64 ( m . Alloc ) )
sysStatus . MemTotal = base . FileSize ( int64 ( m . TotalAlloc ) )
sysStatus . MemSys = base . FileSize ( int64 ( m . Sys ) )
sysStatus . Lookups = m . Lookups
sysStatus . MemMallocs = m . Mallocs
sysStatus . MemFrees = m . Frees
sysStatus . HeapAlloc = base . FileSize ( int64 ( m . HeapAlloc ) )
sysStatus . HeapSys = base . FileSize ( int64 ( m . HeapSys ) )
sysStatus . HeapIdle = base . FileSize ( int64 ( m . HeapIdle ) )
sysStatus . HeapInuse = base . FileSize ( int64 ( m . HeapInuse ) )
sysStatus . HeapReleased = base . FileSize ( int64 ( m . HeapReleased ) )
sysStatus . HeapObjects = m . HeapObjects
sysStatus . StackInuse = base . FileSize ( int64 ( m . StackInuse ) )
sysStatus . StackSys = base . FileSize ( int64 ( m . StackSys ) )
sysStatus . MSpanInuse = base . FileSize ( int64 ( m . MSpanInuse ) )
sysStatus . MSpanSys = base . FileSize ( int64 ( m . MSpanSys ) )
sysStatus . MCacheInuse = base . FileSize ( int64 ( m . MCacheInuse ) )
sysStatus . MCacheSys = base . FileSize ( int64 ( m . MCacheSys ) )
sysStatus . BuckHashSys = base . FileSize ( int64 ( m . BuckHashSys ) )
sysStatus . GCSys = base . FileSize ( int64 ( m . GCSys ) )
sysStatus . OtherSys = base . FileSize ( int64 ( m . OtherSys ) )
sysStatus . NextGC = base . FileSize ( int64 ( m . NextGC ) )
sysStatus . LastGC = fmt . Sprintf ( "%.1fs" , float64 ( time . Now ( ) . UnixNano ( ) - int64 ( m . LastGC ) ) / 1000 / 1000 / 1000 )
2014-03-22 17:21:57 +04:00
sysStatus . PauseTotalNs = fmt . Sprintf ( "%.1fs" , float64 ( m . PauseTotalNs ) / 1000 / 1000 / 1000 )
sysStatus . PauseNs = fmt . Sprintf ( "%.3fs" , float64 ( m . PauseNs [ ( m . NumGC + 255 ) % 256 ] ) / 1000 / 1000 / 1000 )
2014-03-22 15:42:24 +04:00
sysStatus . NumGC = m . NumGC
}
2014-05-06 21:47:47 +04:00
// Operation types.
const (
OT_CLEAN_OAUTH = iota + 1
)
2014-03-20 15:50:26 +04:00
func Dashboard ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = "Admin Dashboard"
2014-03-21 09:48:10 +04:00
ctx . Data [ "PageIsDashboard" ] = true
2014-05-06 21:47:47 +04:00
// Run operation.
op , _ := base . StrTo ( ctx . Query ( "op" ) ) . Int ( )
if op > 0 {
var err error
var success string
switch op {
case OT_CLEAN_OAUTH :
success = "All unbind OAuthes have been deleted."
err = models . CleanUnbindOauth ( )
}
if err != nil {
ctx . Flash . Error ( err . Error ( ) )
} else {
ctx . Flash . Success ( success )
}
ctx . Redirect ( "/admin" )
return
}
2014-03-21 00:04:56 +04:00
ctx . Data [ "Stats" ] = models . GetStatistic ( )
2014-03-22 15:42:24 +04:00
updateSystemStatus ( )
ctx . Data [ "SysStatus" ] = sysStatus
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "admin/dashboard" )
}
func Users ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = "User Management"
2014-03-21 09:48:10 +04:00
ctx . Data [ "PageIsUsers" ] = true
2014-03-21 00:04:56 +04:00
var err error
2014-05-06 03:58:13 +04:00
ctx . Data [ "Users" ] , err = models . GetUsers ( 200 , 0 )
2014-03-21 00:04:56 +04:00
if err != nil {
2014-05-06 03:58:13 +04:00
ctx . Handle ( 500 , "admin.Users" , err )
2014-03-21 00:04:56 +04:00
return
}
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "admin/users" )
}
2014-05-06 03:58:13 +04:00
func Repositories ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = "Repository Management"
ctx . Data [ "PageIsRepos" ] = true
2014-05-03 06:48:14 +04:00
var err error
2014-05-08 00:51:14 +04:00
ctx . Data [ "Repos" ] , err = models . GetRepositoriesWithUsers ( 200 , 0 )
2014-05-03 06:48:14 +04:00
if err != nil {
2014-05-06 03:58:13 +04:00
ctx . Handle ( 500 , "admin.Repositories" , err )
2014-05-03 06:48:14 +04:00
return
}
2014-05-06 03:58:13 +04:00
ctx . HTML ( 200 , "admin/repos" )
2014-05-03 06:48:14 +04:00
}
2014-05-06 03:58:13 +04:00
func Auths ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = "Auth Sources"
ctx . Data [ "PageIsAuths" ] = true
2014-03-21 09:48:10 +04:00
2014-03-21 00:04:56 +04:00
var err error
2014-05-06 03:58:13 +04:00
ctx . Data [ "Sources" ] , err = models . GetAuths ( )
2014-03-21 00:04:56 +04:00
if err != nil {
2014-05-06 03:58:13 +04:00
ctx . Handle ( 500 , "admin.Auths" , err )
2014-03-21 00:04:56 +04:00
return
}
2014-05-06 03:58:13 +04:00
ctx . HTML ( 200 , "admin/auths" )
2014-03-20 15:50:26 +04:00
}
2014-03-21 09:48:10 +04:00
func Config ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = "Server Configuration"
ctx . Data [ "PageIsConfig" ] = true
2014-03-21 11:27:59 +04:00
2014-05-26 04:11:25 +04:00
ctx . Data [ "AppUrl" ] = setting . AppUrl
ctx . Data [ "Domain" ] = setting . Domain
ctx . Data [ "OfflineMode" ] = setting . OfflineMode
ctx . Data [ "DisableRouterLog" ] = setting . DisableRouterLog
ctx . Data [ "RunUser" ] = setting . RunUser
2014-03-21 11:27:59 +04:00
ctx . Data [ "RunMode" ] = strings . Title ( martini . Env )
2014-05-26 04:11:25 +04:00
ctx . Data [ "RepoRootPath" ] = setting . RepoRootPath
2014-05-28 09:53:06 +04:00
ctx . Data [ "StaticRootPath" ] = setting . StaticRootPath
ctx . Data [ "LogRootPath" ] = setting . LogRootPath
2014-05-26 04:11:25 +04:00
ctx . Data [ "ScriptType" ] = setting . ScriptType
2014-03-21 11:27:59 +04:00
2014-05-26 04:11:25 +04:00
ctx . Data [ "Service" ] = setting . Service
2014-03-21 11:27:59 +04:00
ctx . Data [ "DbCfg" ] = models . DbCfg
2014-03-21 12:13:32 +04:00
ctx . Data [ "MailerEnabled" ] = false
2014-05-26 04:11:25 +04:00
if setting . MailService != nil {
2014-03-21 12:13:32 +04:00
ctx . Data [ "MailerEnabled" ] = true
2014-05-26 04:11:25 +04:00
ctx . Data [ "Mailer" ] = setting . MailService
2014-03-21 12:13:32 +04:00
}
2014-03-21 11:27:59 +04:00
2014-04-14 05:00:12 +04:00
ctx . Data [ "OauthEnabled" ] = false
2014-05-26 04:11:25 +04:00
if setting . OauthService != nil {
2014-04-14 05:00:12 +04:00
ctx . Data [ "OauthEnabled" ] = true
2014-05-26 04:11:25 +04:00
ctx . Data [ "Oauther" ] = setting . OauthService
2014-04-14 05:00:12 +04:00
}
2014-05-26 04:11:25 +04:00
ctx . Data [ "CacheAdapter" ] = setting . CacheAdapter
ctx . Data [ "CacheConfig" ] = setting . CacheConfig
2014-03-21 18:09:57 +04:00
2014-05-26 04:11:25 +04:00
ctx . Data [ "SessionProvider" ] = setting . SessionProvider
ctx . Data [ "SessionConfig" ] = setting . SessionConfig
2014-03-22 17:21:57 +04:00
2014-05-26 04:11:25 +04:00
ctx . Data [ "PictureService" ] = setting . PictureService
ctx . Data [ "DisableGravatar" ] = setting . DisableGravatar
2014-03-22 14:42:19 +04:00
2014-05-11 22:37:12 +04:00
type logger struct {
Mode , Config string
}
2014-05-26 04:11:25 +04:00
loggers := make ( [ ] * logger , len ( setting . LogModes ) )
for i := range setting . LogModes {
loggers [ i ] = & logger { setting . LogModes [ i ] , setting . LogConfigs [ i ] }
2014-05-11 22:37:12 +04:00
}
ctx . Data [ "Loggers" ] = loggers
2014-03-21 20:13:13 +04:00
2014-03-21 09:48:10 +04:00
ctx . HTML ( 200 , "admin/config" )
}