swa 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +11 -0
- data/lib/swa/cli/cloud_formation_command.rb +1 -1
- data/lib/swa/cli/collection_behaviour.rb +8 -0
- data/lib/swa/cli/ec2_command.rb +50 -1
- data/lib/swa/cli/elb_command.rb +53 -0
- data/lib/swa/cli/glue_command.rb +192 -0
- data/lib/swa/cli/iam_command.rb +92 -4
- data/lib/swa/cli/kms_command.rb +1 -1
- data/lib/swa/cli/main_command.rb +4 -0
- data/lib/swa/cli/s3_command.rb +70 -1
- data/lib/swa/cli/selector.rb +4 -0
- data/lib/swa/cloud_formation/stack.rb +4 -0
- data/lib/swa/ec2/image.rb +4 -0
- data/lib/swa/ec2/instance.rb +10 -1
- data/lib/swa/ec2/key_pair.rb +4 -0
- data/lib/swa/ec2/security_group.rb +6 -0
- data/lib/swa/ec2/snapshot.rb +13 -4
- data/lib/swa/ec2/subnet.rb +4 -0
- data/lib/swa/ec2/volume.rb +4 -0
- data/lib/swa/ec2/vpc.rb +4 -0
- data/lib/swa/elb/load_balancer.rb +24 -0
- data/lib/swa/glue/crawler.rb +28 -0
- data/lib/swa/glue/database.rb +17 -0
- data/lib/swa/glue/job.rb +21 -0
- data/lib/swa/glue/job_bookmark_entry.rb +17 -0
- data/lib/swa/glue/job_run.rb +26 -0
- data/lib/swa/glue/partition.rb +26 -0
- data/lib/swa/glue/table.rb +17 -0
- data/lib/swa/iam/credentials.rb +31 -0
- data/lib/swa/iam/group.rb +11 -1
- data/lib/swa/iam/instance_profile.rb +26 -0
- data/lib/swa/iam/policy.rb +4 -0
- data/lib/swa/iam/role.rb +9 -0
- data/lib/swa/iam/user.rb +4 -0
- data/lib/swa/kms/alias.rb +4 -0
- data/lib/swa/record.rb +6 -0
- data/lib/swa/s3/bucket.rb +13 -1
- data/lib/swa/s3/object.rb +5 -0
- data/lib/swa/s3/object_version.rb +48 -0
- data/lib/swa/version.rb +1 -1
- data/swa.gemspec +12 -3
- metadata +139 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b1dfb1773a649e5d9e24e8ee24739cb6b2df451bb2cd4ffdf6a9b4336c067d87
|
4
|
+
data.tar.gz: dc90877d13ad90f7df91dfcec228639de7dd1393b42f2378ee2236421e1d44a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52ee4e00fd3bc9c3001d6a8168a3278f387da0a31732d9dd2bbb4a1971b9066150638ccdf757eac652ff8f6116b58d820262c030d1b018c32605b4475c59feb1
|
7
|
+
data.tar.gz: ec4a90e0a5a3e973c051227c33adb9d63048d82a31ca745a9c754593d738c76d0c58f3f6fbdfe75e9beae5c9dd4aa159b38016c2c444ac6ac1453aa5b3b8721f
|
data/README.md
CHANGED
@@ -76,6 +76,17 @@ The "item" sub-command can be ommitted, when it can be inferred from the resourc
|
|
76
76
|
$ swa ec2 i-bcf48c2b data
|
77
77
|
$ swa ec2 ami-1e73737d data
|
78
78
|
|
79
|
+
## Installing it
|
80
|
+
|
81
|
+
SWA is packaged as a Ruby gem, and can be installed with:
|
82
|
+
|
83
|
+
gem install swa
|
84
|
+
|
85
|
+
On a Mac, I recommend [brew-gem](https://github.com/sportngin/brew-gem) for easy system-wide installation:
|
86
|
+
|
87
|
+
brew install brew-gem
|
88
|
+
brew gem install swa
|
89
|
+
|
79
90
|
## Contributing
|
80
91
|
|
81
92
|
Bug reports and pull requests are welcome on GitHub at https://github.com/mdub/swa.
|
@@ -19,6 +19,14 @@ module Swa
|
|
19
19
|
|
20
20
|
end
|
21
21
|
|
22
|
+
target.subcommand ["ids"], "Just print ids" do
|
23
|
+
def execute
|
24
|
+
collection.each do |i|
|
25
|
+
puts i.id
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
22
30
|
target.subcommand ["data", "d"], "Full details" do
|
23
31
|
|
24
32
|
parameter "[QUERY]", "JMESPath expression"
|
data/lib/swa/cli/ec2_command.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "aws-sdk-
|
1
|
+
require "aws-sdk-ec2"
|
2
2
|
require "swa/cli/base_command"
|
3
3
|
require "swa/cli/collection_behaviour"
|
4
4
|
require "swa/cli/item_behaviour"
|
@@ -227,10 +227,25 @@ module Swa
|
|
227
227
|
List key-pairs.
|
228
228
|
EOF
|
229
229
|
|
230
|
+
option "--named", "PATTERN", "name pattern"
|
231
|
+
|
230
232
|
include CollectionBehaviour
|
231
233
|
|
234
|
+
subcommand "delete", "Delete all key-pairs" do
|
235
|
+
def execute
|
236
|
+
signal_error "no key-pairs specified" unless selector.specified?
|
237
|
+
key_pairs.each(&:delete)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
232
241
|
private
|
233
242
|
|
243
|
+
def named=(pattern)
|
244
|
+
selector.add do |kp|
|
245
|
+
File.fnmatch(pattern, kp.name)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
234
249
|
def key_pairs
|
235
250
|
query_for(:key_pairs, Swa::EC2::KeyPair)
|
236
251
|
end
|
@@ -245,6 +260,12 @@ module Swa
|
|
245
260
|
|
246
261
|
include ItemBehaviour
|
247
262
|
|
263
|
+
subcommand ["delete"], "Delete group" do
|
264
|
+
def execute
|
265
|
+
security_group.delete
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
248
269
|
private
|
249
270
|
|
250
271
|
def security_group
|
@@ -260,6 +281,12 @@ module Swa
|
|
260
281
|
include TagFilterOptions
|
261
282
|
include CollectionBehaviour
|
262
283
|
|
284
|
+
subcommand ["delete"], "Delete group" do
|
285
|
+
def execute
|
286
|
+
security_groups.each(&:delete)
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
263
290
|
private
|
264
291
|
|
265
292
|
def security_groups
|
@@ -302,12 +329,34 @@ module Swa
|
|
302
329
|
EOF
|
303
330
|
|
304
331
|
option "--owned-by", "OWNER", "with specified owner", :default => "self"
|
332
|
+
option ["--volume", "--of"], "VOLUME-ID", "for specified volume"
|
333
|
+
|
334
|
+
option ["--started-after", "--after"], "WHEN", "earliest start-time"
|
335
|
+
option ["--started-before", "--before"], "WHEN", "latest start-time"
|
305
336
|
|
306
337
|
include TagFilterOptions
|
307
338
|
include CollectionBehaviour
|
308
339
|
|
309
340
|
private
|
310
341
|
|
342
|
+
def volume=(volume_id)
|
343
|
+
add_filter("volume-id", volume_id)
|
344
|
+
end
|
345
|
+
|
346
|
+
def started_after=(datetime_string)
|
347
|
+
min_start_time = parse_datetime(datetime_string).max
|
348
|
+
selector.add do |image|
|
349
|
+
image.start_time > min_start_time
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
def started_before=(datetime_string)
|
354
|
+
max_start_time = parse_datetime(datetime_string).min
|
355
|
+
selector.add do |image|
|
356
|
+
image.start_time < max_start_time
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
311
360
|
def snapshots
|
312
361
|
query_options[:owner_ids] = [owned_by]
|
313
362
|
query_for(:snapshots, Swa::EC2::Snapshot)
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "aws-sdk-elasticloadbalancing"
|
2
|
+
require "swa/cli/base_command"
|
3
|
+
require "swa/cli/collection_behaviour"
|
4
|
+
require "swa/cli/item_behaviour"
|
5
|
+
require "swa/elb/load_balancer"
|
6
|
+
|
7
|
+
module Swa
|
8
|
+
module CLI
|
9
|
+
|
10
|
+
class ElbCommand < BaseCommand
|
11
|
+
|
12
|
+
subcommand ["load-balancer", "lb"], "Show load-balancer" do
|
13
|
+
|
14
|
+
parameter "NAME", "ELB name"
|
15
|
+
|
16
|
+
include ItemBehaviour
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def item
|
21
|
+
results = describe_load_balancers(:load_balancer_names => [name])
|
22
|
+
signal_error "No such ELB '#{name}'" unless results.any?
|
23
|
+
Swa::ELB::LoadBalancer.new(results.first)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
subcommand ["load-balancers", "lbs"], "Show load-balancers" do
|
29
|
+
|
30
|
+
include CollectionBehaviour
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def collection
|
35
|
+
Swa::ELB::LoadBalancer.list(describe_load_balancers)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
protected
|
41
|
+
|
42
|
+
def elb_client
|
43
|
+
::Aws::ElasticLoadBalancing::Client.new(aws_config)
|
44
|
+
end
|
45
|
+
|
46
|
+
def describe_load_balancers(options = {})
|
47
|
+
elb_client.describe_load_balancers(options).load_balancer_descriptions
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,192 @@
|
|
1
|
+
require "aws-sdk-glue"
|
2
|
+
require "swa/cli/base_command"
|
3
|
+
require "swa/cli/collection_behaviour"
|
4
|
+
require "swa/cli/item_behaviour"
|
5
|
+
require "swa/glue/crawler"
|
6
|
+
require "swa/glue/database"
|
7
|
+
require "swa/glue/job"
|
8
|
+
require "swa/glue/job_run"
|
9
|
+
require "swa/glue/job_bookmark_entry"
|
10
|
+
require "swa/glue/partition"
|
11
|
+
require "swa/glue/table"
|
12
|
+
|
13
|
+
module Swa
|
14
|
+
module CLI
|
15
|
+
|
16
|
+
class GlueCommand < BaseCommand
|
17
|
+
|
18
|
+
subcommand ["crawler"], "Show crawler" do
|
19
|
+
|
20
|
+
parameter "NAME", "crawler name"
|
21
|
+
|
22
|
+
include ItemBehaviour
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def item
|
27
|
+
Swa::Glue::Crawler.new(glue_client.get_crawler(:name => name).crawler)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
subcommand ["crawlers"], "Show crawlers" do
|
33
|
+
|
34
|
+
include CollectionBehaviour
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def collection
|
39
|
+
query_for(:get_crawlers, :crawlers, Swa::Glue::Crawler)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
subcommand ["database"], "Show database" do
|
45
|
+
|
46
|
+
parameter "NAME", "database name"
|
47
|
+
|
48
|
+
include ItemBehaviour
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def item
|
53
|
+
Swa::Glue::Database.new(glue_client.get_database(:name => name).database)
|
54
|
+
end
|
55
|
+
|
56
|
+
subcommand ["table"], "Show table" do
|
57
|
+
|
58
|
+
parameter "NAME", "table name", attribute_name: :table_name
|
59
|
+
|
60
|
+
include ItemBehaviour
|
61
|
+
|
62
|
+
subcommand ["partitions"], "Show partitions" do
|
63
|
+
|
64
|
+
include CollectionBehaviour
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def collection
|
69
|
+
query_for(:get_partitions, :partitions, Swa::Glue::Partition, :database_name => name, :table_name => table_name)
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def item
|
77
|
+
Swa::Glue::Table.new(glue_client.get_table(
|
78
|
+
:database_name => name, :name => table_name
|
79
|
+
).table)
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
subcommand ["tables"], "Show tables" do
|
85
|
+
|
86
|
+
include CollectionBehaviour
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def collection
|
91
|
+
query_for(:get_tables, :table_list, Swa::Glue::Table, :database_name => name)
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
subcommand ["databases"], "Show databases" do
|
99
|
+
|
100
|
+
include CollectionBehaviour
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
def collection
|
105
|
+
query_for(:get_databases, :database_list, Swa::Glue::Database)
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
subcommand ["job"], "Show job" do
|
111
|
+
|
112
|
+
parameter "NAME", "job name"
|
113
|
+
|
114
|
+
include ItemBehaviour
|
115
|
+
|
116
|
+
private
|
117
|
+
|
118
|
+
def item
|
119
|
+
Swa::Glue::Job.new(glue_client.get_job(:job_name => name).job)
|
120
|
+
end
|
121
|
+
|
122
|
+
subcommand ["run"], "Show run" do
|
123
|
+
|
124
|
+
parameter "ID", "run ID", attribute_name: :run_id
|
125
|
+
|
126
|
+
include ItemBehaviour
|
127
|
+
|
128
|
+
subcommand ["bookmark"], "Show bookmark" do
|
129
|
+
|
130
|
+
self.default_subcommand = "summary"
|
131
|
+
|
132
|
+
include ItemBehaviour
|
133
|
+
|
134
|
+
private
|
135
|
+
|
136
|
+
def item
|
137
|
+
Swa::Glue::JobBookmarkEntry.new(
|
138
|
+
glue_client.get_job_bookmark(:job_name => name, :run_id => run_id).job_bookmark_entry
|
139
|
+
)
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
|
144
|
+
private
|
145
|
+
|
146
|
+
def item
|
147
|
+
Swa::Glue::JobRun.new(glue_client.get_job_run(:job_name => name, :run_id => run_id).job_run)
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
subcommand ["runs"], "Show runs" do
|
153
|
+
|
154
|
+
include CollectionBehaviour
|
155
|
+
|
156
|
+
private
|
157
|
+
|
158
|
+
def collection
|
159
|
+
query_for(:get_job_runs, :job_runs, Swa::Glue::JobRun, :job_name => name)
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
subcommand ["jobs"], "Show jobs" do
|
167
|
+
|
168
|
+
include CollectionBehaviour
|
169
|
+
|
170
|
+
private
|
171
|
+
|
172
|
+
def collection
|
173
|
+
query_for(:get_jobs, :jobs, Swa::Glue::Job)
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
|
178
|
+
protected
|
179
|
+
|
180
|
+
def glue_client
|
181
|
+
::Aws::Glue::Client.new(aws_config)
|
182
|
+
end
|
183
|
+
|
184
|
+
def query_for(query_method, response_key, model, **query_args)
|
185
|
+
records = glue_client.public_send(query_method, **query_args).public_send(response_key)
|
186
|
+
model.list(records)
|
187
|
+
end
|
188
|
+
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|
192
|
+
end
|
data/lib/swa/cli/iam_command.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
require "aws-sdk-
|
1
|
+
require "aws-sdk-iam"
|
2
2
|
require "swa/cli/base_command"
|
3
3
|
require "swa/cli/collection_behaviour"
|
4
4
|
require "swa/cli/item_behaviour"
|
5
|
+
require "swa/iam/credentials"
|
5
6
|
require "swa/iam/group"
|
7
|
+
require "swa/iam/instance_profile"
|
6
8
|
require "swa/iam/policy"
|
7
9
|
require "swa/iam/role"
|
8
10
|
require "swa/iam/user"
|
@@ -42,6 +44,36 @@ module Swa
|
|
42
44
|
|
43
45
|
end
|
44
46
|
|
47
|
+
subcommand ["instance-profile", "ip"], "Show instance-profile" do
|
48
|
+
|
49
|
+
parameter "NAME", "name/ARN"
|
50
|
+
|
51
|
+
include ItemBehaviour
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def item
|
56
|
+
Swa::IAM::InstanceProfile.new(iam.instance_profile(File.basename(name)))
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
subcommand ["instance-profiles", "ips"], "Show instance-profiles" do
|
62
|
+
|
63
|
+
self.description = <<-EOF
|
64
|
+
List instance-profiles.
|
65
|
+
EOF
|
66
|
+
|
67
|
+
include CollectionBehaviour
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def collection
|
72
|
+
query_for(:instance_profiles, Swa::IAM::InstanceProfile)
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
45
77
|
subcommand ["policy"], "Show policy" do
|
46
78
|
|
47
79
|
parameter "ARN", "policy ARN"
|
@@ -70,12 +102,29 @@ module Swa
|
|
70
102
|
List policies.
|
71
103
|
EOF
|
72
104
|
|
105
|
+
option "--scope", "SCOPE", "'AWS' or 'Local'" do |arg|
|
106
|
+
case arg.downcase
|
107
|
+
when "all", "*"
|
108
|
+
"All"
|
109
|
+
when "local"
|
110
|
+
"Local"
|
111
|
+
when "aws"
|
112
|
+
"AWS"
|
113
|
+
else
|
114
|
+
raise ArgumentError, "must be one of 'All', 'AWS' or 'Local'"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
73
118
|
include CollectionBehaviour
|
74
119
|
|
75
120
|
private
|
76
121
|
|
77
122
|
def collection
|
78
|
-
query_for(:policies, Swa::IAM::Policy)
|
123
|
+
query_for(:policies, Swa::IAM::Policy, query_options)
|
124
|
+
end
|
125
|
+
|
126
|
+
def query_options
|
127
|
+
{ :scope => scope }.reject { |_k,v| v.nil? }
|
79
128
|
end
|
80
129
|
|
81
130
|
end
|
@@ -92,6 +141,41 @@ module Swa
|
|
92
141
|
Swa::IAM::Role.new(iam.role(File.basename(name)))
|
93
142
|
end
|
94
143
|
|
144
|
+
subcommand "assume", "Assume the role" do
|
145
|
+
|
146
|
+
option "--session-name", "NAME", "STS session-name",
|
147
|
+
:environment_variable => "USER",
|
148
|
+
:default => "swa"
|
149
|
+
|
150
|
+
parameter "[COMMAND] ...", "command to execute"
|
151
|
+
|
152
|
+
def execute
|
153
|
+
env = assume.to_env
|
154
|
+
if command_list.empty?
|
155
|
+
dump_env(env)
|
156
|
+
else
|
157
|
+
exec(env, *command_list)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
private
|
162
|
+
|
163
|
+
def assume
|
164
|
+
response = sts_client.assume_role(
|
165
|
+
:role_arn => item.arn,
|
166
|
+
:role_session_name => session_name
|
167
|
+
)
|
168
|
+
Swa::IAM::Credentials.new(response.credentials.to_h)
|
169
|
+
end
|
170
|
+
|
171
|
+
def dump_env(env)
|
172
|
+
env.each do |k,v|
|
173
|
+
puts "#{k}=#{v}"
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
95
179
|
end
|
96
180
|
|
97
181
|
subcommand ["roles"], "Show roles" do
|
@@ -146,11 +230,15 @@ module Swa
|
|
146
230
|
::Aws::IAM::Resource.new(aws_config)
|
147
231
|
end
|
148
232
|
|
149
|
-
def query_for(query_method, resource_model)
|
150
|
-
aws_resources = iam.public_send(query_method)
|
233
|
+
def query_for(query_method, resource_model, *query_args)
|
234
|
+
aws_resources = iam.public_send(query_method, *query_args)
|
151
235
|
wrapped_resources = resource_model.list(aws_resources)
|
152
236
|
end
|
153
237
|
|
238
|
+
def sts_client
|
239
|
+
::Aws::STS::Client.new(aws_config)
|
240
|
+
end
|
241
|
+
|
154
242
|
end
|
155
243
|
|
156
244
|
end
|
data/lib/swa/cli/kms_command.rb
CHANGED
data/lib/swa/cli/main_command.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require "swa/cli/base_command"
|
2
2
|
require "swa/cli/cloud_formation_command"
|
3
3
|
require "swa/cli/ec2_command"
|
4
|
+
require "swa/cli/elb_command"
|
5
|
+
require "swa/cli/glue_command"
|
4
6
|
require "swa/cli/iam_command"
|
5
7
|
require "swa/cli/kms_command"
|
6
8
|
require "swa/cli/s3_command"
|
@@ -12,6 +14,8 @@ module Swa
|
|
12
14
|
|
13
15
|
subcommand ["cf", "cloudformation"], "CloudFormation stuff", CloudFormationCommand
|
14
16
|
subcommand "ec2", "EC2 stuff", Ec2Command
|
17
|
+
subcommand "elb", "elb stuff", ElbCommand
|
18
|
+
subcommand "glue", "Glue stuff", GlueCommand
|
15
19
|
subcommand "iam", "IAM stuff", IamCommand
|
16
20
|
subcommand "kms", "KMS stuff", KmsCommand
|
17
21
|
subcommand "s3", "S3 stuff", S3Command
|
data/lib/swa/cli/s3_command.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "aws-sdk-
|
1
|
+
require "aws-sdk-s3"
|
2
2
|
require "swa/cli/base_command"
|
3
3
|
require "swa/cli/collection_behaviour"
|
4
4
|
require "swa/cli/item_behaviour"
|
@@ -82,6 +82,30 @@ module Swa
|
|
82
82
|
|
83
83
|
end
|
84
84
|
|
85
|
+
subcommand ["version", "v"], "Show version" do
|
86
|
+
|
87
|
+
parameter "ID", "object version ID", :attribute_name => :version_id
|
88
|
+
|
89
|
+
include ItemBehaviour
|
90
|
+
|
91
|
+
subcommand "get", "GET object" do
|
92
|
+
|
93
|
+
def execute
|
94
|
+
IO.copy_stream(version.get_body, $stdout)
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
protected
|
100
|
+
|
101
|
+
def version
|
102
|
+
object.version(version_id)
|
103
|
+
end
|
104
|
+
|
105
|
+
alias_method :item, :version
|
106
|
+
|
107
|
+
end
|
108
|
+
|
85
109
|
protected
|
86
110
|
|
87
111
|
def object
|
@@ -137,6 +161,51 @@ module Swa
|
|
137
161
|
|
138
162
|
end
|
139
163
|
|
164
|
+
subcommand ["object-versions", "versions", "vs"], "List object-versions" do
|
165
|
+
|
166
|
+
option "--prefix", "PREFIX", "object prefix"
|
167
|
+
|
168
|
+
self.default_subcommand = "list"
|
169
|
+
|
170
|
+
subcommand ["list", "ls"], "One-line summary" do
|
171
|
+
|
172
|
+
def execute
|
173
|
+
versions.each do |i|
|
174
|
+
puts i.summary
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
179
|
+
|
180
|
+
subcommand ["data", "d"], "Full details" do
|
181
|
+
|
182
|
+
parameter "[QUERY]", "JMESPath expression"
|
183
|
+
|
184
|
+
def execute
|
185
|
+
display_data(versions.map(&:data).to_a, query)
|
186
|
+
end
|
187
|
+
|
188
|
+
end
|
189
|
+
|
190
|
+
subcommand "delete-all", "Delete versions" do
|
191
|
+
|
192
|
+
def execute
|
193
|
+
versions.each do |v|
|
194
|
+
logger.info "Deleting #{v.uri} #{v.id}"
|
195
|
+
v.delete
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
|
201
|
+
protected
|
202
|
+
|
203
|
+
def versions
|
204
|
+
bucket.object_versions(:prefix => prefix)
|
205
|
+
end
|
206
|
+
|
207
|
+
end
|
208
|
+
|
140
209
|
subcommand "policy", "print bucket policy" do
|
141
210
|
|
142
211
|
def execute
|
data/lib/swa/cli/selector.rb
CHANGED