1## This Source Code Form is subject to the terms of the Mozilla Public 2## License, v. 2.0. If a copy of the MPL was not distributed with this 3## file, You can obtain one at https://mozilla.org/MPL/2.0/. 4## 5## Copyright (c) 2007-2021 VMware, Inc. or its affiliates. All rights reserved. 6 7defmodule RabbitMQ.CLI.Diagnostics.Commands.OsEnvCommand do 8 @moduledoc """ 9 Lists RabbitMQ-specific environment variables defined on target node 10 """ 11 12 import RabbitMQ.CLI.Core.Platform, only: [line_separator: 0] 13 14 @behaviour RabbitMQ.CLI.CommandBehaviour 15 16 def scopes(), do: [:diagnostics] 17 18 use RabbitMQ.CLI.Core.AcceptsDefaultSwitchesAndTimeout 19 use RabbitMQ.CLI.Core.MergesNoDefaults 20 use RabbitMQ.CLI.Core.AcceptsNoPositionalArguments 21 use RabbitMQ.CLI.Core.RequiresRabbitAppRunning 22 23 def run([], %{node: node_name, timeout: timeout}) do 24 case :rabbit_misc.rpc_call(node_name, :rabbit_env, :get_used_env_vars, [], timeout) do 25 {:error, _} = err -> err 26 {:error, _, _} = err -> err 27 xs when is_list(xs) -> 28 # convert keys and values to binaries (Elixir strings) 29 xs 30 |> Enum.map(fn {k, v} -> {:rabbit_data_coercion.to_binary(k), :rabbit_data_coercion.to_binary(v)} end) 31 |> :maps.from_list 32 other -> other 33 end 34 end 35 36 def output([], %{formatter: fmt}) when fmt == "csv" or fmt == "erlang" do 37 {:ok, []} 38 end 39 def output([], %{node: node_name, formatter: "json"}) do 40 {:ok, %{"result" => "ok", "node" => node_name, "variables" => []}} 41 end 42 def output([], %{node: node_name}) do 43 {:ok, "Node #{node_name} reported no relevant environment variables."} 44 end 45 def output(vars, %{node: node_name, formatter: "json"}) do 46 {:ok, %{"result" => "ok", "node" => node_name, "variables" => vars}} 47 end 48 def output(vars, %{formatter: "csv"}) do 49 {:stream, [Enum.map(vars, fn({k, v}) -> [variable: k, value: v] end)]} 50 end 51 def output(vars, _opts) do 52 lines = Enum.map(vars, fn({k, v}) -> "#{k}=#{v}" end) |> Enum.join(line_separator()) 53 {:ok, lines} 54 end 55 56 def usage() do 57 "os_env" 58 end 59 60 def help_section(), do: :configuration 61 62 def description(), do: "Lists RabbitMQ-specific environment variables set on target node" 63 64 def banner(_, %{node: node_name}) do 65 "Listing RabbitMQ-specific environment variables defined on node #{node_name}..." 66 end 67end 68