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
@@ -1,37 +0,0 @@
1
-
2
- module Rudy; module Routines;
3
- module UserHelper
4
- include Rudy::Routines::HelperBase # TODO: use trap_rbox_errors
5
- extend self
6
-
7
- def adduser?(routine)
8
- (!routine.adduser.nil? && !routine.adduser.to_s.empty?)
9
- end
10
- def adduser(routine, machine, rbox)
11
-
12
- # On Solaris, the user's home directory needs to be specified
13
- # explicitly so we do it for linux too for fun.
14
- homedir = rbox.guess_user_home(routine.adduser.to_s)
15
- args = [:m, :d, homedir, :s, '/bin/bash', routine.adduser.to_s]
16
- puts command_separator(rbox.preview_command(:useradd, args), rbox.user, rbox.host)
17
-
18
- # NOTE: We'll may to use platform specific code here.
19
- # Linux has adduser and useradd commands:
20
- # adduser can prompt for info which we don't want.
21
- # useradd does not prompt (on Debian/Ubuntu at least).
22
- # We need to specify bash b/c the default is /bin/sh
23
- trap_rbox_errors { rbox.useradd(args) }
24
- end
25
-
26
- def authorize?(routine)
27
- (!routine.authorize.nil? && !routine.authorize.to_s.empty?)
28
- end
29
- def authorize(routine, machine, rbox)
30
- puts command_separator(:authorize_keys_remote, rbox.user, rbox.host)
31
- trap_rbox_errors { rbox.authorize_keys_remote(routine.authorize) }
32
- end
33
-
34
-
35
- end
36
-
37
- end; end
@@ -1,200 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- # what: Rudy EC2 startup script
4
- # who: delano@solutious.com
5
- # when: 2009-02-25 (rev: 4)
6
-
7
- # NOTE: This is a prototype version of this script. A cleaner version
8
- # with better documentation is forthcoming.
9
-
10
- # Runs when an ec2 instance startups up.
11
- # Grabs configuration from the run time user data and stores it locally.
12
- # See Rudy::CLI::Machines#start_instance for the expected yaml format.
13
-
14
- # Put this in /etc/init.d. Then:
15
- # * chmod 755 rudy-ec2-startup
16
- # * cd /etc/rc3.d
17
- # * ln -s ../init.d/rudy-ec2-startup S17rudy
18
- # * cd /etc/rc4.d
19
- # * ln -s ../init.d/rudy-ec2-startup S17rudy
20
- # * cd /etc/rc5.d
21
- # * ln -s ../init.d/rudy-ec2-startup S17rudy
22
-
23
- require 'yaml'
24
- require 'resolv'
25
-
26
- LOGFILE = '/var/log/rudy-ec2-startup'
27
- USERDATA = 'http://169.254.169.254/2008-02-01/user-data'
28
- METADATA = 'http://169.254.169.254/2008-02-01/meta-data'
29
-
30
- #LOGFILE = '/tmp/rudy-ec2-startup'
31
- #USERDATA = 'http://127.0.0.1/2008-02-01/user-data'
32
- #METADATA = 'http://127.0.0.1/2008-02-01/meta-data'
33
-
34
- METADATAPARAMS = ['instance-id', 'instance-type']
35
-
36
- Rudy::CONFIG_DIR=File.join('.rudy')
37
- Rudy::CONFIG_FILE=File.join('config')
38
-
39
- module Rudy
40
- module EC2Startup
41
- extend self
42
-
43
- VERSION = 4.freeze
44
-
45
- def process_config
46
- begin
47
- File.unlink(LOGFILE) if File.exists?(LOGFILE)
48
- log "RUDY (rev#{VERSION}) is in the house"
49
-
50
- log "Grabing configuration..."
51
- config_yaml = run("curl -s #{USERDATA}")
52
-
53
- log "Grabing meta-data..."
54
- metadata = get_metadata
55
-
56
- log "Processing metadata..."
57
- METADATAPARAMS.each do |name|
58
- default = name.gsub('instance-', '')
59
- value = (metadata[name] && !metadata[name].empty?) ? metadata[name] : default
60
- log " ---> #{name}: #{value}"
61
- write_to_file("/etc/ec2/#{name}", value, "w")
62
- end
63
-
64
- log "Processing userdata..."
65
-
66
- if !config_yaml || config_yaml.empty?
67
- raise "Nothing to process (did you supply user-data when you created the instance)"
68
- end
69
-
70
- config = YAML::load(config_yaml)
71
- config ||= {}
72
-
73
- # Print to STDOUT and NOT to the log.
74
- # We don't want sensitive config values available in the log
75
- puts "CONFIG: " << config_yaml
76
-
77
- zone = config[:zone] ? config[:zone].to_s.downcase : "zone"
78
- environment = config[:environment] ? config[:environment].to_s.downcase : "env"
79
- role = config[:role] ? config[:role].to_s.downcase : "role"
80
- position = config[:position] ? config[:position].to_s.downcase : "00"
81
-
82
- hostname = [zone, environment, role, position].join('-')
83
- log "Setting hostname: #{hostname}"
84
- `hostname #{hostname}`
85
-
86
- config[:hosts] ||= {}
87
- config[:hosts][hostname] = '127.0.0.1'
88
-
89
- if config[:userdata] && config[:userdata].is_a?(Hash)
90
- # TODO: How to we get the path to any user's home directory?
91
- # (when we're not running as that user.)
92
- config[:userdata].each_pair do |n,hash|
93
- fileparts = (n == :root) ? ['/root'] : [user_home_dir(n)]
94
- fileparts << Rudy::CONFIG_DIR
95
- dirpath = File.join(fileparts)
96
- filepath = File.join(dirpath, Rudy::CONFIG_FILE)
97
-
98
- # Backwards compatability
99
- if !File.directory?(dirpath)
100
- log "Deleting the deprecated #{dirpath} config"
101
- File.unlink(dirpath)
102
- end
103
-
104
- unless File.exists?(dirpath)
105
- log "Creating #{dirpath}"
106
- Dir.mkdir(dirpath, 0700)
107
- end
108
-
109
- log "Writing to #{filepath}"
110
- user_data = {
111
- :userdata => hash
112
- }
113
- write_to_file(filepath, user_data.to_yaml, "w")
114
- end
115
- end
116
-
117
- if config[:hosts] && config[:hosts].is_a?(Hash)
118
- unless read_file('/etc/hosts') =~ /----- RUDY SAYS -----/
119
- log "Updating /etc/hosts..."
120
- write_to_file("/etc/hosts", "\n# ----- RUDY SAYS -----\n", :append)
121
- config[:hosts].each_pair do |name, address|
122
- # Respect existing entries
123
- next if read_file('/etc/hosts') =~ /#{name}/
124
-
125
- ip_address = (address !~ /^\d.+/) ? Resolv.getaddress(address) : address
126
-
127
- log " ---> #{name}: #{ip_address}"
128
- write_to_file("/etc/hosts", "\n#{ip_address}\t#{name}\n", :append)
129
- end
130
- end
131
- end
132
-
133
- log "Done!"
134
-
135
- rescue => ex
136
- log "ERROR: #{ex.message}"
137
- end
138
- end
139
-
140
-
141
- def get_metadata
142
- metadata = {}
143
-
144
- begin
145
- METADATAPARAMS.each do |param|
146
- log " ---> #{param}"
147
- metadata[param.to_s] = run("curl -s #{METADATA}/#{param}")
148
- metadata[param.to_s] = nil if metadata[param.to_s].empty?
149
- end
150
- rescue => ex
151
- log("Problem getting metadata: #{ex.message}")
152
- end
153
- metadata
154
- end
155
-
156
- def run(command, input='')
157
- IO.popen(command, 'r+') do |io|
158
- io.read
159
- end
160
- end
161
-
162
- def get_formatted_time
163
- t = Time.now
164
- t_out = t.strftime("%H:%M:%S%p (%m/%d/%Y)")
165
- end
166
-
167
- def write_to_file(filename, s, type)
168
- type = (type == :append) ? 'a' : 'w'
169
- f = File.open(filename,type)
170
- f.puts s
171
- f.close
172
- end
173
-
174
- def read_file(path)
175
- read_file_to_array(path).join('')
176
- end
177
-
178
- def read_file_to_array(path)
179
- contents = []
180
- return contents unless File.exists?(path)
181
- open(path, 'r') do |l|
182
- contents = l.readlines
183
- end
184
- contents
185
- end
186
-
187
- def user_home_dir(user)
188
- (`su #{user} -c "echo \\$HOME"` || '').chomp
189
- end
190
-
191
- def log(s)
192
- msg = "#{get_formatted_time}: #{s}"
193
- write_to_file(LOGFILE, msg, :append)
194
- puts msg
195
- end
196
-
197
- end
198
- end
199
-
200
- Rudy::EC2Startup.process_config