From 30e4359386ce6fc4471daa045922bccba292c831 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 14 Feb 2025 18:52:36 +0900 Subject: [PATCH] Copy permission and ownership at shift Fix #80 --- lib/logger/log_device.rb | 14 ++++++++++++++ test/logger/test_logdevice.rb | 17 +++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/lib/logger/log_device.rb b/lib/logger/log_device.rb index dbbc0d9..cde3158 100644 --- a/lib/logger/log_device.rb +++ b/lib/logger/log_device.rb @@ -226,9 +226,23 @@ def shift_log_period(period_end) end def shift_log_file(shifted) + stat = @dev.stat @dev.close rescue nil File.rename(@filename, shifted) @dev = create_logfile(@filename) + mode, uid, gid = stat.mode, stat.uid, stat.gid + begin + @dev.chmod(mode) if mode + mode = nil + @dev.chown(uid, gid) + rescue Errno::EPERM + if mode + # failed to chmod, probably nothing can do more. + elsif uid + uid = nil + retry # to change gid only + end + end return true end end diff --git a/test/logger/test_logdevice.rb b/test/logger/test_logdevice.rb index a65ceaf..c9b0816 100644 --- a/test/logger/test_logdevice.rb +++ b/test/logger/test_logdevice.rb @@ -205,6 +205,23 @@ def test_reopen_file_by_file end end + def test_perm_after_shift + mode = 0o611 + File.open(@filename, "w") {|f| f.chmod mode} + logfile = @filename + logfile0 = logfile + '.0' + logdev = d(@filename, shift_age: 1, shift_size: 0) + logdev.write('hello') + logdev.write('hello') + logdev.close + + assert_equal File.stat(logfile0).mode, File.stat(logfile).mode + ensure + if logfile0 + File.unlink(logfile0) rescue nil + end + end + def test_shifting_size_with_reopen tmpfile = Tempfile.new([File.basename(__FILE__, '.*'), '_1.log']) logfile = tmpfile.path