summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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.erl38
4 files changed, 44 insertions, 12 deletions
diff --git a/src/rabbit_error_logger_file_h.erl b/src/rabbit_error_logger_file_h.erl
index d67b02ef42..c3bdd5201d 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_directory_exists(File),
error_logger_file_h:init(FileInfo);
init(File) ->
+ rabbit_misc:ensure_directory_exists(File),
error_logger_file_h:init(File).
handle_event(Event, State) ->
diff --git a/src/rabbit_misc.erl b/src/rabbit_misc.erl
index c1c643d3a4..02f519bd4c 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_directory_exists/1]).
-import(mnesia).
-import(lists).
@@ -98,6 +98,7 @@
'ok' | 'aborted').
-spec(dirty_dump_log/1 :: (string()) -> 'ok' | {'error', any()}).
-spec(append_file/2 :: (string(), string()) -> 'ok' | {'error', any()}).
+-spec(ensure_directory_exists/1 :: (string()) -> 'ok').
-endif.
@@ -369,3 +370,10 @@ append_file(File, _, Suffix) ->
{ok, Data} -> file:write_file([File, Suffix], Data, [append]);
Error -> Error
end.
+
+ensure_directory_exists(Filename) ->
+ case filelib:ensure_dir(Filename) of
+ ok -> ok;
+ {error, Reason} ->
+ throw({error, {cannot_create_directory, Filename, Reason}})
+ end.
diff --git a/src/rabbit_sasl_report_file_h.erl b/src/rabbit_sasl_report_file_h.erl
index 10e2ee6eb9..0c5a29f02b 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_directory_exists(File),
sasl_report_file_h:init(FileInfo);
init(File) ->
+ rabbit_misc:ensure_directory_exists(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 db78bbcc50..7c7136b905 100644
--- a/src/rabbit_tests.erl
+++ b/src/rabbit_tests.erl
@@ -236,25 +236,37 @@ 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);
+ {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);
+ {error, {cannot_log_to_file, _, _}} -> ok
+ end,
+ ok = set_permissions(TmpDir, 8#00400 + 8#00200 + 8#00100),
+ ok = set_permissions(TmpLog, 8#00400 + 8#00200),
+ ok = delete_file(TmpLog),
+ ok = file:del_dir(TmpDir),
%% start application with standard error_logger_file_h
%% handler not installed
@@ -494,6 +506,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),