server-blender 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.13
1
+ 0.0.14
data/bin/blender CHANGED
@@ -18,4 +18,5 @@ Run "blender COMMAND -h" to get help about a command
18
18
  end
19
19
 
20
20
  require 'optparse'
21
- require File.expand_path(File.join(__FILE__, "../../lib/blender/cli/", command))
21
+ require File.expand_path(File.join(__FILE__, "../../lib/blender/cli/", command))
22
+ main
data/files/init.sh ADDED
@@ -0,0 +1,2 @@
1
+ mkdir -p /var/lib/blender/{recipes,logs,tmp}
2
+ chmod 0700 /var/lib/blender/
data/files/mix.sh CHANGED
@@ -1,7 +1,7 @@
1
- #!/bin/bash -eu
1
+ set -ue
2
2
 
3
3
  SHADOW_PUPPET_VERSION="0.3.2"
4
- MANIFEST_VERSION="0.0.14"
4
+ MANIFEST_VERSION="0.0.15"
5
5
 
6
6
  trap "echo FAILED" EXIT
7
7
 
@@ -33,25 +33,31 @@ function use_system_ruby() {
33
33
  fi
34
34
  }
35
35
 
36
- use_system_ruby
37
- ensure_gem shadow_puppet $SHADOW_PUPPET_VERSION
38
- ensure_gem ruby-debug
39
- ensure_gem server-blender-manifest $MANIFEST_VERSION
40
-
41
- echo "Mix: [recipe: $RECIPE, node: ${NODE:-}, roles: ${ROLES:-}]"
36
+ function run_recipe() {
37
+ echo "Mix: [recipe: $RECIPE, node: ${NODE:-}, roles: ${ROLES:-}]"
42
38
 
43
- # rvm substitutes cd with its scripts/cd which accesses unbound variables
44
- set +u
45
- cd /var/lib/blender/recipes
46
- set -u
39
+ # rvm substitutes cd with its scripts/cd which accesses unbound variables
40
+ set +u
41
+ cd /var/lib/blender/recipes
42
+ set -u
47
43
 
48
- ruby -rrubygems <<-RUBY
44
+ /usr/bin/ruby -rrubygems <<-RUBY
49
45
  gem 'server-blender-manifest', '$MANIFEST_VERSION'
50
46
  require 'blender/manifest'
51
47
  Blender::Manifest.run("${SHADOW_PUPPET_VERSION}") || exit(1)
52
48
  RUBY
49
+ }
53
50
 
54
- trap - EXIT
51
+ use_system_ruby
52
+ ensure_gem shadow_puppet $SHADOW_PUPPET_VERSION
53
+ ensure_gem ruby-debug
54
+ ensure_gem server-blender-manifest $MANIFEST_VERSION
55
+ if run_recipe; then
56
+ echo
57
+ echo "Your ServerShake is ready. Have fun!"
58
+ else
59
+ echo
60
+ echo "Failed to mix your ServerShake. Check error messages above for details"
61
+ fi
55
62
 
56
- echo
57
- echo Your ServerShake is ready. Have fun!
63
+ trap - EXIT
@@ -1,44 +1,57 @@
1
- options = {
2
- :system_gems => 'y'
3
- }
4
- OptionParser.new do |opts|
5
- opts.banner = "Usage: blender init [OPTIONS] HOST"
6
- opts.separator ""
7
- opts.separator "Common options:"
1
+ def parse_options
2
+ options = {
3
+ :system_gems => 'y'
4
+ }
5
+ OptionParser.new do |opts|
6
+ opts.banner = "Usage: blender init [OPTIONS] HOST"
7
+ opts.separator ""
8
+ opts.separator "Common options:"
8
9
 
9
- opts.on("-u", "--upstream-gems", "don't use the system gems, download and install upstream version instead") do
10
- options[:system_gems] = 'n'
11
- end
10
+ opts.on("-u", "--upstream-gems", "don't use the system gems, download and install upstream version instead") do
11
+ options[:system_gems] = 'n'
12
+ end
12
13
 
13
- opts.on("-N", "--node NODE", "force NODE as the current nodename") do |val|
14
- options[:node] = val
15
- end
14
+ opts.on("-N", "--node NODE", "force NODE as the current nodename") do |val|
15
+ options[:node] = val
16
+ end
16
17
 
17
- opts.on("-t", "--trace", "dump trace to the stdout") do |val|
18
- options[:trace] = true
19
- end
18
+ opts.on("-t", "--trace", "dump trace to the stdout") do |val|
19
+ options[:trace] = true
20
+ end
20
21
 
