diff --git a/CHANGELOG.md b/CHANGELOG.md index eadd7c4..a58d9ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 0.1.10 * added **eypconf_servergroup** fact +* added **download** type to download files checking if the resulting file is empty ## 0.1.9 diff --git a/README.md b/README.md index bf4560f..06ca27b 100644 --- a/README.md +++ b/README.md @@ -50,8 +50,23 @@ in ERB files you can call this module's functions using: <%= scope.function_bool2onoff([@trace]) %> ``` +to download a file you can use the download type: + +``` +download { 'salt': + url => 'https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm', + creates => '/tmp/test_repo_salt', +} +``` + ## Reference +### types + +#### download + +download a file using wget checking that the resulting file is not empty + ### functions #### bool2boolstr diff --git a/lib/puppet/provider/download/download_linux.rb b/lib/puppet/provider/download/download_linux.rb new file mode 100644 index 0000000..3c23a1e --- /dev/null +++ b/lib/puppet/provider/download/download_linux.rb @@ -0,0 +1,47 @@ +Puppet::Type.type(:download).provide(:download_linux) do + + def check_created_file(file) + if File.exists?(file) + if File.zero?(file) + self.debug("Found #{file} but empty") + return false + else + self.debug("Found #{file}") + return true + end + else + self.debug("Not found #{file}") + return false + end + end + + def run_wget_command(url) + + command = ["wget"] + command.push(url) + command.push("-O ", resource[:creates]) + + if resource[:cwd] + Dir.chdir resource[:cwd] do + run_command(command) + end + else + run_command(command) + end + end + + private + + def run_command(command) + command = command.join ' ' + output = Puppet::Util::Execution.execute(command, { + :uid => 'root', + :gid => 'root', + :failonfail => false, + :combine => true, + :override_locale => true, + }) + [output, $CHILD_STATUS.dup] + end + +end diff --git a/lib/puppet/type/download.rb b/lib/puppet/type/download.rb new file mode 100644 index 0000000..711797f --- /dev/null +++ b/lib/puppet/type/download.rb @@ -0,0 +1,61 @@ +Puppet::Type.newtype(:download) do + @doc = 'download files' + + newparam(:name) do + desc "An arbitrary tag for your own reference" + isnamevar + end + + newproperty(:url) do + desc 'URL to download' + + defaultto { @resource[:name] } + + # If needing to run the SQL command, return a fake value that will trigger + # a sync, else return the expected SQL command so no sync takes place + def retrieve + if @resource.should_run_wget + return :notrun + else + return self.should + end + end + + def sync + output, status = provider.run_wget_command(value) + self.fail("Error executing wget; returned #{status}: '#{output}'") unless status == 0 + end + end + + newparam(:cwd, :parent => Puppet::Parameter::Path) do + desc "The working directory under which the wget command should be executed." + defaultto("/tmp") + end + + newparam(:creates) do + desc "file created" + + def matches(value) + provider.check_created_file(value) + end + end + + newparam(:refreshonly, :boolean => true) do + desc "If 'true', it will only be executed via a notify/subscribe event." + + defaultto(:false) + newvalues(:true, :false) + end + + def should_run_wget(refreshing = false) + creates_param = @parameters[:creates] + return false if !creates_param.nil? && !creates_param.value.nil? && creates_param.matches(creates_param.value) + return false if !refreshing && @parameters[:refreshonly].value == :true + true + end + + def refresh + self.property(:command).sync if self.should_run_wget(true) + end + +end