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