bucket_list 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/bucket_list +100 -0
- data/config/aws_config.yml +2 -0
- data/config/config.yml +3 -0
- data/lib/bucket_list/app.rb +134 -0
- data/lib/bucket_list.rb +1 -0
- metadata +100 -0
data/bin/bucket_list
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'bucket_list'
|
5
|
+
rescue LoadError
|
6
|
+
# Cucumber seems to need this
|
7
|
+
$:.unshift "#{File.dirname(__FILE__)}/../lib/"
|
8
|
+
$:.unshift "#{File.dirname(__FILE__)}/../lib/bucket_list/"
|
9
|
+
require 'bucket_list'
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'optparse'
|
13
|
+
options = {}
|
14
|
+
|
15
|
+
option_parser = OptionParser.new do |opts|
|
16
|
+
|
17
|
+
# Allow app to take a comma-separated list of hashes
|
18
|
+
# E.g. bucket:file,bucket:file
|
19
|
+
opts.accept(Hash) do |string|
|
20
|
+
hash = {}
|
21
|
+
string.split(',').each do |pair|
|
22
|
+
key,value = pair.split(/:/)
|
23
|
+
hash[key] = value
|
24
|
+
end
|
25
|
+
hash
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.on("-c ", "--create-bucket BUCKET_NAME", "Create a new bucket") do |bucket_name|
|
29
|
+
options[:create_bucket] = bucket_name.to_s
|
30
|
+
end
|
31
|
+
|
32
|
+
opts.on("-d ", "--delete-bucket BUCKET_NAME", "Delete an existing bucket") do |bucket_name|
|
33
|
+
options[:delete_bucket] = bucket_name.to_s
|
34
|
+
end
|
35
|
+
|
36
|
+
opts.on('-u', '--upload BUCKET_NAME:FILE',Hash, 'Upload FILE to BUCKET_NAME') do |hash|
|
37
|
+
options[:upload] = hash
|
38
|
+
end
|
39
|
+
|
40
|
+
opts.on("-o ", "--objects BUCKET_NAME", "Show contents of BUCKET_NAME") do |bucket_name|
|
41
|
+
options[:show_contents] = bucket_name.to_s
|
42
|
+
end
|
43
|
+
|
44
|
+
opts.on("-l", "--list-buckets", "Display a list of buckets") do
|
45
|
+
options[:list] = true
|
46
|
+
end
|
47
|
+
|
48
|
+
opts.on("-v", "--version", "Display bucket_list version") do
|
49
|
+
options[:version] = true
|
50
|
+
end
|
51
|
+
|
52
|
+
opts.on("-h", "--help", "Display bucket_list command usage") do
|
53
|
+
puts opts
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
option_parser.parse!
|
58
|
+
|
59
|
+
bucket_list = BucketList.new
|
60
|
+
|
61
|
+
if options[:create_bucket]
|
62
|
+
puts "[INFO] About to create a new S3 bucket named '#{options[:create_bucket]}'"
|
63
|
+
bucket_list.create_bucket(options[:create_bucket])
|
64
|
+
end
|
65
|
+
|
66
|
+
if options[:delete_bucket]
|
67
|
+
puts "[INFO] About to delete the '#{options[:delete_bucket]}' bucket"
|
68
|
+
bucket_list.delete_bucket(options[:delete_bucket])
|
69
|
+
end
|
70
|
+
|
71
|
+
if options[:list]
|
72
|
+
if bucket_list.get_number_of_buckets > 0
|
73
|
+
bucket_list.get_list_of_bucket_names.each do |bucket_name|
|
74
|
+
puts bucket_name
|
75
|
+
end
|
76
|
+
else
|
77
|
+
puts "[INFO] You do not currently have any AWS S3 buckets"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
if options[:show_contents]
|
82
|
+
puts "[INFO] Listing contents of the '#{options[:show_contents]}' bucket"
|
83
|
+
bucket_objects = bucket_list.get_bucket_contents(options[:show_contents])
|
84
|
+
if !bucket_objects.empty?
|
85
|
+
bucket_objects.each do |object|
|
86
|
+
puts object
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
if options[:upload]
|
92
|
+
options[:upload].each_pair do |bucket_name, file|
|
93
|
+
puts "[INFO] Uploading '#{file}' to the '#{bucket_name}' bucket"
|
94
|
+
bucket_list.upload_file_to_bucket(bucket_name, file)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
if options[:version]
|
99
|
+
puts "[INFO] bucket_list version: #{bucket_list.settings['version']}"
|
100
|
+
end
|
data/config/config.yml
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
require 'erb'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
class BucketList
|
6
|
+
attr_accessor :s3, :settings
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
if keys_available?
|
10
|
+
aws_config_file = "#{File.dirname(__FILE__)}/../../config/aws_config.yml"
|
11
|
+
aws_config = YAML.load(ERB.new(File.read(aws_config_file)).result)
|
12
|
+
AWS.config(aws_config)
|
13
|
+
@s3 = AWS::S3.new
|
14
|
+
|
15
|
+
config_file = "#{File.dirname(__FILE__)}/../../config/config.yml"
|
16
|
+
config = YAML.load(File.read(config_file))
|
17
|
+
@settings = config
|
18
|
+
else
|
19
|
+
puts "[ERROR] AWS access keys must be available through 'BUCKET_LIST_ACCESS_KEY' and 'BUCKET_LIST_SECRET_KEY' environment variables"
|
20
|
+
exit 1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def bucket_exists?(bucket_name)
|
25
|
+
@s3.buckets[bucket_name].exists?
|
26
|
+
end
|
27
|
+
|
28
|
+
def bucket_contains_object?(bucket_name, object_name)
|
29
|
+
bucket_contents = Array.new
|
30
|
+
bucket = s3.buckets[bucket_name]
|
31
|
+
bucket.objects['key']
|
32
|
+
bucket.objects.each do |obj|
|
33
|
+
bucket_contents << obj.key
|
34
|
+
end
|
35
|
+
bucket_contents.include?(object_name)
|
36
|
+
end
|
37
|
+
|
38
|
+
def create_bucket(bucket_name)
|
39
|
+
if !bucket_exists?(bucket_name)
|
40
|
+
@s3.buckets.create(bucket_name)
|
41
|
+
wait_for_bucket(bucket_name, true)
|
42
|
+
puts "[INFO] Bucket created"
|
43
|
+
else
|
44
|
+
puts "[ERROR] Sorry, a bucket named '#{bucket_name}' already exists"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def keys_available?
|
49
|
+
x = ENV['BUCKET_LIST_ACCESS_KEY']
|
50
|
+
y = ENV['BUCKET_LIST_SECRET_KEY']
|
51
|
+
!x.nil? && !y.nil?
|
52
|
+
end
|
53
|
+
|
54
|
+
def delete_bucket(bucket_name)
|
55
|
+
if bucket_exists?(bucket_name)
|
56
|
+
bucket = s3.buckets[bucket_name]
|
57
|
+
bucket.delete!
|
58
|
+
wait_for_bucket(bucket_name, false)
|
59
|
+
puts "[INFO] The bucket '#{bucket_name}' has been deleted"
|
60
|
+
else
|
61
|
+
puts "[ERROR] Sorry, a bucket named '#{bucket_name}' does not exist"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def get_bucket_contents(bucket_name)
|
66
|
+
bucket_contents = Array.new
|
67
|
+
if bucket_exists?(bucket_name)
|
68
|
+
if get_number_of_bucket_contents(bucket_name) > 0
|
69
|
+
bucket = s3.buckets[bucket_name]
|
70
|
+
bucket.objects['key']
|
71
|
+
bucket.objects.each do |obj|
|
72
|
+
bucket_contents << obj.key
|
73
|
+
end
|
74
|
+
bucket_contents
|
75
|
+
else
|
76
|
+
puts "[INFO] The bucket '#{bucket_name}' does not have any contents"
|
77
|
+
end
|
78
|
+
else
|
79
|
+
puts "[ERROR] Sorry, a bucket named '#{bucket_name}' does not exist"
|
80
|
+
end
|
81
|
+
bucket_contents
|
82
|
+
end
|
83
|
+
|
84
|
+
def get_number_of_buckets
|
85
|
+
@s3.buckets.count
|
86
|
+
end
|
87
|
+
|
88
|
+
def get_number_of_bucket_contents(bucket_name)
|
89
|
+
if bucket_exists?(bucket_name)
|
90
|
+
bucket = s3.buckets[bucket_name]
|
91
|
+
bucket.objects.count
|
92
|
+
else
|
93
|
+
puts "[ERROR] Sorry, a bucket named '#{bucket_name}' does not exist"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def get_list_of_bucket_names
|
98
|
+
my_buckets = Array.new
|
99
|
+
@s3.buckets.each do |bucket|
|
100
|
+
my_buckets << bucket.name
|
101
|
+
end
|
102
|
+
my_buckets
|
103
|
+
end
|
104
|
+
|
105
|
+
def upload_file_to_bucket(bucket_name, file)
|
106
|
+
if bucket_exists?(bucket_name)
|
107
|
+
bucket = s3.buckets[bucket_name]
|
108
|
+
|
109
|
+
basename = File.basename(file)
|
110
|
+
o = bucket.objects[basename]
|
111
|
+
o.write(:file => file)
|
112
|
+
|
113
|
+
until bucket_contains_object?(bucket_name, basename) do
|
114
|
+
sleep 1
|
115
|
+
end
|
116
|
+
puts "[INFO] Uploaded '#{file}' to the '#{bucket_name}' bucket"
|
117
|
+
puts "[INFO] Access file at '#{o.url_for(:read)}'"
|
118
|
+
else
|
119
|
+
puts "[ERROR] Sorry, a bucket named '#{bucket_name}' does not exist"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def wait_for_bucket(bucket_name, exist_bool)
|
124
|
+
if exist_bool
|
125
|
+
until bucket_exists?(bucket_name) do
|
126
|
+
sleep 1
|
127
|
+
end
|
128
|
+
else
|
129
|
+
until !bucket_exists?(bucket_name) do
|
130
|
+
sleep 1
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
data/lib/bucket_list.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bucket_list/app'
|
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bucket_list
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ed King
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-27 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: aws-sdk
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.6.4
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.6.4
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: cucumber
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.2.1
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.2.1
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: aruba
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.4.11
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.4.11
|
62
|
+
description: bucket_list is a simple command line tool that can be used to manage
|
63
|
+
and upload files to AWS S3 buckets.
|
64
|
+
email: ed@victavision.co.uk
|
65
|
+
executables:
|
66
|
+
- bucket_list
|
67
|
+
extensions: []
|
68
|
+
extra_rdoc_files: []
|
69
|
+
files:
|
70
|
+
- lib/bucket_list.rb
|
71
|
+
- lib/bucket_list/app.rb
|
72
|
+
- config/config.yml
|
73
|
+
- config/aws_config.yml
|
74
|
+
- bin/bucket_list
|
75
|
+
homepage: http://ed.victavision.co.uk/blog/post/27-8-2012-bucket-list
|
76
|
+
licenses: []
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ! '>='
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
requirements: []
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 1.8.24
|
96
|
+
signing_key:
|
97
|
+
specification_version: 3
|
98
|
+
summary: Command line app for talking to AWS S3
|
99
|
+
test_files: []
|
100
|
+
has_rdoc:
|