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) 2020 VMware, Inc. or its affiliates. All rights reserved. 6 7defmodule RabbitMQ.CLI.Ctl.Commands.ListUserLimitsCommand do 8 alias RabbitMQ.CLI.Core.DocGuide 9 10 @behaviour RabbitMQ.CLI.CommandBehaviour 11 12 def scopes(), do: [:ctl, :diagnostics] 13 def switches(), do: [global: :boolean, user: :string] 14 15 def merge_defaults(args, %{global: true} = opts) do 16 {args, Map.merge(%{table_headers: true}, opts)} 17 end 18 19 def merge_defaults(args, opts) do 20 {args, Map.merge(%{user: "guest", table_headers: true}, opts)} 21 end 22 23 use RabbitMQ.CLI.Core.AcceptsNoPositionalArguments 24 use RabbitMQ.CLI.Core.RequiresRabbitAppRunning 25 26 def run([], %{node: node_name, global: true}) do 27 case :rabbit_misc.rpc_call(node_name, :rabbit_auth_backend_internal, :get_user_limits, []) do 28 [] -> 29 [] 30 31 {:error, err} -> 32 {:error, err} 33 34 {:badrpc, node} -> 35 {:badrpc, node} 36 37 val -> 38 Enum.map(val, fn {user, val} -> 39 {:ok, val_encoded} = JSON.encode(Map.new(val)) 40 [user: user, limits: val_encoded] 41 end) 42 end 43 end 44 45 def run([], %{node: node_name, user: username}) do 46 case :rabbit_misc.rpc_call(node_name, :rabbit_auth_backend_internal, :get_user_limits, [username]) do 47 :undefined -> 48 {:error, {:no_such_user, username}} 49 50 {:error, err} -> 51 {:error, err} 52 53 {:badrpc, node} -> 54 {:badrpc, node} 55 56 val when is_list(val) or is_map(val) -> 57 {:ok, val_encoded} = JSON.encode(Map.new(val)) 58 val_encoded 59 end 60 end 61 62 use RabbitMQ.CLI.DefaultOutput 63 64 def formatter(), do: RabbitMQ.CLI.Formatters.Table 65 66 def usage, do: "list_user_limits [--user <username>] [--global]" 67 68 def usage_additional() do 69 [ 70 ["--global", "list limits for all the users"] 71 ] 72 end 73 74 def usage_doc_guides() do 75 [ 76 DocGuide.access_control() 77 ] 78 end 79 80 def help_section(), do: :user_management 81 82 def description(), do: "Displays configured user limits" 83 84 def banner([], %{global: true}) do 85 "Listing limits for all users ..." 86 end 87 88 def banner([], %{user: username}) do 89 "Listing limits for user \"#{username}\" ..." 90 end 91end 92