server-blender-core 0.0.1
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/.document +5 -0
- data/.gitignore +22 -0
- data/LICENSE +20 -0
- data/README.markdown +21 -0
- data/Rakefile +51 -0
- data/VERSION +1 -0
- data/files/darwin/install-ports.sh +45 -0
- data/files/fbucket +10 -0
- data/files/gitconfig +30 -0
- data/keys/github.com-host_key +1 -0
- data/recipes/blender_tools.rb +11 -0
- data/recipes/core.rb +216 -0
- data/recipes/default.rb +20 -0
- data/recipes/git.rb +32 -0
- data/recipes/locales.rb +20 -0
- data/recipes/os/darwin.rb +21 -0
- data/recipes/os/debian.rb +10 -0
- data/recipes/os/ubuntu.rb +8 -0
- data/recipes/postfix.rb +10 -0
- data/recipes/users.rb +120 -0
- data/recipes/utils.rb +33 -0
- data/server-blender-core.gemspec +72 -0
- data/spec/recipes/core_spec.rb +179 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +18 -0
- metadata +139 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
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.
|
data/README.markdown
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# server-blender-core
|
2
|
+
|
3
|
+
Core cookbook for [server-blender](http://astrails.com/opensource/server-blender)
|
4
|
+
|
5
|
+
* [Code](http://github.com/astrails/server-blender-core)
|
6
|
+
* [Home](http://astrails.com/opensource/server-blender)
|
7
|
+
* [Issues](http://github.com/astrails/server-blender-core/issues)
|
8
|
+
|
9
|
+
## Note on Patches/Pull Requests
|
10
|
+
|
11
|
+
* Fork the project.
|
12
|
+
* Make your feature addition or bug fix.
|
13
|
+
* Add tests for it. This is important so I don't break it in a
|
14
|
+
future version unintentionally.
|
15
|
+
* Commit, do not mess with rakefile, version, or history.
|
16
|
+
(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)
|
17
|
+
* Send me a pull request. Bonus points for topic branches.
|
18
|
+
|
19
|
+
## Copyright
|
20
|
+
|
21
|
+
Copyright (c) 2010 Vitaly Kushner. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "server-blender-core"
|
8
|
+
gem.summary = %Q{core recipes cookbook 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 core recipes cookbook. 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
|
+
|
17
|
+
gem.add_dependency "server-blender-manifest", ">= 0.0.15"
|
18
|
+
|
19
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
20
|
+
gem.add_development_dependency "yard", ">= 0"
|
21
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
22
|
+
end
|
23
|
+
Jeweler::GemcutterTasks.new
|
24
|
+
rescue LoadError
|
25
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
26
|
+
end
|
27
|
+
|
28
|
+
require 'spec/rake/spectask'
|
29
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
30
|
+
spec.libs << 'lib' << 'spec'
|
31
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
32
|
+
end
|
33
|
+
|
34
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
35
|
+
spec.libs << 'lib' << 'spec'
|
36
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
37
|
+
spec.rcov = true
|
38
|
+
end
|
39
|
+
|
40
|
+
task :spec => :check_dependencies
|
41
|
+
|
42
|
+
task :default => :spec
|
43
|
+
|
44
|
+
begin
|
45
|
+
require 'yard'
|
46
|
+
YARD::Rake::YardocTask.new
|
47
|
+
rescue LoadError
|
48
|
+
task :yardoc do
|
49
|
+
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
50
|
+
end
|
51
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/bin/bash -e
|
2
|
+
|
3
|
+
VERSION=1.9.1
|
4
|
+
|
5
|
+
echo
|
6
|
+
date
|
7
|
+
echo Installing Darwin Ports $VERSION
|
8
|
+
|
9
|
+
if [ ! -e /usr/bin/gcc ]; then
|
10
|
+
echo
|
11
|
+
echo "****************************************************************************************************"
|
12
|
+
echo "** Xcode is not installed. Please install Xcode from the OSX installation DVD and run this again. **"
|
13
|
+
echo "****************************************************************************************************"
|
14
|
+
exit 1
|
15
|
+
fi
|
16
|
+
|
17
|
+
cd /var/lib/blender/tmp
|
18
|
+
rm -rf macports
|
19
|
+
mkdir macports
|
20
|
+
cd macports
|
21
|
+
curl -O http://distfiles.macports.org/MacPorts/MacPorts-${VERSION}.tar.bz2
|
22
|
+
tar -jxf MacPorts-${VERSION}.tar.bz2
|
23
|
+
cd MacPorts-$VERSION
|
24
|
+
./configure
|
25
|
+
make
|
26
|
+
sudo make install
|
27
|
+
|
28
|
+
if ! grep -1 /opt/local/bin /etc/paths; then
|
29
|
+
echo Modifying /etc/paths
|
30
|
+
echo /opt/local/bin > /etc/paths.tmp
|
31
|
+
echo /opt/local/sbin >> /etc/paths.tmp
|
32
|
+
cat /etc/paths >> /etc/paths.tmp
|
33
|
+
mv /etc/paths.tmp /etc/paths
|
34
|
+
fi
|
35
|
+
|
36
|
+
if ! grep -1 /opt/local/share/man /etc/manpaths; then
|
37
|
+
echo Modifying /etc/manpaths
|
38
|
+
echo /opt/local/share/man > /etc/manpaths.tmp
|
39
|
+
cat /etc/manpaths >> /etc/manpaths.tmp
|
40
|
+
mv /etc/manpaths.tmp /etc/manpaths
|
41
|
+
fi
|
42
|
+
|
43
|
+
/opt/local/bin/port -v selfupdate
|
44
|
+
|
45
|
+
echo DONE
|
data/files/fbucket
ADDED
data/files/gitconfig
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
[core]
|
2
|
+
editor = vim
|
3
|
+
|
4
|
+
[color]
|
5
|
+
diff = auto
|
6
|
+
status = auto
|
7
|
+
branch = auto
|
8
|
+
interactive = auto
|
9
|
+
|
10
|
+
[core]
|
11
|
+
editor = vim
|
12
|
+
|
13
|
+
[alias]
|
14
|
+
ci = commit
|
15
|
+
co = checkout
|
16
|
+
st = status
|
17
|
+
br = branch
|
18
|
+
lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative
|
19
|
+
ls = ls-files
|
20
|
+
d = diff -C --stat -p
|
21
|
+
dw = diff -C --stat -p --color-words
|
22
|
+
|
23
|
+
[push]
|
24
|
+
default = current
|
25
|
+
|
26
|
+
[help]
|
27
|
+
autocorrect = 1
|
28
|
+
|
29
|
+
[branch]
|
30
|
+
autosetuprebase = always
|
@@ -0,0 +1 @@
|
|
1
|
+
github.com,65.74.177.129 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Blender::Recipes::BlenderTools
|
2
|
+
# installs blender tools. currently just 'fbucket'
|
3
|
+
#
|
4
|
+
# @return dependency reference
|
5
|
+
def blender_tools
|
6
|
+
dep = sys_dir("/usr/local/bin", :require => sys_dir("/usr/local"))
|
7
|
+
sys_file "/usr/local/bin/fbucket", :mode => "0755",
|
8
|
+
:content => template(find_file("fbucket")),
|
9
|
+
:require => dep
|
10
|
+
end
|
11
|
+
end
|
data/recipes/core.rb
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
module Blender::Recipes::Core
|
2
|
+
|
3
|
+
# render template with the given bindings
|
4
|
+
#
|
5
|
+
# @param [String] path path to the template file
|
6
|
+
# @param [Binding] b (local binding) binding to use
|
7
|
+
# @param [Boolean] cleanup (false) cleanup whitespace lines from the result
|
8
|
+
#
|
9
|
+
# @return [String] rendered template content
|
10
|
+
def template(path, b = binding, cleanup = false)
|
11
|
+
content = File.read(path)
|
12
|
+
begin
|
13
|
+
require 'erb'
|
14
|
+
res = ERB.new(content).result(b)
|
15
|
+
res.gsub!(/^\s+$/, "") if cleanup
|
16
|
+
res
|
17
|
+
rescue => e
|
18
|
+
puts "FAILED TEMPLATE:#{e}\n#{content}\n"
|
19
|
+
raise
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# merge dependencies with :require key from the opts
|
24
|
+
#
|
25
|
+
# @param opts options hash
|
26
|
+
# @option opts [Array] :require (nil)
|
27
|
+
# @param [Array] deps dependencies to merge
|
28
|
+
def merge_dependencies(opts, *deps)
|
29
|
+
([*opts[:require]] + [*deps]).flatten.compact
|
30
|
+
end
|
31
|
+
|
32
|
+
# running on Darwin?
|
33
|
+
#
|
34
|
+
# @return true if OS is Darwin
|
35
|
+
def darwin?
|
36
|
+
"Darwin" == os
|
37
|
+
end
|
38
|
+
|
39
|
+
# running on Ubuntu
|
40
|
+
#
|
41
|
+
# @return true if OS is Ubuntu
|
42
|
+
def ubuntu?
|
43
|
+
"Ubuntu" == os
|
44
|
+
end
|
45
|
+
|
46
|
+
# running on Debian?
|
47
|
+
#
|
48
|
+
# @return true if OS is Debian
|
49
|
+
def debian?
|
50
|
+
"Debian" == os
|
51
|
+
end
|
52
|
+
|
53
|
+
# running on Debian or Ubuntu?
|
54
|
+
#
|
55
|
+
# @return true if OS is Debian or Ubuntu
|
56
|
+
def debuntu?
|
57
|
+
debian? or ubuntu?
|
58
|
+
end
|
59
|
+
|
60
|
+
# detects cookbook of the current (or calling) recipes
|
61
|
+
# @param [Integer] (0) at how far in stack to look
|
62
|
+
def current_cookbook(at = 0)
|
63
|
+
caller[at][/\/cookbooks\/([^\/]+)\//, 1]
|
64
|
+
end
|
65
|
+
|
66
|
+
# find file by name
|
67
|
+
# @param [String] file filename to search for relative to `subdir` directory
|
68
|
+
# @param [String] cookbook recipes cookbook to search in
|
69
|
+
# @return [String] found file path
|
70
|
+
# @exammple
|
71
|
+
# find_file("install.sh", :files, "cassandra") # will look for install.sh inside cassandra/files
|
72
|
+
# find_file("my-key", :keys, "boo") # will look for install.sh inside boo/keys
|
73
|
+
def find_file(file, subdir = 'files', cookbook = current_cookbook(1))
|
74
|
+
|
75
|
+
if cookbook
|
76
|
+
pattern = "cookbooks/#{cookbook}/#{subdir}/#{file}"
|
77
|
+
else
|
78
|
+
pattern = ["#{subdir}/#{file}", "cookbooks/*/#{subdir}/#{file}"]
|
79
|
+
end
|
80
|
+
files = Dir[*pattern]
|
81
|
+
|
82
|
+
raise "too many files found: #{files * ', '}" if files.size > 1
|
83
|
+
files.first && File.expand_path(files.first) || raise("Couldn't find #{file} in #{pattern.inspect}")
|
84
|
+
end
|
85
|
+
|
86
|
+
# creates file with default params
|
87
|
+
# @param [String] path file path
|
88
|
+
# @param [Hash] opts standard `file` options
|
89
|
+
# Note: by default will create a file with mode 0644 owned by root:root
|
90
|
+
# @return [Array] dependency reference
|
91
|
+
def sys_file(path, opts = {})
|
92
|
+
opts = opts.dup
|
93
|
+
|
94
|
+
mode = opts.delete(:mode) || "0644"
|
95
|
+
|
96
|
+
owner = opts.delete(:owner) || "root"
|
97
|
+
|
98
|
+
group = opts.delete(:group) ||
|
99
|
+
if "root" == owner
|
100
|
+
darwin? ? "wheel" : "root"
|
101
|
+
else
|
102
|
+
darwin? ? "staff" : owner
|
103
|
+
end
|
104
|
+
|
105
|
+
opts[:owner] = owner unless false == owner
|
106
|
+
opts[:group] = group unless false == group
|
107
|
+
opts[:mode] = mode unless false == mode
|
108
|
+
|
109
|
+
file path, opts
|
110
|
+
[file(path)]
|
111
|
+
end
|
112
|
+
|
113
|
+
# create directory
|
114
|
+
# @param [String] path directory path
|
115
|
+
# @param [Hash] opts options hash
|
116
|
+
# @option opts [String] :owner (root) directory owner
|
117
|
+
# @option opts [String] :group (same as user) directory group
|
118
|
+
# @option opts [String, Integer] :mode (0755) directory group
|
119
|
+
# @return [Array] dependency reference
|
120
|
+
def sys_dir(path, opts = {})
|
121
|
+
sys_file(path, {:ensure => :directory, :mode => "0755"}.merge(opts))
|
122
|
+
end
|
123
|
+
|
124
|
+
# executes command and returns deps array
|
125
|
+
# Same like the original `exec` but returns the dependency
|
126
|
+
# @return [Array] dependency reference
|
127
|
+
def sys_exec(name, opts = {})
|
128
|
+
opts = opts.dup
|
129
|
+
if rvm_version = opts.delete(:rvm)
|
130
|
+
raise "no :with_rvm supported and :rvm option supplied. mix :rvm recipe from server-blender-rvm cookbook" unless respond_to?(:with_rvm)
|
131
|
+
opts[:command] = with_rvm(opts[:command], rvm_version) if opts[:command]
|
132
|
+
opts[:unless] = with_rvm(opts[:unless], rvm_version) if opts[:unless]
|
133
|
+
opts[:onlyif] = with_rvm(opts[:onlyif], rvm_version) if opts[:onlyif]
|
134
|
+
opts[:refresh] = with_rvm(opts[:refresh], rvm_version) if opts[:refresh]
|
135
|
+
end
|
136
|
+
if logfile = opts.delete(:logfile)
|
137
|
+
logfile = File.expand_path(logfile, "/var/lib/blender/logs/")
|
138
|
+
|
139
|
+
command = opts[:command] || name
|
140
|
+
opts[:command] = command << " 2>&1 | tee -a #{logfile};exit $PIPESTATUS"
|
141
|
+
end
|
142
|
+
opts[:logoutput] ||= :on_failure
|
143
|
+
exec(name, opts)
|
144
|
+
[exec(name)]
|
145
|
+
end
|
146
|
+
|
147
|
+
# Installs packages
|
148
|
+
# @param [Array] list list of packages to install
|
149
|
+
# @param [Hash] opts standard puppet options
|
150
|
+
# @return [Array] dependency references for all the packages
|
151
|
+
def sys_pkg(*packages_and_options)
|
152
|
+
opts = packages_and_options.extract_options!
|
153
|
+
packages_and_options.flatten.map do |p|
|
154
|
+
package(p.to_s, {:ensure => :installed}.merge(opts))
|
155
|
+
package(p.to_s)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def sys_service(name, opts = {})
|
160
|
+
status = opts[:ensure] || :running
|
161
|
+
service(name, {:ensure => status, :enable => ("running" == status.to_s)}.merge(opts))
|
162
|
+
[service(name)]
|
163
|
+
end
|
164
|
+
|
165
|
+
# url for rubygems at github
|
166
|
+
GEMS_GITHUB = 'http://gems.github.com'
|
167
|
+
|
168
|
+
# Install rubygems
|
169
|
+
#
|
170
|
+
# @param [Array] list of gems to install. each element can be either a string gem name, or an array of [name, version, dependencies, source]
|
171
|
+
#
|
172
|
+
# @example
|
173
|
+
# sys_gem [
|
174
|
+
# "will_paginate",
|
175
|
+
# ["rails", "2.3.5"]
|
176
|
+
# ["thoughtbot-shoulda", "2.9.1", nil, GITHUB]
|
177
|
+
# }
|
178
|
+
#
|
179
|
+
# @return [Array] dependency references for all the gems
|
180
|
+
def sys_gem(list, options = {})
|
181
|
+
[*list].map do |name, version, depends, source|
|
182
|
+
opts = options.merge(:provider => :gem, :ensure => version || :installed)
|
183
|
+
opts[:require] = [*depends] if depends
|
184
|
+
opts[:source] = source if source
|
185
|
+
package name.to_s, opts
|
186
|
+
package(name.to_s)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
# mount a volume
|
191
|
+
# @param [String] directory mount point
|
192
|
+
# @param [String] volume what volume (device) to mount, e.g. "/dev/sdm"
|
193
|
+
# @return [Array] dependency reference
|
194
|
+
def sys_mount(directory, volume, opts = {})
|
195
|
+
mount(directory, {
|
196
|
+
:device => volume,
|
197
|
+
:ensure => :mounted,
|
198
|
+
:fstype =>"xfs",
|
199
|
+
:options => "noatime",
|
200
|
+
:atboot => true}.merge(opts).merge(:require => merge_dependencies(opts, file(directory))))
|
201
|
+
|
202
|
+
[mount(directory)]
|
203
|
+
end
|
204
|
+
|
205
|
+
# mount one directory into another
|
206
|
+
# @param [String] to directory of the mount destination
|
207
|
+
# @param [String] from directory of the mount source
|
208
|
+
# @return [Array] dependency reference
|
209
|
+
def bind_mount(to, from, opts = {})
|
210
|
+
sys_mount to, from,
|
211
|
+
opts.merge(
|
212
|
+
:require => merge_dependencies(opts, file(from)),
|
213
|
+
:fstype => "none",
|
214
|
+
:options => "bind")
|
215
|
+
end
|
216
|
+
end
|
data/recipes/default.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
mix :git, :blender_tools
|
2
|
+
|
3
|
+
# Install default stuff. This is what we install on all our managed servers.
|
4
|
+
module Blender::Recipes::Default
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.class_eval { recipe :default }
|
8
|
+
end
|
9
|
+
|
10
|
+
# This recipe will be executed by default. You can override it
|
11
|
+
# by declaring function 'default' in any of your mixed plugins
|
12
|
+
#
|
13
|
+
# @see Blender::Recipes::Git#gitconfig
|
14
|
+
# @see Blender::Recipes::BlenderTools#blender_tools
|
15
|
+
def default
|
16
|
+
gitconfig
|
17
|
+
blender_tools
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
data/recipes/git.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# Git utils
|
2
|
+
module Blender::Recipes::Git
|
3
|
+
|
4
|
+
# setup default /etc/gitconfig
|
5
|
+
#
|
6
|
+
# @return dependency reference
|
7
|
+
def gitconfig
|
8
|
+
sys_file path = "/etc/gitconfig",
|
9
|
+
:ensure => :present,
|
10
|
+
:source => find_file("gitconfig"),
|
11
|
+
:group => (darwin? ? "wheel" : "root"),
|
12
|
+
:require => sys_pkg("git-core")
|
13
|
+
end
|
14
|
+
|
15
|
+
# initialize git repository
|
16
|
+
#
|
17
|
+
# @return dependency reference
|
18
|
+
def git_repository(repo, opts = {})
|
19
|
+
_git = file File.join(repo, ".git"), :checksum => :mtime
|
20
|
+
sys_exec "/usr/bin/git --git-dir '#{path}' init-db", opts.merge(
|
21
|
+
:require => merge_dependencies(opts, sys_pkg("git-core")),
|
22
|
+
:creates => path,
|
23
|
+
:before => _git)
|
24
|
+
end
|
25
|
+
|
26
|
+
def git_clone(repo, path, opts = {})
|
27
|
+
sys_exec "git clone #{repo} #{path}", opts.merge(
|
28
|
+
:creates => path,
|
29
|
+
:require => merge_dependencies(opts, sys_pkg("git-core")),
|
30
|
+
:cwd => File.dirname(path))
|
31
|
+
end
|
32
|
+
end
|
data/recipes/locales.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
mix :core
|
2
|
+
|
3
|
+
# Setup locales
|
4
|
+
module Blender::Recipes::Locales
|
5
|
+
|
6
|
+
# setup locales on debian / ubuntu machines. you can contribute support for your OS :)
|
7
|
+
#
|
8
|
+
# @return [Array] dependency reference
|
9
|
+
def locales
|
10
|
+
raise "only debian/ubuntu supported" unless debuntu?
|
11
|
+
|
12
|
+
sys_file "/etc/default/locale", :content => "LANG=en_US.UTF-8"
|
13
|
+
|
14
|
+
path = File.exist?("/var/lib/locales/supported.d") ? "/var/lib/locales/supported.d/local" : "/etc/locale.gen"
|
15
|
+
|
16
|
+
dep = sys_pkg("locales")
|
17
|
+
dep += sys_file(path, :content => "en_US.UTF-8 UTF-8\n", :notify => exec("locale-gen"))
|
18
|
+
sys_exec "locale-gen", :refreshonly => true, :require => dep
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
mix :core
|
2
|
+
|
3
|
+
# Darwin specific stuff
|
4
|
+
module Blender::Recipes::Os::Darwin
|
5
|
+
# setup Darwin environment.
|
6
|
+
# installs darwinports
|
7
|
+
# + setup defaultprovider for the 'package' resource to darwinport
|
8
|
+
def darwin_setup
|
9
|
+
sys_exec "install darwin ports",
|
10
|
+
:command => find_file("darwin/install-ports.sh"),
|
11
|
+
:creates => "/opt/local/bin/port",
|
12
|
+
:logfile => "install-ports.log"
|
13
|
+
Puppet::Type.type(:package).defaultprovider = Puppet::Type.type(:package).provider(:darwinport)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Darwin specific initialization
|
17
|
+
# This should be called before you do any packages on Darwin
|
18
|
+
def darwin
|
19
|
+
sys_pkg %w/wget/
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
mix :locales
|
2
|
+
|
3
|
+
module Blender::Recipes::Os::Debian
|
4
|
+
# Debian specific initialization.
|
5
|
+
def debian
|
6
|
+
dep = sys_pkg %w/vim less wget curl links2 dstat zip unzip gzip bzip2 tar
|
7
|
+
rsync tree bind9-host build-essential autotools-dev/
|
8
|
+
dep += locales
|
9
|
+
end
|
10
|
+
end
|
data/recipes/postfix.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
module Blender::Recipes::Postfix
|
2
|
+
# installs postfix and mailutils
|
3
|
+
# @param [String, optional] root_alias alias to redirect root's email to
|
4
|
+
#
|
5
|
+
# @return dependency reference
|
6
|
+
def postfix(root_alias = nil)
|
7
|
+
mailalias("root", :recipient => root_alias, :ensure => :present, :require => package("postfix")) if root_alias
|
8
|
+
sys_pkg "postfix", "mailutils"
|
9
|
+
end
|
10
|
+
end
|
data/recipes/users.rb
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
mix :utils
|
2
|
+
|
3
|
+
module Blender::Recipes::Users
|
4
|
+
|
5
|
+
# allow override for user's home_dir
|
6
|
+
# call this function before home_dir is called and the value you provide will be returned in
|
7
|
+
# the subsequent invocations of home_dir
|
8
|
+
# @param [String] user username to override homedir for
|
9
|
+
# @param [String] dir homedir to use
|
10
|
+
def set_home_dir(user, dir)
|
11
|
+
@home_dir ||= {}
|
12
|
+
@home_dir[user] = dir
|
13
|
+
end
|
14
|
+
|
15
|
+
# returns homedir for a given user
|
16
|
+
# @param [String] user username for which homedir is requested
|
17
|
+
# @return [String] user's home directory
|
18
|
+
def home_dir(user)
|
19
|
+
@home_dir ||= {"root" => (darwin? ? "/var/root" : "/root")}
|
20
|
+
@home_dir[user.to_s] ||= darwin? ? "/Users/#{user}": "/home/#{user}"
|
21
|
+
end
|
22
|
+
|
23
|
+
# create an application (i.e. non-system) user and his home dir
|
24
|
+
# @param [String] name username
|
25
|
+
# 1st creates user, then it's homedirectory (since it obviously needs to be owned buy the user)
|
26
|
+
# @return reference for the homedir resource
|
27
|
+
def app_user(name, opts = {})
|
28
|
+
home = home_dir(name)
|
29
|
+
|
30
|
+
if opts[:password]
|
31
|
+
case os.downcase
|
32
|
+
when 'debian', 'ubuntu'
|
33
|
+
opts[:require] = merge_dependencies(opts, sys_pkg("libshadow-ruby1.8"))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# user resource - this will actually create the user
|
38
|
+
user name, {
|
39
|
+
:ensure => :present,
|
40
|
+
:home => home,
|
41
|
+
:shell => "/bin/bash",
|
42
|
+
:managehome => true,
|
43
|
+
:allowdupe => false,
|
44
|
+
}.merge(opts)
|
45
|
+
|
46
|
+
# create homedirectory for the user
|
47
|
+
sys_file home,
|
48
|
+
:ensure => :directory,
|
49
|
+
:owner => name,
|
50
|
+
:mode => "0755",
|
51
|
+
:require => user(name)
|
52
|
+
end
|
53
|
+
|
54
|
+
# returns path to the user's .ssh directory
|
55
|
+
def dot_ssh_path(user)
|
56
|
+
"#{home_dir(user)}/.ssh"
|
57
|
+
end
|
58
|
+
|
59
|
+
# create ~/.ssh directory for the user and return its path
|
60
|
+
# @param [String] user username
|
61
|
+
# @return [String] path to ~/.ssh
|
62
|
+
def dot_ssh(user)
|
63
|
+
sys_dir dot_ssh_path(user),
|
64
|
+
:mode => 0700, :owner => user,
|
65
|
+
:require => (user.to_s == "root" || darwin?) ? [] : [file(home_dir(user))]
|
66
|
+
end
|
67
|
+
|
68
|
+
# authorize given ssh keys to login as given user
|
69
|
+
# @param [String] user username to login as
|
70
|
+
# @param [Array] keys list of keysnames to allow to login
|
71
|
+
# @return reference for ~/.ssh/authorized_keys file resource
|
72
|
+
def ssh_authorized_keys(user, keys)
|
73
|
+
sys_file "#{dot_ssh_path(user)}/authorized_keys",
|
74
|
+
:mode => 0600,
|
75
|
+
:owner => user,
|
76
|
+
:require => dot_ssh(user),
|
77
|
+
:content => keys.map {|k| File.read(find_file(k, :keys, nil)).strip}.join("\n")
|
78
|
+
end
|
79
|
+
|
80
|
+
# setup public/private ssh keys for a user
|
81
|
+
# @param [String] user user to setup keys for
|
82
|
+
# @param [String] key name of the key. This function expects 2 files to exist: keys/KEY and keys/KEY.pub
|
83
|
+
# @option opts [Array] :require (nil) additional requirements
|
84
|
+
# @return reference for ~/.ssh/id_dsa.pub resource, it is created last
|
85
|
+
def ssh_key(user, key, opts = {})
|
86
|
+
deps = merge_dependencies(opts, dot_ssh(user))
|
87
|
+
|
88
|
+
# create private key
|
89
|
+
deps = sys_file("#{dot_ssh_path(user)}/id_dsa",
|
90
|
+
:mode => 0600, :owner => user,
|
91
|
+
:require => deps,
|
92
|
+
:content => File.read(find_file(key, :keys, nil)))
|
93
|
+
|
94
|
+
# create public key
|
95
|
+
sys_file "#{dot_ssh_path(user)}/id_dsa.pub",
|
96
|
+
:mode => 0644, :owner => user,
|
97
|
+
:require => deps,
|
98
|
+
:content => File.read(find_file("#{key}.pub", :keys, nil))
|
99
|
+
end
|
100
|
+
|
101
|
+
# add given key to the ~/.ssh/known_hosts file for the user
|
102
|
+
# if the file doesn't exist it will be created
|
103
|
+
# if it does exist, only the key line will be added to it
|
104
|
+
# @param [String] user username
|
105
|
+
# @param [String] key. this function expects file keys/KEY to exist and contain the known_hosts line
|
106
|
+
# @option opts [Array] :require (nil) additional requirements
|
107
|
+
# @return dependency reference for the line in the known_hosts file
|
108
|
+
def ssh_known_host(user, key, opts = {})
|
109
|
+
deps = merge_dependencies(opts, dot_ssh(user))
|
110
|
+
|
111
|
+
path = "#{dot_ssh_path(user)}/known_hosts"
|
112
|
+
deps = sys_file(path,
|
113
|
+
:mode => 0600, :owner => user,
|
114
|
+
:require => deps,
|
115
|
+
:ensure => :file)
|
116
|
+
|
117
|
+
# this will return the dep ref for the line
|
118
|
+
line path, File.read(find_file(key, :keys, nil)).strip, :require => deps
|
119
|
+
end
|
120
|
+
end
|
data/recipes/utils.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
mix :core
|
2
|
+
|
3
|
+
module Blender::Recipes::Utils
|
4
|
+
# adds or removes lines from a file
|
5
|
+
# @param file filename of the file
|
6
|
+
# @param line line to add/removes
|
7
|
+
# @param opts[:ensure] when :present - the line will be added, when :absent - will be removed
|
8
|
+
# @param opts[:regexp] effective only when :ensure => :absent. tread line as a regexp and not as a literal string
|
9
|
+
# @return [Array] dependency reference
|
10
|
+
def line(file, line, opts = {})
|
11
|
+
case opts.delete(:ensure) || :present
|
12
|
+
|
13
|
+
when :present
|
14
|
+
sys_exec("present #{file}:#{line}", opts.merge(
|
15
|
+
:command => "/bin/echo '#{line}' >> '#{file}'",
|
16
|
+
:unless => "grep -qFx '#{line}' '#{file}'"))
|
17
|
+
|
18
|
+
when :absent
|
19
|
+
if regexp = opts.delete(:regexp)
|
20
|
+
sys_exec("absent #{file}: /#{line}/", opts.merge(
|
21
|
+
:command => "/usr/bin/perl -ni -e 'print unless /#{line}/' '#{file}'",
|
22
|
+
:onlyif => "grep -qP '#{line}' '#{file}'"))
|
23
|
+
else
|
24
|
+
sys_exec("absent #{file}: \"#{line}\"", opts.merge(
|
25
|
+
:command => "/usr/bin/perl -ni -e 'print unless /^\\Q#{line}\\E\$/' '#{file}'",
|
26
|
+
:onlyif => "grep -qFx '#{line}' '#{file}'"))
|
27
|
+
end
|
28
|
+
else
|
29
|
+
raise "unknown ensure value #{action}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,72 @@
|
|
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-core}
|
8
|
+
s.version = "0.0.1"
|
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-11-28}
|
13
|
+
s.description = %q{This gem is part of the server-blender family (http://astrails.com/opensource/server-blender)
|
14
|
+
It contains core recipes cookbook. See server-blender for more information.
|
15
|
+
}
|
16
|
+
s.email = %q{vitaly@astrails.com}
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".document",
|
22
|
+
".gitignore",
|
23
|
+
"LICENSE",
|
24
|
+
"README.markdown",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"files/darwin/install-ports.sh",
|
28
|
+
"files/fbucket",
|
29
|
+
"files/gitconfig",
|
30
|
+
"keys/github.com-host_key",
|
31
|
+
"recipes/blender_tools.rb",
|
32
|
+
"recipes/core.rb",
|
33
|
+
"recipes/default.rb",
|
34
|
+
"recipes/git.rb",
|
35
|
+
"recipes/locales.rb",
|
36
|
+
"recipes/os/darwin.rb",
|
37
|
+
"recipes/os/debian.rb",
|
38
|
+
"recipes/os/ubuntu.rb",
|
39
|
+
"recipes/postfix.rb",
|
40
|
+
"recipes/users.rb",
|
41
|
+
"recipes/utils.rb",
|
42
|
+
"server-blender-core.gemspec",
|
43
|
+
"spec/recipes/core_spec.rb",
|
44
|
+
"spec/spec.opts",
|
45
|
+
"spec/spec_helper.rb"
|
46
|
+
]
|
47
|
+
s.homepage = %q{http://astrails.com/opensource/server-blender}
|
48
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
49
|
+
s.require_paths = ["lib"]
|
50
|
+
s.rubygems_version = %q{1.3.7}
|
51
|
+
s.summary = %q{core recipes cookbook for server-blender}
|
52
|
+
|
53
|
+
if s.respond_to? :specification_version then
|
54
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
55
|
+
s.specification_version = 3
|
56
|
+
|
57
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
58
|
+
s.add_runtime_dependency(%q<server-blender-manifest>, [">= 0.0.15"])
|
59
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
60
|
+
s.add_development_dependency(%q<yard>, [">= 0"])
|
61
|
+
else
|
62
|
+
s.add_dependency(%q<server-blender-manifest>, [">= 0.0.15"])
|
63
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
64
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
65
|
+
end
|
66
|
+
else
|
67
|
+
s.add_dependency(%q<server-blender-manifest>, [">= 0.0.15"])
|
68
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
69
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
@@ -0,0 +1,179 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'core'
|
3
|
+
|
4
|
+
describe Blender::Recipes::Core do
|
5
|
+
before(:each) do
|
6
|
+
@root = Root.new
|
7
|
+
@root.instance_eval {mix :core}
|
8
|
+
end
|
9
|
+
|
10
|
+
describe :template do
|
11
|
+
it "should ERB parse with binding" do
|
12
|
+
stub(File).read("foo/bar") {"foo <%= bar %> baz"}
|
13
|
+
bar = 123
|
14
|
+
@root.template("foo/bar", binding).should == "foo 123 baz"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should cleanup whitespace only lines when cleanup = true" do
|
18
|
+
stub(File).read("foo/bar") {"aaa\nbbb\n \nccc\n\t \nddd"}
|
19
|
+
@root.template("foo/bar", binding, true).should == "aaa\nbbb\n\nccc\n\nddd"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe :merge_dependencies do
|
24
|
+
it "should merge deps fro moptions with arguments" do
|
25
|
+
@root.merge_dependencies({:require => [:a]}, :b, :c).should == [:a, :b, :c]
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should merge single dep" do
|
29
|
+
@root.merge_dependencies({:require => [:a]}, :b).should == [:a, :b]
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should merge deps array" do
|
33
|
+
@root.merge_dependencies({:require => [:a]}, [:b, :c]).should == [:a, :b, :c]
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should leave arg if opts dep is nil" do
|
37
|
+
@root.merge_dependencies({}, :b).should == [:b]
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should leave arg array if opts dep is nil" do
|
41
|
+
@root.merge_dependencies({}, [:b, :c]).should == [:b, :c]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe :find_file do
|
46
|
+
it "fail if finds multiple files" do
|
47
|
+
stub(Dir).[](anything) {["aaa", "bbb"]}
|
48
|
+
proc {
|
49
|
+
@root.find_file("foo", "bar", "baz")
|
50
|
+
}.should raise_error(RuntimeError, "too many files found: aaa, bbb")
|
51
|
+
end
|
52
|
+
|
53
|
+
it "fail if no files found" do
|
54
|
+
stub(Dir).[](anything) {[]}
|
55
|
+
proc {
|
56
|
+
@root.find_file("foo", "bar", "baz")
|
57
|
+
}.should raise_error(RuntimeError, /^Couldn't find foo in/)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should look in . and all cookbooks when cookbook param is nil" do
|
61
|
+
mock(Dir).[]("foo/bar", "cookbooks/*/foo/bar") {["foo/bar"]}
|
62
|
+
@root.find_file("bar", "foo", nil)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should look only in the specific cookbook dir when given cookbook param" do
|
66
|
+
mock(Dir).[]("cookbooks/baz/foo/bar") {["cookbooks/baz/foo/bar"]}
|
67
|
+
@root.find_file("bar", "foo", "baz")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe :sys_file do
|
72
|
+
it "should add file resource with default params" do
|
73
|
+
stub(@root).darwin? {false}
|
74
|
+
@root.sys_file "foo", :content => "Foo"
|
75
|
+
@root.should have_file("foo").
|
76
|
+
content("Foo").
|
77
|
+
mode("0644").
|
78
|
+
owner("root").
|
79
|
+
group("root")
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should default to root:root on non-mac" do
|
83
|
+
stub(@root).darwin? {false}
|
84
|
+
@root.sys_file "foo"
|
85
|
+
@root.should have_file("foo").owner("root").group("root")
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should default to root:wheel on mac" do
|
89
|
+
stub(@root).darwin? {true}
|
90
|
+
@root.sys_file "foo"
|
91
|
+
@root.should have_file("foo").owner("root").group("wheel")
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should default to user:user on non-mac" do
|
95
|
+
stub(@root).darwin? {false}
|
96
|
+
@root.sys_file "foo", :owner => "user"
|
97
|
+
@root.should have_file("foo").owner("user").group("user")
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should default to user:staff on mac" do
|
101
|
+
stub(@root).darwin? {true}
|
102
|
+
@root.sys_file "foo", :owner => "user"
|
103
|
+
@root.should have_file("foo").owner("user").group("staff")
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
describe :sys_dir do
|
109
|
+
it "should add directory resource with default params" do
|
110
|
+
stub(@root).darwin? {false}
|
111
|
+
@root.sys_dir "foo"
|
112
|
+
@root.should have_file("foo").
|
113
|
+
ensure(:directory).
|
114
|
+
mode("0755").
|
115
|
+
owner("root").
|
116
|
+
group("root")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe :sys_exec do
|
121
|
+
it "should add exec with default params" do
|
122
|
+
@root.sys_exec(
|
123
|
+
"foo",
|
124
|
+
:cwd => "/", :command => "pwd",
|
125
|
+
:unless => "check-unless",
|
126
|
+
:onlyif => "check-if",
|
127
|
+
:refresh => "refresh-cmd"
|
128
|
+
)
|
129
|
+
@root.should(
|
130
|
+
have_exec("foo").command("pwd").cwd("/").
|
131
|
+
logoutput(:on_failure).unless("check-unless").onlyif("check-if"))
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should wrap with rvm if needed" do
|
135
|
+
stub(@root).with_rvm {|c,v| "with-rvm(#{c}, #{v})"}
|
136
|
+
@root.sys_exec "foo",
|
137
|
+
:command => "do-foo",
|
138
|
+
:refresh => "refresh-foo",
|
139
|
+
:unless => "unless-foo",
|
140
|
+
:onlyif => "if-foo",
|
141
|
+
:rvm => "rVm"
|
142
|
+
@root.should(
|
143
|
+
have_exec("foo").command("with-rvm(do-foo, rVm)").unless("with-rvm(unless-foo, rVm)").
|
144
|
+
onlyif("with-rvm(if-foo, rVm)").refresh("with-rvm(refresh-foo, rVm)"))
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should raise error when requesting :rvm when no :rvm support" do
|
148
|
+
proc {
|
149
|
+
@root.sys_exec "foo",
|
150
|
+
:command => "do-foo",
|
151
|
+
:rvm => "rVm"
|
152
|
+
}.should raise_error(RuntimeError, /no :with_rvm/)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe :sys_pkg do
|
157
|
+
it "should create packages with default args" do
|
158
|
+
@root.sys_pkg "aaa", "bbb", :source => "there"
|
159
|
+
@root.should have_package("aaa").ensure(:installed).source("there")
|
160
|
+
@root.should have_package("bbb").ensure(:installed).source("there")
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
describe :sys_service do
|
165
|
+
it "should add service" do
|
166
|
+
@root.sys_service "foo"
|
167
|
+
@root.should have_service("foo").ensure(:running).enable(true)
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should disable if status is not running" do
|
171
|
+
@root.sys_service :foo, :ensure => :stopped
|
172
|
+
@root.should have_service(:foo).ensure(:stopped).enable(false)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
describe :sys_gem do
|
177
|
+
|
178
|
+
end
|
179
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'ruby-debug'
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'recipes'))
|
6
|
+
|
7
|
+
require 'blender/manifest/root'
|
8
|
+
require 'blender/manifest/matchers'
|
9
|
+
require 'spec'
|
10
|
+
require 'spec/autorun'
|
11
|
+
require 'shadow_puppet/test'
|
12
|
+
|
13
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
14
|
+
|
15
|
+
Spec::Runner.configure do |config|
|
16
|
+
config.include Blender::Manifest::Matchers
|
17
|
+
config.mock_with :rr
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: server-blender-core
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Vitaly Kushner
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-11-28 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: server-blender-manifest
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 1
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 0
|
33
|
+
- 15
|
34
|
+
version: 0.0.15
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rspec
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 13
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
- 2
|
49
|
+
- 9
|
50
|
+
version: 1.2.9
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: yard
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 3
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
version: "0"
|
65
|
+
type: :development
|
66
|
+
version_requirements: *id003
|
67
|
+
description: |
|
68
|
+
This gem is part of the server-blender family (http://astrails.com/opensource/server-blender)
|
69
|
+
It contains core recipes cookbook. See server-blender for more information.
|
70
|
+
|
71
|
+
email: vitaly@astrails.com
|
72
|
+
executables: []
|
73
|
+
|
74
|
+
extensions: []
|
75
|
+
|
76
|
+
extra_rdoc_files:
|
77
|
+
- LICENSE
|
78
|
+
files:
|
79
|
+
- .document
|
80
|
+
- .gitignore
|
81
|
+
- LICENSE
|
82
|
+
- README.markdown
|
83
|
+
- Rakefile
|
84
|
+
- VERSION
|
85
|
+
- files/darwin/install-ports.sh
|
86
|
+
- files/fbucket
|
87
|
+
- files/gitconfig
|
88
|
+
- keys/github.com-host_key
|
89
|
+
- recipes/blender_tools.rb
|
90
|
+
- recipes/core.rb
|
91
|
+
- recipes/default.rb
|
92
|
+
- recipes/git.rb
|
93
|
+
- recipes/locales.rb
|
94
|
+
- recipes/os/darwin.rb
|
95
|
+
- recipes/os/debian.rb
|
96
|
+
- recipes/os/ubuntu.rb
|
97
|
+
- recipes/postfix.rb
|
98
|
+
- recipes/users.rb
|
99
|
+
- recipes/utils.rb
|
100
|
+
- server-blender-core.gemspec
|
101
|
+
- spec/recipes/core_spec.rb
|
102
|
+
- spec/spec.opts
|
103
|
+
- spec/spec_helper.rb
|
104
|
+
has_rdoc: true
|
105
|
+
homepage: http://astrails.com/opensource/server-blender
|
106
|
+
licenses: []
|
107
|
+
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options:
|
110
|
+
- --charset=UTF-8
|
111
|
+
require_paths:
|
112
|
+
- lib
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 3
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
version: "0"
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
hash: 3
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
version: "0"
|
131
|
+
requirements: []
|
132
|
+
|
133
|
+
rubyforge_project:
|
134
|
+
rubygems_version: 1.3.7
|
135
|
+
signing_key:
|
136
|
+
specification_version: 3
|
137
|
+
summary: core recipes cookbook for server-blender
|
138
|
+
test_files: []
|
139
|
+
|