rudy 0.8.5 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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