kuzushi 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/VERSION +1 -1
  2. data/lib/kuzushi.rb +85 -46
  3. metadata +2 -2
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.8
1
+ 0.0.9
@@ -4,6 +4,12 @@ require 'restclient'
4
4
  require 'ostruct'
5
5
  require 'rush'
6
6
  require 'ohai'
7
+ require 'erb'
8
+
9
+ ## IDEAS
10
+
11
+ ## firewall until ready
12
+ ## ruby 1.9 compatibility
7
13
 
8
14
  class Kuzushi
9
15
  def initialize(url)
@@ -15,10 +21,29 @@ class Kuzushi
15
21
  @tasks = []
16
22
  load_config_stack(@name)
17
23
  @config = @configs.reverse.inject({}) { |i,c| i.merge(c) }
24
+ end
25
+
26
+ def init
27
+ @init = true
28
+ start
29
+ end
30
+
31
+ def start
32
+ process_stack
33
+ puts "----"
34
+ @tasks.each do |t|
35
+ puts "TASK: #{t[:description]}"
36
+ t[:blk].call
37
+ end
38
+ puts "----"
39
+ end
40
+
41
+ protected
42
+
43
+ def system
18
44
  ohai = Ohai::System.new
19
45
  ohai.all_plugins
20
- @system = ohai.data
21
- process_stack
46
+ ohai
22
47
  end
23
48
 
24
49
  def load_config_stack(name)
@@ -36,12 +61,11 @@ class Kuzushi
36
61
  process :local_packages
37
62
  process :gems
38
63
  process :volumes
39
- process :raids
40
- process :mounts
41
64
  process :files
42
65
  process :users
43
66
 
44
67
  script get("after")
68
+ script get("init") if init?
45
69
  end
46
70
 
47
71
  ## magic goes here
@@ -59,6 +83,7 @@ class Kuzushi
59
83
  send("process_#{type}", item)
60
84
  end
61
85
  script item["after"]
86
+ script item["init"] if init?
62
87
  end
63
88
  end
64
89
  end
@@ -66,7 +91,7 @@ class Kuzushi
66
91
  def process_packages
67
92
  @packages = get_array("packages")
68
93
  task "install packages" do
69
- shell "apt-get update && apt-get upgrade -y && apt-get install -y #{@packages.join(" ")}", "DEBIAN_FRONTEND" => "noninteractive", "DEBIAN_PRIORITY" => "critical"
94
+ shell "apt-get update && apt-get upgrade -y && apt-get install -y #{@packages.join(" ")}"
70
95
  end
71
96
  end
72
97
 
@@ -85,39 +110,56 @@ class Kuzushi
85
110
  end
86
111
 
87
112
  def process_volumes(v)
113
+ handle_ebs v if v.type == "ebs"
114
+ handle_raid v if v.type == "raid"
115
+ set_readahead v if v.readahead
116
+ set_scheduler v if v.scheduler
117
+ handle_format v if v.format
118
+ handle_mount v if v.mount
119
+ end
120
+
121
+ def handle_ebs(v)
88
122
  task "wait for volume #{v.device}" do
89
123
  wait_for_volume v.device
90
124
  end
91
- set_readahead v
92
- set_scheduler v
93
- check_format v
94
125
  end
95
126
 
96
- def process_raids(r)
97
- task "assemble raid #{r.device}" do
98
- begin
127
+ def handle_raid(r)
128
+ task "create raid #{r.device}", :init => true do
129
+ shell "mdadm --create #{r.device} -n #{r.drives.size} -l #{r.level} -c #{r.chunksize || 64} #{r.drives.join(" ")}"
130
+ end
131
+ task "assemble raid #{r.device}" do ## assemble fails a lot with device busy - is udev to blame :(
132
+ if not dev_exists? r.device
133
+ shell "service stop udev"
99
134
  shell "mdadm --assemble #{r.device} #{r.drives.join(" ")}"
100
- rescue Object => o
101
- ## sometimes the disks come back with odd error messages - retry seems to be the best option
102
- puts "error: #{o.message}"
103
- retry
135
+ shell "service start udev"
104
136
  end
105
137
  end
106
- set_readahead r
107
- set_scheduler r
108
- check_format r
109
138
  add_package "mdadm"
110
139
  end
111
140
 
