class Awful::S3

Public Instance Methods

buckets(name = /./) click to toggle source
# File lib/awful/s3.rb, line 47
def buckets(name = /./)
  s3.list_buckets.buckets.select do |bucket|
    bucket.name.match(/#{name}/)
  end.output do |list|
    if options[:long]
      print_table list.map { |b| [ b.name, b.creation_date ] }
    else
      puts list.map(&:name)
    end
  end
end
cat(path) click to toggle source
# File lib/awful/s3.rb, line 111
def cat(path)
  bucket, key = path.split('/', 2)
  s3.get_object(bucket: bucket, key: key) do |chunk|
    $stdout.write(chunk)
  end
end
clean(name) click to toggle source
# File lib/awful/s3.rb, line 197
def clean(name)
  if yes? "Really delete ALL objects in bucket #{name}?", :yellow
    clean_objects(name)
  end
end
clean_objects(bucket, marker = nil) click to toggle source
# File lib/awful/s3.rb, line 176
def clean_objects(bucket, marker = nil)
  ## get 100 objects at a time
  objects = s3.list_objects(bucket: bucket, marker: marker)
  return if objects.contents.empty?

  ## delete them all
  s3.delete_objects(
    bucket: bucket,
    delete: {
      objects: objects.contents.map { |obj| { key: obj.key } }
    }
  )

  ## recurse if there are more
  if objects.next_marker
    clean_objects(bucket, objects.next_marker)
  end
end
copy(bucket, key) click to toggle source
# File lib/awful/s3.rb, line 155
def copy(bucket, key)
  s3.copy_object(
    bucket: bucket,
    key: key,
    server_side_encryption: options[:kms] ? 'aws:kms' : nil,
    ssekms_key_id: options[:kms],
    copy_source: options[:source],
  )
end
delete(bucket, *objects) click to toggle source
# File lib/awful/s3.rb, line 204
def delete(bucket, *objects)
  s3.delete_objects(
    bucket: bucket,
    delete: {
      objects: objects.map{ |k| {key: k} }
    }
  )
end
empty?(bucket_name) click to toggle source
# File lib/awful/s3.rb, line 76
def empty?(bucket_name)
  s3.list_objects(bucket: bucket_name, max_keys: 1).contents.empty?.output(&method(:puts))
end
exists?(bucket_name) click to toggle source
# File lib/awful/s3.rb, line 67
def exists?(bucket_name)
  begin
    s3.head_bucket(bucket: bucket_name) && true
  rescue Aws::S3::Errors::NotFound
    false
  end.output(&method(:puts))
end
get(bucket, key, filename = nil) click to toggle source
# File lib/awful/s3.rb, line 120
def get(bucket, key, filename = nil)
  if filename
    s3.get_object(bucket: bucket, key: key, response_target: filename)
  else
    s3.get_object(bucket: bucket, key: key).output do |response|
      puts response.body.read
    end
  end
end
get_stack_tag(name) click to toggle source
# File lib/awful/s3.rb, line 21
def get_stack_tag(name)
  (get_tags(name) || []).find do |tag|
    tag.key == 'aws:cloudformation:stack-name'
  end&.value
end
get_tags(bucket_name) click to toggle source
# File lib/awful/s3.rb, line 15
def get_tags(bucket_name)
  s3.get_bucket_tagging(bucket: bucket_name).tag_set
rescue Aws::S3::Errors::NoSuchTagSet # sdk throws this if no tags
  nil
end
ls(name = '.') click to toggle source
# File lib/awful/s3.rb, line 36
def ls(name = '.')
  if name.include?('/')
    bucket, prefix = name.split('/', 2)
    invoke 'objects', [bucket, prefix], options
  else
    invoke 'buckets', [name], options
  end
end
objects(bucket, prefix = nil) click to toggle source
# File lib/awful/s3.rb, line 60
def objects(bucket, prefix = nil)
  s3_resource.bucket(bucket).objects(prefix: prefix).map do |object|
    object.key
  end.output { |list| puts list }
end
orphans() click to toggle source
# File lib/awful/s3.rb, line 215
def orphans
  s3.list_buckets.buckets.each do |bucket|
    if (stack = get_stack_tag(bucket.name))
      next if stack_exists?(stack)
      puts bucket.name
      s3.delete_bucket(bucket: bucket.name) if options[:delete]
    end
  end
end
put(bucket, key, filename = nil) click to toggle source
# File lib/awful/s3.rb, line 141
def put(bucket, key, filename = nil)
  body = options.fetch('string', file_or_stdin(filename))
  s3.put_object(
    bucket: bucket,
    key: key,
    body: body,
    server_side_encryption: options[:kms] ? 'aws:kms' : nil,
    ssekms_key_id: options[:kms],
  )
end
remove_bucket(name) click to toggle source
# File lib/awful/s3.rb, line 166
def remove_bucket(name)
  if yes? "Really delete bucket #{name}?", :yellow
    s3.delete_bucket(bucket: name)
  end
end
s3_resource() click to toggle source

resource interface to S3 commands

# File lib/awful/s3.rb, line 11
def s3_resource
  Aws::S3::Resource.new(client: s3)
end
stack_exists?(name) click to toggle source
# File lib/awful/s3.rb, line 27
def stack_exists?(name)
  cf.describe_stacks(stack_name: name) && true
rescue ::Aws::CloudFormation::Errors::ValidationError
  false
end
tagged(name = '.') click to toggle source
# File lib/awful/s3.rb, line 84
def tagged(name = '.')
  conditions = options[:tags].map do |tag|
    key, value = tag.split('=')
    ->(set) { (set[0] == key) && (set[1] == value) }
  end
  if options[:stack]
    conditions << ->(set) { (set[0] == 'aws:cloudformation:stack-name') && (set[1] == options[:stack]) }
  end
  if options[:resource]
    conditions << ->(set) { (set[0] == 'aws:cloudformation:logical-id') && (set[1] == options[:resource]) }
  end

  ## get all buckets and check for a match with conditions
  s3.list_buckets.buckets.select do |b|
    b.name.match(/^#{name}/i)
  end.map do |bucket|
    tags = get_tags(bucket.name) or next
    tags.any? do |set|
      conditions.any? { |c| c.call(set) }
    end && bucket
  end.select{|b| b}.output do |buckets|
    puts buckets.map(&:name)
  end
end
upload(file, s3path) click to toggle source
# File lib/awful/s3.rb, line 132
def upload(file, s3path)
  bucket, key = s3path.split('/', 2)
  s3_resource.bucket(bucket).object(key).upload_file(file)
end