bucket_list 0.1.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.
- 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:
|