# File lib/mcollective/application/inventory.rb, line 94
  def node_inventory
    node = configuration[:node]

    util = rpcclient("rpcutil")
    util.identity_filter node
    util.progress = false

    nodestats = util.custom_request("daemon_stats", {}, node, {"identity" => node}).first

    unless nodestats
      STDERR.puts "Did not receive any results from node #{node}"
      exit 1
    end

    unless nodestats[:statuscode] == 0
      STDERR.puts "Failed to retrieve daemon_stats from #{node}: #{nodestats[:statusmsg]}"
    else
      util.custom_request("inventory", {}, node, {"identity" => node}).each do |resp|
        unless resp[:statuscode] == 0
          STDERR.puts "Failed to retrieve inventory for #{node}: #{resp[:statusmsg]}"
          next
        end

        data = resp[:data]

        begin
          puts "Inventory for #{resp[:sender]}:"
          puts

          nodestats = nodestats[:data]

          puts "   Server Statistics:"
          puts "                      Version: #{nodestats[:version]}"
          puts "                   Start Time: #{Time.at(nodestats[:starttime])}"
          puts "                  Config File: #{nodestats[:configfile]}"
          puts "                  Collectives: #{data[:collectives].join(', ')}" if data.include?(:collectives)
          puts "              Main Collective: #{data[:main_collective]}" if data.include?(:main_collective)
          puts "                   Process ID: #{nodestats[:pid]}"
          puts "               Total Messages: #{nodestats[:total]}"
          puts "      Messages Passed Filters: #{nodestats[:passed]}"
          puts "            Messages Filtered: #{nodestats[:filtered]}"
          puts "             Expired Messages: #{nodestats[:ttlexpired]}"
          puts "                 Replies Sent: #{nodestats[:replies]}"
          puts "         Total Processor Time: #{nodestats[:times][:utime]} seconds"
          puts "                  System Time: #{nodestats[:times][:stime]} seconds"

          puts

          puts "   Agents:"
          if data[:agents].size > 0
            data[:agents].sort.in_groups_of(3, "") do |agents|
              puts "      %-15s %-15s %-15s" % agents
            end
          else
            puts "      No agents installed"
          end

          puts

          puts "   Data Plugins:"
          if data[:data_plugins].size > 0
            data[:data_plugins].sort.in_groups_of(3, "") do |plugins|
              puts "      %-15s %-15s %-15s" % plugins.map{|p| p.gsub("_data", "")}
            end
          else
            puts "      No data plugins installed"
          end

          puts

          puts "   Configuration Management Classes:"
          if data[:classes].size > 0
            field_size = MCollective::Util.field_size(data[:classes], 30)
            fields_num = MCollective::Util.field_number(field_size)
            format = "   " + (" %-#{field_size}s" * fields_num)

            data[:classes].sort.in_groups_of(fields_num, "") do |klasses|
              puts format % klasses
            end
          else
            puts "      No classes applied"
          end

          puts

          puts "   Facts:"
          if data[:facts].size > 0
            data[:facts].sort_by{|f| f[0]}.each do |f|
              puts "      #{f[0]} => #{f[1]}"
            end
          else
            puts "      No facts known"
          end

          break
        rescue Exception => e
          STDERR.puts "Failed to display node inventory: #{e.class}: #{e}"
        end
      end
    end

    halt util.stats
  end