itchef/cookbooks/cpe_profiles/resources/cpe_profiles.rb (51 lines of code) (raw):

# Copyright (c) Facebook, Inc. and its affiliates. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Cookbook Name:: cpe_profiles # Resource:: cpe_profiles resource_name :cpe_profiles provides :cpe_profiles, :os => 'darwin' default_action :run action :run do if node['cpe_profiles']['default_cookbook'].empty? Chef::Log.warn("#{cookbook_name}: No default profiles cookbook defined") return end map = node['cpe_profiles']['cookbook_map'] default = node['cpe_profiles']['default_cookbook'] prefix = node['cpe_profiles']['prefix'] profiles.each do |k, v| # see if this prefix is overridden with a cookbook or fallback to default cookbook = map.key?(k) ? map[k] : default # read the 'destination' cookbook prefix cb_prefix = node[cookbook]['prefix'] # replace the prefix name in the main Hash key new_prefix = k.sub(prefix, cb_prefix) # inject newly replaced profile into destination prefix node.default[cookbook][new_prefix] = profile_prefix_sub(v, cb_prefix) end end action_class do def profiles node['cpe_profiles'].to_h.reject do |k, v| [ 'prefix', 'default_cookbook', 'cookbook_map', ].include?(k) || !v.is_a?(Hash) end end def profile_prefix_sub(profile, cb_prefix) # rewrite prefix for profile new_profile = payload_prefix_sub(profile, cb_prefix) # rewrite prefix for each payload new_profile['PayloadContent'] = new_profile['PayloadContent'].map do |p| payload_prefix_sub(p, cb_prefix) end new_profile end def payload_prefix_sub(payload, cb_prefix) unless payload.key?('PayloadIdentifier') Chef::Log.warn( "#{cookbook_name}: payload does not contain"\ " a ProfileIdentifier key: #{payload}", ) return payload end prefix = node['cpe_profiles']['prefix'] new_payload = payload.clone new_payload['PayloadIdentifier'] = new_payload['PayloadIdentifier'].sub( prefix, cb_prefix ) new_payload end end