rudy 0.8.5 → 0.9.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.
Files changed (132) hide show
  1. data/CHANGES.txt +110 -18
  2. data/README.rdoc +40 -44
  3. data/Rudyfile +35 -50
  4. data/bin/rudy +88 -57
  5. data/bin/rudy-ec2 +2 -16
  6. data/bin/rudy-s3 +0 -10
  7. data/bin/rudy-sdb +11 -12
  8. data/lib/rudy.rb +59 -91
  9. data/lib/rudy/aws.rb +4 -45
  10. data/lib/rudy/aws/ec2.rb +57 -20
  11. data/lib/rudy/aws/ec2/address.rb +10 -11
  12. data/lib/rudy/aws/ec2/group.rb +10 -9
  13. data/lib/rudy/aws/ec2/image.rb +8 -8
  14. data/lib/rudy/aws/ec2/instance.rb +18 -19
  15. data/lib/rudy/aws/ec2/keypair.rb +14 -19
  16. data/lib/rudy/aws/ec2/snapshot.rb +16 -9
  17. data/lib/rudy/aws/ec2/volume.rb +39 -26
  18. data/lib/rudy/aws/ec2/zone.rb +5 -4
  19. data/lib/rudy/aws/s3.rb +2 -1
  20. data/lib/rudy/aws/sdb.rb +35 -86
  21. data/lib/rudy/backups.rb +24 -0
  22. data/lib/rudy/cli.rb +5 -131
  23. data/lib/rudy/cli/aws/ec2/addresses.rb +19 -27
  24. data/lib/rudy/cli/aws/ec2/candy.rb +45 -20
  25. data/lib/rudy/cli/aws/ec2/groups.rb +9 -13
  26. data/lib/rudy/cli/aws/ec2/images.rb +5 -133
  27. data/lib/rudy/cli/aws/ec2/instances.rb +25 -25
  28. data/lib/rudy/cli/aws/ec2/keypairs.rb +7 -11
  29. data/lib/rudy/cli/aws/ec2/snapshots.rb +5 -9
  30. data/lib/rudy/cli/aws/ec2/volumes.rb +22 -23
  31. data/lib/rudy/cli/aws/ec2/zones.rb +2 -3
  32. data/lib/rudy/cli/aws/sdb/domains.rb +5 -6
  33. data/lib/rudy/cli/aws/sdb/objects.rb +33 -0
  34. data/lib/rudy/cli/aws/sdb/select.rb +23 -0
  35. data/lib/rudy/cli/backups.rb +38 -0
  36. data/lib/rudy/cli/base.rb +104 -0
  37. data/lib/rudy/cli/candy.rb +1 -2
  38. data/lib/rudy/cli/config.rb +20 -7
  39. data/lib/rudy/cli/disks.rb +7 -9
  40. data/lib/rudy/cli/execbase.rb +56 -0
  41. data/lib/rudy/cli/machines.rb +242 -45
  42. data/lib/rudy/cli/metadata.rb +24 -10
  43. data/lib/rudy/cli/networks.rb +34 -0
  44. data/lib/rudy/cli/routines.rb +32 -6
  45. data/lib/rudy/cli/status.rb +60 -0
  46. data/lib/rudy/config.rb +55 -32
  47. data/lib/rudy/config/objects.rb +44 -30
  48. data/lib/rudy/disks.rb +25 -0
  49. data/lib/rudy/exceptions.rb +99 -0
  50. data/lib/rudy/global.rb +67 -28
  51. data/lib/rudy/guidelines.rb +3 -2
  52. data/lib/rudy/huxtable.rb +67 -58
  53. data/lib/rudy/machines.rb +41 -263
  54. data/lib/rudy/metadata.rb +212 -38
  55. data/lib/rudy/metadata/backup.rb +123 -78
  56. data/lib/rudy/metadata/disk.rb +153 -170
  57. data/lib/rudy/metadata/machine.rb +179 -0
  58. data/lib/rudy/mixins.rb +2 -1
  59. data/lib/rudy/mixins/hash.rb +3 -1
  60. data/lib/rudy/mixins/symbol.rb +8 -0
  61. data/lib/rudy/routines.rb +127 -344
  62. data/lib/rudy/routines/base.rb +229 -0
  63. data/lib/rudy/routines/handlers/base.rb +48 -0
  64. data/lib/rudy/routines/handlers/depends.rb +49 -0
  65. data/lib/rudy/routines/handlers/disks.rb +249 -0
  66. data/lib/rudy/routines/handlers/group.rb +44 -0
  67. data/lib/rudy/routines/handlers/host.rb +70 -0
  68. data/lib/rudy/routines/handlers/keypair.rb +70 -0
  69. data/lib/rudy/routines/handlers/machines.rb +15 -0
  70. data/lib/rudy/routines/handlers/script.rb +85 -0
  71. data/lib/rudy/routines/handlers/user.rb +45 -0
  72. data/lib/rudy/routines/passthrough.rb +19 -23
  73. data/lib/rudy/routines/reboot.rb +98 -50
  74. data/lib/rudy/routines/shutdown.rb +65 -14
  75. data/lib/rudy/routines/startup.rb +112 -17
  76. data/lib/rudy/utils.rb +35 -68
  77. data/rudy.gemspec +82 -25
  78. data/tryouts/01_mixins/01_hash_tryouts.rb +20 -0
  79. data/tryouts/10_require_time/10_rudy_tryouts.rb +33 -0
  80. data/tryouts/10_require_time/15_global_tryouts.rb +58 -0
  81. data/tryouts/12_config/10_load_config_tryouts.rb +43 -0
  82. data/tryouts/12_config/20_defaults_tryouts.rb +16 -0
  83. data/tryouts/12_config/30_accounts_tryouts.rb +17 -0
  84. data/tryouts/12_config/40_machines_tryouts.rb +53 -0
  85. data/tryouts/12_config/50_commands_tryouts.rb +17 -0
  86. data/tryouts/12_config/60_routines_tryouts.rb +16 -0
  87. data/tryouts/15_huxtable/10_huxtable_tryouts.rb +47 -0
  88. data/tryouts/15_huxtable/20_user_tryouts.rb +47 -0
  89. data/tryouts/20_simpledb/10_domains_tryouts.rb +36 -0
  90. data/tryouts/20_simpledb/20_objects_tryouts.rb +56 -0
  91. data/tryouts/25_ec2/10_keypairs_tryouts.rb +54 -0
  92. data/tryouts/25_ec2/20_groups_tryouts.rb +56 -0
  93. data/tryouts/25_ec2/21_groups_authorize_address_tryouts.rb +53 -0
  94. data/tryouts/25_ec2/22_groups_authorize_account_tryouts.rb +54 -0
  95. data/tryouts/25_ec2/30_addresses_tryouts.rb +42 -0
  96. data/tryouts/25_ec2/40_volumes_tryouts.rb +53 -0
  97. data/tryouts/25_ec2/50_snapshots_tryouts.rb +75 -0
  98. data/tryouts/26_ec2_instances/10_instance_tryouts.rb +107 -0
  99. data/tryouts/26_ec2_instances/50_images_tryouts.rb +7 -0
  100. data/tryouts/30_metadata/10_include_tryouts.rb +45 -0
  101. data/tryouts/30_metadata/13_object_tryouts.rb +19 -0
  102. data/tryouts/30_metadata/50_disk_tryouts.rb +115 -0
  103. data/tryouts/30_metadata/51_disk_digest_tryouts.rb +24 -0
  104. data/tryouts/30_metadata/53_disk_list_tryouts.rb +35 -0
  105. data/tryouts/30_metadata/56_disk_volume_tryouts.rb +68 -0
  106. data/tryouts/30_metadata/60_backup_tryouts.rb +101 -0
  107. data/tryouts/30_metadata/63_backup_list_tryouts.rb +38 -0
  108. data/tryouts/30_metadata/64_backup_disk_tryouts.rb +65 -0
  109. data/tryouts/30_metadata/66_backup_snapshot_tryouts.rb +76 -0
  110. data/tryouts/30_metadata/70_machine_tryouts.rb +85 -0
  111. data/tryouts/30_metadata/73_machine_list_tryouts.rb +58 -0
  112. data/tryouts/30_metadata/76_machine_instance_tryouts.rb +64 -0
  113. data/tryouts/30_metadata/77_machines_tryouts.rb +45 -0
  114. data/tryouts/40_routines/10_keypair_handler_tryouts.rb +52 -0
  115. data/tryouts/40_routines/11_group_handler_tryouts.rb +36 -0
  116. data/tryouts/80_cli/10_rudyec2_tryouts.rb +8 -0
  117. data/tryouts/80_cli/60_rudy_tryouts.rb +41 -0
  118. data/tryouts/exploration/console.rb +91 -0
  119. data/tryouts/exploration/machine.rb +23 -0
  120. data/tryouts/failer +6 -0
  121. metadata +116 -32
  122. data/bin/ird +0 -153
  123. data/lib/rudy/metadata/backups.rb +0 -67
  124. data/lib/rudy/metadata/debug.rb +0 -38
  125. data/lib/rudy/metadata/disks.rb +0 -67
  126. data/lib/rudy/metadata/objectbase.rb +0 -108
  127. data/lib/rudy/routines/helper.rb +0 -76
  128. data/lib/rudy/routines/helpers/dependshelper.rb +0 -34
  129. data/lib/rudy/routines/helpers/diskhelper.rb +0 -403
  130. data/lib/rudy/routines/helpers/scripthelper.rb +0 -197
  131. data/lib/rudy/routines/helpers/userhelper.rb +0 -37
  132. data/support/rudy-ec2-startup +0 -200
