Last active
August 29, 2015 14:01
-
-
Save irvingpop/6c545a335febc81ac950 to your computer and use it in GitHub Desktop.
knife-ec-backup data validation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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