cmd/syncthing: Add support for -auditfile= (fixes #3859)

Adds support for -auditfile= where is "-" for stdout, "--" for stderr, or a
filename. It can be left blank (or left out entirely) for the original
behaviour of creating a timestamped filename.

GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/3860
This commit is contained in:
Kudalufi 2017-01-03 08:54:28 +00:00 committed by Jakob Borg
parent 79f7f50c4d
commit 79dd6918f2

View File

@ -12,6 +12,7 @@ import (
"errors" "errors"
"flag" "flag"
"fmt" "fmt"
"io"
"io/ioutil" "io/ioutil"
"log" "log"
"net" "net"
@ -211,6 +212,7 @@ type RuntimeOptions struct {
hideConsole bool hideConsole bool
logFile string logFile string
auditEnabled bool auditEnabled bool
auditFile string
verbose bool verbose bool
paused bool paused bool
unpaused bool unpaused bool
@ -273,6 +275,7 @@ func parseCommandLineOptions() RuntimeOptions {
flag.BoolVar(&options.paused, "paused", false, "Start with all devices and folders paused") flag.BoolVar(&options.paused, "paused", false, "Start with all devices and folders paused")
flag.BoolVar(&options.unpaused, "unpaused", false, "Start with all devices and folders unpaused") flag.BoolVar(&options.unpaused, "unpaused", false, "Start with all devices and folders unpaused")
flag.StringVar(&options.logFile, "logfile", options.logFile, "Log file name (use \"-\" for stdout)") flag.StringVar(&options.logFile, "logfile", options.logFile, "Log file name (use \"-\" for stdout)")
flag.StringVar(&options.auditFile, "auditfile", options.auditFile, "Specify audit file (use \"-\" for stdout, \"--\" for stderr)")
if runtime.GOOS == "windows" { if runtime.GOOS == "windows" {
// Allow user to hide the console window // Allow user to hide the console window
flag.BoolVar(&options.hideConsole, "no-console", false, "Hide console window") flag.BoolVar(&options.hideConsole, "no-console", false, "Hide console window")
@ -545,7 +548,7 @@ func syncthingMain(runtimeOptions RuntimeOptions) {
l.SetPrefix("[start] ") l.SetPrefix("[start] ")
if runtimeOptions.auditEnabled { if runtimeOptions.auditEnabled {
startAuditing(mainService) startAuditing(mainService, runtimeOptions.auditFile)
} }
if runtimeOptions.verbose { if runtimeOptions.verbose {
@ -928,11 +931,31 @@ func copyFile(src, dst string) error {
return nil return nil
} }
func startAuditing(mainService *suture.Supervisor) { func startAuditing(mainService *suture.Supervisor, auditFile string) {
auditFile := timestampedLoc(locAuditLog)
fd, err := os.OpenFile(auditFile, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600) var fd io.Writer
if err != nil { var err error
l.Fatalln("Audit:", err) var auditDest string
var auditFlags int
if auditFile == "-" {
fd = os.Stdout
auditDest = "stdout"
} else if auditFile == "--" {
fd = os.Stderr
auditDest = "stderr"
} else {
if auditFile == "" {
auditFile = timestampedLoc(locAuditLog)
auditFlags = os.O_WRONLY | os.O_CREATE | os.O_EXCL
} else {
auditFlags = os.O_WRONLY | os.O_CREATE | os.O_APPEND
}
fd, err = os.OpenFile(auditFile, auditFlags, 0600)
if err != nil {
l.Fatalln("Audit:", err)
}
auditDest = auditFile
} }
auditService := newAuditService(fd) auditService := newAuditService(fd)
@ -942,7 +965,7 @@ func startAuditing(mainService *suture.Supervisor) {
// ensure we capture all events from the start. // ensure we capture all events from the start.
auditService.WaitForStart() auditService.WaitForStart()
l.Infoln("Audit log in", auditFile) l.Infoln("Audit log in", auditDest)
} }
func setupGUI(mainService *suture.Supervisor, cfg *config.Wrapper, m *model.Model, apiSub events.BufferedSubscription, diskSub events.BufferedSubscription, discoverer discover.CachingMux, connectionsService *connections.Service, errors, systemLog logger.Recorder, runtimeOptions RuntimeOptions) { func setupGUI(mainService *suture.Supervisor, cfg *config.Wrapper, m *model.Model, apiSub events.BufferedSubscription, diskSub events.BufferedSubscription, discoverer discover.CachingMux, connectionsService *connections.Service, errors, systemLog logger.Recorder, runtimeOptions RuntimeOptions) {