itchef/cookbooks/cpe_remote/resources/file.rb (113 lines of code) (raw):

# Cookbook Name:: cpe_remote # Resource:: cpe_remote_file # # 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. # resource_name :cpe_remote_file default_action :create provides :cpe_remote_file property :folder_name, String, :name_property => true # see https://github.com/chef/chef/blob/ + # f43371b231d7bb88c01618c90347cbb1fc96a393/lib/chef/resource/file.rb property :atomic_update, [TrueClass, FalseClass], :default => lazy { Chef::Config[:file_atomic_update] }, :desired_state => false property :checksum, String property :backup, [FalseClass, Integer], :default => false, :desired_state => false property :file_name, String, :desired_state => false property :file_url, String, :desired_state => false property :group, [String, Integer] property :mode, [String, Integer], :default => '0644', :coerce => proc { |m| ((m.respond_to?(:oct) ? m.oct : m.to_i) & 007777).to_s(8) } property :owner, [String, Integer] property :path, String, :desired_state => false property :headers, Hash, :desired_state => false action_class do include CPE::Remote end load_current_value do |desired| # ~FC006 path = desired.path if ::File.exist?(path) f_stat = ::File.stat(path) checksum_ondisk = Chef::Digester.checksum_for_file(path) checksum checksum_ondisk unless platform?('windows') begin current_user = ::Etc.getpwuid(f_stat.uid).name rescue ArgumentError current_user = f_stat.uid end owner current_user begin current_group = ::Etc.getgrgid(f_stat.gid).name rescue ArgumentError current_group = f_stat.gid end group current_group m = f_stat.mode mode "0#{(m & 07777).to_s(8)}" end end end action :create do return unless node['cpe_remote']['server_accessible'] converge_if_changed do filename = new_resource.file_name ? new_resource.file_name : new_resource.folder_name file_source = new_resource.file_url ? new_resource.file_url : gen_url(new_resource.folder_name, filename) hders = new_resource.headers ? new_resource.headers : auth_headers(file_source, 'GET') node['cpe_remote']['additional_headers'].each do |k, v| hders[k] = v end # Delete symlink before creating remote file. # Using link resource vs force_unlink property due to bug see: # https://github.com/chef/chef/issues/4992 link new_resource.path do only_if { ::File.symlink?(new_resource.path) } action :delete end # Download the remote file locally if file doesn't exist or checksum fails remote_file new_resource.path do only_if do CPE::Log.unless( "Failed to download remote file since url(#{file_source}) is invalid", :level => :warn, :type => 'cpe_remote_file', :action => "remote_file/#{filename}", :status => 'fail', ) { valid_url?(file_source) } end path new_resource.path if new_resource.path atomic_update new_resource.atomic_update source file_source mode new_resource.mode owner new_resource.owner group new_resource.group checksum new_resource.checksum backup new_resource.backup headers(hders) if hders end file_path = new_resource.path Chef.event_handler do on :resource_failed do |resource, _action, exception| if resource.to_s == "remote_file[#{file_path}]" CPE::Log.log( "#{filename} deployment to #{file_path} " + "failed with exception: #{exception}", :level => :error, :type => 'cpe_remote_file', :action => 'install', :status => 'fail', ) end end end Chef.event_handler do on :resource_updated do |resource| if resource.to_s == "remote_file[#{file_path}]" CPE::Log.log( "#{filename} deployment to #{file_path} succeeded", :level => :debug, :type => 'cpe_remote_file', :action => 'install', :status => 'success', ) end end end end end