diff options
author | Matthias Radestock <matthias@lshift.net> | 2008-12-05 09:32:11 +0000 |
---|---|---|
committer | Matthias Radestock <matthias@lshift.net> | 2008-12-05 09:32:11 +0000 |
commit | 070e0857353f2de782318d4e512a1f880dae4388 (patch) | |
tree | 55213ac76a9b152ebc012cc5fe65d8a5d3596a0a | |
parent | 714c8d1957e9f5332b6deaf858bfa64d842960db (diff) | |
parent | 5fa4f462d7d3a691ab0bb159e388a096f7e0f019 (diff) | |
download | rabbitmq-server-070e0857353f2de782318d4e512a1f880dae4388.tar.gz |
merge bug19900 into default
-rw-r--r-- | src/rabbit_error_logger_file_h.erl | 4 | ||||
-rw-r--r-- | src/rabbit_misc.erl | 10 | ||||
-rw-r--r-- | src/rabbit_sasl_report_file_h.erl | 4 | ||||
-rw-r--r-- | src/rabbit_tests.erl | 52 |
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), |