Merge pull request #2860 from rabbitmq/cli-remote_shell

Add rabbitmq-diagnostics remote_shell
This commit is contained in:
Michael Klishin 2021-03-05 05:59:31 +03:00 committed by GitHub
commit af50305d5d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 75 additions and 0 deletions

View File

@ -0,0 +1,35 @@
## This Source Code Form is subject to the terms of the Mozilla Public
## License, v. 2.0. If a copy of the MPL was not distributed with this
## file, You can obtain one at https://mozilla.org/MPL/2.0/.
##
## Copyright (c) 2007-2021 VMware, Inc. or its affiliates. All rights reserved.
defmodule RabbitMQ.CLI.Diagnostics.Commands.RemoteShellCommand do
@behaviour RabbitMQ.CLI.CommandBehaviour
use RabbitMQ.CLI.Core.MergesNoDefaults
use RabbitMQ.CLI.Core.AcceptsNoPositionalArguments
def run([], %{node: node_name}) do
_ = Supervisor.terminate_child(:kernel_sup, :user)
Process.flag(:trap_exit, true)
user_drv = :user_drv.start(['tty_sl -c -e', {node_name, :shell, :start, []}])
Process.link(user_drv)
receive do
{'EXIT', user_drv, _} ->
{:ok, "Disconnected from #{node_name}."}
end
end
use RabbitMQ.CLI.DefaultOutput
def help_section(), do: :observability_and_health_checks
def description(), do: "Starts an interactive Erlang shell on the target node"
def usage, do: "remote_shell"
def banner(_, %{node: node_name}) do
"Starting an interactive Erlang shell on node #{node_name}... Press 'Ctrl+G' then 'q' to exit."
end
end

View File

@ -0,0 +1,40 @@
## This Source Code Form is subject to the terms of the Mozilla Public
## License, v. 2.0. If a copy of the MPL was not distributed with this
## file, You can obtain one at https://mozilla.org/MPL/2.0/.
##
## Copyright (c) 2007-2020 VMware, Inc. or its affiliates. All rights reserved.
defmodule RemoteShellCommandTest do
use ExUnit.Case, async: false
import TestHelper
@command RabbitMQ.CLI.Diagnostics.Commands.RemoteShellCommand
setup_all do
RabbitMQ.CLI.Core.Distribution.start()
:ok
end
setup context do
{:ok, opts: %{
node: get_rabbit_hostname(),
timeout: context[:test_timeout] || 15000
}}
end
test "merge_defaults: nothing to do" do
assert @command.merge_defaults([], %{}) == {[], %{}}
end
test "validate: treats positional arguments as a failure" do
assert @command.validate(["extra-arg"], %{}) == {:validation_failure, :too_many_args}
end
test "validate: treats empty positional arguments and default switches as a success" do
assert @command.validate([], %{}) == :ok
end
# Unreachable nodes will leave the remote_shell open with an error.
end