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
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