@@ -0,0 +1,24 @@
1
+ module Rudy
2
+
3
+ module Backups
4
+ RTYPE = 'back'.freeze
5
+
6
+ extend self
7
+ extend Rudy::Metadata::ClassMethods
8
+ include Rudy::Huxtable
9
+ extend Rudy::Huxtable
10
+
11
+ # Returns the most recent backup object for the given path
12
+ def get(path)
13
+ tmp = Rudy::Backup.new path
14
+ backups = Rudy::Backups.list :path => path
15
+ return nil unless backups.is_a?(Array) && !backups.empty?
16
+ backups.first
17
+ end
18
+
19
+ def from_hash(h)
20
+ Rudy::Backup.from_hash h
21
+ end
22
+ end
23
+
24
+ end
data/lib/rudy/cli.rb CHANGED
@@ -10,6 +10,10 @@ module Rudy
10
10
  # line interfaces. See the bin/ files if you're interested.
11
11
  #
12
12
  module CLI
13
+
14
+ require 'rudy/cli/execbase'
15
+ require 'rudy/cli/base'
16
+
13
17
  class NoCred < RuntimeError #:nodoc
14
18
  end
15
19
 
@@ -19,92 +23,7 @@ module Rudy
19
23
  # Should print messages as they come
20
24
  end