112
- def process_mounts(m)
113
- task "mount #{m.label}" do
114
- shell "mkdir -p #{m.label} && mount -o #{m.options} -L #{m.label} #{m.label}"
141
+ def handle_mount(m)
142
+ task "mount #{m.device}" do
143
+ shell "mkdir -p #{m.mount} && mount -o #{m.options || "noatime"} #{m.device} #{m.mount}" unless mounted?(m.device)
115
144
  end
116
145
  end
117
146
 
147
+ def system_arch
148
+ system.kernel["machine"]
149
+ end
150
+
151
+ def mounted?(dev)
152
+ !!system.filesystem[dev]["mount"]
153
+ end
154
+
155
+ def package_arch
156
+ `dpkg --print-architecture`.chomp
157
+ end
158
+
118
159
  def process_files(f)
119
160
  fetch("/templates/#{f.template}") do |file|
120
161
  task "setting up #{f.file}" do
162
+ @system = system
121
163
  t = ERB.new File.read(file), 0, '<>'
122
164
  File.open(f.file,"w") { |f| f.write(t.render) }
123
165
  end
@@ -129,26 +171,26 @@ class Kuzushi
129
171
  task "add authorized_key for user #{user.name}" do
130
172
  shell "su - #{user.name} -c 'mkdir -p .ssh; echo \"#{key}\" >> .ssh/authorized_keys; chmod -R 0600 .ssh'"
131
173
  end
132
- end
174
+ end
133
175
  end
134
176
 
135
177
  def set_readahead(v)
136
- if v.readahead
137
- task "set readahead for #{v.device}" do
138
- shell "blockdev --setra #{v.readahead} #{v.device}"
139
- end
178
+ task "set readahead for #{v.device}" do
179
+ shell "blockdev --setra #{v.readahead} #{v.device}"
140
180
  end
141
181
  end
142
182
 
143
183
  def set_scheduler(v)
144
- if v.scheduler
145
- task "set scheduler for #{v.device}" do
146
- shell "echo #{v.scheduler} > /sys/block/#{File.basename(v.device)}/queue/scheduler"
147
- end
184
+ task "set scheduler for #{v.device}" do
185
+ shell "echo #{v.scheduler} > /sys/block/#{File.basename(v.device)}/queue/scheduler"
148
186
  end
149
187
  end
150
188
 
151
- def check_format(v)
189
+ def handle_format(v)
190
+ task "formatting #{v.device}", :init => true do
191
+ label = "-L " + v.label rescue ""
192
+ "mkfs.#{v.format} #{label} #{v.device}"
193
+ end
152
194
  add_package "xfsprogs" if v.format == "xfs"
153
195
  end
154
196
 
@@ -157,7 +199,7 @@ class Kuzushi
157
199
  end
158
200
 
159
201
  def package(p, &block)
160
- fetch("/packages/#{p}_i386.deb") do |file|
202
+ fetch("/packages/#{p}_#{package_arch}.deb") do |file|
161
203
  block.call(file)
162
204
  end
163
205
  end
@@ -221,31 +263,28 @@ class Kuzushi
221
263
  end
222
264
 
223
265
  def wait_for_volume(vol)
224
- until File.exists?("/sys/block/#{File.basename(vol)}") do
266
+ ## Maybe use ohai here instead -- FIXME
267
+ until dev_exists? vol do
225
268
  puts "waiting for volume #{vol}"
226
269
  sleep 2
227
270
  end
228
271
  end
229
272
 
230
- def start
231
- puts "----"
232
- @tasks.each do |t|
233
- puts "TASK: #{t[:description]}"
234
- t[:blk].call
235
- end
236
- puts "----"
273
+ def shell(cmd)
274
+ puts "# #{cmd}"
275
+ puts Rush.bash cmd
237
276
  end
238
277
 
239
- def shell(cmd, env = {})
240
- puts "# #{cmd}"
241
- puts Rush.bash cmd, :env => env
278
+ def init?
279
+ @init ||= false
242
280
  end
243
281
 
244
- def task(description, &blk)
282
+ def task(description, options = {} &blk)
283
+ return if options[:init] and not init?
245
284
  @tasks << { :description => description, :blk => blk }
246
285
  end
247
286
 
248
- def path
249
- Dir["**/config.json"]
287
+ def dev_exists?(dev)
288
+ File.exists?("/sys/block/#{File.basename(dev)}")
250
289
  end
251
290
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kuzushi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Orion Henry
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-19 00:00:00 -05:00
12
+ date: 2010-02-21 00:00:00 -05:00
13
13
  default_executable: kuzushi
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency