3 # Function to make a structured and sorted yaml representation out of a hash
4 def recursive_hash_to_yml_string(hash, depth=0)
6 depth.times { spacer += " "}
7 hash.keys.sort.each do |sorted_key|
8 @yml_string += spacer + sorted_key + ": "
9 if hash[sorted_key].is_a?(Array)
11 sorted_key.length.times { keyspacer += " " }
13 hash[sorted_key].each do |item|
14 @yml_string += spacer + keyspacer + "- " + item +"\n"
16 elsif hash[sorted_key].is_a?(Hash)
18 recursive_hash_to_yml_string(hash[sorted_key], depth+1)
20 @yml_string += "#{hash[sorted_key].to_s}\n"
25 # Function to transform shorted write up of the keys into full hash representation
29 hash.each do |key,val|
30 if m = /^([^.]+)\.(.*)$/.match(key)
31 temp = { m[1] => { m[2] => val } }
32 transform(temp).each do |stuff|
37 transform(val).each do |stuff|
38 return_vals << { key => stuff }
41 return_vals << { key => val }
49 # Function to deep merge hashes with same keys
51 def deep_merge_with_array_values_concatenated(hash)
54 hash.keys.each do |key|
55 if hash[key].is_a? Hash and self[key].is_a? Hash
56 target[key] = target[key].deep_merge_with_array_values_concatenated(hash[key])
60 if hash[key].is_a?(Array) && target[key].is_a?(Array)
61 target[key] = target[key] + hash[key]
63 target[key] = hash[key]
72 @yml_string = "### MANAGED BY PUPPET ###\n"
74 if !@instance_conf.empty?
76 @yml_string += "---\n"
78 ## Transform shorted keys into full write up
79 transformed_config = transform(@instance_conf)
81 # Merge it back into a hash
83 transformed_config.each do |subhash|
84 tmphash = tmphash.deep_merge_with_array_values_concatenated(subhash)
87 # Transform it into yaml
88 recursive_hash_to_yml_string(tmphash)