21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
# File 'lib/chef/knife/sharp-data_bag-align.rb', line 21
def check_databags
to_update = Hash.new
unless File.exists?(data_bag_path)
ui.warn "Bad data bag path, skipping data bag sync."
return to_update
end
ui.msg(ui.color("== Data bags ==", :bold))
updated_dbs = Hash.new
local_dbs = Dir.glob(File.join(data_bag_path, "**/*.json")).map {|f| [File.dirname(f).split("/").last, File.basename(f, ".json")]}
remote_dbs = Chef::DataBag.list.keys.map {|db| Chef::DataBag.load(db).keys.map{|dbi| [db, dbi]}}.flatten(1)
if local_dbs.empty?
ui.warn "No local data bags found, is the data bag path correct ? (#{data_bag_path})"
return to_update
end
(remote_dbs - local_dbs).each do |db|
ui.msg "* #{db.join("/")} data bag item is remote only"
if config[:dump_remote_only]
ui.msg "* Dumping to #{File.join(data_bag_path, "#{db.join("/")}.json")}"
begin
remote_db = Chef::DataBagItem.load(db.first, db.last).raw_data
Dir.mkdir(File.join(data_bag_path, db.first)) unless File.exists?(File.join(data_bag_path, db.first))
File.open(File.join(data_bag_path, "#{db.join("/")}.json"), "w") do |file|
file.puts JSON.pretty_generate(remote_db)
end
rescue Exception => e
ui.error "Unable to dump #{db.join("/")} data bag item (#{e.message})"
end
end
end
(local_dbs - remote_dbs).each do |db|
begin
local_db = JSON::load(File.read(File.join(data_bag_path, "#{db.join("/")}.json")))
updated_dbs[db] = local_db
ui.msg "* #{db.join("/")} data bag item is local only"
rescue Exception => e
ui.error "Unable to load #{db.join("/")} data bag item (#{e.message})"
end
end
(remote_dbs & local_dbs).each do |db|
begin
remote_db = Chef::DataBagItem.load(db.first, db.last).raw_data
local_db = JSON::load(File.read(File.join(data_bag_path, "#{db.join("/")}.json")))
if remote_db != local_db
updated_dbs[db] = local_db
ui.msg("* #{db.join("/")} data bag item is not up-to-date")
end
rescue Exception => e
ui.error "Unable to load #{db.join("/")} data bag item (#{e.message})"
end
end
if sharp_config[chef_server] and sharp_config[chef_server].has_key?("ignore_databags")
(updated_dbs.keys.map{|k| k.join("/")} & sharp_config[chef_server]["ignore_databags"]).each do |db|
updated_dbs.delete(db.split("/"))
ui.msg "* Skipping #{db} data bag (ignore list)"
end
end
if !updated_dbs.empty?
all = false
updated_dbs.each do |name, obj|
answer = nil
answer = ui.ask_question("> Update #{name.join("/")} data bag item on server ? Y/N/(A)ll/(Q)uit ", :default => "N").upcase unless all
if answer == "A"
all = true
elsif answer == "Q"
ui.msg "* Aborting data bag alignment."
break
end
if all or answer == "Y"
to_update[name] = obj
else
ui.msg "* Skipping #{name.join("/")} data bag item"
end
end
else
ui.msg "* Data bags are up-to-date."
end
to_update
end
|