itchef/cookbooks/cpe_dconf/resources/cpe_dconf.rb (102 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_dconf # Resource:: default resource_name :cpe_dconf provides :cpe_dconf, :os => 'linux' default_action :update action :update do return unless node['cpe_dconf']['settings'].values.any? # Make sure dconf cli package is up-to-date dconf_cli_pkg = value_for_platform_family( 'debian' => 'dconf-cli', :default => 'dconf', ) package dconf_cli_pkg do action :upgrade end # Set directory permissions %w{ /etc/dconf /etc/dconf/profile /etc/dconf/db /etc/dconf/db/cpe.d /etc/dconf/db/cpe.d/locks }.each do |dir| directory dir do owner 'root' group 'root' mode '0755' end end # Install dconf user profile cookbook_file '/etc/dconf/profile/user' do source 'dconf-user-profile' owner 'root' group 'root' mode '0644' notifies :run, 'execute[update dconf]', :delayed end # Configure dconf keys for each component dconf_db_dir = '/etc/dconf/db/cpe.d' node['cpe_dconf']['settings'].each do |comp, settings_raw| # Here, each key can correspond to either a primitive (like a string), where # we assume lock=true, or it can be a hash, in order to disable locking. # This step will process settings to determine the lock status for each key. settings_processed = {} locks = [] settings_raw.each do |dir, keys| settings_processed[dir] = {} keys.each do |k, v| if v.respond_to?(:key) # Replace hash with literal for use in template settings_processed[dir][k] = v['value'] lock = v.fetch('lock', true) else # Use literal value and assume lock=true settings_processed[dir][k] = v lock = true end # Build list of keys to lock, to be used later if lock locks.push "/#{dir}/#{k}" end end end # Generate keys file template ::File.join(dconf_db_dir, comp) do source 'dconf-generic-keys.erb' owner 'root' group 'root' mode '0644' notifies :run, 'execute[update dconf]', :delayed variables( :settings => settings_processed, ) end # Generate locks file template ::File.join(dconf_db_dir, 'locks', comp) do # ~FB031 source 'dconf-generic-locks.erb' owner 'root' group 'root' mode '0644' notifies :run, 'execute[update dconf]', :delayed variables( :locks => locks, ) end end # clean up settings that no longer exist # gate on the directory existing, since this code runs # earlier than the resources actually creating the directories if ::Dir.exist?(dconf_db_dir) stale_dbs = ::Dir.entries(dconf_db_dir).select do |f| ::File.file?(::File.join(dconf_db_dir, f)) && !node['cpe_dconf']['settings'].keys.include?(f) end stale_dbs.each do |db| file ::File.join(dconf_db_dir, db) do action :delete notifies :run, 'execute[update dconf]', :delayed end end end locks_dir = ::File.join(dconf_db_dir, 'locks') if ::Dir.exist?(locks_dir) stale_locks = ::Dir.entries(locks_dir).select do |f| ::File.file?(::File.join(locks_dir, f)) && !node['cpe_dconf']['settings'].keys.include?(f) end stale_locks.each do |lock| file ::File.join(locks_dir, lock) do action :delete notifies :run, 'execute[update dconf]', :delayed end end end # Finally, notify dconf to rebuild its binary database from our files execute 'update dconf' do command '/usr/bin/dconf update' action :nothing end end