21
- opts.on("-H", "--hostname HOSTNAME", "set HOSTNAME") do |val|
22
- options[:hostname] = val
23
- end
22
+ opts.on("-H", "--hostname HOSTNAME", "set HOSTNAME") do |val|
23
+ options[:hostname] = val
24
+ end
24
25
 
25
- opts.on("-h", "--help", "Show this message") do
26
- puts opts
27
- exit
28
- end
26
+ opts.on("-h", "--help", "Show this message") do
27
+ raise(opts.to_s)
28
+ end
29
29
 
30
- end.parse!
30
+ end.parse!
31
31
 
32
- abort("please provide a hostname") unless host = ARGV.shift
32
+ raise("please provide a hostname\n#{opts}") unless host = ARGV.shift
33
33
 
34
- extra=""
35
- extra << " TRACE=1" if options[:trace]
36
- extra << " HOSTNAME=#{options[:hostname]}" if options[:hostname]
37
- extra << " NODE=#{options[:node]}" if options[:node]
34
+ options.merge(:host => host)
35
+ end
38
36
 
39
37
  def run(*cmd)
40
- puts ">> #{cmd * ' '}"
38
+ STDERR.puts ">> #{cmd * ' '}"
41
39
  system(*cmd)
42
40
  end
43
41
 
44
- run "cat #{File.expand_path("files/bootstrap.sh", Blender::ROOT)} | ssh #{host} USE_SYSTEM_GEMS=#{options[:system_gems]}#{extra} /bin/bash -eu"
42
+ def bootstrap(options)
43
+ extra=""
44
+ extra << " TRACE=1" if options[:trace]
45
+ extra << " HOSTNAME=#{options[:hostname]}" if options[:hostname]
46
+ extra << " NODE=#{options[:node]}" if options[:node]
47
+
48
+ run "cat #{File.expand_path("files/bootstrap.sh", Blender::ROOT)} | ssh #{options[:host]} USE_SYSTEM_GEMS=#{options[:system_gems]}#{extra} /bin/bash -eu"
49
+ end
50
+
51
+ def main
52
+ options = parse_options
53
+ bootstrap(options)
54
+
55
+ rescue => e
56
+ abort(e.to_s)
57
+ end
@@ -1,71 +1,89 @@
1
- options = {}
2
- opts = OptionParser.new do |opts|
3
- opts.banner = "Usage: blender mix [OPTIONS] [DIR] HOST"
4
- opts.separator "Options:"
1
+ def parse_options
2
+ options = {}
3
+ opts = OptionParser.new do |opts|
4
+ opts.banner = "Usage: blender mix [OPTIONS] [DIR] HOST"
5
+ opts.separator "Options:"
5
6
 
6
- opts.on("-r", "--recipe RECIPE", "if RECIPE is not specified blender will first look for <directory_name>.rb and then for blender-recipe.rb") do |val|
7
- options[:recipe] = val
8
- end
7
+ opts.on("-r", "--recipe RECIPE", "if RECIPE is not specified blender will first look for <directory_name>.rb and then for blender-recipe.rb") do |val|
8
+ options[:recipe] = val
9
+ end
9
10
 
10
- opts.on("-N", "--node NODE", "force NODE as the current nodename") do |val|
11
- options[:node] = val
12
- end
11
+ opts.on("-N", "--node NODE", "force NODE as the current nodename") do |val|
12
+ options[:node] = val
13
+ end
13
14
 
14
- opts.on("-R", "--roles ROLES", "comma delimited list of roles that should execute") do |val|
15
- options[:roles] = val
16
- end
15
+ opts.on("-R", "--roles ROLES", "comma delimited list of roles that should execute") do |val|
16
+ options[:roles] = val
17
+ end
18
+
19
+ opts.separator ""
20
+ opts.separator "Common options:"
21
+
22
+ opts.on("-h", "--help", "Show this message") do
23
+ raise(opts.to_s)
24
+ end
17
25
 
18
- opts.separator ""
19
- opts.separator "Common options:"
26
+ opts.separator ""
27
+ opts.separator "Notes:"
28
+ opts.separator ' "." used if DIR not specified'
20
29
 
21
- opts.on("-h", "--help", "Show this message") do
22
- puts opts
23
- exit
24
30
  end
31
+ opts.parse!
25
32
 
