2020-01-29 01:01:06 +00:00
// Copyright 2020 The Gitea 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 private
import (
2020-07-06 01:07:07 +01:00
"fmt"
2020-01-29 01:01:06 +00:00
"net/http"
2021-01-26 23:36:53 +08:00
"code.gitea.io/gitea/modules/context"
2020-01-29 01:01:06 +00:00
"code.gitea.io/gitea/modules/graceful"
2021-07-25 00:03:58 +08:00
"code.gitea.io/gitea/modules/json"
2020-01-29 01:01:06 +00:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/private"
"code.gitea.io/gitea/modules/queue"
2020-07-06 01:07:07 +01:00
"code.gitea.io/gitea/modules/setting"
2021-01-26 23:36:53 +08:00
"code.gitea.io/gitea/modules/web"
2020-01-29 01:01:06 +00:00
)
// FlushQueues flushes all the Queues
2021-01-26 23:36:53 +08:00
func FlushQueues ( ctx * context . PrivateContext ) {
opts := web . GetForm ( ctx ) . ( * private . FlushOptions )
2020-01-29 01:01:06 +00:00
if opts . NonBlocking {
// Save the hammer ctx here - as a new one is created each time you call this.
baseCtx := graceful . GetManager ( ) . HammerContext ( )
go func ( ) {
err := queue . GetManager ( ) . FlushAll ( baseCtx , opts . Timeout )
if err != nil {
log . Error ( "Flushing request timed-out with error: %v" , err )
}
} ( )
2021-06-23 21:38:19 +02:00
ctx . JSON ( http . StatusAccepted , private . Response {
Err : "Flushing" ,
2020-01-29 01:01:06 +00:00
} )
return
}
2021-05-31 07:18:11 +01:00
err := queue . GetManager ( ) . FlushAll ( ctx , opts . Timeout )
2020-01-29 01:01:06 +00:00
if err != nil {
2021-06-23 21:38:19 +02:00
ctx . JSON ( http . StatusRequestTimeout , private . Response {
Err : fmt . Sprintf ( "%v" , err ) ,
2020-01-29 01:01:06 +00:00
} )
}
2021-12-15 14:59:57 +08:00
ctx . PlainText ( http . StatusOK , "success" )
2020-01-29 01:01:06 +00:00
}
2020-07-06 01:07:07 +01:00
// PauseLogging pauses logging
2021-01-26 23:36:53 +08:00
func PauseLogging ( ctx * context . PrivateContext ) {
2020-07-06 01:07:07 +01:00
log . Pause ( )
2021-12-15 14:59:57 +08:00
ctx . PlainText ( http . StatusOK , "success" )
2020-07-06 01:07:07 +01:00
}
// ResumeLogging resumes logging
2021-01-26 23:36:53 +08:00
func ResumeLogging ( ctx * context . PrivateContext ) {
2020-07-06 01:07:07 +01:00
log . Resume ( )
2021-12-15 14:59:57 +08:00
ctx . PlainText ( http . StatusOK , "success" )
2020-07-06 01:07:07 +01:00
}
// ReleaseReopenLogging releases and reopens logging files
2021-01-26 23:36:53 +08:00
func ReleaseReopenLogging ( ctx * context . PrivateContext ) {
2020-07-06 01:07:07 +01:00
if err := log . ReleaseReopen ( ) ; err != nil {
2021-06-23 21:38:19 +02:00
ctx . JSON ( http . StatusInternalServerError , private . Response {
Err : fmt . Sprintf ( "Error during release and reopen: %v" , err ) ,
2020-07-06 01:07:07 +01:00
} )
return
}
2021-12-15 14:59:57 +08:00
ctx . PlainText ( http . StatusOK , "success" )
2020-07-06 01:07:07 +01:00
}
// RemoveLogger removes a logger
2021-01-26 23:36:53 +08:00
func RemoveLogger ( ctx * context . PrivateContext ) {
2020-07-06 01:07:07 +01:00
group := ctx . Params ( "group" )
name := ctx . Params ( "name" )
ok , err := log . GetLogger ( group ) . DelLogger ( name )
if err != nil {
2021-06-23 21:38:19 +02:00
ctx . JSON ( http . StatusInternalServerError , private . Response {
Err : fmt . Sprintf ( "Failed to remove logger: %s %s %v" , group , name , err ) ,
2020-07-06 01:07:07 +01:00
} )
return
}
if ok {
setting . RemoveSubLogDescription ( group , name )
}
2021-12-15 14:59:57 +08:00
ctx . PlainText ( http . StatusOK , fmt . Sprintf ( "Removed %s %s" , group , name ) )
2020-07-06 01:07:07 +01:00
}
// AddLogger adds a logger
2021-01-26 23:36:53 +08:00
func AddLogger ( ctx * context . PrivateContext ) {
opts := web . GetForm ( ctx ) . ( * private . LoggerOptions )
2020-07-06 01:07:07 +01:00
if len ( opts . Group ) == 0 {
opts . Group = log . DEFAULT
}
if _ , ok := opts . Config [ "flags" ] ; ! ok {
switch opts . Group {
case "access" :
opts . Config [ "flags" ] = log . FlagsFromString ( "" )
case "router" :
opts . Config [ "flags" ] = log . FlagsFromString ( "date,time" )
default :
opts . Config [ "flags" ] = log . FlagsFromString ( "stdflags" )
}
}
if _ , ok := opts . Config [ "colorize" ] ; ! ok && opts . Mode == "console" {
if _ , ok := opts . Config [ "stderr" ] ; ok {
opts . Config [ "colorize" ] = log . CanColorStderr
} else {
opts . Config [ "colorize" ] = log . CanColorStdout
}
}
if _ , ok := opts . Config [ "level" ] ; ! ok {
opts . Config [ "level" ] = setting . LogLevel
}
if _ , ok := opts . Config [ "stacktraceLevel" ] ; ! ok {
opts . Config [ "stacktraceLevel" ] = setting . StacktraceLogLevel
}
if opts . Mode == "file" {
if _ , ok := opts . Config [ "maxsize" ] ; ! ok {
opts . Config [ "maxsize" ] = 1 << 28
}
if _ , ok := opts . Config [ "maxdays" ] ; ! ok {
opts . Config [ "maxdays" ] = 7
}
if _ , ok := opts . Config [ "compressionLevel" ] ; ! ok {
opts . Config [ "compressionLevel" ] = - 1
}
}
bufferLen := setting . Cfg . Section ( "log" ) . Key ( "BUFFER_LEN" ) . MustInt64 ( 10000 )
byteConfig , err := json . Marshal ( opts . Config )
if err != nil {
log . Error ( "Failed to marshal log configuration: %v %v" , opts . Config , err )
2021-06-23 21:38:19 +02:00
ctx . JSON ( http . StatusInternalServerError , private . Response {
Err : fmt . Sprintf ( "Failed to marshal log configuration: %v %v" , opts . Config , err ) ,
2020-07-06 01:07:07 +01:00
} )
return
}
config := string ( byteConfig )
if err := log . NewNamedLogger ( opts . Group , bufferLen , opts . Name , opts . Mode , config ) ; err != nil {
log . Error ( "Failed to create new named logger: %s %v" , config , err )
2021-06-23 21:38:19 +02:00
ctx . JSON ( http . StatusInternalServerError , private . Response {
Err : fmt . Sprintf ( "Failed to create new named logger: %s %v" , config , err ) ,
2020-07-06 01:07:07 +01:00
} )
return
}
setting . AddSubLogDescription ( opts . Group , setting . SubLogDescription {
Name : opts . Name ,
Provider : opts . Mode ,
Config : config ,
} )
2021-12-15 14:59:57 +08:00
ctx . PlainText ( http . StatusOK , "success" )
2020-07-06 01:07:07 +01:00
}