rudy 0.2.3 → 0.2.4
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/CHANGES.txt +2 -2
- data/bin/rudy +23 -3
- data/lib/drydock.rb +1 -2
- data/lib/rudy.rb +23 -9
- data/lib/rudy/command/base.rb +22 -14
- data/lib/rudy/command/environment.rb +22 -8
- data/rudy.gemspec +1 -1
- metadata +2 -2
data/CHANGES.txt
CHANGED
@@ -4,8 +4,7 @@ RUDY, CHANGES
|
|
4
4
|
|
5
5
|
NOTE: This is a complete re-write from 0.1
|
6
6
|
|
7
|
-
*
|
8
|
-
* NEW: Commands: myaddress, addresses, images, instances, disks, connect release
|
7
|
+
* NEW: Commands: myaddress, addresses, images, instances, disks, connect, copy release
|
9
8
|
* NEW: Metadata storage to SimpleDB
|
10
9
|
* NEW: Creates EBS volumes based on startup from metadata
|
11
10
|
* NEW: Automated release process
|
@@ -14,6 +13,7 @@ NOTE: This is a complete re-write from 0.1
|
|
14
13
|
* NEW: Manage system based on security groups.
|
15
14
|
* NEW: "rudy groups" overhaul. Display, creates, destroys groups.
|
16
15
|
* CHANGE: Added Environment variables
|
16
|
+
* UPGRADE: drydock 0.3.3
|
17
17
|
|
18
18
|
|
19
19
|
#### 0.1 (2009-02-06) ###############################
|
data/bin/rudy
CHANGED
@@ -113,6 +113,17 @@ command :connect => Rudy::Command::Environment do |obj|
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
+
debug :on
|
117
|
+
option :r, :remote, "Copy FROM the remote machine to the local machine"
|
118
|
+
option :p, :print, "Only print the SSH command, don't connect"
|
119
|
+
usage "rudy [-e env] [-u user] copy [-p] -r [from path] [to path]"
|
120
|
+
command :copy => Rudy::Command::Environment do |obj, argv|
|
121
|
+
capture(:stderr) do
|
122
|
+
obj.print_header
|
123
|
+
raise "No path specified (rudy copy FROM-PATH [FROM-PATH ...] TO-PATH)" unless argv.size >= 2
|
124
|
+
obj.copy(argv)
|
125
|
+
end
|
126
|
+
end
|
116
127
|
|
117
128
|
|
118
129
|
option :all, "Display all disk definitions"
|
@@ -124,7 +135,7 @@ option :D, :destroy, "Destroy a disk definition"
|
|
124
135
|
option :A, :attach, "Attach a disk"
|
125
136
|
usage "rudy [global options] disks [-C -p path -d device -s size] [-A] [-D] [disk name]"
|
126
137
|
command :disks => Rudy::Command::Disks do |obj, argv|
|
127
|
-
|
138
|
+
capture(:stderr) do
|
128
139
|
obj.print_header
|
129
140
|
if obj.create
|
130
141
|
raise "No filesystem path specified" unless obj.path
|
@@ -141,7 +152,7 @@ command :disks => Rudy::Command::Disks do |obj, argv|
|
|
141
152
|
obj.print_disks
|
142
153
|
end
|
143
154
|
obj.print_footer
|
144
|
-
|
155
|
+
end
|
145
156
|
end
|
146
157
|
|
147
158
|
#command :volumes => Rudy::Command::Volumes do |obj|
|
@@ -188,6 +199,7 @@ option :b, :bucket_name, String, "The name of the bucket that will store the ima
|
|
188
199
|
option :C, :create, "Create an image"
|
189
200
|
usage "rudy images [-C -i image -b bucket -a account]"
|
190
201
|
command :images => Rudy::Command::Images do |obj|
|
202
|
+
capture(:stderr) do
|
191
203
|
obj.print_header
|
192
204
|
|
193
205
|
if obj.create
|
@@ -198,18 +210,22 @@ command :images => Rudy::Command::Images do |obj|
|
|
198
210
|
obj.print_images
|
199
211
|
end
|
200
212
|
end
|
213
|
+
end
|
201
214
|
|
202
215
|
command :stage => Rudy::Command::Stage do |obj|
|
216
|
+
capture(:stderr) do
|
203
217
|
obj.print_header
|
204
218
|
|
205
219
|
raise "No SCM defined. Set RUDY_SVN_BASE or RUDY_GIT_BASE." unless obj.scm
|
206
220
|
|
207
221
|
exit unless you_are_sure?
|
208
222
|
obj.push_to_stage
|
209
|
-
|
223
|
+
end
|
210
224
|
end
|
211
225
|
|
212
226
|
|
227
|
+
|
228
|
+
|
213
229
|
option :all, "Display all security groups"
|
214
230
|
option :r, :protocols, Array, "Comma-separated list of protocols. One of: tcp (default), udp, icmp"
|
215
231
|
option :p, :ports, Array, "List of comma-separated ports to authorize (default: 22,80,443)"
|
@@ -219,6 +235,9 @@ option :D, :destroy, "Destroy a security group"
|
|
219
235
|
option :M, :modify, "Modify a security group"
|
220
236
|
usage "rudy [global options] groups [-C] [-a IP addresses] [-p ports] [group name]"
|
221
237
|
command :groups => Rudy::Command::Groups do |obj, argv|
|
238
|
+
capture(:stderr) do
|
239
|
+
obj.print_header
|
240
|
+
|
222
241
|
if obj.create
|
223
242
|
obj.create_group(argv.first)
|
224
243
|
|
@@ -232,6 +251,7 @@ command :groups => Rudy::Command::Groups do |obj, argv|
|
|
232
251
|
else
|
233
252
|
obj.print_groups(argv.first)
|
234
253
|
end
|
254
|
+
end
|
235
255
|
end
|
236
256
|
|
237
257
|
|
data/lib/drydock.rb
CHANGED
data/lib/rudy.rb
CHANGED
@@ -33,7 +33,7 @@ module Rudy #:nodoc:
|
|
33
33
|
module VERSION #:nodoc:
|
34
34
|
MAJOR = 0.freeze unless defined? MAJOR
|
35
35
|
MINOR = 2.freeze unless defined? MINOR
|
36
|
-
TINY =
|
36
|
+
TINY = 4.freeze unless defined? TINY
|
37
37
|
def self.to_s
|
38
38
|
[MAJOR, MINOR, TINY].join('.')
|
39
39
|
end
|
@@ -81,19 +81,33 @@ def sh(command, chdir=false)
|
|
81
81
|
end
|
82
82
|
|
83
83
|
# TODO: Net::SSH
|
84
|
-
def ssh(host, keypair, user, command, chdir=false, verbose=false)
|
85
|
-
|
86
|
-
cmd
|
87
|
-
|
84
|
+
def ssh(host, keypair, user, command=false, chdir=false, verbose=false, printonly=false)
|
85
|
+
puts "CONNECTING TO #{host}..."
|
86
|
+
cmd = "ssh -q -i #{keypair} #{user}@#{host} "
|
87
|
+
command = "cd #{chdir} && #{command}" if chdir
|
88
|
+
cmd += " '#{command}'" if command
|
88
89
|
puts cmd if verbose
|
89
|
-
system(cmd)
|
90
|
+
printonly ? (puts cmd) : system(cmd)
|
90
91
|
end
|
91
92
|
|
92
93
|
|
93
|
-
def scp(host, keypair, user,
|
94
|
-
|
94
|
+
def scp(host, keypair, user, paths, to_path, to_local=false, verbose=false, printonly=false)
|
95
|
+
puts "CONNECTING TO #{host}..."
|
96
|
+
paths = [paths] unless paths.is_a?(Array)
|
97
|
+
from_paths = ""
|
98
|
+
if to_local
|
99
|
+
paths.each do |path|
|
100
|
+
from_paths << "#{user}@#{host}:#{path} "
|
101
|
+
end
|
102
|
+
else
|
103
|
+
to_path = "#{user}@#{host}:#{to_path}"
|
104
|
+
from_paths = paths.join(' ')
|
105
|
+
end
|
106
|
+
|
107
|
+
cmd = "scp -i #{keypair} #{from_paths} #{to_path}"
|
108
|
+
|
95
109
|
puts cmd if verbose
|
96
|
-
system(cmd)
|
110
|
+
printonly ? (puts cmd) : system(cmd)
|
97
111
|
end
|
98
112
|
|
99
113
|
|
data/lib/rudy/command/base.rb
CHANGED
@@ -86,6 +86,13 @@ module Rudy
|
|
86
86
|
#@s3 = Rudy::AWS::SimpleDB.new(@access_key, @secret_key)
|
87
87
|
end
|
88
88
|
|
89
|
+
# Raises exceptions if the requested user does
|
90
|
+
# not have a valid keypair configured. (See: EC2_KEYPAIR_*)
|
91
|
+
def check_keys
|
92
|
+
raise "No SSH key provided for #{keypairname}!" unless has_keypair?(keypairname)
|
93
|
+
raise "SSH key provided but cannot be found! (#{keypairpath})" unless File.exists?(keypairpath)
|
94
|
+
end
|
95
|
+
|
89
96
|
def has_pem_keys?
|
90
97
|
(@ec2_cert && File.exists?(@ec2_cert) &&
|
91
98
|
@ec2_private_key && File.exists?(@ec2_private_key))
|
@@ -185,26 +192,27 @@ module Rudy
|
|
185
192
|
# Print a default header to the screen for every command.
|
186
193
|
# +cmd+ is the name of the command current running.
|
187
194
|
def print_header(cmd=nil)
|
188
|
-
|
189
|
-
|
190
|
-
puts
|
191
|
-
|
192
|
-
criteria = []
|
193
|
-
[:zone, :environment, :role, :position].each do |n|
|
194
|
-
val = instance_variable_get("@#{n}")
|
195
|
-
criteria << "[#{n} = #{val}]"
|
196
|
-
end
|
197
|
-
puts criteria.join(" and ")
|
198
|
-
|
195
|
+
title = "RUDY v#{Rudy::VERSION}"
|
196
|
+
title << " -- #{@alias}" if @alias
|
197
|
+
puts title, $/
|
198
|
+
|
199
199
|
if (@environment == "prod")
|
200
|
-
puts %q(
|
201
|
-
=======================================================
|
200
|
+
puts %q(=======================================================
|
202
201
|
=======================================================
|
203
202
|
!!!!!!!!! YOU ARE PLAYING WITH PRODUCTION !!!!!!!!!
|
204
203
|
=======================================================
|
205
204
|
=======================================================
|
206
|
-
|
205
|
+
|
206
|
+
)
|
207
|
+
end
|
208
|
+
|
209
|
+
criteria = []
|
210
|
+
[:zone, :environment, :role, :position].each do |n|
|
211
|
+
val = instance_variable_get("@#{n}")
|
212
|
+
criteria << "[#{n} = #{val}]"
|
207
213
|
end
|
214
|
+
puts criteria.join(" and ")
|
215
|
+
puts
|
208
216
|
|
209
217
|
end
|
210
218
|
|
@@ -13,20 +13,34 @@
|
|
13
13
|
module Rudy
|
14
14
|
module Command
|
15
15
|
class Environment < Rudy::Command::Base
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
|
17
|
+
# Returns a hash of info for the requested machine. If the requested machine
|
18
|
+
# is not running, it will raise an exception.
|
19
|
+
def find_requested_machine
|
20
20
|
machine_list = @ec2.instances.list(machine_group)
|
21
21
|
machine = machine_list.values.first # NOTE: Only one machine per group, for now...
|
22
|
-
|
23
22
|
raise "There's no machine running in #{machine_group}" unless machine
|
24
23
|
raise "The primary machine in #{machine_group} is not in a running state" unless machine[:aws_state] == 'running'
|
25
|
-
|
26
|
-
|
27
|
-
system(cmd) unless @print
|
24
|
+
|
25
|
+
machine
|
28
26
|
end
|
29
27
|
|
28
|
+
def connect
|
29
|
+
check_keys
|
30
|
+
machine = find_requested_machine
|
31
|
+
ssh machine[:dns_name], keypairpath, user, false, false, false, @print
|
32
|
+
end
|
33
|
+
|
34
|
+
# +paths+ an array of paths to copy. The last element is the "to" path.
|
35
|
+
def copy(paths)
|
36
|
+
check_keys
|
37
|
+
machine = find_requested_machine
|
38
|
+
paths = paths.flatten
|
39
|
+
to_path = paths.pop
|
40
|
+
scp machine[:dns_name], keypairpath, user, paths, to_path, @remote, false, @print
|
41
|
+
end
|
42
|
+
|
43
|
+
|
30
44
|
# Start EC2 instances to run the stage.
|
31
45
|
# Returns a hash in the same format as +instances+
|
32
46
|
def build_stage
|
data/rudy.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
@spec = Gem::Specification.new do |s|
|
2
2
|
s.name = "rudy"
|
3
|
-
s.version = "0.2.
|
3
|
+
s.version = "0.2.4"
|
4
4
|
s.summary = "Rudy is a handy staging and deployment tool for Amazon EC2."
|
5
5
|
s.description = "Rudy is a handy staging and deployment tool for Amazon EC2."
|
6
6
|
s.author = "Delano Mandelbaum"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rudy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Delano Mandelbaum
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-02-
|
12
|
+
date: 2009-02-24 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|