26
- opts.separator ""
27
- opts.separator "Notes:"
28
- opts.separator ' "." used if DIR not specified'
33
+ options[:usage] = opts.to_s
29
34
 
30
- end
31
- opts.parse!
32
-
33
- dir = ARGV.shift
34
- host = ARGV.shift
35
- abort("unexpected: #{ARGV*" "}\n#{opts}") unless ARGV.empty?
36
- if host.nil?
37
- host = dir
38
- dir = "."
39
- end
35
+ dir = ARGV.shift
36
+ host = ARGV.shift
37
+ raise("unexpected: #{ARGV*" "}\n#{opts}") unless ARGV.empty?
40
38
 
41
- abort(opts.to_s) unless dir && host
39
+ if host.nil?
40
+ host = dir
41
+ dir = "."
42
+ end
42
43
 
43
- unless File.directory?(dir)
44
- puts "#{dir} is not a directory"
45
- abort(opts.to_s)
46
- end
44
+ raise(opts.to_s) unless dir && host
45
+
46
+ raise("#{dir} is not a directory\n#{opts}") unless File.directory?(dir)
47
47
 
48
- # check for recipe, recipe.rb, directory_name.rb, and default.rb
49
- recipes = []
50
- if rname = options[:recipe]
51
- recipes << rname << "#{rname}.rb"
48
+ options.merge(:dir => dir, :host => host)
52
49
  end
53
- recipes << "#{File.basename(File.expand_path(dir))}.rb" << "blender-recipe.rb"
54
50
 
55
- recipe = recipes.detect {|r| File.file?(File.join(dir, r))} ||
56
- abort("recipe not found\n#{opts}")
57
51
 
58
- WORK_DIR = "/var/lib/blender/recipes"
52
+ def find_recipe(options)
53
+ # check for recipe, recipe.rb, directory_name.rb, and default.rb
54
+ recipes = []
55
+ if rname = options[:recipe]
56
+ recipes << rname << "#{rname}.rb"
57
+ end
58
+ recipes << "#{File.basename(File.expand_path(options[:dir]))}.rb" << "blender-recipe.rb"
59
+
60
+ recipe = recipes.detect {|r| File.file?(File.join(options[:dir], r))} ||
61
+ raise("recipe not found (looking for #{recipes * ' '})\n#{options[:usage]}")
62
+ end
59
63
 
60
64
  def run(*cmd)
61
- puts ">> #{cmd * ' '}"
65
+ STDERR.puts ">> #{cmd * ' '}"
62
66
  system(*cmd)
63
67
  end
64
68
 
65
- run("rsync -azP --delete --exclude '.*' #{dir}/ #{host}:#{WORK_DIR}") &&
66
69
 
67
- env_config = "RECIPE=#{recipe}"
68
- env_config << " NODE=#{options[:node]}" if options[:node]
69
- env_config << " ROLES=#{options[:roles]}" if options[:roles]
70
+ def run_recipe(recipe, options)
71
+ run "cat #{File.expand_path("files/init.sh", Blender::ROOT)} | ssh #{options[:host]} /bin/bash -l" or raise("failed init.sh")
72
+
73
+ run("rsync -qazP --delete --exclude '.*' #{options[:dir]}/ #{options[:host]}:/var/lib/blender/recipes") or raise("failed rsync")
74
+
75
+ env_config = "RECIPE=#{recipe}"
76
+ env_config << " NODE=#{options[:node]}" if options[:node]
77
+ env_config << " ROLES=#{options[:roles]}" if options[:roles]
70
78
 
71
- run "cat #{File.expand_path("files/mix.sh", Blender::ROOT)} | ssh #{host} #{env_config} /bin/bash -eu"
79
+ run "cat #{File.expand_path("files/mix.sh", Blender::ROOT)} | ssh #{options[:host]} #{env_config} /bin/bash -l" or raise("failed mix.sh")
80
+ end
81
+
82
+ def main
83
+ options = parse_options
84
+ recipe = find_recipe(options)
85
+ run_recipe(recipe, options)
86
+
87
+ rescue => e
88
+ abort(e.to_s)
89
+ end
@@ -1,64 +1,70 @@
1
1
  require 'pp'
2
- options = {}
3
2
 
4
- AMI_64 = "ami-55739e3c"
5
- AMI_32 = "ami-bb709dd2"
3
+ def parse_options
4
+ options = {}
6
5
 
