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
data/bin/ird DELETED
@@ -1,153 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- # = Interactive Rudy (experimental)
4
- #
5
- # === Not your granparent's deployment tool
6
- #
7
- # See ird -h for usage
8
- #
9
-
10
- $:.unshift File.join(File.dirname(__FILE__), '..', 'lib') # Put our local lib in first place
11
- $:.unshift File.join(File.dirname(__FILE__), '..', 'vendor', 'highline-1.5.1', 'lib')
12
- %w{drydock caesars rye}.each { |dir| $:.unshift File.join(File.dirname(__FILE__), '..', '..', dir, 'lib') }
13
- require 'rubygems'
14
-
15
- # SEE: http://github.com/rubyspec/matzruby/blob/a34130eb7c4ecc164115a59aa1b76c643bd98202/lib/irb/xmp.rb
16
- # SEE: http://github.com/blackwinter/wirble/tree/master
17
- require "irb"
18
- require 'irb/completion'
19
-
20
- require 'rudy'
21
- require 'drydock'
22
- require 'rudy/cli'
23
-
24
-
25
- class RudyCLI_Interactive < Rudy::CLI::Base # :nodoc:all
26
-
27
- include Readline
28
-
29
- default :interactive
30
- debug :off
31
- about "An interactive REPL for Rudy."
32
- usage "#{$0} [global options]"
33
- command :interactive do |obj|
34
-
35
- @@rmach = Rudy::Machines.new(:global => obj.global)
36
- @@rkey = Rudy::KeyPairs.new(:global => obj.global)
37
- @@rgrp = Rudy::Groups.new(:global => obj.global)
38
- @@rvol = Rudy::Volumes.new(:global => obj.global)
39
- @@radd = Rudy::Addresses.new(:global => obj.global)
40
-
41
- puts Rudy::CLI.generate_header(@@rmach.global, @@rmach.config)
42
- puts Rudy::Utils.without_indent(%Q`
43
- ------------------------------------------------------------
44
- Welcome Interactive Rudy! (EXPERIMENTAL)
45
- ------------------------------------------------------------
46
-
47
- `)
48
- h
49
-
50
- # What's the deal with this error message when defining a help method?
51
- # => rb: warn: can't alias help from irb_help
52
- if __FILE__ == $0
53
- IRB.start(__FILE__)
54
- else
55
- # check -e option
56
- if /^-e$/ =~ $0
57
- IRB.start(__FILE__)
58
- else
59
- IRB.start(__FILE__)
60
- end
61
- end
62
-
63
- end
64
-
65
-
66
-
67
-
68
- def h;
69
- puts (%Q`
70
- HELP
71
-
72
- h Help (this screen)
73
- m Rudy::Machines instance
74
- g Rudy::Groups instance
75
- k Rudy::KeyPairs instance
76
- v Rudy::Volumes instance
77
- a Rudy::Addresses instance
78
- ssh [GROUP] Connect to a machine
79
- example Start an EC2 instance from scratch.
80
- `)
81
- end
82
- def example
83
- puts (%Q`
84
- EXAMPLE
85
- Start an EC2 instance from scratch.
86
-
87
- # Create a security group
88
- >> g.create
89
- => #<Rudy::AWS::EC2::Group @name="stage-app" ...>
90
-
91
- # Create a keypair (used to login as root)
92
- >> k.create
93
- => #<Rudy::AWS::EC2::KeyPair @name="key-stage-app" ...>
94
-
95
- # Start an EC2 machine instance:
96
- >> m.create
97
- Instance: i-228def51
98
- Waiting for the instance to startup
99
- ........It's up!
100
-
101
- # Login to the new instance
102
- >> ssh
103
-
104
- All commands in Rudy refer to the global defaults unless
105
- otherwise specified. "stage" is the default environment and
106
- "app" is the default role. You can change these with command
107
- line arguments or by modifying the defaults in your Rudy
108
- config file: #{@@rmach.config_dirname}
109
-
110
- You can also specify your own names by providing
111
- one as the first argument: g.create 'group5000'.
112
-
113
- # List instances in stage-app
114
- >> m.list :running
115
- => [#<Rudy::AWS::EC2::Instance:0x18c5888 ...>]
116
-
117
- # Print the instance in a human readable way
118
- >> puts m.list.first.to_s
119
-
120
- # Print instance system console output
121
- >> puts m.console
122
-
123
- # Destroy ALL INSTANCES in stage-app
124
- >> m.destroy
125
- `)
126
- end
127
-
128
- def m; @@rmach; end
129
- def k; @@rkey; end
130
- def g; @@rgrp; end
131
- def v; @@rvol; end
132
- def a; @@radd; end
133
-
134
- # Change Group
135
- #def cg(name); end
136
-
137
- def ssh(*args)
138
- @@rmach.switch_user :root
139
- @@rmach.connect(*args)
140
- @@rmach.switch_user # back to previous user
141
- nil
142
- end
143
-
144
-
145
- end
146
-
147
- #include RudyCLI_Interactive # So we don't have to say CLI.example in the REPL.
148
-
149
-
150
- __END__
151
- #@rbox = Rye::Box.new('ec2-174-129-173-3.compute-1.amazonaws.com', 'root')
152
- #@rbox2 = Rye::Box.new('ec2-174-129-173-3.compute-1.amazonaws.com', 'root')
153
- #@rbox.add_keys('/Users/delano/Projects/git/rudy/.rudy/key-test-app.private')
@@ -1,67 +0,0 @@
1
-
2
-
3
- module Rudy
4
- class Backups
5
- include Rudy::MetaData
6
-
7
- def init
8
- now = Time.now.utc
9
- datetime = Rudy::MetaData::Backup.format_timestamp(now).split(Rudy::DELIM)
10
- @created = now.to_i
11
- @date, @time, @second = datetime
12
- end
13
-
14
- #def create(&each_mach)
15
-
16
- #end
17
-
18
-
19
- def destroy(&each_mach)
20
- list do |backup|
21
- puts "Destroying #{backup.name}"
22
- backup.destroy
23
- end
24
- end
25
-
26
- def list(more=[], less=[], local={}, &each_backup)
27
- backups = list_as_hash(more, less, local, &each_backup)
28
- backups &&= backups.values
29
- backups
30
- end
31
-
32
- def list_as_hash(more=[], less=[], local={}, &each_backup)
33
- more ||= []
34
- more += [:rtype, 'back']
35
- query = to_select(more, less, local)
36
- list = @sdb.select(query) || {}
37
- backups = {}
38
- list.each_pair do |n,d|
39
- backups[n] = Rudy::MetaData::Backup.from_hash(d)
40
- end
41
- backups.each_pair { |n,backup| each_backup.call(backup) } if each_backup
42
- backups = nil if backups.empty?
43
- backups
44
- end
45
-
46
- def get(rname=nil)
47
- dhash = @sdb.get(Rudy::DOMAIN, rname)
48
- return nil if dhash.nil? || dhash.empty?
49
- d = Rudy::MetaData::Backup.from_hash(dhash)
50
- d.update if d
51
- d
52
- end
53
-
54
-
55
- def running?
56
- !list.nil?
57
- # TODO: add logic that checks whether the instances are running.
58
- end
59
-
60
- def to_select(*args)
61
- query = super(*args)
62
- query << " and created != '0' order by created desc"
63
- end
64
-
65
- end
66
- end
67
-
@@ -1,38 +0,0 @@
1
-
2
-
3
- module Rudy; module MetaData
4
- class Debug
5
- include Rudy::MetaData
6
-
7
- def init
8
- end
9
-
10
- def list(more=[], less=[], local={}, &block)
11
- objects = list_as_hash(more, less, local, &block)
12
- objects &&= objects.values
13
- objects
14
- end
15
-
16
- def list_as_hash(more=[], less=[], local={}, &block)
17
- query = to_select(more, less, local)
18
- list = @sdb.select(query) || {}
19
- objects = {}
20
- list.each_pair do |n,d|
21
- objects[n] = d
22
- end
23
- objects.each_pair { |n,obj| block.call(obj) } if block
24
- objects = nil if objects.empty?
25
- objects
26
- end
27
-
28
-
29
- def to_select(more, less, local)
30
- query = super(more, less, local)
31
- # query << " order by created desc"
32
- puts query if @@global.verbose > 0
33
- query
34
- end
35
-
36
- end
37
- end; end
38
-
@@ -1,67 +0,0 @@
1
-
2
-
3
- module Rudy
4
- class Disks
5
- include Rudy::MetaData
6
-
7
-
8
- def init
9
- @rback = Rudy::Backups.new
10
- end
11
-
12
- #def create(&each_mach)
13
-
14
- #end
15
-
16
-
17
- def destroy(&each_mach)
18
- #raise MachineGroupNotRunning, current_machine_group unless running?
19
- #raise MachineGroupNotDefined, current_machine_group unless known_machine_group?
20
- list do |disk|
21
- puts "Destroying #{disk.name}"
22
- disk.destroy
23
- end
24
- end
25
-
26
- def backups
27
- @rback.list()
28
- end
29
-
30
- def list(more=[], less=[], &each_disk)
31
- disks = list_as_hash(&each_disk)
32
- disks &&= disks.values
33
- disks
34
- end
35
-
36
- def list_as_hash(more=[], less=[], &each_disk)
37
- query = to_select([:rtype, 'disk'], less)
38
- list = @sdb.select(query) || {}
39
- disks = {}
40
- list.each_pair do |n,d|
41
- disks[n] = Rudy::MetaData::Disk.from_hash(d)
42
- end
43
- disks.each_pair { |n,disk| each_disk.call(disk) } if each_disk
44
- disks = nil if disks.empty?
45
- disks
46
- end
47
-
48
- def get(rname=nil)
49
- dhash = @sdb.get(Rudy::DOMAIN, rname)
50
- return nil if dhash.nil? || dhash.empty?
51
- d = Rudy::MetaData::Disk.from_hash(dhash)
52
- d.update if d
53
- d
54
- end
55
-
56
-
57
- def running?
58
- !list.nil?
59
- # TODO: add logic that checks whether the instances are running.
60
- end
61
-
62
-
63
-
64
-
65
- end
66
- end
67
-
@@ -1,108 +0,0 @@
1
-
2
-
3
- module Rudy
4
- module MetaData
5
- module ObjectBase
6
- include Rudy::Huxtable
7
-
8
- attr_accessor :sdb_domain
9
-
10
- def initialize(*args)
11
- a, s, r = @@global.accesskey, @@global.secretkey, @@global.region
12
- @sdb = Rudy::AWS::SDB.new(a, s, r)
13
- @ec2inst = Rudy::AWS::EC2::Instances.new(a, s, r)
14
- @rvol = Rudy::AWS::EC2::Volumes.new(a, s, r)
15
- @radd = Rudy::AWS::EC2::Addresses.new(a, s, r)
16
- @rsnap = Rudy::AWS::EC2::Snapshots.new(a, s, r)
17
- @sdb_domain = Rudy::DOMAIN
18
- init(*args)
19
- end
20
-
21
- def init(*args); raise "Must override init"; end
22
-
23
- def valid?; raise "#{self.class} must override 'valid?'"; end
24
-
25
- def to_query(more=[], less=[])
26
- Rudy::AWS::SDB.generate_query build_criteria(more, less)
27
- end
28
-
29
- def to_select(more=[], less=[])
30
- s = Rudy::AWS::SDB.generate_select ['*'], @sdb_domain, build_criteria(more, less)
31
- s
32
- end
33
-
34
- def name(identifier, zon, env, rol, pos, *other)
35
- pos = pos.to_s.rjust 2, '0'
36
- [identifier, zon, env, rol, pos, *other].flatten.compact.join(Rudy::DELIM)
37
- end
38
-
39
- def save(replace=true)
40
- replace = true if replace.nil?
41
- @sdb ||= Rudy::AWS::SDB.new(@@global.accesskey, @@global.secretkey, @@global.region)
42
- @sdb.put(@sdb_domain, name, self.to_hash, replace) # Always returns nil
43
- true
44
- end
45
-
46
- def destroy
47
- @sdb ||= Rudy::AWS::SDB.new(@@global.accesskey, @@global.secretkey, @@global.region)
48
- @sdb.destroy(@sdb_domain, name)
49
- true
50
- end
51
-
52
- def refresh
53
- @sdb ||= Rudy::AWS::SDB.new(@@global.accesskey, @@global.secretkey, @@global.region)
54
- h = @sdb.get(@sdb_domain, name) || {}
55
- from_hash(h)
56
- end
57
-
58
- def ==(other)
59
- return false unless other.is_a?(self.class)
60
- self.name == other.name
61
- end
62
-
63
- # A generic default
64
- def to_s
65
- str = ""
66
- field_names.each do |key|
67
- str << sprintf(" %22s: %s#{$/}", key, self.send(key.to_sym))
68
- end
69
- str
70
- end
71
-
72
- def liner_note
73
- info = @awsid && !@awsid.empty? ? @awsid : "[no aws object]"
74
- "%s %s" % [self.name.bright, info]
75
- end
76
-
77
- def inspect
78
- lines = []
79
- lines << liner_note
80
- field_names.each do |key|
81
- next unless self.respond_to?(key)
82
- val = self.send(key)
83
- lines << sprintf(" %22s: %s", key, (val.is_a?(Array) ? val.join(', ') : val))
84
- end
85
- lines.join($/)
86
- end
87
-
88
- protected
89
-
90
- # Builds a zipped Array from a list of criteria.
91
- # The list of criteria is made up of metadata object attributes.
92
- # The list is constructed by taking the adding +more+, and
93
- # subtracting +less+ from <tt>:rtype, :region, :zone, :environment, :role, :position</tt>
94
- #
95
- # Returns [[:rtype, value], [:zone, value], ...]
96
- def build_criteria(more=[], less=[])
97
- criteria = [:rtype, :region, :zone, :environment, :role, :position, *more].compact
98
- criteria -= [*less].flatten.uniq.compact
99
- values = criteria.collect do |n|
100
- self.send(n.to_sym)
101
- end
102
- criteria.zip(values)
103
- end
104
-
105
- end
106
- end
107
- end
108
-
@@ -1,76 +0,0 @@
1
-
2
-
3
- module Rudy
4
- module Routines
5
- module HelperBase
6
- include Rudy::Huxtable
7
-
8
- def trap_rbox_errors(ret=nil, &command)
9
- begin
10
- ret = command.call if command
11
- return unless ret.is_a?(Rye::Rap)
12
- puts ' ' << ret.stdout.join("#{$/} ") if !ret.stdout.empty?
13
- print_response(ret)
14
- rescue IOError => ex
15
- STDERR.puts " Connection Error (#{ex.message})".color(:red)
16
- choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
17
- if choice.match(/\AS/i)
18
- return
19
- elsif choice.match(/\AR/i)
20
- retry
21
- else
22
- exit 12
23
- end
24
- rescue Rye::CommandError => ex
25
- print_response(ex)
26
- choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
27
- if choice.match(/\AS/i)
28
- return
29
- elsif choice.match(/\AR/i)
30
- retry
31
- else
32
- exit 12
33
- end
34
- rescue Rye::CommandNotFound => ex
35
- STDERR.puts " CommandNotFound: #{ex.message}".color(:red)
36
- STDERR.puts ex.backtrace if Rudy.debug?
37
- choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
38
- if choice.match(/\AS/i)
39
- return
40
- elsif choice.match(/\AR/i)
41
- retry
42
- else
43
- exit 12
44
- end
45
- end
46
-
47
- ret
48
- end
49
-
50
- def keep_going?
51
- Annoy.pose_question(" Keep going?\a ", /yes|y|ya|sure|you bet!/i, STDERR)
52
- end
53
-
54
- # Returns a formatted string for printing command info
55
- def command_separator(cmd, user, host)
56
- cmd ||= ""
57
- cmd, user = cmd.to_s, user.to_s
58
- prompt = user == "root" ? "#" : "$"
59
- ("%s@%s%s %s" % [user, host, prompt, cmd.bright])
60
- end
61
-
62
- private
63
- def print_response(rap)
64
- colour = rap.exit_code != 0 ? :red : :normal
65
- [:stderr].each do |sumpin|
66
- next if rap.send(sumpin).empty?
67
- STDERR.puts
68
- STDERR.puts((" #{sumpin.to_s.upcase} " << '-'*38).color(colour).bright)
69
- STDERR.puts " " << rap.send(sumpin).join("#{$/} ").color(colour)
70
- end
71
- STDERR.puts " Exit code: #{rap.exit_code}".color(colour) if rap.exit_code != 0
72
- end
73
-
74
- end
75
- end
76
- end