Class: Awful::S3

Inherits:
Cli show all
Defined in:
lib/awful/s3.rb

Instance Method Summary collapse

Methods inherited from Cli

#initialize

Constructor Details

This class inherits a constructor from Awful::Cli

Instance Method Details

#buckets(name = /./) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/awful/s3.rb', line 42

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) ⇒ Object



106
107
108
109
110
111
# File 'lib/awful/s3.rb', line 106

def cat(path)
  bucket, key = path.split('/', 2)
  s3.get_object(bucket: bucket, key: key) do |chunk|
    $stdout.write(chunk)
  end
end

#clean(name) ⇒ Object



192
193
194
195
196
# File 'lib/awful/s3.rb', line 192

def clean(name)
  if yes? "Really delete ALL objects in bucket #{name}?", :yellow
    clean_objects(name)
  end
end

#copy(bucket, key) ⇒ Object



150
151
152
153
154
155
156
157
158
# File 'lib/awful/s3.rb', line 150

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) ⇒ Object



199
200
201
202
203
204
205
206
# File 'lib/awful/s3.rb', line 199

def delete(bucket, *objects)
  s3.delete_objects(
    bucket: bucket,
    delete: {
      objects: objects.map{ |k| {key: k} }
    }
  )
end

#empty?(bucket_name) ⇒ Boolean

Returns:

  • (Boolean)


71
72
73
# File 'lib/awful/s3.rb', line 71

def empty?(bucket_name)
  s3.list_objects(bucket: bucket_name, max_keys: 1).contents.empty?.output(&method(:puts))
end

#exists?(bucket_name) ⇒ Boolean

Returns:

  • (Boolean)


62
63
64
65
66
67
68
# File 'lib/awful/s3.rb', line 62

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) ⇒ Object



115
116
117
118
119
120
121
122
123
# File 'lib/awful/s3.rb', line 115

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

#ls(name = '.') ⇒ Object



31
32
33
34
35
36
37
38
# File 'lib/awful/s3.rb', line 31

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) ⇒ Object



55
56
57
58
59
# File 'lib/awful/s3.rb', line 55

def objects(bucket, prefix = nil)
  s3_resource.bucket(bucket).objects(prefix: prefix).map do |object|
    object.key
  end.output { |list| puts list }
end

#orphansObject



210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# File 'lib/awful/s3.rb', line 210

def orphans
  s3.list_buckets.buckets.each do |b|
    stack = get_tags(b.name)&.find{ |t| t.key == 'aws:cloudformation:stack-name' }&.value
    next if cfn_stack(stack) # not an orphan if stack exists

    if options[:delete]
      if s3.list_objects_v2(bucket: b.name, max_keys: 1).key_count == 0
        s3.delete_bucket(bucket: b.name) if yes?("Delete empty bucket #{b.name}?", :yellow)
      else
        puts "#{b.name} not empty"
      end
    else
      puts b.name
    end
  end
end

#put(bucket, key, filename = nil) ⇒ Object



136
137
138
139
140
141
142
143
144
145
# File 'lib/awful/s3.rb', line 136

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

#rbObject

rb is an alias for remove_bucket



168
# File 'lib/awful/s3.rb', line 168

map :rb => :remove_bucket

#remove_bucket(name) ⇒ Object



161
162
163
164
165
# File 'lib/awful/s3.rb', line 161

def remove_bucket(name)
  if yes? "Really delete bucket #{name}?", :yellow
    s3.delete_bucket(bucket: name)
  end
end

#tagged(name = '.') ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/awful/s3.rb', line 79

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) ⇒ Object



127
128
129
130
# File 'lib/awful/s3.rb', line 127

def upload(file, s3path)
  bucket, key = s3path.split('/', 2)
  s3_resource.bucket(bucket).object(key).upload_file(file)
end