itchef/cookbooks/cpe_chrome/resources/cpe_chrome_posix.rb (291 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_chrome # Resources:: cpe_chrome_posix resource_name :cpe_chrome_posix provides :cpe_chrome, :os => ['darwin', 'linux'] default_action :config action :config do install_repos install_chrome manage_chrome manage_chrome_extensions end action_class do def install_repos return unless node.linux? return unless node['cpe_chrome']['manage_repo'] yum_repository 'google-chrome' do only_if { node.fedora? || node.centos? } description 'Google Chrome repo' baseurl 'http://dl.google.com/linux/chrome/rpm/stable/x86_64' enabled true gpgkey 'https://dl.google.com/linux/linux_signing_key.pub' gpgcheck true action :create end apt_repository 'google-chrome' do only_if { node.debian_family? } uri 'http://dl.google.com/linux/chrome/deb/' distribution 'stable' components ['main'] arch 'amd64' key 'EB4C1BFD4F042F6DDDCCEC917721F63BD38B4796' action :add end end def install_chrome return unless node.linux? return unless node['cpe_chrome']['install_package'] package 'google-chrome-stable' do only_if do node.fedora? || node.centos? || node.debian_family? end action :upgrade end end def manage_chrome return if node['cpe_chrome']['validate_installed'] && !node.installed?('com.google.Chrome') if node['cpe_chrome']['mp']['UseMasterPreferencesFile'] mprefs = node['cpe_chrome']['mp']['FileContents'].reject { |_k, v| v.nil? } else mprefs = {} end prefs = node['cpe_chrome']['profile'].reject do |_k, v| v.nil? || (v.respond_to?(:empty?) && v.empty?) end return if prefs.empty? && mprefs.empty? case node['os'] when 'darwin' manage_chrome_macos(mprefs, prefs) when 'linux' manage_chrome_linux(mprefs, prefs) end end def manage_chrome_extensions return if node['cpe_chrome']['validate_installed'] && !node.installed?('com.google.Chrome') extprefs = node['cpe_chrome']['extension_profile'].reject do |_k, v| v.nil? || (v.respond_to?(:empty?) && v.empty?) end case node['os'] when 'darwin' manage_chrome_extensions_macos(extprefs) when 'linux' manage_chrome_extensions_linux(extprefs) end end def manage_chrome_linux(mprefs, prefs) # Chromium and Chrome get the same preferences %w{ /etc/opt /etc/opt/chrome /etc/opt/chrome/policies /etc/opt/chrome/policies/managed /etc/opt/chrome/policies/recommended }.each do |path| directory path do mode '0755' owner node.root_user group node.root_group end end migrate_chromium_settings_linux link '/etc/chromium' do to '/etc/opt/chrome' owner node.root_user group node.root_group end { '/etc/opt/chrome/policies/managed/test_policy.json' => prefs, '/etc/opt/chrome/policies/recommended/test_policy.json' => mprefs, }.each do |path, preferences| if preferences.empty? file path do action :delete end else file path do mode '0644' owner node.root_user group node.root_group action :create content Chef::JSONCompat.to_json_pretty(preferences) end end end end def manage_chrome_macos(mprefs, prefs) prefix = node['cpe_profiles']['prefix'] organization = node['organization'] ? node['organization'] : 'Facebook' chrome_profile = { 'PayloadIdentifier' => "#{prefix}.browsers.chrome", 'PayloadRemovalDisallowed' => true, 'PayloadScope' => 'System', 'PayloadType' => 'Configuration', 'PayloadUUID' => 'bf900530-2306-0131-32e2-000c2944c108', 'PayloadOrganization' => organization, 'PayloadVersion' => 1, 'PayloadDisplayName' => 'Chrome', 'PayloadContent' => [{ 'PayloadType' => 'com.google.Chrome', 'PayloadVersion' => 1, 'PayloadIdentifier' => "#{prefix}.browsers.chrome", 'PayloadUUID' => '3377ead0-2310-0131-32ec-000c2944c108', 'PayloadEnabled' => true, 'PayloadDisplayName' => 'Chrome', }], } prefs.each do |k, v| chrome_profile['PayloadContent'][0][k] = v end profile_domain = "#{node['cpe_profiles']['prefix']}.browsers.chrome" node.default['cpe_profiles'][profile_domain] = chrome_profile # Check for Chrome Canary if node.installed?('com.google.Chrome.canary') prefix = node['cpe_profiles']['prefix'] organization = node['organization'] ? node['organization'] : 'Facebook' canary_profile = { 'PayloadIdentifier' => "#{prefix}.browsers.chromecanary", 'PayloadRemovalDisallowed' => true, 'PayloadScope' => 'System', 'PayloadType' => 'Configuration', 'PayloadUUID' => 'bf900530-2306-0131-32e2-000c2944c108', 'PayloadOrganization' => organization, 'PayloadVersion' => 1, 'PayloadDisplayName' => 'Chrome Canary', 'PayloadContent' => [{ 'PayloadType' => 'com.google.Chrome.canary', 'PayloadVersion' => 1, 'PayloadIdentifier' => "#{prefix}.browsers.chromecanary", 'PayloadUUID' => 'bf900530-2306-0131-32e2-000c2944c108', 'PayloadEnabled' => true, 'PayloadDisplayName' => 'Chrome Canary', }], } prefs.each do |k, v| unless node['cpe_chrome']['canary_ignored_prefs'].include?(k) canary_profile['PayloadContent'][0][k] = v end end profile_domain = "#{node['cpe_profiles']['prefix']}.browsers.chromecanary" node.default['cpe_profiles'][profile_domain] = canary_profile end # Apply the Master Preferences file master_path = '/Library/Google/Google Chrome Master Preferences' if mprefs.empty? file master_path do action :delete end else directory '/Library/Google' do mode '0755' owner 'root' group 'wheel' action :create end # Create the Master Preferences file file master_path do mode '0644' owner 'root' group 'wheel' action :create content Chef::JSONCompat.to_json_pretty(mprefs) end end end def manage_chrome_extensions_macos(extprefs) return if extprefs.empty? prefix = node['cpe_profiles']['prefix'] organization = node['organization'] ? node['organization'] : 'Facebook' extprefs.each do |k, v| chrome_ext_profile = { 'PayloadIdentifier' => "#{prefix}.browsers.chrome.extension.#{k}", 'PayloadRemovalDisallowed' => true, 'PayloadScope' => 'System', 'PayloadType' => 'Configuration', 'PayloadUUID' => v['profile_uuid'], 'PayloadOrganization' => organization, 'PayloadVersion' => 1, 'PayloadDisplayName' => "Chrome Extension (#{v['display_name']})", 'PayloadContent' => [{ 'PayloadType' => "com.google.Chrome.extensions.#{k}", 'PayloadVersion' => 1, 'PayloadIdentifier' => "#{prefix}.browsers.chrome.extension.settings.#{k}", 'PayloadUUID' => v['payload_uuid'], 'PayloadEnabled' => true, 'PayloadDisplayName' => "Chrome Extension (#{v['display_name']})", }], } v['profile'].each do |k_ext, v_ext| chrome_ext_profile['PayloadContent'][0][k_ext] = v_ext['value'] end node.default['cpe_profiles']["#{prefix}.browsers.chrome.extension.#{k}"] = chrome_ext_profile end # Check for Chrome Canary if node.installed?('com.google.Chrome.canary') prefix = node['cpe_profiles']['prefix'] organization = node['organization'] ? node['organization'] : 'Facebook' extprefs.each do |k, v| canary_ext_profile = { 'PayloadIdentifier' => "#{prefix}.browsers.chromecanary.extension.#{k}", 'PayloadRemovalDisallowed' => true, 'PayloadScope' => 'System', 'PayloadType' => 'Configuration', 'PayloadUUID' => v['profile_uuid'], 'PayloadOrganization' => organization, 'PayloadVersion' => 1, 'PayloadDisplayName' => "Chrome Extension (#{v['display_name']})", 'PayloadContent' => [{ 'PayloadType' => "com.google.Chrome.canary.extensions.#{k}", 'PayloadVersion' => 1, 'PayloadIdentifier' => "#{prefix}.browsers.chromecanary.extension.settings.#{k}", 'PayloadUUID' => v['payload_uuid'], 'PayloadEnabled' => true, 'PayloadDisplayName' => "Chrome Canary Extension (#{v['display_name']})", }], } v['profile'].each do |k_ext, v_ext| canary_ext_profile['PayloadContent'][0][k_ext] = v_ext['value'] end node.default['cpe_profiles']["#{prefix}.browsers.chromecanary.extension.#{k}"] = canary_ext_profile end end end def manage_chrome_extensions_linux(extprefs) extension_hash = { '3rdparty' => { 'extensions' => {}, }, } path = '/etc/opt/chrome/policies/managed/cpe_extension_policy.json' if extprefs.empty? file path do action :delete end else extprefs.each do |k, v| extprefs_hash = {} v['profile'].each do |k_ext, v_ext| extprefs_hash[k_ext] = v_ext['value'] end extension_hash['3rdparty']['extensions'][k] = extprefs_hash end file path do mode '0644' owner node.root_user group node.root_group action :create content Chef::JSONCompat.to_json_pretty(extension_hash) end end end def migrate_chromium_settings_linux # if /etc/chromium already exists, chmod + chown everything inside of it # and move it to /etc/opt/chrome bash 'migrate chromium directory' do only_if do ::File.directory?('/etc/chromium') && !::File.symlink?('/etc/chromium') end code <<-EOH find /etc/chromium -type d -exec chmod 0755 {} \\; find /etc/chromium -type f -exec chmod 0644 {} \\; chown -R #{node.root_user}:#{node.root_group} /etc/chromium cp -R /etc/chromium/* /etc/opt/chrome/ rm -rf /etc/chromium EOH end end end