21
25
 
22
- class CommandBase < Drydock::Command
23
- include Rudy::Huxtable
24
-
25
- attr_reader :config
26
-
27
- protected
28
- def init
29
-
30
- if Drydock.debug?
31
- #Caesars.enable_debug
32
- Rudy.enable_debug
33
- end
34
-
35
- # The CLI wants output!
36
- Rudy::Huxtable.update_logger STDOUT
37
-
38
- # Send The Huxtables the global values from the command-line
39
- Rudy::Huxtable.update_global @global
40
-
41
- # Reload configuration. This must come after update_global
42
- # so it will catch the @@global.config path (if supplied).
43
- begin
44
- Rudy::Huxtable.update_config
45
- rescue Caesars::SyntaxError => ex
46
- STDERR.puts ex.message
47
- STDERR.puts ex.backtrace if @@global.verbose > 0
48
- exit 81
49
- end
50
-
51
- @@global.nocolor ? String.disable_color : String.enable_color
52
- @@global.yes ? Annoy.enable_skip : Annoy.disable_skip
53
-
54
- unless @@global.accesskey && @@global.secretkey
55
- STDERR.puts "No AWS credentials. Check your configs!"
56
- STDERR.puts "Try: rudy init"
57
- exit 1
58
- end
59
-
60
- if @@global.environment =~ /^prod/ && Drydock.debug?
61
- puts Rudy::Utils.banner("PRODUCTION ACCESS IS DISABLED IN DEBUG MODE")
62
- exit 1
63
- end
64
-
65
- end
66
-
67
- def execute_action(emsg="Failed", &action)
68
- begin
69
- ret = action.call
70
- raise emsg unless ret
71
- ret
72
- rescue Rudy::AWS::EC2::NoAMI => ex
73
- raise Drydock::OptError.new('-a', @alias)
74
- end
75
- end
76
-
77
- def execute_check(level=:medium)
78
- ret = Annoy.are_you_sure?(level)
79
- exit 0 unless ret
80
- ret
81
- end
82
-
83
- # Print a default header to the screen for every command.
84
- #
85
- def print_header
86
-
87
- # Send The Huxtables the global values again because they could be
88
- # updated after initialization but before the command was executed
89
- Rudy::Huxtable.update_global @global
90
-
91
- puts Rudy::CLI.generate_header(@@global, @@config) if @@global.print_header
92
-
93
- unless @@global.quiet
94
- if @@global.environment == "prod"
95
- msg = "YOU ARE PLAYING WITH PRODUCTION"
96
- puts Rudy::Utils.banner(msg, :normal), $/
97
- end
98
- puts Rudy::Utils.banner("THIS IS EC2"), $/ if Rudy.in_situ?
99
- end
100
- end
101
-
102
- def machine_separator(name, awsid)
103
- ('%s %-50s awsid: %s ' % [$/, name, awsid]).att(:reverse)
104
- end
105
-
106
- end
107
-
26
+
108
27
  def self.generate_header(global, config)
