diff options
| -rw-r--r-- | include/rabbit_cli.hrl | 10 | ||||
| -rw-r--r-- | packaging/Makefile | 27 | ||||
| -rw-r--r-- | packaging/RPMS/Fedora/Makefile | 3 | ||||
| -rw-r--r-- | packaging/debs/Debian/Makefile | 3 | ||||
| -rw-r--r-- | packaging/debs/apt-repository/Makefile | 21 | ||||
| -rw-r--r-- | packaging/generic-unix/Makefile | 7 | ||||
| -rw-r--r-- | packaging/standalone/Makefile | 12 | ||||
| -rw-r--r-- | packaging/windows-exe/Makefile | 2 | ||||
| -rw-r--r-- | packaging/windows/Makefile | 12 | ||||
| -rwxr-xr-x[-rw-r--r--] | scripts/rabbitmq-server-ha.ocf | 19 | ||||
| -rw-r--r-- | src/rabbit_access_control.erl | 8 | ||||
| -rw-r--r-- | src/rabbit_cli.erl | 36 | ||||
| -rw-r--r-- | src/rabbit_direct.erl | 4 |
13 files changed, 107 insertions, 57 deletions
diff --git a/include/rabbit_cli.hrl b/include/rabbit_cli.hrl index 737bb4ea3d..e49adf5b5a 100644 --- a/include/rabbit_cli.hrl +++ b/include/rabbit_cli.hrl @@ -48,3 +48,13 @@ -define(ONLINE_DEF, {?ONLINE_OPT, flag}). -define(RPC_TIMEOUT, infinity). + +%% Subset of standartized exit codes from sysexits.h +-define(EX_OK , 0). +-define(EX_USAGE , 64). % Bad command-line arguments. +-define(EX_DATAERR , 65). % Wrong data in command-line arguments. +-define(EX_NOUSER , 67). % The user specified does not exist. +-define(EX_UNAVAILABLE, 69). % Could not connect to the target node. +-define(EX_SOFTWARE , 70). % Failed to execute command. +-define(EX_TEMPFAIL , 75). % Temporary error (e.g. something has timed out). +-define(EX_CONFIG , 78). % Misconfiguration detected diff --git a/packaging/Makefile b/packaging/Makefile index 151791152f..edb876770f 100644 --- a/packaging/Makefile +++ b/packaging/Makefile @@ -41,6 +41,7 @@ all: packages PACKAGES_DIR ?= ../PACKAGES SOURCE_DIST_FILE ?= $(wildcard $(PACKAGES_DIR)/rabbitmq-server-*.tar.xz) +ifneq ($(filter-out clean,$(MAKECMDGOALS)),) ifeq ($(SOURCE_DIST_FILE),) $(error Cannot find source archive; please specify SOURCE_DIST_FILE) endif @@ -53,6 +54,11 @@ endif ifeq ($(wildcard $(SOURCE_DIST_FILE)),) $(error The source archive must exist) endif +endif + +ifndef NO_CLEAN +DO_CLEAN := clean +endif packages: package-deb package-rpm package-windows package-generic-unix @: @@ -61,7 +67,7 @@ package-deb: $(SOURCE_DIST_FILE) $(gen_verbose) $(MAKE) -C debs/Debian \ SOURCE_DIST_FILE=$(abspath $(SOURCE_DIST_FILE)) \ PACKAGES_DIR=$(abspath $(PACKAGES_DIR)) \ - all clean + all $(DO_CLEAN) package-rpm: package-rpm-fedora package-rpm-suse @: @@ -70,30 +76,30 @@ package-rpm-fedora: $(SOURCE_DIST_FILE) $(gen_verbose) $(MAKE) -C RPMS/Fedora \ SOURCE_DIST_FILE=$(abspath $(SOURCE_DIST_FILE)) \ PACKAGES_DIR=$(abspath $(PACKAGES_DIR)) \ - all clean + all $(DO_CLEAN) package-rpm-suse: $(SOURCE_DIST_FILE) $(gen_verbose) $(MAKE) -C RPMS/Fedora \ SOURCE_DIST_FILE=$(abspath $(SOURCE_DIST_FILE)) \ PACKAGES_DIR=$(abspath $(PACKAGES_DIR)) \ RPM_OS=suse \ - all clean + all $(DO_CLEAN) package-windows: $(SOURCE_DIST_FILE) $(gen_verbose) $(MAKE) -C windows \ SOURCE_DIST_FILE=$(abspath $(SOURCE_DIST_FILE)) \ PACKAGES_DIR=$(abspath $(PACKAGES_DIR)) \ - all clean + all $(DO_CLEAN) $(verbose) $(MAKE) -C windows-exe \ SOURCE_DIST_FILE=$(abspath $(SOURCE_DIST_FILE)) \ PACKAGES_DIR=$(abspath $(PACKAGES_DIR)) \ - all clean + all $(DO_CLEAN) package-generic-unix: $(SOURCE_DIST_FILE) $(gen_verbose) $(MAKE) -C generic-unix \ SOURCE_DIST_FILE=$(abspath $(SOURCE_DIST_FILE)) \ PACKAGES_DIR=$(abspath $(PACKAGES_DIR)) \ - all clean + all $(DO_CLEAN) ifeq ($(PLATFORM),darwin) packages: package-standalone-macosx @@ -102,5 +108,12 @@ package-standalone-macosx: $(SOURCE_DIST_FILE) $(gen_verbose) $(MAKE) -C standalone OS=mac \ SOURCE_DIST_FILE=$(abspath $(SOURCE_DIST_FILE)) \ PACKAGES_DIR=$(abspath $(PACKAGES_DIR)) \ - all clean + all $(DO_CLEAN) endif + +.PHONY: clean + +clean: + for subdir in debs/Debian RPMS/Fedora windows windows-exe generic-unix standalone; do \ + $(MAKE) -C "$$subdir" clean; \ + done diff --git a/packaging/RPMS/Fedora/Makefile b/packaging/RPMS/Fedora/Makefile index 9b2061b47a..5763cadf04 100644 --- a/packaging/RPMS/Fedora/Makefile +++ b/packaging/RPMS/Fedora/Makefile @@ -1,4 +1,6 @@ SOURCE_DIST_FILE ?= $(wildcard ../../../rabbitmq-server-*.tar.xz) + +ifneq ($(filter-out clean,$(MAKECMDGOALS)),) ifeq ($(SOURCE_DIST_FILE),) $(error Cannot find source archive; please specify SOURCE_DIST_FILE) endif @@ -10,6 +12,7 @@ VERSION ?= $(patsubst rabbitmq-server-%.tar.xz,%,$(notdir $(SOURCE_DIST_FILE))) ifeq ($(VERSION),) $(error Cannot determine version; please specify VERSION) endif +endif TOP_DIR = $(shell pwd) # Under debian we do not want to check build dependencies, since that diff --git a/packaging/debs/Debian/Makefile b/packaging/debs/Debian/Makefile index 8328660ae7..a35b869d4f 100644 --- a/packaging/debs/Debian/Makefile +++ b/packaging/debs/Debian/Makefile @@ -1,4 +1,6 @@ SOURCE_DIST_FILE ?= $(wildcard ../../../rabbitmq-server-*.tar.xz) + +ifneq ($(filter-out clean,$(MAKECMDGOALS)),) ifeq ($(SOURCE_DIST_FILE),) $(error Cannot find source archive; please specify SOURCE_DIST_FILE) endif @@ -10,6 +12,7 @@ VERSION ?= $(patsubst rabbitmq-server-%.tar.xz,%,$(notdir $(SOURCE_DIST_FILE))) ifeq ($(VERSION),) $(error Cannot determine version; please specify VERSION) endif +endif DEBIAN_ORIG_TARBALL = rabbitmq-server_$(VERSION).orig.tar.xz UNPACKED_DIR = rabbitmq-server-$(VERSION) diff --git a/packaging/debs/apt-repository/Makefile b/packaging/debs/apt-repository/Makefile index ce4347bcb4..bbddc15a4e 100644 --- a/packaging/debs/apt-repository/Makefile +++ b/packaging/debs/apt-repository/Makefile @@ -1,27 +1,30 @@ -SIGNING_USER_EMAIL=info@rabbitmq.com +PACKAGES_DIR ?= ../../../PACKAGES +REPO_DIR ?= debian + +SIGNING_USER_EMAIL ?= info@rabbitmq.com ifeq "$(UNOFFICIAL_RELEASE)" "" -HOME_ARG=HOME=$(GNUPG_PATH) +HOME_ARG = HOME=$(GNUPG_PATH) endif all: debian_apt_repository clean: - rm -rf debian + rm -rf $(REPO_DIR) CAN_HAS_REPREPRO=$(shell [ -f /usr/bin/reprepro ] && echo true) ifeq ($(CAN_HAS_REPREPRO), true) debian_apt_repository: clean - mkdir -p debian/conf - cp -a distributions debian/conf + mkdir -p $(REPO_DIR)/conf + cp -a distributions $(REPO_DIR)/conf ifeq "$(UNOFFICIAL_RELEASE)" "" - echo SignWith: $(SIGNING_USER_EMAIL) >> debian/conf/distributions + echo SignWith: $(SIGNING_USER_EMAIL) >> $(REPO_DIR)/conf/distributions endif - for FILE in ../Debian/*.changes ; do \ + for FILE in $(PACKAGES_DIR)/*.changes ; do \ $(HOME_ARG) reprepro --ignore=wrongdistribution \ - -Vb debian include kitten $${FILE} ; \ + -Vb $(REPO_DIR) include kitten $${FILE} ; \ done - reprepro -Vb debian createsymlinks + reprepro -Vb $(REPO_DIR) createsymlinks else debian_apt_repository: @echo Not building APT repository as reprepro could not be found diff --git a/packaging/generic-unix/Makefile b/packaging/generic-unix/Makefile index 8d483582ec..fb8b3a9e68 100644 --- a/packaging/generic-unix/Makefile +++ b/packaging/generic-unix/Makefile @@ -1,4 +1,6 @@ SOURCE_DIST_FILE ?= $(wildcard ../../../rabbitmq-server-*.tar.xz) + +ifneq ($(filter-out clean,$(MAKECMDGOALS)),) ifeq ($(SOURCE_DIST_FILE),) $(error Cannot find source archive; please specify SOURCE_DIST_FILE) endif @@ -10,6 +12,7 @@ VERSION ?= $(patsubst rabbitmq-server-%.tar.xz,%,$(notdir $(SOURCE_DIST_FILE))) ifeq ($(VERSION),) $(error Cannot determine version; please specify VERSION) endif +endif SOURCE_DIR = rabbitmq-server-$(VERSION) TARGET_DIR = rabbitmq_server-$(VERSION) @@ -38,7 +41,6 @@ dist: mkdir -p $(TARGET_DIR)/etc/rabbitmq tar -zcf $(TARGET_TARBALL).tar.gz $(TARGET_DIR) - rm -rf $(SOURCE_DIR) $(TARGET_DIR) if test "$(PACKAGES_DIR)"; then \ mkdir -p "$(PACKAGES_DIR)"; \ @@ -49,5 +51,4 @@ clean: clean_partial rm -f rabbitmq-server-generic-unix-*.tar.gz clean_partial: - rm -rf $(SOURCE_DIR) - rm -rf $(TARGET_DIR) + rm -rf rabbitmq-server-* rabbitmq_server-* diff --git a/packaging/standalone/Makefile b/packaging/standalone/Makefile index 5f2cb90440..578ed57345 100644 --- a/packaging/standalone/Makefile +++ b/packaging/standalone/Makefile @@ -1,4 +1,6 @@ SOURCE_DIST_FILE ?= $(wildcard ../../rabbitmq-server-*.tar.xz) + +ifneq ($(filter-out clean,$(MAKECMDGOALS)),) ifeq ($(SOURCE_DIST_FILE),) $(error Cannot find source archive; please specify SOURCE_DIST_FILE) endif @@ -10,6 +12,7 @@ VERSION ?= $(patsubst rabbitmq-server-%.tar.xz,%,$(notdir $(SOURCE_DIST_FILE))) ifeq ($(VERSION),) $(error Cannot determine version; please specify VERSION) endif +endif SOURCE_DIR=rabbitmq-server-$(VERSION) TARGET_DIR=rabbitmq_server-$(VERSION) @@ -92,19 +95,14 @@ dist: cd $(TARGET_DIR)/release && \ find $(TARGET_DIR) -print0 | LC_COLLATE=C sort -z | \ xargs -0 tar -cnf - | xz > $(CURDIR)/$(TARGET_TARBALL).tar.xz - rm -rf $(SOURCE_DIR) $(TARGET_DIR) if test "$(PACKAGES_DIR)"; then \ mkdir -p "$(PACKAGES_DIR)"; \ mv $(TARGET_TARBALL).tar.xz "$(PACKAGES_DIR)"; \ fi -clean: clean_partial - rm -f rabbitmq-server-$(OS)-standalone-*.tar.gz - -clean_partial: - rm -rf $(SOURCE_DIR) - rm -rf $(TARGET_DIR) +clean: + rm -rf rabbitmq-server-* rabbitmq_server-* .PHONY : generate_release generate_release: diff --git a/packaging/windows-exe/Makefile b/packaging/windows-exe/Makefile index fad0eae5f5..26ef4585c3 100644 --- a/packaging/windows-exe/Makefile +++ b/packaging/windows-exe/Makefile @@ -3,7 +3,7 @@ ZIP_DIR = ../windows else ZIP_DIR = $(PACKAGES_DIR) endif -ZIP = $(notdir $(wildcard $(ZIP_DIR)/rabbitmq-server-windows-$(VERSION).zip)) +ZIP = $(notdir $(wildcard $(ZIP_DIR)/rabbitmq-server-windows-*.zip)) VERSION = $(patsubst rabbitmq-server-windows-%.zip,%,$(ZIP)) diff --git a/packaging/windows/Makefile b/packaging/windows/Makefile index 4fc72b95c4..beda5752be 100644 --- a/packaging/windows/Makefile +++ b/packaging/windows/Makefile @@ -1,4 +1,6 @@ SOURCE_DIST_FILE ?= $(wildcard ../../../rabbitmq-server-*.tar.xz) + +ifneq ($(filter-out clean,$(MAKECMDGOALS)),) ifeq ($(SOURCE_DIST_FILE),) $(error Cannot find source archive; please specify SOURCE_DIST_FILE) endif @@ -10,6 +12,7 @@ VERSION ?= $(patsubst rabbitmq-server-%.tar.xz,%,$(notdir $(SOURCE_DIST_FILE))) ifeq ($(VERSION),) $(error Cannot determine version; please specify VERSION) endif +endif SOURCE_DIR = rabbitmq-server-$(VERSION) TARGET_DIR = rabbitmq_server-$(VERSION) @@ -30,16 +33,11 @@ dist: cp -a README-etc $(TARGET_DIR)/etc/README.txt zip -q -r $(TARGET_ZIP).zip $(TARGET_DIR) - rm -rf $(SOURCE_DIR) $(TARGET_DIR) if test "$(PACKAGES_DIR)"; then \ mkdir -p "$(PACKAGES_DIR)"; \ mv $(TARGET_ZIP).zip "$(PACKAGES_DIR)"; \ fi -clean: clean_partial - rm -f rabbitmq-server-windows-*.zip - -clean_partial: - rm -rf $(SOURCE_DIR) - rm -rf $(TARGET_DIR) +clean: + rm -rf rabbitmq-server-* rabbitmq_server-* diff --git a/scripts/rabbitmq-server-ha.ocf b/scripts/rabbitmq-server-ha.ocf index 6404a7dbd2..42e5332367 100644..100755 --- a/scripts/rabbitmq-server-ha.ocf +++ b/scripts/rabbitmq-server-ha.ocf @@ -246,7 +246,7 @@ Erlang cookie file path where the cookie will be put, if requested Either to use FQDN or a shortname for the rabbitmq node </longdesc> <shortdesc lang="en">Use FQDN</shortdesc> -<content type="boolean" default="${OCF_RESKEY_erlang_cookie_file_default}" /> +<content type="boolean" default="${OCF_RESKEY_use_fqdn_default}" /> </parameter> <parameter name="max_rabbitmqctl_timeouts" unique="0" required="0"> @@ -573,9 +573,22 @@ check_need_join_to() { # Update erlang cookie, if it has been specified update_cookie() { + local cookie_file_content if [ "${OCF_RESKEY_erlang_cookie}" != 'false' ] ; then - echo "${OCF_RESKEY_erlang_cookie}" > "${OCF_RESKEY_erlang_cookie_file}" && \ - chown ${OCF_RESKEY_username}:${OCF_RESKEY_groupname} "${OCF_RESKEY_erlang_cookie_file}" && \ + if [ -f "${OCF_RESKEY_erlang_cookie_file}" ]; then + # First line of cookie file without newline + cookie_file_content=$(head -n1 "${OCF_RESKEY_erlang_cookie_file}" | perl -pe chomp) + fi + # As there is a brief period of time when the file is empty + # (shell redirection has already opened and truncated file, + # and echo hasn't finished its job), we are doing this write + # only when cookie has changed. + if [ "${OCF_RESKEY_erlang_cookie}" != "${cookie_file_content}" ]; then + echo "${OCF_RESKEY_erlang_cookie}" > "${OCF_RESKEY_erlang_cookie_file}" + fi + # And this are idempotent operations, so we don't have to + # check any preconditions for running them. + chown ${OCF_RESKEY_username}:${OCF_RESKEY_groupname} "${OCF_RESKEY_erlang_cookie_file}" chmod 600 "${OCF_RESKEY_erlang_cookie_file}" fi return $OCF_SUCCESS diff --git a/src/rabbit_access_control.erl b/src/rabbit_access_control.erl index 3fe7212276..f649e4b274 100644 --- a/src/rabbit_access_control.erl +++ b/src/rabbit_access_control.erl @@ -142,7 +142,7 @@ check_vhost_access(User = #user{username = Username, auth_user(User, Impl), VHostPath, Sock) end, Mod, "access to vhost '~s' refused for user '~s'", - [VHostPath, Username]); + [VHostPath, Username], not_allowed); (_, Else) -> Else end, ok, Modules). @@ -164,7 +164,11 @@ check_resource_access(User = #user{username = Username, (_, Else) -> Else end, ok, Modules). + check_access(Fun, Module, ErrStr, ErrArgs) -> + check_access(Fun, Module, ErrStr, ErrArgs, access_refused). + +check_access(Fun, Module, ErrStr, ErrArgs, ErrName) -> Allow = case Fun() of {error, E} -> rabbit_log:error(ErrStr ++ " by ~s: ~p~n", @@ -177,5 +181,5 @@ check_access(Fun, Module, ErrStr, ErrArgs) -> true -> ok; false -> - rabbit_misc:protocol_error(access_refused, ErrStr, ErrArgs) + rabbit_misc:protocol_error(ErrName, ErrStr, ErrArgs) end. diff --git a/src/rabbit_cli.erl b/src/rabbit_cli.erl index 522e91120e..311906afc6 100644 --- a/src/rabbit_cli.erl +++ b/src/rabbit_cli.erl @@ -68,10 +68,10 @@ main(ParseFun, DoFun, UsageMod) -> %% thrown errors into normal return values case catch DoFun(Command, Node, Args, Opts) of ok -> - rabbit_misc:quit(0); + rabbit_misc:quit(?EX_OK); {ok, Result} -> rabbit_ctl_misc:print_cmd_result(Command, Result), - rabbit_misc:quit(0); + rabbit_misc:quit(?EX_OK); {'EXIT', {function_clause, [{?MODULE, action, _} | _]}} -> %% < R15 PrintInvalidCommandError(), usage(UsageMod); @@ -81,47 +81,48 @@ main(ParseFun, DoFun, UsageMod) -> {error, {missing_dependencies, Missing, Blame}} -> print_error("dependent plugins ~p not found; used by ~p.", [Missing, Blame]), - rabbit_misc:quit(2); + rabbit_misc:quit(?EX_CONFIG); {'EXIT', {badarg, _}} -> print_error("invalid parameter: ~p", [Args]), - usage(UsageMod); + usage(UsageMod, ?EX_DATAERR); {error, {Problem, Reason}} when is_atom(Problem), is_binary(Reason) -> %% We handle this common case specially to avoid ~p since %% that has i18n issues print_error("~s: ~s", [Problem, Reason]), - rabbit_misc:quit(2); + rabbit_misc:quit(?EX_SOFTWARE); {error, Reason} -> print_error("~p", [Reason]), - rabbit_misc:quit(2); + rabbit_misc:quit(?EX_SOFTWARE); {error_string, Reason} -> print_error("~s", [Reason]), - rabbit_misc:quit(2); + rabbit_misc:quit(?EX_SOFTWARE); {badrpc, {'EXIT', Reason}} -> print_error("~p", [Reason]), - rabbit_misc:quit(2); + rabbit_misc:quit(?EX_SOFTWARE); {badrpc, Reason} -> case Reason of timeout -> - print_error("operation ~w on node ~w timed out", [Command, Node]); + print_error("operation ~w on node ~w timed out", [Command, Node]), + rabbit_misc:quit(?EX_TEMPFAIL); _ -> print_error("unable to connect to node ~w: ~w", [Node, Reason]), - print_badrpc_diagnostics([Node]) - end, - rabbit_misc:quit(2); + print_badrpc_diagnostics([Node]), + rabbit_misc:quit(?EX_UNAVAILABLE) + end; {badrpc_multi, Reason, Nodes} -> print_error("unable to connect to nodes ~p: ~w", [Nodes, Reason]), print_badrpc_diagnostics(Nodes), - rabbit_misc:quit(2); + rabbit_misc:quit(?EX_UNAVAILABLE); function_clause -> print_error("operation ~w used with invalid parameter: ~p", [Command, Args]), usage(UsageMod); {refused, Username, _, _} -> print_error("failed to authenticate user \"~s\"", [Username]), - rabbit_misc:quit(2); + rabbit_misc:quit(?EX_NOUSER); Other -> print_error("~p", [Other]), - rabbit_misc:quit(2) + rabbit_misc:quit(?EX_SOFTWARE) end. start_distribution() -> @@ -139,8 +140,11 @@ name_type() -> end. usage(Mod) -> + usage(Mod, ?EX_USAGE). + +usage(Mod, ExitCode) -> io:format("~s", [Mod:usage()]), - rabbit_misc:quit(1). + rabbit_misc:quit(ExitCode). %%---------------------------------------------------------------------------- diff --git a/src/rabbit_direct.erl b/src/rabbit_direct.erl index 4940ab2b53..623d16215b 100644 --- a/src/rabbit_direct.erl +++ b/src/rabbit_direct.erl @@ -114,8 +114,8 @@ connect1(User, VHost, Protocol, Pid, Infos) -> rabbit_event:notify(connection_created, Infos), {ok, {User, rabbit_reader:server_properties(Protocol)}} catch - exit:#amqp_error{name = access_refused} -> - {error, access_refused} + exit:#amqp_error{name = Reason = not_allowed} -> + {error, Reason} end. start_channel(Number, ClientChannelPid, ConnPid, ConnName, Protocol, User, |
