summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert@lshift.net>2008-12-05 14:47:24 +0000
committerHubert Plociniczak <hubert@lshift.net>2008-12-05 14:47:24 +0000
commitd5f24fcf9b2b9b5285709e8f3954795a82e4b256 (patch)
treef7087f7661115f224b793d9d19fa73e157eac7ee
parent1298f2da3a29a3110a20c0c5e283d237b468ecb8 (diff)
parent070e0857353f2de782318d4e512a1f880dae4388 (diff)
downloadrabbitmq-server-d5f24fcf9b2b9b5285709e8f3954795a82e4b256.tar.gz
Merge bug19889 into default
-rw-r--r--src/rabbit_error_logger_file_h.erl4
-rw-r--r--src/rabbit_misc.erl10
-rw-r--r--src/rabbit_sasl_report_file_h.erl4
-rw-r--r--src/rabbit_tests.erl52
4 files changed, 58 insertions, 12 deletions
diff --git a/src/rabbit_error_logger_file_h.erl b/src/rabbit_error_logger_file_h.erl
index d67b02ef..7f7f77f5 100644
--- a/src/rabbit_error_logger_file_h.erl
+++ b/src/rabbit_error_logger_file_h.erl
@@ -53,9 +53,11 @@ init({{File, _}, error}) ->
%% log rotation
init({File, []}) ->
init(File);
-init({_File, _Type} = FileInfo) ->
+init({File, _Type} = FileInfo) ->
+ rabbit_misc:ensure_parent_dirs_exist(File),
error_logger_file_h:init(FileInfo);
init(File) ->
+ rabbit_misc:ensure_parent_dirs_exist(File),
error_logger_file_h:init(File).
handle_event(Event, State) ->
diff --git a/src/rabbit_misc.erl b/src/rabbit_misc.erl
index 3c67d225..6be73e43 100644
--- a/src/rabbit_misc.erl
+++ b/src/rabbit_misc.erl
@@ -42,7 +42,7 @@
-export([intersperse/2, upmap/2, map_in_order/2]).
-export([guid/0, string_guid/1, binstring_guid/1]).
-export([dirty_read_all/1, dirty_foreach_key/2, dirty_dump_log/1]).
--export([append_file/2]).
+-export([append_file/2, ensure_parent_dirs_exist/1]).
-export([format_stderr/2]).
-import(mnesia).
@@ -99,6 +99,7 @@
'ok' | 'aborted').
-spec(dirty_dump_log/1 :: (string()) -> 'ok' | {'error', any()}).
-spec(append_file/2 :: (string(), string()) -> 'ok' | {'error', any()}).
+-spec(ensure_parent_dirs_exist/1 :: (string()) -> 'ok').
-spec(format_stderr/2 :: (string(), [any()]) -> 'true').
-endif.
@@ -372,6 +373,13 @@ append_file(File, _, Suffix) ->
Error -> Error
end.
+ensure_parent_dirs_exist(Filename) ->
+ case filelib:ensure_dir(Filename) of
+ ok -> ok;
+ {error, Reason} ->
+ throw({error, {cannot_create_parent_dirs, Filename, Reason}})
+ end.
+
format_stderr(Fmt, Args) ->
Port = open_port({fd, 0, 2}, [out]),
port_command(Port, io_lib:format(Fmt, Args)),
diff --git a/src/rabbit_sasl_report_file_h.erl b/src/rabbit_sasl_report_file_h.erl
index 10e2ee6e..e2385d83 100644
--- a/src/rabbit_sasl_report_file_h.erl
+++ b/src/rabbit_sasl_report_file_h.erl
@@ -54,9 +54,11 @@ init({{File, _}, error}) ->
%% doing any log rotation
init({File, []}) ->
init(File);
-init({_File, _Type} = FileInfo) ->
+init({File, _Type} = FileInfo) ->
+ rabbit_misc:ensure_parent_dirs_exist(File),
sasl_report_file_h:init(FileInfo);
init(File) ->
+ rabbit_misc:ensure_parent_dirs_exist(File),
sasl_report_file_h:init({File, sasl_error_logger_type()}).
handle_event(Event, State) ->
diff --git a/src/rabbit_tests.erl b/src/rabbit_tests.erl
index 09e2cfe4..d7c8bddf 100644
--- a/src/rabbit_tests.erl
+++ b/src/rabbit_tests.erl
@@ -238,25 +238,51 @@ test_log_management_during_startup() ->
ok = error_logger:tty(false),
ok = delete_log_handlers([sasl_report_tty_h]),
ok = case catch control_action(start_app, []) of
- ok -> exit(got_success_but_expected_failure);
- {error, {cannot_log_to_tty, _, _}} -> ok
- end,
+ ok -> exit({got_success_but_expected_failure,
+ log_rotation_tty_no_handlers_test});
+ {error, {cannot_log_to_tty, _, _}} -> ok
+ end,
%% fix sasl logging
ok = application:set_env(sasl, sasl_error_logger,
{file, SaslLog}),
- %% start application with logging to invalid directory
+ %% start application with logging to non-existing directory
TmpLog = "/tmp/rabbit-tests/test.log",
- file:delete(TmpLog),
+ delete_file(TmpLog),
ok = application:set_env(kernel, error_logger, {file, TmpLog}),
ok = delete_log_handlers([rabbit_error_logger_file_h]),
ok = add_log_handlers([{error_logger_file_h, MainLog}]),
- ok = case catch control_action(start_app, []) of
- ok -> exit(got_success_but_expected_failure);
- {error, {cannot_log_to_file, _, _}} -> ok
- end,
+ ok = control_action(start_app, []),
+
+ %% start application with logging to directory with no
+ %% write permissions
+ TmpDir = "/tmp/rabbit-tests",
+ ok = set_permissions(TmpDir, 8#00400),
+ ok = delete_log_handlers([rabbit_error_logger_file_h]),
+ ok = add_log_handlers([{error_logger_file_h, MainLog}]),
+ ok = case control_action(start_app, []) of
+ ok -> exit({got_success_but_expected_failure,
+ log_rotation_no_write_permission_dir_test});
+ {error, {cannot_log_to_file, _, _}} -> ok
+ end,
+
+ %% start application with logging to a subdirectory which
+ %% parent directory has no write permissions
+ TmpTestDir = "/tmp/rabbit-tests/no-permission/test/log",
+ ok = application:set_env(kernel, error_logger, {file, TmpTestDir}),
+ ok = add_log_handlers([{error_logger_file_h, MainLog}]),
+ ok = case control_action(start_app, []) of
+ ok -> exit({got_success_but_expected_failure,
+ log_rotatation_parent_dirs_test});
+ {error, {cannot_log_to_file, _,
+ {error, {cannot_create_parent_dirs, _, eacces}}}} -> ok
+ end,
+ ok = set_permissions(TmpDir, 8#00700),
+ ok = set_permissions(TmpLog, 8#00600),
+ ok = delete_file(TmpLog),
+ ok = file:del_dir(TmpDir),
%% start application with standard error_logger_file_h
%% handler not installed
@@ -496,6 +522,14 @@ test_logs_working(MainLogFile, SaslLogFile) ->
[true, true] = non_empty_files([MainLogFile, SaslLogFile]),
ok.
+set_permissions(Path, Mode) ->
+ case file:read_file_info(Path) of
+ {ok, FInfo} -> file:write_file_info(
+ Path,
+ FInfo#file_info{mode=Mode});
+ Error -> Error
+ end.
+
clean_logs(Files, Suffix) ->
[begin
ok = delete_file(File),