109
28
  return "" if global.quiet
110
29
  header = StringIO.new
@@ -128,52 +47,7 @@ module Rudy
128
47
  end
129
48
 
130
49
 
131
- # A base for all Drydock executables (bin/rudy etc...).
132
- class Base
133
- extend Drydock
134
-
135
- before do |obj|
136
- # Don't print Rudy header unless requested to
137
- obj.global.print_header = false if (obj.global.verbose == 0)
138
- @start = Time.now
139
- end
140
-
141
- after do |obj|
142
- if obj.global.verbose > 0
143
- puts
144
- @elapsed = Time.now - @start
145
- puts "Elapsed: %.2f seconds" % @elapsed.to_f if @elapsed > 0.1
146
- end
147
- end
148
-
149
-
150
- # These globals are used by all bin/ executables
151
- global :A, :accesskey, String, "AWS Access Key"
152
- global :S, :secretkey, String, "AWS Secret Access Key"
153
- global :R, :region, String, "Amazon service region (ie: #{Rudy::DEFAULT_REGION})"
154
- global :z, :zone, String, "Amazon Availability zone (ie: #{Rudy::DEFAULT_ZONE})"
155
- global :u, :user, String, "Provide a username (ie: #{Rudy::DEFAULT_USER})"
156
- global :k, :pkey, String, "Path to the private SSH key"
157
- global :f, :format, String, "Output format"
158
- global :n, :nocolor, "Disable output colors"
159
- global :C, :config, String, "Specify another configuration file to read (ie: #{Rudy::CONFIG_FILE})"
160
- global :Y, :yes, "Assume a correct answer to confirmation questions"
161
- global :q, :quiet, "Run with less output"
162
- global :O, :offline, "Be cool about the internet being down"
163
- global :v, :verbose, "Increase verbosity of output (i.e. -v or -vv or -vvv)" do
164
- @verbose ||= 0
165
- @verbose += 1
166
- end
167
- global :V, :version, "Display version number" do
168
- puts "Rudy version: #{Rudy::VERSION}"
169
- exit 0
170
- end
171
-
172
- end
173
-
174
-
175
50
  end
176
-
177
51
  end
178
52
 
179
53
  Rudy::Utils.require_glob(RUDY_LIB, 'rudy', 'cli', '**', '*.rb')
@@ -6,26 +6,24 @@ module AWS; module EC2;
6
6
  class Addresses < Rudy::CLI::CommandBase
7
7
 
8
8
  def addresses_create
9
- radd = Rudy::AWS::EC2::Addresses.new(@@global.accesskey, @@global.secretkey, @@global.region)
10
- address = radd.create
9
+ address = Rudy::AWS::EC2::Addresses.create
11
10
  puts @@global.verbose > 0 ? address.inspect : address.dump(@@global.format)
12
11
  end
13
12
 
14
13
  def addresses_destroy_valid?
15
14
  raise Drydock::ArgError.new("IP address", @alias) unless @argv.ipaddress
16
- @radd = Rudy::AWS::EC2::Addresses.new(@@global.accesskey, @@global.secretkey, @@global.region)
17
- raise "#{@argv.ipaddress} is not allocated to you" unless @radd.exists?(@argv.ipaddress)
18
- raise "#{@argv.ipaddress} is associated!" if @radd.associated?(@argv.ipaddress)
15
+ raise "#{@argv.ipaddress} is not allocated to you" unless Rudy::AWS::EC2::Addresses.exists?(@argv.ipaddress)
16
+ raise "#{@argv.ipaddress} is associated!" if Rudy::AWS::EC2::Addresses.associated?(@argv.ipaddress)
19
17
  true
