code.gitea.io/gitea@v1.21.7/routers/private/manager.go (about) 1 // Copyright 2020 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package private 5 6 import ( 7 "fmt" 8 "net/http" 9 10 "code.gitea.io/gitea/models/db" 11 "code.gitea.io/gitea/modules/context" 12 "code.gitea.io/gitea/modules/graceful" 13 "code.gitea.io/gitea/modules/graceful/releasereopen" 14 "code.gitea.io/gitea/modules/log" 15 "code.gitea.io/gitea/modules/private" 16 "code.gitea.io/gitea/modules/queue" 17 "code.gitea.io/gitea/modules/setting" 18 "code.gitea.io/gitea/modules/templates" 19 "code.gitea.io/gitea/modules/web" 20 ) 21 22 // ReloadTemplates reloads all the templates 23 func ReloadTemplates(ctx *context.PrivateContext) { 24 err := templates.ReloadHTMLTemplates() 25 if err != nil { 26 ctx.JSON(http.StatusInternalServerError, private.Response{ 27 UserMsg: fmt.Sprintf("Template error: %v", err), 28 }) 29 return 30 } 31 ctx.PlainText(http.StatusOK, "success") 32 } 33 34 // FlushQueues flushes all the Queues 35 func FlushQueues(ctx *context.PrivateContext) { 36 opts := web.GetForm(ctx).(*private.FlushOptions) 37 if opts.NonBlocking { 38 // Save the hammer ctx here - as a new one is created each time you call this. 39 baseCtx := graceful.GetManager().HammerContext() 40 go func() { 41 err := queue.GetManager().FlushAll(baseCtx, opts.Timeout) 42 if err != nil { 43 log.Error("Flushing request timed-out with error: %v", err) 44 } 45 }() 46 ctx.JSON(http.StatusAccepted, private.Response{ 47 UserMsg: "Flushing", 48 }) 49 return 50 } 51 err := queue.GetManager().FlushAll(ctx, opts.Timeout) 52 if err != nil { 53 ctx.JSON(http.StatusRequestTimeout, private.Response{ 54 UserMsg: fmt.Sprintf("%v", err), 55 }) 56 } 57 ctx.PlainText(http.StatusOK, "success") 58 } 59 60 // PauseLogging pauses logging 61 func PauseLogging(ctx *context.PrivateContext) { 62 log.GetManager().PauseAll() 63 ctx.PlainText(http.StatusOK, "success") 64 } 65 66 // ResumeLogging resumes logging 67 func ResumeLogging(ctx *context.PrivateContext) { 68 log.GetManager().ResumeAll() 69 ctx.PlainText(http.StatusOK, "success") 70 } 71 72 // ReleaseReopenLogging releases and reopens logging files 73 func ReleaseReopenLogging(ctx *context.PrivateContext) { 74 if err := releasereopen.GetManager().ReleaseReopen(); err != nil { 75 ctx.JSON(http.StatusInternalServerError, private.Response{ 76 Err: fmt.Sprintf("Error during release and reopen: %v", err), 77 }) 78 return 79 } 80 ctx.PlainText(http.StatusOK, "success") 81 } 82 83 // SetLogSQL re-sets database SQL logging 84 func SetLogSQL(ctx *context.PrivateContext) { 85 db.SetLogSQL(ctx, ctx.FormBool("on")) 86 ctx.PlainText(http.StatusOK, "success") 87 } 88 89 // RemoveLogger removes a logger 90 func RemoveLogger(ctx *context.PrivateContext) { 91 logger := ctx.Params("logger") 92 writer := ctx.Params("writer") 93 err := log.GetManager().GetLogger(logger).RemoveWriter(writer) 94 if err != nil { 95 ctx.JSON(http.StatusInternalServerError, private.Response{ 96 Err: fmt.Sprintf("Failed to remove log writer: %s %s %v", logger, writer, err), 97 }) 98 return 99 } 100 ctx.PlainText(http.StatusOK, fmt.Sprintf("Removed %s %s", logger, writer)) 101 } 102 103 // AddLogger adds a logger 104 func AddLogger(ctx *context.PrivateContext) { 105 opts := web.GetForm(ctx).(*private.LoggerOptions) 106 107 if len(opts.Logger) == 0 { 108 opts.Logger = log.DEFAULT 109 } 110 111 writerMode := log.WriterMode{} 112 writerType := opts.Mode 113 114 var flags string 115 var ok bool 116 if flags, ok = opts.Config["flags"].(string); !ok { 117 switch opts.Logger { 118 case "access": 119 flags = "" 120 case "router": 121 flags = "date,time" 122 default: 123 flags = "stdflags" 124 } 125 } 126 writerMode.Flags = log.FlagsFromString(flags) 127 128 if writerMode.Colorize, ok = opts.Config["colorize"].(bool); !ok && opts.Mode == "console" { 129 if _, ok := opts.Config["stderr"]; ok { 130 writerMode.Colorize = log.CanColorStderr 131 } else { 132 writerMode.Colorize = log.CanColorStdout 133 } 134 } 135 136 writerMode.Level = setting.Log.Level 137 if level, ok := opts.Config["level"].(string); ok { 138 writerMode.Level = log.LevelFromString(level) 139 } 140 141 writerMode.StacktraceLevel = setting.Log.StacktraceLogLevel 142 if stacktraceLevel, ok := opts.Config["level"].(string); ok { 143 writerMode.StacktraceLevel = log.LevelFromString(stacktraceLevel) 144 } 145 146 writerMode.Prefix, _ = opts.Config["prefix"].(string) 147 writerMode.Expression, _ = opts.Config["expression"].(string) 148 149 switch writerType { 150 case "console": 151 writerOption := log.WriterConsoleOption{} 152 writerOption.Stderr, _ = opts.Config["stderr"].(bool) 153 writerMode.WriterOption = writerOption 154 case "file": 155 writerOption := log.WriterFileOption{} 156 fileName, _ := opts.Config["filename"].(string) 157 writerOption.FileName = setting.LogPrepareFilenameForWriter(fileName, opts.Writer+".log") 158 writerOption.LogRotate, _ = opts.Config["rotate"].(bool) 159 maxSizeShift, _ := opts.Config["maxsize"].(int) 160 if maxSizeShift == 0 { 161 maxSizeShift = 28 162 } 163 writerOption.MaxSize = 1 << maxSizeShift 164 writerOption.DailyRotate, _ = opts.Config["daily"].(bool) 165 writerOption.MaxDays, _ = opts.Config["maxdays"].(int) 166 if writerOption.MaxDays == 0 { 167 writerOption.MaxDays = 7 168 } 169 writerOption.Compress, _ = opts.Config["compress"].(bool) 170 writerOption.CompressionLevel, _ = opts.Config["compressionLevel"].(int) 171 if writerOption.CompressionLevel == 0 { 172 writerOption.CompressionLevel = -1 173 } 174 writerMode.WriterOption = writerOption 175 case "conn": 176 writerOption := log.WriterConnOption{} 177 writerOption.ReconnectOnMsg, _ = opts.Config["reconnectOnMsg"].(bool) 178 writerOption.Reconnect, _ = opts.Config["reconnect"].(bool) 179 writerOption.Protocol, _ = opts.Config["net"].(string) 180 writerOption.Addr, _ = opts.Config["address"].(string) 181 writerMode.WriterOption = writerOption 182 default: 183 panic(fmt.Sprintf("invalid log writer mode: %s", writerType)) 184 } 185 writer, err := log.NewEventWriter(opts.Writer, writerType, writerMode) 186 if err != nil { 187 log.Error("Failed to create new log writer: %v", err) 188 ctx.JSON(http.StatusInternalServerError, private.Response{ 189 Err: fmt.Sprintf("Failed to create new log writer: %v", err), 190 }) 191 return 192 } 193 log.GetManager().GetLogger(opts.Logger).AddWriters(writer) 194 ctx.PlainText(http.StatusOK, "success") 195 }