diff options
author | Adam Jacob <adam@hjksolutions.com> | 2008-09-30 21:48:06 -0700 |
---|---|---|
committer | Adam Jacob <adam@hjksolutions.com> | 2008-09-30 21:48:06 -0700 |
commit | 33d03dd422bdefe81053252d715252470565a7fd (patch) | |
tree | e0cdde158e8554dafc9cf3509d2b49058c877142 /lib/chef/file_cache.rb | |
parent | e6a53ca2ab0ff760d2d9919f8568bed7e9323076 (diff) | |
download | chef-33d03dd422bdefe81053252d715252470565a7fd.tar.gz |
Adding Chef::FileCache - a simpler replacement for FileStore
Diffstat (limited to 'lib/chef/file_cache.rb')
-rw-r--r-- | lib/chef/file_cache.rb | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/lib/chef/file_cache.rb b/lib/chef/file_cache.rb new file mode 100644 index 0000000000..ea9e17fbb7 --- /dev/null +++ b/lib/chef/file_cache.rb @@ -0,0 +1,203 @@ +# +# Author:: Adam Jacob (<adam@hjksolutions.com>) +# Copyright:: Copyright (c) 2008 HJK Solutions, LLC +# 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 File.join(File.dirname(__FILE__), "mixin", "params_validate") +require File.join(File.dirname(__FILE__), "mixin", "create_path") +require 'json' + +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 Chef::Config[:file_cache_path] + # contents<String>:: A string with the contents you want written to the file + # + # === Returns + # true + def store(path, contents) + 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)) + io = File.open(File.join(cache_path, file_name), "w") + io.print(contents) + io.close + true + end + + # Move a file in to the cache. Useful with the REST raw file output. + # + # === Parameteres + # 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) + File.rename( + file, + File.join(create_cache_path(File.join(file_path_array), true), file_name) + ) + else + raise RuntimeError, "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 Chef::Config[: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. + # + # === Raises + # Chef::Exception::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::Exception::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 Chef::Config[: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() + keys = Array.new + Dir[File.join(Chef::Config[:file_cache_path], '**', '*')].each do |f| + if File.file?(f) + path = f.match("^#{Chef::Config[:file_cache_path]}\/(.+)")[1] + keys << path + 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 Chef::Config[:file_cache_path] + # + # === Returns + # True:: If the file exists + # False:: If it does not + def has_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 + + # 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 Chef::Config[: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(Chef::Config[:file_cache_path], path)) + if create_if_missing + create_path(cache_dir) + else + cache_dir + end + end + + end + end +end
\ No newline at end of file |