20
18
  end
21
19
  def addresses_destroy
22
- address = @radd.get(@argv.ipaddress)
20
+ address = Rudy::AWS::EC2::Addresses.get(@argv.ipaddress)
23
21
  raise "Could not fetch #{address.ipaddress}" unless address
24
22
 
25
23
  puts "Destroying address: #{@argv.ipaddress}"
26
24
  puts "NOTE: this IP address will become available to other EC2 customers.".bright
27
25
  execute_check(:medium)
28
- execute_action { @radd.destroy(@argv.ipaddress) }
26
+ execute_action { Rudy::AWS::EC2::Addresses.destroy(@argv.ipaddress) }
29
27
  self.addresses
30
28
  end
31
29
 
@@ -35,24 +33,21 @@ module AWS; module EC2;
35
33
  true
36
34
  end
37
35
  def associate_addresses
38
- radd = Rudy::AWS::EC2::Addresses.new(@@global.accesskey, @@global.secretkey, @@global.region)
39
- rinst = Rudy::AWS::EC2::Instances.new(@@global.accesskey, @@global.secretkey, @@global.region)
40
-
41
- raise "Instance #{@argv.instid} does not exist!" unless rinst.exists?(@option.instance)
36
+ raise "Instance #{@argv.instid} does not exist!" unless Rudy::AWS::EC2::Instances.exists?(@option.instance)
42
37
 
43
38
  if @option.newaddress
44
39
  print "Creating address... "
45
- tmp = radd.create
40
+ tmp = Rudy::AWS::EC2::Addresses.create
46
41
  puts "#{tmp.ipaddress}"
47
42
  address = tmp.ipaddress
48
43
  else
49
44
  address = @argv.ipaddress
50
45
  end
51
46
 
52
- raise "#{address} is not allocated to you" unless radd.exists?(address)
53
- raise "#{address} is already associated!" if radd.associated?(address)
47
+ raise "#{address} is not allocated to you" unless Rudy::AWS::EC2::Addresses.exists?(address)
48
+ raise "#{address} is already associated!" if Rudy::AWS::EC2::Addresses.associated?(address)
54
49
 
55
- instance = rinst.get(@option.instance)
50
+ instance = Rudy::AWS::EC2::Instances.get(@option.instance)
56
51
 
57
52
  # If an instance was recently disassoiciated, the dns_public may
58
53
  # not be updated yet
@@ -61,8 +56,8 @@ module AWS; module EC2;
61
56
 
62
57
  puts "Associating #{address} to #{instance_name} (#{instance.groups.join(', ')})"
63
58
  execute_check(:low)
64
- execute_action { radd.associate(address, instance.awsid) }
65
- address = radd.get(address)
59
+ execute_action { Rudy::AWS::EC2::Addresses.associate(address, instance.awsid) }
60
+ address = Rudy::AWS::EC2::Addresses.get(address)
66
61
  puts @@global.verbose > 0 ? address.inspect : address.dump(@@global.format)
67
62
  end
68
63
 
@@ -71,24 +66,21 @@ module AWS; module EC2;
71
66
  true
72
67
  end
73
68
  def disassociate_addresses
74
- radd = Rudy::AWS::EC2::Addresses.new(@@global.accesskey, @@global.secretkey, @@global.region)
75
- rinst = Rudy::AWS::EC2::Instances.new(@@global.accesskey, @@global.secretkey, @@global.region)
76
- raise "#{@argv.ipaddress} is not allocated to you" unless radd.exists?(@argv.ipaddress)
77
- raise "#{@argv.ipaddress} is not associated!" unless radd.associated?(@argv.ipaddress)
69
+ raise "#{@argv.ipaddress} is not allocated to you" unless Rudy::AWS::EC2::Addresses.exists?(@argv.ipaddress)
70
+ raise "#{@argv.ipaddress} is not associated!" unless Rudy::AWS::EC2::Addresses.associated?(@argv.ipaddress)
78
71
 
79
- address = radd.get(@argv.ipaddress)
80
- instance = rinst.get(address.instid)
72
+ address = Rudy::AWS::EC2::Addresses.get(@argv.ipaddress)
73
+ instance = Rudy::AWS::EC2::Instances.get(address.instid)
81
74
 
