\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7 \8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh \00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€ \00 $\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95 59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9 C/// File Manager

File Manager

Path: /opt/chef/embedded/lib/ruby/gems/2.7.0/gems/chef-16.3.45/lib/chef/

Viewing File: file_cache.rb

#
# Author:: Adam Jacob (<adam@chef.io>)
# Copyright:: Copyright (c) Chef Software Inc.
# License:: Apache License, Version 2.0
#
# 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.

require_relative "mixin/params_validate"
require_relative "mixin/create_path"
require_relative "exceptions"
require_relative "json_compat"
require "fileutils" unless defined?(FileUtils)
require_relative "util/path_helper"

class Chef
  class FileCache
    class << self
      include Chef::Mixin::ParamsValidate
      include Chef::Mixin::CreatePath

      # Write a file to the File Cache.
      #
      # === Parameters
      # path<String>:: The path to the file you want to put in the cache - should
      #   be relative to file_cache_path
      # contents<String>:: A string with the contents you want written to the file
      # perm<String>:: Sets file permission bits. Permission bits are platform
      #   dependent; on Unix systems, see open(2) for details.
      #
      # === Returns
      # true
      def store(path, contents, perm = 0640)
        validate(
          {
            path: path,
            contents: contents,
          },
          {
            path: { kind_of: String },
            contents: { kind_of: String },
          }
        )

        file_path_array = File.split(path)
        file_name = file_path_array.pop
        cache_path = create_cache_path(File.join(file_path_array))
        File.open(File.join(cache_path, file_name), "w", perm) do |io|
          io.print(contents)
        end
        true
      end

      # Move a file into the cache.  Useful with the REST raw file output.
      #
      # === Parameters
      # file<String>:: The path to the file you want in the cache
      # path<String>:: The relative name you want the new file to use
      def move_to(file, path)
        validate(
          {
            file: file,
            path: path,
          },
          {
            file: { kind_of: String },
            path: { kind_of: String },
          }
        )

        file_path_array = File.split(path)
        file_name = file_path_array.pop
        if File.exists?(file) && File.writable?(file)
          FileUtils.mv(
            file,
            File.join(create_cache_path(File.join(file_path_array), true), file_name)
          )
        else
          raise "Cannot move #{file} to #{path}!"
        end
      end

      # Read a file from the File Cache
      #
      # === Parameters
      # path<String>:: The path to the file you want to load - should
      #   be relative to file_cache_path
      # read<True/False>:: Whether to return the file contents, or the path.
      #   Defaults to true.
      #
      # === Returns
      # String:: A string with the file contents, or the path to the file.
      #
      # === Raises
      # Chef::Exceptions::FileNotFound:: If it cannot find the file in the cache
      def load(path, read = true)
        validate(
          {
            path: path,
          },
          {
            path: { kind_of: String },
          }
        )
        cache_path = create_cache_path(path, false)
        raise Chef::Exceptions::FileNotFound, "Cannot find #{cache_path} for #{path}!" unless File.exists?(cache_path)

        if read
          File.read(cache_path)
        else
          cache_path
        end
      end

      # Delete a file from the File Cache
      #
      # === Parameters
      # path<String>:: The path to the file you want to delete - should
      #   be relative to file_cache_path
      #
      # === Returns
      # true
      def delete(path)
        validate(
          {
            path: path,
          },
          {
            path: { kind_of: String },
          }
        )
        cache_path = create_cache_path(path, false)
        if File.exists?(cache_path)
          File.unlink(cache_path)
        end
        true
      end

      # List all the files in the Cache
      #
      # === Returns
      # Array:: An array of files in the cache, suitable for use with load, delete and store
      def list
        find("**#{File::Separator}*")
      end

      ##
      # Find files in the cache by +glob_pattern+
      # === Returns
      # [String] - An array of file cache keys matching the glob
      def find(glob_pattern)
        keys = []
        Dir[File.join(Chef::Util::PathHelper.escape_glob_dir(file_cache_path), glob_pattern)].each do |f|
          if File.file?(f)
            keys << f[/^#{Regexp.escape(Dir[Chef::Util::PathHelper.escape_glob_dir(file_cache_path)].first) + File::Separator}(.+)/, 1]
          end
        end
        keys
      end

      # Whether or not this file exists in the Cache
      #
      # === Parameters
      # path:: The path to the file you want to check - is relative
      #   to file_cache_path
      #
      # === Returns
      # True:: If the file exists
      # False:: If it does not
      def key?(path)
        validate(
          {
            path: path,
          },
          {
            path: { kind_of: String },
          }
        )
        full_path = create_cache_path(path, false)
        if File.exists?(full_path)
          true
        else
          false
        end
      end

      alias_method :has_key?, :key?

      # Create a full path to a given file in the cache. By default,
      # also creates the path if it does not exist.
      #
      # === Parameters
      # path:: The path to create, relative to file_cache_path
      # create_if_missing:: True by default - whether to create the path if it does not exist
      #
      # === Returns
      # String:: The fully expanded path
      def create_cache_path(path, create_if_missing = true)
        cache_dir = File.expand_path(File.join(file_cache_path, path))
        if create_if_missing
          create_path(cache_dir)
        else
          cache_dir
        end
      end

      private

      def file_cache_path
        Chef::Config[:file_cache_path]
      end

    end
  end
end