0
Fork 0
mirror of https://github.com/caddyserver/caddy.git synced 2025-01-13 22:51:08 -05:00

log: Only chmod if permission bits differ; make log dir (#6761)

* log: Only chmod if permission bits differ

Follow-up to #6314 and https://caddy.community/t/caddy-2-9-0-breaking-change/27576/11

* Fix test

* Refactor FileWriter

* Ooooh octal... right...
This commit is contained in:
Matt Holt 2025-01-07 21:51:03 -07:00 committed by GitHub
parent 50778b5542
commit 1f927d6b07
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 58 additions and 39 deletions

View file

@ -20,6 +20,7 @@ import (
"io" "io"
"math" "math"
"os" "os"
"path/filepath"
"strconv" "strconv"
"github.com/dustin/go-humanize" "github.com/dustin/go-humanize"
@ -146,51 +147,68 @@ func (fw FileWriter) WriterKey() string {
// OpenWriter opens a new file writer. // OpenWriter opens a new file writer.
func (fw FileWriter) OpenWriter() (io.WriteCloser, error) { func (fw FileWriter) OpenWriter() (io.WriteCloser, error) {
if fw.Mode == 0 { modeIfCreating := os.FileMode(fw.Mode)
fw.Mode = 0o600 if modeIfCreating == 0 {
modeIfCreating = 0o600
} }
// roll log files by default // roll log files as a sensible default to avoid disk space exhaustion
if fw.Roll == nil || *fw.Roll { roll := fw.Roll == nil || *fw.Roll
if fw.RollSizeMB == 0 {
fw.RollSizeMB = 100
}
if fw.RollCompress == nil {
compress := true
fw.RollCompress = &compress
}
if fw.RollKeep == 0 {
fw.RollKeep = 10
}
if fw.RollKeepDays == 0 {
fw.RollKeepDays = 90
}
// create the file if it does not exist with the right mode. // create the file if it does not exist; create with the configured mode, or default
// lumberjack will reuse the file mode across log rotation. // to restrictive if not set. (lumberjack will reuse the file mode across log rotation)
f_tmp, err := os.OpenFile(fw.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.FileMode(fw.Mode)) if err := os.MkdirAll(filepath.Dir(fw.Filename), 0o700); err != nil {
return nil, err
}
file, err := os.OpenFile(fw.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, modeIfCreating)
if err != nil {
return nil, err
}
info, err := file.Stat()
if roll {
file.Close() // lumberjack will reopen it on its own
}
// Ensure already existing files have the right mode, since OpenFile will not set the mode in such case.
if configuredMode := os.FileMode(fw.Mode); configuredMode != 0 {
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("unable to stat log file to see if we need to set permissions: %v", err)
} }
f_tmp.Close() // only chmod if the configured mode is different
// ensure already existing files have the right mode, if info.Mode()&os.ModePerm != configuredMode&os.ModePerm {
// since OpenFile will not set the mode in such case. if err = os.Chmod(fw.Filename, configuredMode); err != nil {
if err = os.Chmod(fw.Filename, os.FileMode(fw.Mode)); err != nil { return nil, err
return nil, err }
} }
return &lumberjack.Logger{
Filename: fw.Filename,
MaxSize: fw.RollSizeMB,
MaxAge: fw.RollKeepDays,
MaxBackups: fw.RollKeep,
LocalTime: fw.RollLocalTime,
Compress: *fw.RollCompress,
}, nil
} }
// otherwise just open a regular file // if not rolling, then the plain file handle is all we need
return os.OpenFile(fw.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.FileMode(fw.Mode)) if !roll {
return file, nil
}
// otherwise, return a rolling log
if fw.RollSizeMB == 0 {
fw.RollSizeMB = 100
}
if fw.RollCompress == nil {
compress := true
fw.RollCompress = &compress
}
if fw.RollKeep == 0 {
fw.RollKeep = 10
}
if fw.RollKeepDays == 0 {
fw.RollKeepDays = 90
}
return &lumberjack.Logger{
Filename: fw.Filename,
MaxSize: fw.RollSizeMB,
MaxAge: fw.RollKeepDays,
MaxBackups: fw.RollKeep,
LocalTime: fw.RollLocalTime,
Compress: *fw.RollCompress,
}, nil
} }
// UnmarshalCaddyfile sets up the module from Caddyfile tokens. Syntax: // UnmarshalCaddyfile sets up the module from Caddyfile tokens. Syntax:

View file

@ -20,6 +20,7 @@ import (
"encoding/json" "encoding/json"
"os" "os"
"path" "path"
"path/filepath"
"syscall" "syscall"
"testing" "testing"
@ -77,7 +78,7 @@ func TestFileCreationMode(t *testing.T) {
t.Fatalf("failed to create tempdir: %v", err) t.Fatalf("failed to create tempdir: %v", err)
} }
defer os.RemoveAll(dir) defer os.RemoveAll(dir)
fpath := path.Join(dir, "test.log") fpath := filepath.Join(dir, "test.log")
tt.fw.Filename = fpath tt.fw.Filename = fpath
logger, err := tt.fw.OpenWriter() logger, err := tt.fw.OpenWriter()
@ -92,7 +93,7 @@ func TestFileCreationMode(t *testing.T) {
} }
if st.Mode() != tt.wantMode { if st.Mode() != tt.wantMode {
t.Errorf("file mode is %v, want %v", st.Mode(), tt.wantMode) t.Errorf("%s: file mode is %v, want %v", tt.name, st.Mode(), tt.wantMode)
} }
}) })
} }