82
75
  puts "Disassociating #{address.ipaddress} from #{instance.awsid} (#{instance.groups.join(', ')})"
83
76
  execute_check(:medium)
84
- execute_action { radd.disassociate(@argv.ipaddress) }
85
- address = radd.get(@argv.ipaddress)
77
+ execute_action { Rudy::AWS::EC2::Addresses.disassociate(@argv.ipaddress) }
78
+ address = Rudy::AWS::EC2::Addresses.get(@argv.ipaddress)
86
79
  puts @@global.verbose > 0 ? address.inspect : address.dump(@@global.format)
87
80
  end
88
81
 
89
82
  def addresses
90
- radd = Rudy::AWS::EC2::Addresses.new(@@global.accesskey, @@global.secretkey, @@global.region)
91
- addresses = radd.list || []
83
+ addresses = Rudy::AWS::EC2::Addresses.list || []
92
84
 
93
85
  addresses.each do |address|
94
86
  puts @@global.verbose > 0 ? address.inspect : address.dump(@@global.format)
@@ -49,9 +49,8 @@ module AWS; module EC2;
49
49
  raise "Insecure permissions for #{@@global.pkey}" unless (File.stat(@@global.pkey).mode & 600) == 0
50
50
  end
51
51
  if @option.group
52
- rgroup = Rudy::AWS::EC2::Groups.new(@@global.accesskey, @@global.secretkey, @@global.region)
53
52
  raise "Cannot supply group and instance ID" if @option.instid
54
- raise "Group #{@option.group} does not exist" unless rgroup.exists?(@option.group)
53
+ raise "Group #{@option.group} does not exist" unless Rudy::AWS::EC2::Groups.exists?(@option.group)
55
54
  end
56
55
  if @option.instid && !Rudy::Utils.is_id?(:instance, @option.instid)
57
56
  raise "#{@option.instid} is not an instance ID"
@@ -65,11 +64,11 @@ module AWS; module EC2;
65
64
  opts[:id] = @option.instid if @option.instid
66
65
 
67
66
  # Options to be sent to Rye::Box
68
- ssh_opts = { :user => @global.user || Rudy.sysinfo.user, :debug => nil }
67
+ rye_opts = { :user => @global.user || Rudy.sysinfo.user, :debug => nil }
69
68
  if @@global.pkey
70
69
  raise "Cannot find file #{@@global.pkey}" unless File.exists?(@@global.pkey)
71
70
  raise InsecureKeyPermissions, @@global.pkey unless File.stat(@@global.pkey).mode == 33152
72
- ssh_opts[:keys] = @@global.pkey
71
+ rye_opts[:keys] = @@global.pkey
73
72
  end
74
73
 
75
74
 
@@ -85,25 +84,24 @@ module AWS; module EC2;
85
84
  end
86
85
 
87
86
  checked = false
88
- rudy = Rudy::AWS::EC2::Instances.new(@@global.accesskey, @@global.secretkey, @@global.region)
89
- lt = rudy.list_group(opts[:group], :running, opts[:id]) do |inst|
87
+ lt = Rudy::AWS::EC2::Instances.list_group(opts[:group], :running, opts[:id]) do |inst|
90
88
 
91
89
  # Print header
92
90
  if @@global.quiet
93
- print "You are #{ssh_opts[:user].bright}. " if !checked # only the 1st
91
+ print "You are #{rye_opts[:user].bright}. " if !checked # only the 1st
94
92
  else
95
- print "Connecting #{ssh_opts[:user].bright}@#{inst.dns_public} "
93
+ print "Connecting #{rye_opts[:user].bright}@#{inst.dns_public} "
96
94
  puts "(#{inst.awsid}, groups: #{inst.groups.join(', ')})"
97
95
  end
98
96
 
99
97
  # Make sure we want to run this command on all instances
100
98
  if !checked && command != :interactive_ssh
101
- execute_check(:medium) if ssh_opts[:user] == "root"
99
+ execute_check(:medium) if rye_opts[:user] == "root"
102
100
  checked = true
103
101
  end
104
102
 
105
103
  # Open the connection and run the command
106
- rbox = Rye::Box.new(inst.dns_public, ssh_opts)
104
+ rbox = Rye::Box.new(inst.dns_public, rye_opts)
107
105
  ret = rbox.send(command, command_args)
108
106
  puts ret unless command == :interactive_ssh
109
107
  end
@@ -125,11 +123,11 @@ module AWS; module EC2;
125
123
  opts[:id] &&= [opts[:id]].flatten
