<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: util code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Tue, 14 Oct 2008 01:46:56 GMT</pubDate>
    <description>DZone Snippets: util code</description>
    <item>
      <title>Simple S3 utils - copy bucket to bucket</title>
      <link>http://snippets.dzone.com/posts/show/4935</link>
      <description>Some simple S3 utils in Ruby&lt;br /&gt;&lt;br /&gt;Specifically written to copy one bucket to another (for testing on production on staging)&lt;br /&gt;&lt;br /&gt;PLEASE BE CAREFUL WITH THIS - THERE IS CODE THAT DELETES ALL CONTENTS OF A BUCKET&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;a = AmazoneS3Asset.new&lt;br /&gt;a.copy_over_bucket("myapp_production", "myapp_production")&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'aws/s3'&lt;br /&gt;require 'mechanize'&lt;br /&gt;&lt;br /&gt;class AmazonS3Asset&lt;br /&gt;  &lt;br /&gt;  include AWS::S3&lt;br /&gt;  S3ID = "your s3 id"&lt;br /&gt;  S3KEY = "your s3 key"&lt;br /&gt;  &lt;br /&gt;  def initialize&lt;br /&gt;    puts "connecting..."&lt;br /&gt;    AWS::S3::Base.establish_connection!(&lt;br /&gt;      :access_key_id     =&gt; S3ID,&lt;br /&gt;      :secret_access_key =&gt; S3KEY&lt;br /&gt;    )&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def delete_key(bucket, key)&lt;br /&gt;    if exists?(bucket, key) &lt;br /&gt;      S3Object.delete key, bucket&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def empty_bucket(bucket)&lt;br /&gt;    bucket_keys(bucket).each do |k|&lt;br /&gt;      puts "deleting #{k}"&lt;br /&gt;      delete_key(bucket,k)&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def bucket_keys(bucket)&lt;br /&gt;    b = Bucket.find(bucket)&lt;br /&gt;    b.objects.collect {|o| o.key}&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def copy_over_bucket(from_bucket, to_bucket)&lt;br /&gt;    puts "Replacing #{to_bucket} with contents of #{from_bucket}"&lt;br /&gt;    #delete to_bucket&lt;br /&gt;    empty_bucket(to_bucket)&lt;br /&gt;    bucket_keys(from_bucket).each do |k|&lt;br /&gt;      copy_between_buckets(from_bucket, to_bucket, k)&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def copy_between_buckets(from_bucket, to_bucket, from_key, to_key = nil)&lt;br /&gt;    if exists?(from_bucket, from_key)&lt;br /&gt;      to_key = from_key if to_key.nil?&lt;br /&gt;      puts "Copying #{from_bucket}.#{from_key} to #{to_bucket}.#{to_key}"&lt;br /&gt;      url = "http://s3.amazonaws.com/#{from_bucket}/#{from_key}"&lt;br /&gt;      filename = download(url)&lt;br /&gt;      store_file(to_bucket,to_key,filename)&lt;br /&gt;      File.delete(filename)&lt;br /&gt;      return "http://s3.amazonaws.com/#{to_bucket}/#{to_key}"&lt;br /&gt;    else&lt;br /&gt;      puts "#{from_bucket}.#{from_key} didn't exist"&lt;br /&gt;      return nil&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def store_file(bucket, key, filename)&lt;br /&gt;     puts "Storing #{filename} in #{bucket}.#{key}"&lt;br /&gt;     S3Object.store(&lt;br /&gt;      key,&lt;br /&gt;      File.open(filename),&lt;br /&gt;      bucket,&lt;br /&gt;      :access =&gt; :public_read&lt;br /&gt;      )&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def download(url, save_as = nil)&lt;br /&gt;    if save_as.nil?&lt;br /&gt;      Dir.mkdir("amazon_s3_temp") if !File.exists?("amazon_s3_temp")&lt;br /&gt;      save_as = File.join("amazon_s3_temp",File.basename(url))&lt;br /&gt;    end&lt;br /&gt;    begin&lt;br /&gt;      puts "Saving #{url} to #{save_as}"&lt;br /&gt;      agent = WWW::Mechanize.new {|a| a.log = Logger.new(STDERR) }&lt;br /&gt;      img = agent.get(url)&lt;br /&gt;      img.save_as(save_as)&lt;br /&gt;      return save_as&lt;br /&gt;    rescue&lt;br /&gt;      raise "Failed on " + url + "  " + save_as&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def exists?(bucket,key)&lt;br /&gt;    begin&lt;br /&gt;      res = S3Object.find key, bucket&lt;br /&gt;    rescue &lt;br /&gt;      res = nil&lt;br /&gt;    end&lt;br /&gt;    return !res.nil?&lt;br /&gt;  end&lt;br /&gt;      &lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 30 Dec 2007 20:13:56 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4935</guid>
      <author>wiseleyb (ben)</author>
    </item>
  </channel>
</rss>
