itchef/cookbooks/cpe_profiles_local/resources/cpe_profiles.rb (69 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_local # Resource:: cpe_profiles_local resource_name :cpe_profiles_local provides :cpe_profiles_local, :os => 'darwin' default_action :run action :run do node['cpe_profiles_local'].to_hash.values.each do |profile| next if profile.is_a?(String) && profile.match(node['cpe_profiles_local']['prefix']) identifier = process_identifier(profile) osx_profiles_resource(identifier, 'install', profile) end end action :clean_up do process_profile_cleanup_identifiers return if node['cpe_profiles_local']['__cleanup'].nil? node['cpe_profiles_local']['__cleanup'].each do |identifier| osx_profiles_resource(identifier, 'remove', nil) end end action_class do def process_identifier(profile) identifier = profile['PayloadIdentifier'] unless identifier.start_with?(node['cpe_profiles_local']['prefix']) error_string = "#{identifier} is an invalid profile identifier. The" + "identifier must start with #{node['cpe_profiles_local']['prefix']}!" fail Chef::Exceptions::ConfigurationError, error_string end identifier end def osx_profiles_resource(identifier, nr_action, nr_profile) return unless identifier with_run_context :root do osx_profile identifier do profile nr_profile unless nr_profile.nil? action nr_action end end end def find_managed_profile_identifiers managed_identifiers = [] node['cpe_profiles_local']&.to_hash&.values&.each do |profile| managed_identifiers << profile['PayloadIdentifier'] end current_identifiers = [] profiles_string = shell_out!('profiles -P -o stdout-xml') profiles = Plist.parse_xml(profiles_string.stdout) profiles['_computerlevel']&.each do |profile| if profile['ProfileIdentifier'].start_with?( node['cpe_profiles_local']['prefix'], ) current_identifiers << profile['ProfileIdentifier'] end end return managed_identifiers, current_identifiers end def append_to_cleanup(identifier) node.default['cpe_profiles_local']['__cleanup'] = [] unless node['cpe_profiles_local']['__cleanup'] node.default['cpe_profiles_local']['__cleanup'] << identifier end def process_profile_cleanup_identifiers managed_identifiers, current_identifiers = find_managed_profile_identifiers return if current_identifiers.empty? current_identifiers.each do |identifier| unless managed_identifiers.include?(identifier) || append_to_cleanup(identifier) end end end end