126
124
 
127
125
  # Options to be sent to Net::SSH
128
- ssh_opts = { :user => @global.user || Rudy.sysinfo.user, :debug => nil }
126
+ rye_opts = { :user => @global.user || Rudy.sysinfo.user, :debug => nil }
129
127
  if @@global.pkey
130
128
  raise "Cannot find file #{@@global.pkey}" unless File.exists?(@@global.pkey)
131
129
  raise InsecureKeyPermissions, @@global.pkey unless File.stat(@@global.pkey).mode == 33152
132
- ssh_opts[:keys] = @@global.pkey
130
+ rye_opts[:keys] = @@global.pkey
133
131
  end
134
132
 
135
133
  opts[:paths] = @argv
@@ -143,28 +141,27 @@ module AWS; module EC2;
143
141
 
144
142
  # Options to be sent to Rye::Box
145
143
  info = @@global.quiet ? nil : STDERR
146
- ssh_opts = { :user => @global.user || Rudy.sysinfo.user, :info => info }
144
+ rye_opts = { :user => @global.user || Rudy.sysinfo.user, :info => info }
147
145
  if @@global.pkey
148
146
  raise "Cannot find file #{@@global.pkey}" unless File.exists?(@@global.pkey)
149
147
  raise InsecureKeyPermissions, @@global.pkey unless File.stat(@@global.pkey).mode == 33152
150
- ssh_opts[:keys] = @@global.pkey
148
+ rye_opts[:keys] = @@global.pkey
151
149
  end
152
150
 
153
151
 
154
152
  checked = false
155
- rudy = Rudy::AWS::EC2::Instances.new(@@global.accesskey, @@global.secretkey, @@global.region)
156
- lt = rudy.list_group(opts[:group], :running, opts[:id]) do |inst|
153
+ lt = Rudy::AWS::EC2::Instances.list_group(opts[:group], :running, opts[:id]) do |inst|
157
154
 
158
155
  if @option.print
159
- Rudy::Utils.scp_command inst.dns_public, @@global.pkey, opts[:user], opts[:paths], opts[:dest], (opts[:task] == :download), false, @option.print
156
+ scp_command inst.dns_public, @@global.pkey, opts[:user], opts[:paths], opts[:dest], (opts[:task] == :download), false, @option.print
160
157
  next
161
158
  end
162
159
 
163
160
  # Print header
164
161
  if @@global.quiet
165
- print "You are #{ssh_opts[:user].bright}. " if !checked # only the 1st
162
+ print "You are #{rye_opts[:user].bright}. " if !checked # only the 1st
166
163
  else
167
- print "Connecting #{ssh_opts[:user].bright}@#{inst.dns_public} "
164
+ print "Connecting #{rye_opts[:user].bright}@#{inst.dns_public} "
168
165
  puts "(#{inst.awsid}, groups: #{inst.groups.join(', ')})"
169
166
  end
170
167
 
@@ -175,7 +172,7 @@ module AWS; module EC2;
175
172
  end
176
173
 
177
174
  # Open the connection and run the command
178
- rbox = Rye::Box.new(inst.dns_public, ssh_opts)
175
+ rbox = Rye::Box.new(inst.dns_public, rye_opts)
179
176
  rbox.send(opts[:task], opts[:paths], opts[:dest])
180
177
  end
181
178
 
@@ -183,6 +180,34 @@ module AWS; module EC2;
183
180
 
184
181
 
185
182
 
183
+ private
184
+
185
+ def scp_command(host, keypair, user, paths, to_path, to_local=false, verbose=false, printonly=false)
186
+
187
+ paths = [paths] unless paths.is_a?(Array)
188
+ from_paths = ""
189
+ if to_local
190
+ paths.each do |path|
191
+ from_paths << "#{user}@#{host}:#{path} "
192
+ end
193
+ #puts "Copying FROM remote TO this machine", $/
194
+
195
+ else
196
+ to_path = "#{user}@#{host}:#{to_path}"
197
+ from_paths = paths.join(' ')
198
+ #puts "Copying FROM this machine TO remote", $/
199
+ end
200
+
201
+
202
+ cmd = "scp -r "
203
+ cmd << "-i #{keypair}" if keypair
204
+ cmd << " #{from_paths} #{to_path}"
205
+
206
+ puts cmd if verbose
207
+ printonly ? (puts cmd) : system(cmd)
208
+ end
209
+
210
+
186
211
 
