itchef/cookbooks/cpe_remote/resources/zip.rb (146 lines of code) (raw):

# Cookbook Name:: cpe_remote # Resource:: cpe_remote_zip # # 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_zip default_action :create provides :cpe_remote_zip property :folder_name, String, :name_property => true property :zip_checksum, String property :backup, [FalseClass, Integer], :default => false, :desired_state => false property :zip_name, String, :desired_state => false property :zip_url, String, :desired_state => false property :extract_location, String, :desired_state => false property :group, [String, nil] property :mode, [String, Integer, nil], :default => '0644', :coerce => proc { |m| ((m.respond_to?(:oct) ? m.oct : m.to_i) & 007777).to_s(8) } property :owner, [String, nil] action_class do include CPE::Remote end load_current_value do |desired| # ~FC006 chef_cache = Chef::Config[:file_cache_path] extra_loco = extract_location.delete(':') zip_path = ::File.join(chef_cache, 'remote_zip', extra_loco, zip_name) if ::File.exist?(zip_path) checksum_ondisk = Chef::Digester.checksum_for_file(zip_path) zip_checksum checksum_ondisk end extract_path = desired.extract_location if ::File.exist?(extract_path) f_stat = ::File.stat(extract_path) unless platform?('windows') owner ::Etc.getpwuid(f_stat.uid).name group ::Etc.getgrgid(f_stat.gid).name m = f_stat.mode mode "0#{(m & 07777).to_s(8)}" end end end action :create do chef_cache = Chef::Config[:file_cache_path] extra_loco = new_resource.extract_location.delete(':') zip_path = ::File.join( chef_cache, 'remote_zip', extra_loco, new_resource.zip_name ) return unless node['cpe_remote']['server_accessible'] converge_if_changed do base_filename = ::File.basename(zip_path) # @lint-ignore FBCHEFFoodcritic directory ::File.dirname(zip_path) do # ~FB019 ~FB024 recursive true end if node.windows? zip_cmd = CPE::Utils.sevenzip_cmd return if CPE::Log.if( "#{cookbook_name}: No local 7zip command found", :level => :warn, :type => 'cpe_remote_zip', :action => 'install', :status => 'fail', ) { zip_cmd.nil? } # Create the destination dir first directory 'dest_folder' do only_if { ::File.exist?(zip_path) } path new_resource.extract_location owner 'Administrators' group 'Administrators' mode 0755 action :nothing end # Decompress zip file via shell. powershell_script "decompress_#{base_filename}" do only_if { ::File.exist?(zip_path) } only_if { ::Dir.exist?(new_resource.extract_location) } cwd new_resource.extract_location code "#{zip_cmd} -y x #{zip_path}" action :nothing end end cpe_remote_file new_resource.folder_name do file_name new_resource.zip_name mode new_resource.mode checksum new_resource.zip_checksum file_url new_resource.zip_url if new_resource.zip_url path zip_path backup new_resource.backup unless node['cpe_remote']['additional_headers'].empty? headers node['cpe_remote']['additional_headers'] end action :create notifies :install, 'package[unzip]', :immediately if node.linux? notifies :run, 'execute[extract_zip]' unless node.windows? if node.windows? owner 'Administrators' group 'Administrators' notifies :create, 'directory[dest_folder]' notifies :run, "powershell_script[decompress_#{base_filename}]" end end package 'unzip' do # ~FB043 only_if { node.linux? } action :nothing end execute 'extract_zip' do only_if { ::File.exist?(zip_path) } not_if { node.windows? } cwd new_resource.extract_location command "unzip -o #{zip_path} -d #{new_resource.extract_location}" action :nothing end # @lint-ignore FBCHEFFoodcritic directory new_resource.extract_location do # ~FB019 not_if { node.windows? } recursive true mode new_resource.mode owner new_resource.owner group new_resource.group end resource_name = new_resource.name zip_name = new_resource.zip_name extract_location = new_resource.extract_location Chef.event_handler do on :resource_failed do |resource, _action, exception| if resource.to_s == "cpe_remote_zip[#{resource_name}]" CPE::Log.log( "#{zip_name} deployment to #{extract_location} " + "failed with exception: #{exception}", :level => :debug, :type => 'cpe_remote_zip', :action => 'install', :status => 'fail', ) end end end Chef.event_handler do on :resource_updated do |resource| if resource.to_s == "cpe_remote_zip[#{resource_name}]" CPE::Log.log( "#{zip_name} deployment to #{extract_location} succeeded", :level => :error, :type => 'cpe_remote_zip', :action => 'install', :status => 'success', ) end end end end end