7
- OptionParser.new do |opts|
8
- opts.banner = "Usage: blender start [OPTIONS] [-- [ec2run options]]"
9
- opts.separator "Options:"
6
+ AMI_64 = "ami-55739e3c"
7
+ AMI_32 = "ami-bb709dd2"
10
8
 
11
- opts.on("--ami AMI",
12
- "use specified AMI instead of the default one.",
13
- "If you don't specify your own AMI blender will choose a defaule one:",
14
- "* #{AMI_32} for 32 bits",
15
- "* #{AMI_64} for 64 bits",
16
- "You can change the defaults by writing your own AMIs",
17
- "into ~/.blender/ami and ~/.blender/ami64 files",
18
- " "
19
- ) do |val|
20
- options[:ami] = val
21
- end
22
- opts.on("--key KEY",
23
- "use KEY when starting instance. KEY should already be generated.",
24
- "If you don't specify a KEY blender will try to use the key from your EC2 account",
25
- "Note: There must be only ONE key on the account for it to work. ",
26
- " "
27
- ) do |val|
28
- options[:key] = val
29
- end
9
+ OptionParser.new do |opts|
10
+ opts.banner = "Usage: blender start [OPTIONS] [-- [ec2run options]]"
11
+ opts.separator "Options:"
30
12
 
31
- opts.on("--64", "use 64 bit default AMI. This does nothing if you specify your own AMI") do
32
- options[64] = true
33
- end
13
+ opts.on("--ami AMI",
14
+ "use specified AMI instead of the default one.",
15
+ "If you don't specify your own AMI blender will choose a defaule one:",
16
+ "* #{AMI_32} for 32 bits",
17
+ "* #{AMI_64} for 64 bits",
18
+ "You can change the defaults by writing your own AMIs",
19
+ "into ~/.blender/ami and ~/.blender/ami64 files",
20
+ " "
21
+ ) do |val|
22
+ options[:ami] = val
23
+ end
24
+ opts.on("--key KEY",
25
+ "use KEY when starting instance. KEY should already be generated.",
26
+ "If you don't specify a KEY blender will try to use the key from your EC2 account",
27
+ "Note: There must be only ONE key on the account for it to work. ",
28
+ " "
29
+ ) do |val|
30
+ options[:key] = val
31
+ end
34
32
 
35
- opts.on("-n", "--dry-run", "Don't do anything, just print the command line to be executed") do |val|
36
- options[:dry] = true
37
- end
33
+ opts.on("--64", "use 64 bit default AMI. This does nothing if you specify your own AMI") do
34
+ options[64] = true
35
+ end
38
36
 
39
- opts.separator "\nCommon options:"
37
+ opts.on("-n", "--dry-run", "Don't do anything, just print the command line to be executed") do |val|
38
+ options[:dry] = true
39
+ end
40
40
 
41
- opts.on("-h", "--help", "Show this message") do
42
- puts opts
43
- exit
44
- end
41
+ opts.separator "\nCommon options:"
45
42
 
46
- opts.on_tail <<-EXAMPLE
43
+ opts.on("-h", "--help", "Show this message") do
44
+ puts opts
45
+ exit
46
+ end
47
47
 
48
- Example:
48
+ opts.on_tail <<-EXAMPLE
49
49
 
50
- # start a 64bit instance with default options
51
- blender start -64
50
+ Example:
52
51
 
53
- # start with a custom ami
54
- blender start --ami ami-2d4aa444
52
+ # start a 64bit instance with default options
53
+ blender start -64
55
54
 
56
- # start with passing arguments to ec2run: use security group default+test
57
- blender start -- -g default -g test
58
- EXAMPLE
55
+ # start with a custom ami
56
+ blender start --ami ami-2d4aa444
59
57
 
58
+ # start with passing arguments to ec2run: use security group default+test
59
+ blender start -- -g default -g test
60
+ EXAMPLE
60
61
 
61
- end.parse!
62
+
63
+ end.parse!
64
+
65
+
66
+ options
67
+ end
62
68
 
63
69
  def default_ami(options)
64
70
  name = options[64] ? "~/.blender/ami64" : "~/.blender/ami"
@@ -74,9 +80,24 @@ def default_key(options)
74
80
  keys.first.split("\t")[1] || raise("invalid key")
75
81
  end
76
82
 
