summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert@lshift.net>2008-11-28 12:57:03 +0000
committerHubert Plociniczak <hubert@lshift.net>2008-11-28 12:57:03 +0000
commitb1dab3afd0b26c35dbdea409719a88b116b245c5 (patch)
tree22c211a345b283942bfe50f095a8afb866135874
parent15b7fc9d54934863baba663b5aacbf84660c3c0b (diff)
downloadrabbitmq-server-git-b1dab3afd0b26c35dbdea409719a88b116b245c5.tar.gz
Logging handlers attempt to create the directory
to the log file if it doesn't exist yet. Added new test to include the case when no write permissions are set for the directory.
-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),