From b1dab3afd0b26c35dbdea409719a88b116b245c5 Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Fri, 28 Nov 2008 12:57:03 +0000 Subject: 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. --- src/rabbit_error_logger_file_h.erl | 4 +++- src/rabbit_misc.erl | 10 +++++++++- src/rabbit_sasl_report_file_h.erl | 4 +++- src/rabbit_tests.erl | 38 +++++++++++++++++++++++++++++--------- 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), -- cgit v1.2.1