77
- ami = options[:ami] || default_ami(options)
78
- key = options[:key] || default_key(options)
83
+ def run(*cmd)
84
+ system(*cmd)
85
+ end
86
+
87
+ def start_ami(options)
88
+ ami = options[:ami] || default_ami(options)
89
+ key = options[:key] || default_key(options)
90
+
91
+ cmd = ["ec2run", ami, "-k", key, *ARGV]
92
+
93
+ STDERR.puts ">> #{cmd * ' '}"
94
+ run(cmd) unless options[:dry]
95
+ end
96
+
97
+ def main
98
+ options = parse_options
99
+ start_ami(options)
79
100
 
80
- cmd = ["ec2run", ami, "-k", key, *ARGV]
81
- puts cmd * " "
82
- system(*cmd) unless options[:dry]
101
+ rescue => e
102
+ abort(e.to_s)
103
+ end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{server-blender}
8
- s.version = "0.0.13"
8
+ s.version = "0.0.14"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Vitaly Kushner"]
12
- s.date = %q{2010-06-23}
12
+ s.date = %q{2010-07-04}
13
13
  s.default_executable = %q{blender}
14
14
  s.description = %q{Boostrap and manage servers with shadow_puppet
15
15
 
@@ -36,6 +36,7 @@ http://reductivelabs.com/products/puppet/
36
36
  "VERSION",
37
37
  "bin/blender",
38
38
  "files/bootstrap.sh",
39
+ "files/init.sh",
39
40
  "files/mix.sh",
40
41
  "lib/blender.rb",
41
42
  "lib/blender/cli/init.rb",
@@ -44,20 +45,7 @@ http://reductivelabs.com/products/puppet/
44
45
  "server-blender.gemspec",
45
46
  "spec/server-blender_spec.rb",
46
47
  "spec/spec.opts",
47
- "spec/spec_helper.rb",
48
- "vendor/server-blender-manifests/.gitignore",
49
- "vendor/server-blender-manifests/LICENSE",
50
- "vendor/server-blender-manifests/README.markdown",
51
- "vendor/server-blender-manifests/Rakefile",
52
- "vendor/server-blender-manifests/VERSION",
53
- "vendor/server-blender-manifests/lib/blender/manifest/init.rb",
54
- "vendor/server-blender-manifests/lib/blender/manifest/mixer.rb",
55
- "vendor/server-blender-manifests/lib/blender/manifest/nodes.rb",
56
- "vendor/server-blender-manifests/lib/blender/manifest/roles.rb",
57
- "vendor/server-blender-manifests/lib/blender/manifest/root.rb",
58
- "vendor/server-blender-manifests/server-blender-manifest.gemspec",
59
- "vendor/server-blender-manifests/spec/spec.opts",
60
- "vendor/server-blender-manifests/spec/spec_helper.rb"
48
+ "spec/spec_helper.rb"
61
49
  ]