187
212
  end
188
213
 
@@ -7,33 +7,31 @@ module AWS; module EC2;
7
7
 
8
8
 
9
9
  def create_groups_valid?
10
- @rgroups = Rudy::AWS::EC2::Groups.new(@@global.accesskey, @@global.secretkey, @@global.region)
11
10
  raise Drydock::ArgError.new('group name', @alias) unless @argv.name
12
- raise "Group #{@argv.name} alread exists" if @rgroups.exists?(@argv.name)
11
+ raise "Group #{@argv.name} alread exists" if Rudy::AWS::EC2::Groups.exists?(@argv.name)
13
12
  true
14
13
  end
15
14
  def create_groups
16
15
  opts = check_options
17
16
  execute_action {
18
- @rgroups.create(@argv.name, @option.description, opts[:addresses], opts[:ports], opts[:protocols])
17
+ Rudy::AWS::EC2::Groups.create(@argv.name, @option.description, opts[:addresses], opts[:ports], opts[:protocols])
19
18
  }
20
- @rgroups.list(@argv.name) do |group|
19
+ Rudy::AWS::EC2::Groups.list(@argv.name) do |group|
21
20
  puts @@global.verbose > 0 ? group.inspect : group.dump(@@global.format)
22
21
  end
23
22
  end
24
23
 
25
24
 
26
25
  def destroy_groups_valid?
27
- @rgroups = Rudy::AWS::EC2::Groups.new(@@global.accesskey, @@global.secretkey, @@global.region)
28
26
  raise Drydock::ArgError.new('group name', @alias) unless @argv.name
29
- raise "Group #{@argv.name} does not exist" unless @rgroups.exists?(@argv.name)
27
+ raise "Group #{@argv.name} does not exist" unless Rudy::AWS::EC2::Groups.exists?(@argv.name)
30
28
  true
31
29
  end
32
30
 
33
31
  def destroy_groups
34
32
  puts "Destroying group: #{@argv.name}"
35
33
  execute_check(:medium)
36
- execute_action { @rgroups.destroy(@argv.name) }
34
+ execute_action { Rudy::AWS::EC2::Groups.destroy(@argv.name) }
37
35
  @argv.clear # so groups will print all other groups
38
36
  groups
39
37
  end
@@ -47,8 +45,7 @@ module AWS; module EC2;
47
45
  def groups
48
46
  opts = {}
49
47
  name = @option.all ? nil : @argv.name
50
- rgroups = Rudy::AWS::EC2::Groups.new(@@global.accesskey, @@global.secretkey, @@global.region)
51
- rgroups.list(name).each do |group|
48
+ Rudy::AWS::EC2::Groups.list(name).each do |group|
52
49
  puts @@global.verbose > 0 ? group.inspect : group.dump(@@global.format)
53
50
  end
54
51
  end
@@ -69,7 +66,7 @@ module AWS; module EC2;
69
66
  end
70
67
 
71
68
  raise Drydock::ArgError.new('group name', @alias) unless @argv.name
72
- @groups = Rudy::AWS::EC2::Groups.new(@@global.accesskey, @@global.secretkey, @@global.region)
69
+ true
73
70
  end
74
71
 
75
72
  def modify_group(action)
@@ -83,13 +80,12 @@ module AWS; module EC2;
83
80
  print "on #{opts[:protocols].join(', ').bright} "
84
81
  puts "ports: #{opts[:ports].map { |p| "#{p.join(' to ').bright}" }.join(', ')}"
85
82
  end
86
- rgroups = Rudy::AWS::EC2::Groups.new(@@global.accesskey, @@global.secretkey, @@global.region)
87
83
  execute_check(:medium)
88
84
  execute_action {
89
85
  if (@option.group || @option.owner)
90
- rgroups.send("#{action.to_s}_group", @argv.name, opts[:group], opts[:owner])
86
+ Rudy::AWS::EC2::Groups.send("#{action.to_s}_group", @argv.name, opts[:group], opts[:owner])
91
87
  else
92
- rgroups.send(action, @argv.name, opts[:addresses], opts[:ports], opts[:protocols])
88
+ Rudy::AWS::EC2::Groups.send(action, @argv.name, opts[:addresses], opts[:ports], opts[:protocols])
93
89
  end
94
90
  }
95
91
  groups # prints on the modified group b/c of @argv.name