aws_tools 0.0.1 → 0.0.2
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/Manifest +3 -1
- data/README.rdoc +0 -18
- data/Rakefile +1 -1
- data/aws_tools.gemspec +4 -4
- data/lib/aws_tools.rb +4 -12
- data/lib/aws_tools/ec2.rb +150 -0
- data/lib/aws_tools/s3.rb +88 -36
- metadata +6 -4
data/Manifest
CHANGED
data/README.rdoc
CHANGED
@@ -8,30 +8,12 @@ To install, run
|
|
8
8
|
|
9
9
|
$ sudo gem install aws_tools
|
10
10
|
|
11
|
-
= Examples
|
12
|
-
|
13
|
-
require 'rubygems'
|
14
|
-
require 'right_aws'
|
15
|
-
require 'aws_tools'
|
16
|
-
|
17
|
-
# Connect to S3 and synchronize all buckets.
|
18
|
-
AwsTools::S3::Synchronize.new(RightAws::S3.new(access_key,
|
19
|
-
secret_access_key,
|
20
|
-
:backup_suffix => "-dr",
|
21
|
-
:backup_location => :eu)
|
22
|
-
|
23
|
-
View the documentation for more information.
|
24
|
-
|
25
11
|
= Documentation
|
26
12
|
|
27
13
|
You can generate documentation if you have the source by typing:
|
28
14
|
|
29
15
|
rake doc
|
30
16
|
|
31
|
-
= Release Notes
|
32
|
-
|
33
|
-
First release.
|
34
|
-
|
35
17
|
= Credits
|
36
18
|
|
37
19
|
AwsTools is maintained by {Christopher Meiklejohn}[mailto:cmeik@me.com]. Contact me if you'd like to request any features or have any questions or feedback.
|
data/Rakefile
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'echoe'
|
4
4
|
|
5
|
-
Echoe.new('aws_tools', '0.0.
|
5
|
+
Echoe.new('aws_tools', '0.0.2') do |p|
|
6
6
|
p.description = "A library to help simplify common AWS tasks."
|
7
7
|
p.url = "http://github.com/cmeiklejohn/aws_tools"
|
8
8
|
p.author = "Christopher Meiklejohn"
|
data/aws_tools.gemspec
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{aws_tools}
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.2"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Christopher Meiklejohn"]
|
9
|
-
s.date = %q{2010-02-
|
9
|
+
s.date = %q{2010-02-27}
|
10
10
|
s.description = %q{A library to help simplify common AWS tasks.}
|
11
11
|
s.email = %q{cmeik@me.com}
|
12
|
-
s.extra_rdoc_files = ["README.rdoc", "lib/aws_tools.rb", "lib/aws_tools/s3.rb"]
|
13
|
-
s.files = ["MIT-LICENSE", "
|
12
|
+
s.extra_rdoc_files = ["README.rdoc", "lib/aws_tools.rb", "lib/aws_tools/ec2.rb", "lib/aws_tools/s3.rb"]
|
13
|
+
s.files = ["MIT-LICENSE", "README.rdoc", "Rakefile", "aws_tools.gemspec", "lib/aws_tools.rb", "lib/aws_tools/ec2.rb", "lib/aws_tools/s3.rb", "Manifest"]
|
14
14
|
s.homepage = %q{http://github.com/cmeiklejohn/aws_tools}
|
15
15
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Aws_tools", "--main", "README.rdoc"]
|
16
16
|
s.require_paths = ["lib"]
|
data/lib/aws_tools.rb
CHANGED
@@ -8,26 +8,18 @@
|
|
8
8
|
# Copyright:: Copyright (c) 2010 Christopher Meiklejohn
|
9
9
|
# License:: Distributes under the terms specified in the MIT-LICENSE file.
|
10
10
|
#
|
11
|
-
#
|
11
|
+
# Documentation coming soon.
|
12
12
|
#
|
13
|
-
# # Connect to S3 and synchronize all buckets.
|
14
|
-
# AwsTools::S3::Synchronize.new(RightAws::S3.new(access_key,
|
15
|
-
# secret_access_key,
|
16
|
-
# :backup_suffix => "-dr",
|
17
|
-
# :backup_location => :eu)
|
18
|
-
#
|
19
|
-
#
|
20
|
-
require 'rubygems'
|
21
|
-
require 'right_aws'
|
22
|
-
|
23
13
|
$:.unshift(File.dirname(__FILE__))
|
14
|
+
|
24
15
|
require 'aws_tools/s3'
|
16
|
+
require 'aws_tools/ec2'
|
25
17
|
|
26
18
|
module AwsTools #:nodoc:
|
27
19
|
module VERSION #:nodoc:
|
28
20
|
MAJOR = 0
|
29
21
|
MINOR = 0
|
30
|
-
TINY =
|
22
|
+
TINY = 2
|
31
23
|
|
32
24
|
STRING = [MAJOR, MINOR, TINY].join('.')
|
33
25
|
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
#
|
3
|
+
# AwsTools::Ec2
|
4
|
+
#
|
5
|
+
# Author:: Christopher Meiklejohn (cmeik@me.com)
|
6
|
+
# Copyright:: Copyright (c) 2010 Christopher Meiklejohn
|
7
|
+
# License:: Distributes under the terms specified in the MIT-LICENSE file.
|
8
|
+
#
|
9
|
+
# Documentation coming soon.
|
10
|
+
#
|
11
|
+
module AwsTools
|
12
|
+
class Ec2
|
13
|
+
class Helpers
|
14
|
+
|
15
|
+
# SynchronizeS3Buckets
|
16
|
+
#
|
17
|
+
# Documentation coming soon.
|
18
|
+
class SynchronizeS3Buckets
|
19
|
+
|
20
|
+
# Accessors for everything we might need to specify.
|
21
|
+
# Refactor this eventually back into AwsTools::Ec2 or
|
22
|
+
# AwsTools::Ec2::Helpers
|
23
|
+
attr_accessor :min_count,
|
24
|
+
:max_count,
|
25
|
+
:security_group,
|
26
|
+
:key_name,
|
27
|
+
:addressing_type,
|
28
|
+
:instance_type,
|
29
|
+
:kernel_id,
|
30
|
+
:ramdisk_id,
|
31
|
+
:availability_zone,
|
32
|
+
:monitoring_enabled,
|
33
|
+
:subnet_id,
|
34
|
+
:disable_api_termination,
|
35
|
+
:instance_initiated_shutdown_behavior,
|
36
|
+
:block_device_mappings
|
37
|
+
|
38
|
+
# Initalizer.
|
39
|
+
#
|
40
|
+
# Required parameters:
|
41
|
+
#
|
42
|
+
# ec2: authenticated rightaws ec2 instance to launch the
|
43
|
+
# instance from
|
44
|
+
# ami: ami to use to perform the backup
|
45
|
+
#
|
46
|
+
# access_key: access key to use for s3 inside of instance
|
47
|
+
#
|
48
|
+
# secret_access_key: secret access key to use for s3 inside of
|
49
|
+
# instance
|
50
|
+
#
|
51
|
+
def initialize(ec2,
|
52
|
+
ami,
|
53
|
+
access_key,
|
54
|
+
secret_access_key,
|
55
|
+
options = {})
|
56
|
+
puts "AwsTools::Ec2::Helpers::SynchronizeS3Buckets " +
|
57
|
+
"initialize"
|
58
|
+
|
59
|
+
@ec2 = ec2
|
60
|
+
@ami = ami
|
61
|
+
@access_key = access_key
|
62
|
+
@secret_access_key = secret_access_key
|
63
|
+
|
64
|
+
options.each_pair do |key, value|
|
65
|
+
self.send("#{key}=", value)
|
66
|
+
end
|
67
|
+
|
68
|
+
setup_defaults
|
69
|
+
launch_instance
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
# Setup defaults for EC2 instance
|
75
|
+
#
|
76
|
+
# Refactor this eventually back into AwsTools::Ec2 or
|
77
|
+
# AwsTools::Ec2::Helpers right_was run_instances requires these
|
78
|
+
# as arguments, but launch_instances takes a option hash.
|
79
|
+
# Investigate migrating to launch_instances, which
|
80
|
+
# seems the less recommended way for launching instances
|
81
|
+
#
|
82
|
+
def setup_defaults
|
83
|
+
@min_count = 1 if @min_count.blank?
|
84
|
+
@max_count = 1 if @max_count.blank?
|
85
|
+
@security_group = 'default' if @security_group.blank?
|
86
|
+
@key_name = 'default' if @key_name.blank?
|
87
|
+
@addressing_type = 'public' if @addressing_type.blank?
|
88
|
+
@instance_type = 'm1.small' if @instance_type.blank?
|
89
|
+
# @kernel_id = nil if @kernel_id.blank?
|
90
|
+
# @ramdisk_id = nil if @ramdisk_id.blank?
|
91
|
+
# @availability_zone = nil if @availability_zone.blank?
|
92
|
+
# @monitoring_enabled = nil if @monitoring_enabled.blank?
|
93
|
+
# @subnet_id = nil if @subnet_id.blank?
|
94
|
+
# @disable_api_termination = nil
|
95
|
+
# if @disable_api_termination.blank?
|
96
|
+
# @instance_initiated_shutdown_behavior = nil
|
97
|
+
# if @instance_initiated_shutdown_behavior.blank?
|
98
|
+
# @block_device_mappings = nil if @block_device_mappings.blank?
|
99
|
+
end
|
100
|
+
|
101
|
+
# Define script data to execute
|
102
|
+
# Refactor this to use remote workling at some point
|
103
|
+
def user_data
|
104
|
+
"#!/bin/sh
|
105
|
+
|
106
|
+
/usr/bin/ruby <<EOF
|
107
|
+
|
108
|
+
require 'rubygems'
|
109
|
+
require 'right_aws'
|
110
|
+
require 'aws_tools'
|
111
|
+
|
112
|
+
AwsTools::S3::Synchronize.new(
|
113
|
+
RightAws::S3.new('#{@access_key}',
|
114
|
+
'#{@secret_access_key}'),
|
115
|
+
:backup_suffix => '-backup',
|
116
|
+
:backup_location => :'eu')
|
117
|
+
|
118
|
+
EOF
|
119
|
+
|
120
|
+
shutdown now -h
|
121
|
+
"
|
122
|
+
end
|
123
|
+
|
124
|
+
# Launch ec2 instance
|
125
|
+
def launch_instance
|
126
|
+
puts "AwsTools::Ec2::Helpers::SynchronizeS3Buckets " +
|
127
|
+
"launch_instance"
|
128
|
+
|
129
|
+
# Run the instance via right_aws
|
130
|
+
@ec2.run_instances(@ami,
|
131
|
+
@min_count,
|
132
|
+
@max_count,
|
133
|
+
@security_group,
|
134
|
+
@key_name,
|
135
|
+
user_data,
|
136
|
+
@addressing_type,
|
137
|
+
@instance_type,
|
138
|
+
@kernel_id,
|
139
|
+
@ramdisk_id,
|
140
|
+
@availability_zone,
|
141
|
+
@monitoring_enabled,
|
142
|
+
@subnet_id,
|
143
|
+
@disable_api_termination,
|
144
|
+
@instance_initiated_shutdown_behavior,
|
145
|
+
@block_device_mappings)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
data/lib/aws_tools/s3.rb
CHANGED
@@ -1,23 +1,48 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
#
|
3
|
+
# AwsTools::S3
|
4
|
+
#
|
5
|
+
# Author:: Christopher Meiklejohn (cmeik@me.com)
|
6
|
+
# Copyright:: Copyright (c) 2010 Christopher Meiklejohn
|
7
|
+
# License:: Distributes under the terms specified in the MIT-LICENSE file.
|
8
|
+
#
|
9
|
+
# Documentation coming soon.
|
10
|
+
#
|
5
11
|
|
6
12
|
module AwsTools
|
13
|
+
# S3
|
14
|
+
#
|
15
|
+
# Provides an interface to common S3 administration utilties.
|
7
16
|
class S3
|
17
|
+
|
8
18
|
# Bucket class.
|
9
19
|
#
|
10
20
|
# Knows how to perform synchronization of all assets
|
11
|
-
# in one bucket.
|
21
|
+
# in one bucket. Synchronization is one way, source to destination
|
22
|
+
# only.
|
12
23
|
class Bucket
|
24
|
+
|
13
25
|
# Synchronize.
|
14
26
|
#
|
15
27
|
# Performs the synchronization of one bucket.
|
28
|
+
#
|
29
|
+
# One way synchronization, source to destination based on
|
30
|
+
# modification time.
|
31
|
+
#
|
16
32
|
class Synchronize
|
17
|
-
attr_accessor :bucket, :backup_bucket
|
18
33
|
|
19
|
-
|
20
|
-
|
34
|
+
# Initializer.
|
35
|
+
#
|
36
|
+
# Required parameters:
|
37
|
+
#
|
38
|
+
# bucket: source bucket
|
39
|
+
# backup_bucket: destination bucket
|
40
|
+
#
|
41
|
+
def initialize(bucket, backup_bucket, options = {})
|
42
|
+
puts "AwsTools::S3::Bucket::Synchronize initialize"
|
43
|
+
|
44
|
+
@bucket = bucket
|
45
|
+
@backup_bucket = backup_bucket
|
21
46
|
|
22
47
|
options.each_pair do |key, value|
|
23
48
|
self.send("#{key}=", value)
|
@@ -30,44 +55,53 @@ module AwsTools
|
|
30
55
|
|
31
56
|
# Peform synchronization of one bucket.
|
32
57
|
def perform_synchronization
|
33
|
-
puts "AwsTools::S3::Bucket::Synchronize
|
34
|
-
"#{
|
58
|
+
puts "AwsTools::S3::Bucket::Synchronize " +
|
59
|
+
"perform_synchronization #{@bucket.name} " +
|
60
|
+
"#{@backup_bucket.name}"
|
35
61
|
|
36
|
-
|
62
|
+
# Iterate through the bucket.
|
63
|
+
@bucket.keys.each do |source_key|
|
37
64
|
|
38
65
|
# Look for destination key.
|
39
|
-
destination_key = RightAws::S3::Key.create(backup_bucket,
|
66
|
+
destination_key = RightAws::S3::Key.create(@backup_bucket,
|
67
|
+
source_key.to_s)
|
40
68
|
|
41
69
|
# If it exists...
|
42
70
|
if destination_key.exists?
|
43
71
|
|
44
|
-
puts "AwsTools::S3::Bucket::Synchronize
|
45
|
-
"
|
72
|
+
puts "AwsTools::S3::Bucket::Synchronize " +
|
73
|
+
"perform_synchronization " +
|
74
|
+
"#{source_key.to_s} exists!"
|
46
75
|
|
47
76
|
# Grab headers.
|
48
77
|
source_key.head
|
49
78
|
destination_key.head
|
50
79
|
|
51
80
|
# Get last modified
|
52
|
-
source_date = Time.parse(
|
53
|
-
|
81
|
+
source_date = Time.parse(
|
82
|
+
source_key.headers["last-modified"])
|
83
|
+
destination_date = Time.parse(
|
84
|
+
destination_key.headers["last-modified"])
|
54
85
|
|
55
86
|
# Copy if the destination is older than the source
|
56
87
|
if source_date > destination_date
|
57
|
-
puts "AwsTools::S3::Bucket::Synchronize
|
58
|
-
"
|
88
|
+
puts "AwsTools::S3::Bucket::Synchronize " +
|
89
|
+
"perform_synchronization " +
|
90
|
+
"#{source_key.to_s} older!"
|
59
91
|
|
60
92
|
# Perform a copy of the object.
|
61
93
|
source_key.copy(destination_key)
|
62
94
|
|
63
95
|
# Check if it worked...
|
64
96
|
if destination_key.exists?
|
65
|
-
puts "AwsTools::S3::Bucket::Synchronize
|
66
|
-
"
|
97
|
+
puts "AwsTools::S3::Bucket::Synchronize " +
|
98
|
+
"perform_synchronization " +
|
99
|
+
"#{source_key.to_s} replaced!"
|
67
100
|
end
|
68
101
|
else
|
69
|
-
puts "AwsTools::S3::Bucket::Synchronize
|
70
|
-
"
|
102
|
+
puts "AwsTools::S3::Bucket::Synchronize " +
|
103
|
+
"perform_synchronization " +
|
104
|
+
"#{source_key.to_s} current!"
|
71
105
|
end
|
72
106
|
|
73
107
|
else
|
@@ -77,8 +111,9 @@ module AwsTools
|
|
77
111
|
|
78
112
|
# Check if it worked...
|
79
113
|
if destination_key.exists?
|
80
|
-
puts "AwsTools::S3::Bucket::Synchronize
|
81
|
-
"
|
114
|
+
puts "AwsTools::S3::Bucket::Synchronize " +
|
115
|
+
"perform_synchronization " +
|
116
|
+
"#{source_key.to_s} created!"
|
82
117
|
end
|
83
118
|
|
84
119
|
end
|
@@ -93,13 +128,17 @@ module AwsTools
|
|
93
128
|
#
|
94
129
|
# Performs synchronization of every bucket in an S3 account.
|
95
130
|
#
|
96
|
-
# Assume that you will be synchronizing to a bucket with a suffix
|
97
|
-
# in another zone
|
131
|
+
# Assume that you will be synchronizing to a bucket with a suffix
|
132
|
+
# located in another zone
|
133
|
+
# (since names need to be unique across all zones).
|
134
|
+
#
|
98
135
|
class Synchronize
|
99
|
-
attr_accessor :
|
136
|
+
attr_accessor :backup_perms,
|
137
|
+
:backup_suffix,
|
138
|
+
:backup_location
|
100
139
|
|
101
140
|
def initialize(s3, options = {})
|
102
|
-
puts "AwsTools::S3::Synchronize
|
141
|
+
puts "AwsTools::S3::Synchronize initialize"
|
103
142
|
|
104
143
|
@s3 = s3
|
105
144
|
|
@@ -107,34 +146,47 @@ module AwsTools
|
|
107
146
|
self.send("#{key}=", value)
|
108
147
|
end
|
109
148
|
|
149
|
+
setup_defaults
|
110
150
|
perform_synchronization
|
111
151
|
end
|
112
152
|
|
113
|
-
private
|
153
|
+
private
|
154
|
+
|
155
|
+
# Setup defaults for S3 backups
|
156
|
+
#
|
157
|
+
def setup_defaults
|
158
|
+
@backup_perms = "public-read" if @backup_perms.blank?
|
159
|
+
@backup_suffix = "-backup" if @backup_suffix.blank?
|
160
|
+
@backup_location = "eu" if @backup_location.blank?
|
161
|
+
end
|
114
162
|
|
115
163
|
# Retrieve all buckets, and synchronize them one by one.
|
116
164
|
def perform_synchronization
|
117
165
|
# Retrieve bucket list.
|
118
166
|
@s3.buckets.each do |bucket|
|
119
|
-
puts "AwsTools::S3::Synchronize
|
167
|
+
puts "AwsTools::S3::Synchronize " +
|
168
|
+
"perform_synchronization #{bucket.name} (#{bucket.location})"
|
120
169
|
|
121
170
|
# If the bucket is located in the normal zone, assume this
|
122
171
|
# is a bucket we want to create a backup of.
|
123
172
|
if bucket.location.empty?
|
124
173
|
|
125
174
|
# Backup bucket.
|
126
|
-
backup_bucket_name = "#{bucket.name}#{backup_suffix}"
|
175
|
+
backup_bucket_name = "#{bucket.name}#{@backup_suffix}"
|
127
176
|
|
128
|
-
puts "AwsTools::S3::Synchronize
|
129
|
-
"
|
177
|
+
puts "AwsTools::S3::Synchronize " +
|
178
|
+
"perform_synchronization #{bucket.name} " +
|
179
|
+
"(#{bucket.location}) will be " +
|
180
|
+
"synchronized to #{backup_bucket_name} " +
|
181
|
+
"(#{@backup_location})"
|
130
182
|
|
131
183
|
backup_bucket = @s3.bucket("#{backup_bucket_name}",
|
132
184
|
true,
|
133
|
-
|
134
|
-
:location => backup_location)
|
185
|
+
@backup_perms,
|
186
|
+
:location => @backup_location)
|
135
187
|
|
136
|
-
AwsTools::S3::Bucket::Synchronize.new(
|
137
|
-
|
188
|
+
AwsTools::S3::Bucket::Synchronize.new(bucket,
|
189
|
+
backup_bucket)
|
138
190
|
end
|
139
191
|
end
|
140
192
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Meiklejohn
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-27 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -22,15 +22,17 @@ extensions: []
|
|
22
22
|
extra_rdoc_files:
|
23
23
|
- README.rdoc
|
24
24
|
- lib/aws_tools.rb
|
25
|
+
- lib/aws_tools/ec2.rb
|
25
26
|
- lib/aws_tools/s3.rb
|
26
27
|
files:
|
27
28
|
- MIT-LICENSE
|
28
|
-
- Manifest
|
29
29
|
- README.rdoc
|
30
30
|
- Rakefile
|
31
|
+
- aws_tools.gemspec
|
31
32
|
- lib/aws_tools.rb
|
33
|
+
- lib/aws_tools/ec2.rb
|
32
34
|
- lib/aws_tools/s3.rb
|
33
|
-
-
|
35
|
+
- Manifest
|
34
36
|
has_rdoc: true
|
35
37
|
homepage: http://github.com/cmeiklejohn/aws_tools
|
36
38
|
licenses: []
|