server-blender 0.0.13 → 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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