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 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
@@ -0,0 +1,2 @@
1
+ access_key_id: <%= ENV['BUCKET_LIST_ACCESS_KEY'] %>
2
+ secret_access_key: <%= ENV['BUCKET_LIST_SECRET_KEY'] %>
data/config/config.yml ADDED
@@ -0,0 +1,3 @@
1
+ # bucket_list config file
2
+
3
+ version: 0.1.0
@@ -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
@@ -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: