#!/usr/bin/env ruby require 'fileutils' require 'bundler/setup' require 'archive/tar/minitar' require 'progressbar' require 'typhoeus' FTP_BASE = 'ftp://ftp.ncdc.noaa.gov/pub/data/gsod' YEARS = %w(1950 1960 1970 1980 1990 2000 2010) def main include Archive::Tar dest_dir = File.expand_path('../data', __FILE__) Dir.chdir(dest_dir) download_here_maybe?("#{FTP_BASE}/ish-history.csv") YEARS.each do |year| tarname = "gsod_#{year}.tar" url = "#{FTP_BASE}/#{year}/#{tarname}" dest = "#{dest_dir}/#{tarname}" download_here_maybe?(url) to_unpack = Minitar.open(dest, 'r').collect(&:full_name).select do |f| f =~ /\.gz$/ && !File.exist?(f) end if !to_unpack.empty? @progress = ProgressBar.new(File.basename(dest), to_unpack.length) Minitar.unpack(dest, dest_dir, to_unpack) do |action,name,stats| if action == :file_done @progress.inc(1) end end puts end end end def download_here_maybe?(url) outfile = File.basename(url) if !File.exist?(outfile) File.open(outfile, 'w') do |f| puts "Writing #{url} to #{outfile}" f.write(Typhoeus::Request.get(url).body) end end end if $0 == __FILE__ main end