62
50
  s.homepage = %q{http://astrails.com/opensource/server-blender}
63
51
  s.rdoc_options = ["--charset=UTF-8"]
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 13
9
- version: 0.0.13
8
+ - 14
9
+ version: 0.0.14
10
10
  platform: ruby
11
11
  authors:
12
12
  - Vitaly Kushner
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-06-23 00:00:00 +03:00
17
+ date: 2010-07-04 00:00:00 +03:00
18
18
  default_executable: blender
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -71,6 +71,7 @@ files:
71
71
  - VERSION
72
72
  - bin/blender
73
73
  - files/bootstrap.sh
74
+ - files/init.sh
74
75
  - files/mix.sh
75
76
  - lib/blender.rb
76
77
  - lib/blender/cli/init.rb
@@ -80,19 +81,6 @@ files:
80
81
  - spec/server-blender_spec.rb
81
82
  - spec/spec.opts
82
83
  - spec/spec_helper.rb
83
- - vendor/server-blender-manifests/.gitignore
84
- - vendor/server-blender-manifests/LICENSE
85
- - vendor/server-blender-manifests/README.markdown
86
- - vendor/server-blender-manifests/Rakefile
87
- - vendor/server-blender-manifests/VERSION
88
- - vendor/server-blender-manifests/lib/blender/manifest/init.rb
89
- - vendor/server-blender-manifests/lib/blender/manifest/mixer.rb
90
- - vendor/server-blender-manifests/lib/blender/manifest/nodes.rb
91
- - vendor/server-blender-manifests/lib/blender/manifest/roles.rb
92
- - vendor/server-blender-manifests/lib/blender/manifest/root.rb
93
- - vendor/server-blender-manifests/server-blender-manifest.gemspec
94
- - vendor/server-blender-manifests/spec/spec.opts
95
- - vendor/server-blender-manifests/spec/spec_helper.rb
96
84
  has_rdoc: true
97
85
  homepage: http://astrails.com/opensource/server-blender
98
86
  licenses: []
@@ -1,26 +0,0 @@
1
- ## MISC
2
- pkg
3
- tags
4
- .yardoc
5
-
6
- ## MAC OS
7
- .DS_Store
8
-
9
- ## TEXTMATE
10
- *.tmproj
11
- tmtags
12
-
13
- ## EMACS
14
- *~
15
- \#*
16
- .\#*
17
-
18
- ## VIM
19
- *.swp
20
-
21
- ## PROJECT::GENERAL
22
- coverage
23
- rdoc
24
- pkg
25
-
26
- ## PROJECT::SPECIFIC
@@ -1,20 +0,0 @@
1
- Copyright (c) 2009 Vitaly Kushner
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,23 +0,0 @@
1
- # server-blender-manifest
2
-
3
- This gem is part of the [server-blender](http://astrails.com/opensource/server-blender) family.
4
-
5
- It contains server-side root manifest implementation for blender recipes. See server-blender for more information.
6
-
7
- * Home: [http://astrails.com/opensource/server-blender](http://astrails.com/opensource/server-blender)
8
- * Code: [http://github.com/astrails/server-blender-manifest](http://github.com/astrails/server-blender-manifest)
9
- * Blog: [http://blog.astrails.com/server-blender](http://blog.astrails.com/server-blender)
10
-
11
- ## Note on Patches/Pull Requests
12
-
13
- * Fork the project.
14
- * Make your feature addition or bug fix.
15
- * Add tests for it. This is important so I don't break it in a
16
- future version unintentionally.
17
- * Commit, do not mess with rakefile, version, or history.
18
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
19
- * Send me a pull request. Bonus points for topic branches.
20
-
21
- ## Copyright
22
-
23
- Copyright (c) 2010 Vitaly Kushner. See LICENSE for details.
@@ -1,40 +0,0 @@
1
- require 'rubygems'
2
- require 'rake'
3
-
4
- begin
5
- require 'jeweler'
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "server-blender-manifest"
8
- gem.summary = %Q{server-side root manifest implementation for server-blender}
9
- gem.description = <<-DESC
10
- This gem is part of the server-blender family (http://astrails.com/opensource/server-blender)
11
- It contains server-side root manifest implementation for blender recipes. See server-blender for more information.
12
- DESC
13
- gem.email = "vitaly@astrails.com"
14
- gem.homepage = "http://astrails.com/opensource/server-blender"
15
- gem.authors = ["Vitaly Kushner"]
16
- gem.add_development_dependency "rspec", ">= 1.2.9"
17
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
18
- end
19
- Jeweler::GemcutterTasks.new
20
- rescue LoadError
21
- puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
22
- end
23
-
24
- require 'spec/rake/spectask'
25
- Spec::Rake::SpecTask.new(:spec) do |spec|
26
- spec.libs << 'lib' << 'spec'
27
- spec.spec_files = FileList['spec/**/*_spec.rb']
28
- end
29
-
30
- Spec::Rake::SpecTask.new(:rcov) do |spec|
31
- spec.libs << 'lib' << 'spec'
32
- spec.pattern = 'spec/**/*_spec.rb'
33
- spec.rcov = true
34
- end
35
-
36
- task :spec => :check_dependencies
37
-
38
- task :default => :spec
39
-
40
- # documentaion is included in the parent server-blender gem
@@ -1 +0,0 @@
1
- 0.0.8
@@ -1,23 +0,0 @@
1
- module Blender::Manifest::Init
2
- def self.included(base)
3
- base.class_eval do
4
- recipe :create_blender_directories
5
- end
6
- end
7
-
8
- # create blender directories
9
- # @return dependency ref for the direcotires creation
10
- def create_blender_directories
11
- @create_blender_directories ||=
12
- begin
13
- dep = directory "/var/lib/blender", :mode => 0700
14
- dep = directory "/var/lib/blender/logs", :require => dep
15
- dep = directory "/var/lib/blender/tmp", :require => dep
16
- end
17
- end
18
-
19
- # @return dependency for blender directories
20
- def builder_deps
21
- create_blender_directories
22
- end
23
- end
@@ -1,35 +0,0 @@
1
- module Blender::Manifest::Mixer
2
- # mixes recipe module
3
- #
4
- # The purpose is to make the mixing of recipes cleaner and easier on the eyes :)
5
- # i.e. instead of
6
- # require 'foo'
7
- # include Blender::Recipes::Foo
8
- # require 'bar'
9
- # include Blender::Recipes::Bar
10
- # you can just
11
- # mix :foo, :bar
12
- # @param [[String, Symbol, Module]] recipes to mix
13
- def mix(*recipes)
14
-
15
- recipes.each do |recipe|
16
-
17
- next if Root.mixed_recipes.include?(recipe)
18
- Root.mixed_recipes << recipe
19
-
20
- case recipe
21
- when String, Symbol
22
- require recipe.to_s
23
- mixin = "Blender::Recipes::#{recipe.to_s.camelize}".constantize
24
- when Module
25
- mixin = recipe
26
- else
27
- raise "Expecting String, Symbol or Module. don't know what do do with #{recipe.inspect}"
28
- end
29
-
30
- puts "MIX: #{mixin}"
31
- ::Root.send :include, mixin
32
- end
33
- end
34
-
35
- end
@@ -1,94 +0,0 @@
1
- # This module encapsulates nodes handeling
2
- # Nodes can be declared both on a class level and inside a recipe
3
- # When defining a node an 'id' is associated with its hostname
4
- # and the node can later be reffered by this id (for example
5
- # to get its ip)
6
- module Blender::Manifest::Nodes
7
-
8
- def self.included(base)
9
- base.send :extend, self
10
- end
11
-
12
- # this holds the map from host ids to hostnames
13
- @@internal_hostnames = {}
14
- @@external_hostnames = {}
15
-
16
- # returns hostname by id or local host's name if the id is nil
17
- def hostname(id = nil, external = false)
18
- if id
19
- (external ? @@external_hostnames : @@internal_hostnames)[id]
20
- else
21
- external ? Facter.fqdn : Facter.hostname
22
- end
23
- end
24
-
25
- # returns id of the node we are running at
26
- # Note: will ONLY return non-nil value after (or during) node definition
27
- # unless node is forced by environment NODE variable or /etc/node file
28
- def current_node
29
- node = ENV['NODE'] ||
30
- (File.exists?("/etc/node") && File.read("/etc/node").strip) ||
31
- @@internal_hostnames.index(hostname) ||
32
- @@external_hostnames.index(hostname(nil, true))
33
- node && node.to_sym
34
- end
35
-
36
- # @return true if we are running on the node with the given `id`
37
- def current_node?(id)
38
- current_node == id.to_sym
39
- end
40
-
41
- # resolves host name using 'host' executable
42
- # @return host's IP by its name or nil if not found
43
- def host_ip(name)
44
- res = `host #{name}`.split("\n").grep(/has address/).first
45
- res && res.split.last
46
- end
47
-
48
- # define node and conditionally execute code block only on the specific node
49
- # Note: can be called multiple times without internal_name and external_name parameters
50
- # in which case will only do the conditional execution
51
- # @param [Symbol, String] id of the host to define or test for
52
- # @param [String] internal_name short hostname for the host
53
- # @param [String] external_name full dns hostname for the host
54
- # @example
55
- # node :app, "host5", "host5.serverfarm2.localdomain" do
56
- # ...
57
- # end
58
- #
59
- # node :app do
60
- # ...
61
- # end
62
- #
63
- def node(id, internal_name = nil, external_name = internal_name)
64
- return if false == internal_name # can be used to temporary 'disable' host's definition
65
- # like:
66
- # host :app2, false do .. end
67
- @@internal_hostnames[id] = internal_name if internal_name
68
- @@external_hostnames[id] = external_name if external_name
69
-
70
- if block_given? && current_node?(id)
71
- puts "NODE: #{id} / #{current_node}"
72
- @node = id
73
- yield
74
- end
75
- end
76
-
77
- # find out node addr. try to use external, then internal, then the host id to determine ip
78
- # @param [Symbol, String] id id of the host to resolve
79
- def addr(id)
80
- [hostname(id, true).to_s, hostname(id).to_s, id.to_s].each do |name|
81
- ip = host_ip(name)
82
- return ip if ip
83
- end
84
-
85
- # if all else fails, we should still be able to address the current node
86
- current_node?(id) ? "127.0.0.1" : nil
87
- end
88
-
89
- # same as addr but throws exception if IP can't be found
90
- def addr!(id)
91
- addr(id) or raise "Can't find address for '#{id}'"
92
- end
93
-
94
- end
@@ -1,40 +0,0 @@
1
- module Blender::Manifest::Roles
2
-
3
- def self.included(base)
4
- base.send :extend, self
5
- end
6
-
7
- # A very simple mechanism to define roles
8
- #
9
- # Roles to accept can be defined from environment, /etc/roles file
10
- # or can be explicitly defined like 'roles xxx, yyy'
11
- # usually the 'roles a,b,c' call will come inside of
12
- # a `node` block and so will be conditionally executed depending on the
13
- # running host
14
-
15
- def current_roles
16
- @current_roles ||=
17
- if ENV['ROLES']
18
- ENV['ROLES'].split(",")
19
- elsif File.exists?("/etc/roles")
20
- File.read("/etc/roles").strip.split
21
- else
22
- []
23
- end
24
- end
25
-
26
- # ADDS roles to the currently defined roles
27
- def roles *roles
28
- current_roles.concat(roles.map {|r| r.to_s})
29
- end
30
-
31
- # conditionally runs the code block if the role 'r' is
32
- # currently defined
33
- def role r
34
- if block_given? && current_roles.include?(r.to_s)
35
- puts "ROLE: #{r}"
36
- yield
37
- end
38
- end
39
-
40
- end
@@ -1,38 +0,0 @@
1
- require 'ruby-debug'
2
- $: << File.dirname(__FILE__) # FIXME: remove?
3
-
4
- module Blender
5
- module Manifest; end
6
- module Recipes; end
7
- end
8
- require 'init'
9
- require 'nodes'
10
- require 'roles'
11
- require 'mixer'
12
-
13
- class Root < ::ShadowPuppet::Manifest
14
- include Blender::Manifest::Init
15
- include Blender::Manifest::Nodes
16
- include Blender::Manifest::Roles
17
-
18
- @@mixed_recipes = []
19
- def self.mixed_recipes
20
- @@mixed_recipes
21
- end
22
-
23
- def execute_user_recipe
24
- raise "no RECIPE to execute" unless recipe = ENV['RECIPE']
25
-
26
- code = open(recipe).read
27
- instance_eval(code, recipe)
28
- end
29
- recipe :execute_user_recipe
30
- end
31
-
32
- include Blender::Manifest::Mixer
33
-
34
- # "standard" recipe directories
35
- $: << "recipes" << "recipes/astrails" << "lib/astrails/blender/recipes"
36
-
37
- # add all libs in the ./vendor directory to the path
38
- $:.concat Dir["vendor/*/"]
@@ -1,58 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{server-blender-manifest}
8
- s.version = "0.0.8"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Vitaly Kushner"]
12
- s.date = %q{2010-06-15}
13
- s.description = %q{This gem is part of the server-blender family (http://astrails.com/opensource/server-blender)
14
- It contains server-side root manifest implementation for blender recipes. See server-blender for more information.
15
- }
16
- s.email = %q{vitaly@astrails.com}
17
- s.extra_rdoc_files = [
18
- "LICENSE",
19
- "README.markdown"
20
- ]
21
- s.files = [
22
- ".gitignore",
23
- "LICENSE",
24
- "README.markdown",
25
- "Rakefile",
26
- "VERSION",
27
- "lib/blender/manifest/init.rb",
28
- "lib/blender/manifest/mixer.rb",
29
- "lib/blender/manifest/nodes.rb",
30
- "lib/blender/manifest/roles.rb",
31
- "lib/blender/manifest/root.rb",
32
- "server-blender-manifest.gemspec",
33
- "spec/spec.opts",
34
- "spec/spec_helper.rb"
35
- ]
36
- s.homepage = %q{http://astrails.com/opensource/server-blender}
37
- s.rdoc_options = ["--charset=UTF-8"]
38
- s.require_paths = ["lib"]
39
- s.rubygems_version = %q{1.3.6}
40
- s.summary = %q{server-side root manifest implementation for server-blender}
41
- s.test_files = [
42
- "spec/spec_helper.rb"
43
- ]
44
-
45
- if s.respond_to? :specification_version then
46
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
47
- s.specification_version = 3
48
-
49
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
50
- s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
51
- else
52
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
53
- end
54
- else
55
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
56
- end
57
- end
58
-
@@ -1 +0,0 @@
1
- --color
@@ -1,9 +0,0 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
- require 'server-blender-manifest'
4
- require 'spec'
5
- require 'spec/autorun'
6
-
7
- Spec::Runner.configure do |config|
8
-
9
- end