Skip to content

Instantly share code, notes, and snippets.

@vchepkov
Created January 2, 2019 12:57
Show Gist options
  • Save vchepkov/2d9f87cf71c656e88f41ef92439a9128 to your computer and use it in GitHub Desktop.
Save vchepkov/2d9f87cf71c656e88f41ef92439a9128 to your computer and use it in GitHub Desktop.
facts application
class MCollective::Application::Facts<MCollective::Application
description "Reports on usage for a specific fact"
def post_option_parser(configuration)
configuration[:fact] = ARGV.shift if ARGV.size > 0
end
def validate_configuration(configuration)
raise "Please specify a fact to report for" unless configuration.include?(:fact)
end
def show_single_fact_report(fact, facts, verbose=false)
puts("Report for fact: #{fact}\n\n")
field_size = MCollective::Util.field_size(facts.keys)
facts.keys.sort.each do |k|
printf(" %-#{field_size}s found %d times\n", k, facts[k].size)
if verbose
puts
facts[k].sort.each do |f|
puts(" #{f}")
end
puts
end
end
end
def main
rpcutil = rpcclient("rpcutil")
rpcutil.progress = false
facts = {}
rpcutil.get_fact(:fact => configuration[:fact]) do |resp|
pp resp
begin
value = resp[:body][:data][:value]
if value
if facts.include?(value)
facts[value.inspect] << resp[:senderid]
else
facts[value.inspect] = [ resp[:senderid] ]
end
end
rescue Exception => e
STDERR.puts "Could not parse facts for #{resp[:senderid]}: #{e.class}: #{e}"
end
pp facts
end
if facts.empty?
puts "No values found for fact #{configuration[:fact]}\n"
else
show_single_fact_report(configuration[:fact], facts, options[:verbose])
end
printrpcstats
halt rpcutil.stats
end
end
@vchepkov
Copy link
Author

vchepkov commented Jan 2, 2019

$ mco facts selinux -j
{:senderid=>"master.localdomain",
 :requestid=>"f54fb2d7b46a5caa9798b400fa2bb5d0",
 :senderagent=>"rpcutil",
 :msgtime=>1546433946,
 :body=>
  {"statuscode"=>0,
   "statusmsg"=>"OK",
   "data"=>{:fact=>"selinux", :value=>true}}}
{:senderid=>"node.localdomain",
 :requestid=>"f54fb2d7b46a5caa9798b400fa2bb5d0",
 :senderagent=>"rpcutil",
 :msgtime=>1546433946,
 :body=>
  {"statuscode"=>0,
   "statusmsg"=>"OK",
   "data"=>{:fact=>"selinux", :value=>true}}}
{"true"=>["node.localdomain"]}
Report for fact: selinux

        true                                     found 1 times

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment