Merge pull request #2860 from rabbitmq/cli-remote_shell
Add rabbitmq-diagnostics remote_shell
This commit is contained in:
commit
af50305d5d
35
deps/rabbitmq_cli/lib/rabbitmq/cli/diagnostics/commands/remote_shell_command.ex
vendored
Normal file
35
deps/rabbitmq_cli/lib/rabbitmq/cli/diagnostics/commands/remote_shell_command.ex
vendored
Normal 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
|
||||
|
|
@ -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
|
||||
Loading…
Reference in New Issue