Skip to content

Instantly share code, notes, and snippets.

@irvingpop
Last active August 29, 2015 14:01
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save irvingpop/6c545a335febc81ac950 to your computer and use it in GitHub Desktop.
Save irvingpop/6c545a335febc81ac950 to your computer and use it in GitHub Desktop.
knife-ec-backup data validation
#!/opt/chef/embedded/bin/ruby
require 'json'
class Checker
def check
check_cookbook_metadata
check_node_sizes
check_bad_platform_metadata
check_bad_invitations
check_duplicates_in_groups
check_self_referential_groups
check_user_client_conflict
end
def check_cookbook_metadata
puts "\nCookbooks with missing metadata fields"
puts "---------------------------"
Dir["organizations/*/cookbooks/metadata.rb"].each do |filename|
metadata = File.readlines(filename)
puts filename if metadata.grep(/^name|^maintainer\s+|^maintainer_email/).count < 3
end
end
def check_node_sizes
puts "\nNodes that may be too large"
puts "---------------------------"
Dir["organizations/*/nodes/*.json"].each do |filename|
puts filename if File.stat(filename).size > 1_000_000
end
end
def check_bad_platform_metadata
puts "\nBad platform metadata in cookbooks"
puts "-----------------------------------"
Dir["organizations/*/cookbooks/*/metadata.json"].each do |filename|
md = JSON.parse(File.read(filename))
bad_json = false
md["platforms"].each {|k,v| bad_json = true if v == [] }
puts filename if bad_json
end
end
def check_bad_invitations
puts "\nNull username in invitations"
puts "----------------------------"
Dir["organizations/*/invitations.json"].each do |filename|
if JSON.parse(File.read(filename)).any? {|i| i["username"].nil?}
puts filename
end
end
end
def check_duplicates_in_groups
puts "\nDuplicates in groups"
puts "-------------------"
Dir["organizations/*/groups/*.json"].each do |filename|
group = JSON.parse(File.read(filename))
dup_clients = ! ( group["clients"].nil? || (group["clients"].uniq.size == group["clients"].size))
dup_users = ! ( group["users"].nil? || (group["users"].uniq.size == group["users"].size))
if dup_clients || dup_users
puts "", "* #{filename}"
end
if dup_clients
puts "Duplicate Clients:"
puts group["clients"].uniq.map {|c| [group["clients"].count(c), c] }.select {|i| i[0] > 1}.map {|i| i[1] }
end
if dup_users
puts "\tFollowing users are duplicated:"
puts group["users"].uniq.map {|c| [group["users"].count(c), c] }.select {|i| i[0] > 1}.map {|i| i[1] }
end
end
end
def check_self_referential_groups
puts "\nGroups that contain themselves"
puts "--------------------------------"
Dir["organizations/*/groups/*.json"].each do |filename|
group_name = File.basename(filename).gsub(".json", "")
group = JSON.parse(File.read(filename))
if group["groups"] && group["groups"].include?(group_name)
puts filename
end
end
end
def check_user_client_conflict
puts "\nClients that conflict with users"
puts "--------------------------------"
Dir["organizations/*/members.json"]. each do |mfile|
org_name = mfile.split("/")[1]
members = JSON.parse(File.read(mfile))
members.each do |member|
uname = member["user"]["username"]
if File.exists?("organizations/#{org_name}/clients/#{uname}.json")
puts "organizations/#{org_name}/clients/#{uname}.json"
end
end
end
end
end
if ! File.exists?("organizations")
puts "No organizations folder found. Please run this from an ec-export"
exit 1
else
Checker.new.check
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment