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-07-26 08:24:27 +04:00
"github.com/Unknwon/com"
"github.com/Unknwon/macaron"
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-06-13 21:01:52 +04:00
"github.com/gogits/gogs/modules/cron"
2014-03-20 15:50:26 +04:00
"github.com/gogits/gogs/modules/middleware"
2014-06-19 09:08:03 +04:00
"github.com/gogits/gogs/modules/process"
2014-05-26 04:11:25 +04:00
"github.com/gogits/gogs/modules/setting"
2014-03-20 15:50:26 +04:00
)
2014-06-22 21:14:03 +04:00
const (
DASHBOARD base . TplName = "admin/dashboard"
USERS base . TplName = "admin/users"
REPOS base . TplName = "admin/repos"
AUTHS base . TplName = "admin/auths"
CONFIG base . TplName = "admin/config"
MONITOR_PROCESS base . TplName = "admin/monitor/process"
MONITOR_CRON base . TplName = "admin/monitor/cron"
)
2014-07-07 12:15:08 +04:00
var (
startTime = time . Now ( )
)
2014-03-22 17:21:57 +04:00
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.
2014-06-21 08:51:41 +04:00
type AdminOperation int
2014-05-06 21:47:47 +04:00
const (
2014-06-21 08:51:41 +04:00
CLEAN_UNBIND_OAUTH AdminOperation = iota + 1
CLEAN_INACTIVATE_USER
2014-05-06 21:47:47 +04:00
)
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.
2014-07-26 08:24:27 +04:00
op , _ := com . StrTo ( ctx . Query ( "op" ) ) . Int ( )
2014-05-06 21:47:47 +04:00
if op > 0 {
var err error
var success string
2014-06-21 08:51:41 +04:00
switch AdminOperation ( op ) {
case CLEAN_UNBIND_OAUTH :
2014-05-06 21:47:47 +04:00
success = "All unbind OAuthes have been deleted."
err = models . CleanUnbindOauth ( )
2014-06-21 08:51:41 +04:00
case CLEAN_INACTIVATE_USER :
success = "All inactivate accounts have been deleted."
err = models . DeleteInactivateUsers ( )
2014-05-06 21:47:47 +04:00
}
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-06-22 21:14:03 +04:00
ctx . HTML ( 200 , DASHBOARD )
2014-03-20 15:50:26 +04:00
}
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
2014-07-26 08:24:27 +04:00
p := com . StrTo ( ctx . Query ( "p" ) ) . MustInt ( )
2014-07-07 12:15:08 +04:00
if p < 1 {
p = 1
}
2014-07-12 08:55:19 +04:00
pageNum := 50
2014-07-07 12:15:08 +04:00
count := models . CountUsers ( )
curCount := int64 ( ( p - 1 ) * pageNum + pageNum )
if curCount > count {
p = int ( count ) / pageNum
} else if count > curCount {
ctx . Data [ "NextPageNum" ] = p + 1
}
if p > 1 {
ctx . Data [ "LastPageNum" ] = p - 1
}
2014-03-21 00:04:56 +04:00
var err error
2014-07-07 12:15:08 +04:00
ctx . Data [ "Users" ] , err = models . GetUsers ( pageNum , ( p - 1 ) * pageNum )
2014-03-21 00:04:56 +04:00
if err != nil {
2014-06-22 21:14:03 +04:00
ctx . Handle ( 500 , "admin.Users(GetUsers)" , err )
2014-03-21 00:04:56 +04:00
return
}
2014-06-22 21:14:03 +04:00
ctx . HTML ( 200 , USERS )
2014-03-20 15:50:26 +04:00
}
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
2014-07-26 08:24:27 +04:00
p := com . StrTo ( ctx . Query ( "p" ) ) . MustInt ( )
2014-07-07 12:15:08 +04:00
if p < 1 {
p = 1
}
2014-07-12 08:55:19 +04:00
pageNum := 50
2014-07-07 12:15:08 +04:00
count := models . CountRepositories ( )
curCount := int64 ( ( p - 1 ) * pageNum + pageNum )
if curCount > count {
p = int ( count ) / pageNum
} else if count > curCount {
ctx . Data [ "NextPageNum" ] = p + 1
}
if p > 1 {
ctx . Data [ "LastPageNum" ] = p - 1
}
2014-05-03 06:48:14 +04:00
var err error
2014-07-07 12:15:08 +04:00
ctx . Data [ "Repos" ] , err = models . GetRepositoriesWithUsers ( pageNum , ( p - 1 ) * pageNum )
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-06-22 21:14:03 +04:00
ctx . HTML ( 200 , 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-06-22 21:14:03 +04:00
ctx . HTML ( 200 , 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-07-26 08:24:27 +04:00
ctx . Data [ "RunMode" ] = strings . Title ( macaron . 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-06-24 21:55:47 +04:00
ctx . Data [ "ReverseProxyAuthUser" ] = setting . ReverseProxyAuthUser
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-06-08 12:45:34 +04:00
ctx . Data [ "WebhookTaskInterval" ] = setting . WebhookTaskInterval
ctx . Data [ "WebhookDeliverTimeout" ] = setting . WebhookDeliverTimeout
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
2014-08-01 01:25:34 +04:00
ctx . Data [ "CacheInternal" ] = setting . CacheInternal
ctx . Data [ "CacheConn" ] = setting . CacheConn
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-06-22 21:14:03 +04:00
ctx . HTML ( 200 , CONFIG )
2014-03-21 09:48:10 +04:00
}
2014-06-13 21:01:52 +04:00
func Monitor ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = "Monitoring Center"
ctx . Data [ "PageIsMonitor" ] = true
tab := ctx . Query ( "tab" )
switch tab {
case "process" :
ctx . Data [ "PageIsMonitorProcess" ] = true
2014-06-19 09:08:03 +04:00
ctx . Data [ "Processes" ] = process . Processes
2014-06-22 21:14:03 +04:00
ctx . HTML ( 200 , MONITOR_PROCESS )
2014-06-13 21:01:52 +04:00
default :
ctx . Data [ "PageIsMonitorCron" ] = true
ctx . Data [ "Entries" ] = cron . ListEntries ( )
2014-06-22 21:14:03 +04:00
ctx . HTML ( 200 , MONITOR_CRON )
2014-06-13 21:01:52 +04:00
}
}