itchef/cookbooks/cpe_symlinks/resources/cpe_symlinks.rb (46 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_symlinks # Resource:: default resource_name :cpe_symlinks provides :cpe_symlinks default_action :create # rubocop:disable Metrics/BlockLength action :create do return if node['cpe_symlinks'].empty? cached_path = ::File.join(Chef::Config[:file_cache_path], '.chef-symlinks.json') cached_list = cached_on_disk(cached_path) symlink_list = [] # Create symlinks on disk node['cpe_symlinks'].to_h.map.each do |target_dir, symlinks| symlinks.each do |target, source| next unless ::File.exist?(source) link ::File.join(target_dir, target) do to source end symlink_list << ::File.join(target_dir, target) end end # Cache list of symlinks to disk file cached_path do content Chef::JSONCompat.to_json_pretty(symlink_list.uniq) action :create owner node.root_user group node.root_group mode '755' end # Remove any symlinks on disk that have been unmanaged removal_list = cached_list.uniq - symlink_list.uniq unless removal_list.empty? removal_list.each do |symlink| link symlink do only_if { ::File.symlink?(symlink) } # TODO(dmk): Hack needed to rollout chefctl. Will delete after. not_if { symlink.eql?('/usr/local/bin/chefctl') } action :delete end end end end action_class do def cached_on_disk(cached_path) begin cached_list = Chef::JSONCompat.from_json(::File.read(cached_path)) rescue cached_list = [] end cached_list end end # rubocop:enable Metrics/BlockLength