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  }