class Mvndownload

Public Class Methods

download( vars ) click to toggle source
# File lib/mvndownload.rb, line 81
def self.download( vars )
    getfile = true
    vars.each do |key, val|
        if val == ""
            vars[key] = nil 
        end
    end
    if vars[:filename] == nil
        filename = vars[:source][/([^\/]+)$/]
    else
        filename = vars[:filename]
    end
    dest = File.join vars[:destination], filename
    if File.file?(dest)
        if dodownload("#{vars[:source]}.md5", "#{dest}.md5", vars[:username], vars[:password], vars[:proxyhost], vars[:proxyport], vars[:proxyuser], vars[:proxypass])
            getfile = !md5_check("#{dest}.md5", "#{dest}", true, false)
        end
    end
    if getfile
        FileUtils.rm_f dest
        unless dodownload(vars[:source], dest, vars[:username], vars[:password], vars[:proxyhost], vars[:proxyport], vars[:proxyuser], vars[:proxypass])
            abort "Download failed, you may want to check your remote server for issues or the correct file name"
        end
        if dodownload("#{vars[:source]}.md5", "#{dest}.md5", vars[:username], vars[:password], vars[:proxyhost], vars[:proxyport], vars[:proxyuser], vars[:proxypass])
            abort "MD5 check failed, potentially corrupt download" unless md5_check("#{dest}.md5", "#{dest}", true, false)
        end
    end
end

Private Class Methods

dodownload(source, dest, user, pass, p_addr, p_port, p_user, p_pass) click to toggle source
# File lib/mvndownload.rb, line 35
def self.dodownload(source, dest, user, pass, p_addr, p_port, p_user, p_pass)
    rc = nil
    uri = nil
    uri = URI(source)
    req = Net::HTTP::Get.new(uri.request_uri)
    unless user == nil
        req.basic_auth(user, pass)
    end
    begin
        h = Net::HTTP.new(uri.host, uri.port, p_addr, p_port, p_user, p_pass)
        h.use_ssl = uri.scheme == 'https'
        h.start do |http|
            http.request req do |response|
                parent = File.dirname dest
                stat = Sys::Filesystem.stat(parent)
                bytes_available = stat.block_size * stat.blocks_available
                
                if ( response.content_length() != nil )
                    if ((response['content-length'].to_i *2) >  bytes_available)
                        raise RuntimeError,"Not enough disk space to download the file to " + parent
                    end
                end
                
                rc = response.code
                if rc == '200'
                    unless File.directory? parent
                        FileUtils.rm_f(parent) if File.exist?(parent)
                        FileUtils.mkdir_p parent
                    end
                    open(dest, 'w') do |io|
                        response.read_body do |chunk|
                            io.write chunk
                        end
                    end
                else
                    puts "Download failed, return code from download: #{rc}"
                end
            end
        end
    rescue => downloadException
        abort "The file #{source} failed to be downloaded due to: " + downloadException.message 
    end
    return rc == '200'
end
md5_check(source, destination, sourcemd5 = false, destinationmd5 = false) click to toggle source
# File lib/mvndownload.rb, line 7
def self.md5_check(source, destination, sourcemd5 = false, destinationmd5 = false)
    smd5 = nil
    dmd5 = nil
    if sourcemd5
        File.open(source, 'rb') { |h| smd5 = h.read } ; nil
    else
        smd5 = Digest::MD5.file(source).hexdigest
    end

    if destinationmd5
        File.open(destination, 'rb') { |h| dmd5 = h.read } ; nil
    else
        dmd5 = Digest::MD5.file(destination).hexdigest
    end
    s5 = ""
    d5 = ""
    smd5.each_byte { |c|
        s5 << c.chr if c==9 || c==10 || c==13 || (c > 31 && c < 127)
    }
    dmd5.each_byte { |c|
        d5 << c.chr if c==9 || c==10 || c==13 || (c > 31 && c < 127)
    }
    s5 = s5.chomp.strip
    d5 = d5.chomp.strip
    return s5 == d5
end