itchef/cookbooks/cpe_munki/resources/cpe_munki_install.rb (91 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_munki # Resource:: cpe_munki_install resource_name :cpe_munki_install provides :cpe_munki_install, :os => 'darwin' default_action :install action_class do def managed_installs '/Library/Preferences/ManagedInstalls' end def read_munki_lastcheckdate begin defaults_cmd = shell_out( "/usr/bin/defaults read #{managed_installs} LastCheckDate", ).stdout last_check_date = Date.parse(defaults_cmd) rescue ArgumentError log("Unable to parse LastCheckDate: #{defaults_cmd}") last_check_date = Date.today end last_check_date end def write_munki_lastcheckdate(time) execute "defaults write #{managed_installs} LastCheckDate '#{time}'" end def remediate? return unless node['cpe_munki']['auto_remediate'] # There is a chance that this is prior to the first run, # file might not be present. return unless ::File.exist?("#{managed_installs}.plist") # getting value for the last munki check-in last_check_date = read_munki_lastcheckdate # if it's greater than the remediate_window since munki last ran. today = Date.today remediate_window = node['cpe_munki']['auto_remediate'].to_i return unless (today - last_check_date).to_i > remediate_window # and the pkg is installed node['cpe_munki']['munki_version_to_install'].to_h.each do |pkg, _opts| receipt = "com.googlecode.munki.#{pkg}" next if shell_out( "/usr/sbin/pkgutil --pkg-info='#{receipt}'", ).error? # forget the pkg execute "/usr/sbin/pkgutil --forget #{receipt}" end write_munki_lastcheckdate(Time.now) end end action :install do return unless node['cpe_munki']['install'] m = 'com.googlecode.munki' remediate? node['cpe_munki']['munki_version_to_install'].to_h.each do |pkg, opts| package_version = opts['version'] package_name = "munkitools_#{pkg}-#{package_version}" cpe_remote_pkg "munkitools_#{pkg}" do # ~FC037 app 'munkitools' pkg_name package_name pkg_url opts['url'] if opts['url'] checksum opts['checksum'] receipt "com.googlecode.munki.#{pkg}" version package_version if pkg.include?('launchd') notifies :restart, "launchd[#{m}.logouthelper]" notifies :restart, "launchd[#{m}.managedsoftwareupdate-check]" notifies :restart, "launchd[#{m}.managedsoftwareupdate-manualcheck]" notifies :restart, "launchd[#{m}.authrestartd]" notifies :restart, "launchd[#{m}.managedsoftwareupdate-install]" notifies :restart, "launchd[#{m}.app_usage_monitor]" notifies :restart, "launchd[#{m}.munki-notifier]" notifies :restart, "launchd[#{m}.ManagedSoftwareCenter]" end end end [ 'logouthelper', 'managedsoftwareupdate-check', 'managedsoftwareupdate-manualcheck', 'authrestartd', 'managedsoftwareupdate-install', 'app_usage_monitor', ].each do |d| launchd "#{m}.#{d}" do not_if { node['cpe_munki']['skip_enforcing_launchds'].include?(d) } only_if { ::File.exist?("/Library/LaunchDaemons/#{m}.#{d}.plist") } action :enable end end [ 'munki-notifier', 'ManagedSoftwareCenter', ].each do |a| launchd "#{m}.#{a}" do not_if { node['cpe_munki']['skip_enforcing_launchds'].include?(a) } only_if { ::File.exist?("/Library/LaunchAgents/#{m}.#{a}.plist") } type 'agent' action :enable end end end