caterer 0.11.0 → 0.11.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/Vagrantfile CHANGED
@@ -3,8 +3,12 @@
3
3
  Vagrant.configure("2") do |config|
4
4
 
5
5
  # ubuntu
6
- config.vm.box = 'precise'
7
- config.vm.box_url = 'http://files.vagrantup.com/precise64.box'
6
+ # config.vm.box = 'precise'
7
+ # config.vm.box_url = 'http://files.vagrantup.com/precise64.box'
8
+
9
+ # centos
10
+ config.vm.box = 'pagoda_cent6_minimal'
11
+ config.vm.box_url = 'https://s3.amazonaws.com/vagrant.pagodabox.com/boxes/centos-6.4-x86_64-minimal.box'
8
12
 
9
13
  config.vm.provider "virtualbox" do |v|
10
14
  v.customize ["modifyvm", :id, "--cpus", "2", "--memory", "1024", "--cpuexecutioncap", "75"]
@@ -2,6 +2,7 @@ module Caterer
2
2
  module Action
3
3
  module Server
4
4
  autoload :Lock, 'caterer/action/server/lock'
5
+ autoload :Platform, 'caterer/action/server/platform'
5
6
  autoload :Reboot, 'caterer/action/server/reboot'
6
7
  autoload :Validate, 'caterer/action/server/validate'
7
8
  autoload :Unlock, 'caterer/action/server/unlock'
@@ -0,0 +1,14 @@
1
+ module Caterer
2
+ module Action
3
+ module Server
4
+ class Platform < Base
5
+
6
+ def call(env)
7
+ platform = env[:server].detect_platform
8
+ @app.call(env) if platform
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+ end
@@ -29,6 +29,7 @@ Caterer.actions.register(:bootstrap) do
29
29
  Vli::Action::Builder.new do
30
30
  use Caterer::Action::Environment::Setup
31
31
  use Caterer.actions.get(:validate)
32
+ use Caterer::Action::Server::Platform
32
33
  use Caterer::Action::Provisioner::Load
33
34
  use Caterer::Action::Provisioner::Prepare
34
35
  use Caterer::Action::Server::Lock
@@ -43,6 +44,7 @@ Caterer.actions.register(:provision) do
43
44
  Vli::Action::Builder.new do
44
45
  use Caterer::Action::Environment::Setup
45
46
  use Caterer.actions.get(:validate)
47
+ use Caterer::Action::Server::Platform
46
48
  use Caterer::Action::Provisioner::Load
47
49
  use Caterer::Action::Provisioner::Prepare
48
50
  use Caterer::Action::Provisioner::Validate::Bootstrapped
@@ -57,6 +59,7 @@ Caterer.actions.register(:up) do
57
59
  Vli::Action::Builder.new do
58
60
  use Caterer::Action::Environment::Setup
59
61
  use Caterer.actions.get(:validate)
62
+ use Caterer::Action::Server::Platform
60
63
  use Caterer::Action::Provisioner::Load
61
64
  use Caterer::Action::Provisioner::Prepare
62
65
  use Caterer::Action::Server::Lock
@@ -72,6 +75,7 @@ Caterer.actions.register(:reboot) do
72
75
  Vli::Action::Builder.new do
73
76
  use Caterer::Action::Environment::Setup
74
77
  use Caterer::Action::Server::Validate::SSH
78
+ use Caterer::Action::Server::Platform
75
79
  use Caterer::Action::Server::Reboot
76
80
  end
77
81
  end
@@ -80,6 +84,7 @@ Caterer.actions.register(:clean) do
80
84
  Vli::Action::Builder.new do
81
85
  use Caterer::Action::Environment::Setup
82
86
  use Caterer.actions.get(:validate)
87
+ use Caterer::Action::Server::Platform
83
88
  use Caterer::Action::Provisioner::Load
84
89
  use Caterer::Action::Provisioner::Uninstall
85
90
  end
@@ -27,7 +27,7 @@ module Caterer
27
27
  until eof do
28
28
  begin
29
29
  out = stdout.readpartial(4096)
30
- if out.match /password:/
30
+ if out.match /(p|P)assword:/
31
31
  stdin.puts server.password
32
32
  else
33
33
  @logger.debug("stdout: #{out}")
@@ -5,7 +5,7 @@ module Caterer
5
5
  attr_accessor :dest_dir, :run_list, :json, :cookbooks_path, :roles_path, :data_bags_path, :bootstrap_scripts
6
6
 
7
7
  def initialize
8
- @dest_dir = '/opt/cater_chef_solo'
8
+ @dest_dir = '/opt/cater/chef_solo'
9
9
  @run_list = []
10
10
  @json = {}
11
11
  @cookbooks_path = ['cookbooks']
@@ -8,6 +8,8 @@ module Caterer
8
8
  module Provisioner
9
9
  class ChefSolo < Base
10
10
 
11
+ include Util::Shell
12
+
11
13
  attr_reader :run_list
12
14
  attr_accessor :dest_dir, :json, :cookbooks_path, :roles_path
13
15
  attr_accessor :data_bags_path, :bootstrap_scripts
@@ -130,16 +132,14 @@ module Caterer
130
132
  def install(server)
131
133
  server.ui.info "Preparing installation..."
132
134
 
133
- # upload
134
- server.ssh.upload install_script, "#{target_install_path}"
135
+ installer = install_script(server.platform)
135
136
 
136
- # set permissions
137
- server.ssh.sudo "chown #{server.username} #{target_install_path}", :stream => true
138
- server.ssh.sudo "chmod +x #{target_install_path}", :stream => true
137
+ if not File.exists? installer
138
+ server.ui.error "#{server.platform} doesn't have an install script"
139
+ return
140
+ end
139
141
 
140
- # run
141
- server.ui.info "Installing chef-solo..."
142
- res = server.ssh.sudo "#{target_install_path}", :stream => true
142
+ res = server.ssh.sudo bash(File.read(installer)), :stream => true
143
143
 
144
144
  unless res == 0
145
145
  server.ui.error "install failed with exit code: #{res}"
@@ -261,8 +261,8 @@ module Caterer
261
261
  "#{dest_dir}/config.json"
262
262
  end
263
263
 
264
- def install_script
265
- File.expand_path("../../../templates/provisioner/chef_solo/bootstrap.sh", __FILE__)
264
+ def install_script(platform)
265
+ File.expand_path("../../../templates/provisioner/chef_solo/bootstrap/#{platform}.sh", __FILE__)
266
266
  end
267
267
 
268
268
  def solo_content(server)
@@ -3,6 +3,8 @@ require 'digest'
3
3
 
4
4
  module Caterer
5
5
  class Server
6
+
7
+ include Util::Shell
6
8
 
7
9
  attr_reader :env
8
10
 
@@ -172,6 +174,27 @@ module Caterer
172
174
  env.action_runner.run(name, options)
173
175
  end
174
176
 
177
+ def detect_platform
178
+ @platform ||= begin
179
+ ui.info "Detecting platform..."
180
+ out = ""
181
+ res = ssh.sudo bash(File.read(platform_script)) do |_stream, data|
182
+ out += data
183
+ end
184
+ if res == 0
185
+ out.strip # success
186
+ else
187
+ ui.error "Unknown platform"
188
+ false
189
+ end
190
+ end
191
+ end
192
+ alias :platform :detect_platform
193
+
194
+ def platform_script
195
+ File.expand_path("../../templates/server/platform.sh", __FILE__)
196
+ end
197
+
175
198
  def upload_directory(from, to)
176
199
  if File.exists? from
177
200
  if can_rsync?
data/lib/caterer/util.rb CHANGED
@@ -2,5 +2,6 @@ module Caterer
2
2
  module Util
3
3
  autoload :ANSIEscapeCodeRemover, 'caterer/util/ansi_escape_code_remover'
4
4
  autoload :Retryable, 'caterer/util/retryable'
5
+ autoload :Shell, 'caterer/util/shell'
5
6
  end
6
7
  end
@@ -0,0 +1,41 @@
1
+ module Caterer
2
+ module Util
3
+ module Shell
4
+
5
+ # strategy:
6
+ # 1- escape the escapes
7
+ # 2- escape quotes
8
+ # 3- escape dollar signs
9
+ def escape(cmd)
10
+ cmd.gsub!(/\\/, "\\\\\\")
11
+ cmd.gsub!(/"/, "\\\"")
12
+ cmd.gsub!(/\$/, "\\$")
13
+ cmd
14
+ end
15
+
16
+ def bash(cmd)
17
+ "bash -c \"#{escape(cmd)}\""
18
+ end
19
+
20
+ def su(user, cmd)
21
+ "su #{user} -l -c \"#{escape(cmd)}\""
22
+ end
23
+
24
+ def env(vars)
25
+ vars ||= {}
26
+ env = ''
27
+ vars.each do |key, val|
28
+ env += " " if not env == ''
29
+ env += env_string(key, val)
30
+ end
31
+ (env == '')? env : "#{env} "
32
+ end
33
+
34
+ def env_string(key, val)
35
+ key = key.to_s if not key.is_a? String
36
+ %Q{#{key.upcase}="#{escape(val)}"}
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -1,3 +1,3 @@
1
1
  module Caterer
2
- VERSION = "0.11.0"
2
+ VERSION = "0.11.1"
3
3
  end
@@ -34,13 +34,26 @@ detect_platform() {
34
34
  then
35
35
  platform="el"
36
36
  fi
37
- # Apple OS X
38
37
  elif [ -f "/usr/bin/sw_vers" ];
39
38
  then
40
39
  platform="mac_os_x"
41
40
  elif [ -f "/etc/release" ];
42
41
  then
43
- platform="solaris2"
42
+ if [[ -n $(cat /etc/release | grep "SmartOS") ]]; then
43
+ platform="smartos"
44
+ elif [[ -n $(cat /etc/release | grep "OmniOS") ]]; then
45
+ platform="omnios"
46
+ elif [[ -n $(cat /etc/release | grep "OpenIndiana") ]]; then
47
+ platform="openindiana"
48
+ elif [[ -n $(cat /etc/release | grep "OpenSolaris") ]]; then
49
+ platform="opensolaris"
50
+ elif [[ -n $(cat /etc/release | grep "Oracle Solaris") ]]; then
51
+ platform="oracle_solaris"
52
+ elif [[ -n $(cat /etc/release | grep "Solaris") ]]; then
53
+ platform="solaris2"
54
+ elif [[ -n $(cat /etc/release | grep "NexentaCore") ]]; then
55
+ platform="nexentacore"
56
+ fi
44
57
  elif [ -f "/etc/SuSE-release" ];
45
58
  then
46
59
  if grep -q 'Enterprise' /etc/SuSE-release;
@@ -74,9 +87,25 @@ install() {
74
87
  "sles" )
75
88
  yast -i $1
76
89
  ;;
90
+ esac
91
+ }
92
+
93
+ bootstrap() {
94
+ echo "bootstrapping chef..."
95
+ case $(detect_platform) in
96
+ "smartos" )
97
+ # made this one myself :)
98
+ echo "downloading chef fatclient..."
99
+ wget -q -P https://s3.amazonaws.com/packages.pagodabox.com/tar/smartos/chef/chef-fatclient.tar.bz2
100
+ cd /; tar -xjf /tmp/Chef-fatclient-SmartOS-10.14.2.tar.bz2
101
+ # make an executable link
102
+ mkdir -p /opt/local/bin
103
+ ln -s /opt/local/bin/chef-solo /opt/chef/bin/chef-solo
104
+ # cleanup
105
+ rm -f /tmp/Chef-fatclient-SmartOS-10.14.2.tar.bz2
106
+ ;;
77
107
  *)
78
- echo "sorry, I don't have a bootstrap for this platform"
79
- exit 1
108
+ curl -L https://www.opscode.com/chef/install.sh | bash
80
109
  ;;
81
110
  esac
82
111
  }
@@ -86,4 +115,4 @@ exists curl || install curl
86
115
  exists rsync || install rsync
87
116
 
88
117
  # install chef-solo
89
- exists chef-solo || curl -L https://www.opscode.com/chef/install.sh | bash
118
+ exists chef-solo || bootstrap
@@ -0,0 +1,11 @@
1
+ # install curl
2
+ echo "ensure curl exists..."
3
+ command -v curl &>/dev/null || apt-get -y --force-yes install curl
4
+
5
+ # install rsync
6
+ echo "ensure rsync exists..."
7
+ command -v rsync &>/dev/null || apt-get -y --force-yes install rsync
8
+
9
+ # install chef
10
+ echo "bootstrapping chef..."
11
+ curl -L https://www.opscode.com/chef/install.sh | bash
@@ -0,0 +1,11 @@
1
+ # install curl
2
+ echo "ensure curl exists..."
3
+ command -v curl &>/dev/null || yum -y install curl
4
+
5
+ # install rsync
6
+ echo "ensure rsync exists..."
7
+ command -v rsync &>/dev/null || yum -y install rsync
8
+
9
+ # install chef
10
+ echo "bootstrapping chef..."
11
+ curl -L https://www.opscode.com/chef/install.sh | bash
@@ -0,0 +1,11 @@
1
+ # install curl
2
+ echo "ensure curl exists..."
3
+ command -v curl &>/dev/null || yum -y install curl
4
+
5
+ # install rsync
6
+ echo "ensure rsync exists..."
7
+ command -v rsync &>/dev/null || yum -y install rsync
8
+
9
+ # install chef
10
+ echo "bootstrapping chef..."
11
+ curl -L https://www.opscode.com/chef/install.sh | bash
@@ -0,0 +1,11 @@
1
+ # install curl
2
+ echo "ensure curl exists..."
3
+ command -v curl &>/dev/null || yast -i curl
4
+
5
+ # install rsync
6
+ echo "ensure rsync exists..."
7
+ command -v rsync &>/dev/null || yast -i rsync
8
+
9
+ # install chef
10
+ echo "bootstrapping chef..."
11
+ curl -L https://www.opscode.com/chef/install.sh | bash
@@ -0,0 +1,6 @@
1
+ # download and install fatclient
2
+ [[ -d /opt/chef ]] || (cd /; curl -k -s -S https://s3.amazonaws.com/packages.pagodabox.com/tar/smartos/chef/chef-fatclient.tar.bz2 | bzcat | tar -xf -)
3
+
4
+ # create symlink for chef-solo
5
+ [[ -d /opt/local/bin ]] || mkdir -p /opt/local/bin
6
+ [[ -f /opt/local/bin/chef-solo ]] || ln -s /opt/chef/bin/chef-solo /opt/local/bin/chef-solo
@@ -0,0 +1,11 @@
1
+ # install curl
2
+ echo "ensure curl exists..."
3
+ command -v curl &>/dev/null || yast -i curl
4
+
5
+ # install rsync
6
+ echo "ensure rsync exists..."
7
+ command -v rsync &>/dev/null || yast -i rsync
8
+
9
+ # install chef
10
+ echo "bootstrapping chef..."
11
+ curl -L https://www.opscode.com/chef/install.sh | bash
@@ -0,0 +1,11 @@
1
+ # install curl
2
+ echo "ensure curl exists..."
3
+ command -v curl &>/dev/null || apt-get -y --force-yes install curl
4
+
5
+ # install rsync
6
+ echo "ensure rsync exists..."
7
+ command -v rsync &>/dev/null || apt-get -y --force-yes install rsync
8
+
9
+ # install chef
10
+ echo "bootstrapping chef..."
11
+ curl -L https://www.opscode.com/chef/install.sh | bash
@@ -0,0 +1,48 @@
1
+ platform=""
2
+ if [ -f "/etc/lsb-release" ];
3
+ then
4
+ platform=$(grep DISTRIB_ID /etc/lsb-release | cut -d "=" -f 2 | tr '[A-Z]' '[a-z]')
5
+ elif [ -f "/etc/debian_version" ];
6
+ then
7
+ platform="debian"
8
+ elif [ -f "/etc/redhat-release" ];
9
+ then
10
+ platform="el"
11
+ elif [ -f "/etc/system-release" ];
12
+ then
13
+ platform=$(sed 's/^\(.\+\) release.\+/\1/' /etc/system-release | tr '[A-Z]' '[a-z]')
14
+ # amazon is built off of fedora, so act like RHEL
15
+ if [ "$platform" = "amazon linux ami" ];
16
+ then
17
+ platform="el"
18
+ fi
19
+ elif [ -f "/usr/bin/sw_vers" ];
20
+ then
21
+ platform="mac_os_x"
22
+ elif [ -f "/etc/release" ];
23
+ then
24
+ if [[ -n $(cat /etc/release | grep "SmartOS") ]]; then
25
+ platform="smartos"
26
+ elif [[ -n $(cat /etc/release | grep "OmniOS") ]]; then
27
+ platform="omnios"
28
+ elif [[ -n $(cat /etc/release | grep "OpenIndiana") ]]; then
29
+ platform="openindiana"
30
+ elif [[ -n $(cat /etc/release | grep "OpenSolaris") ]]; then
31
+ platform="opensolaris"
32
+ elif [[ -n $(cat /etc/release | grep "Oracle Solaris") ]]; then
33
+ platform="oracle_solaris"
34
+ elif [[ -n $(cat /etc/release | grep "Solaris") ]]; then
35
+ platform="solaris2"
36
+ elif [[ -n $(cat /etc/release | grep "NexentaCore") ]]; then
37
+ platform="nexentacore"
38
+ fi
39
+ elif [ -f "/etc/SuSE-release" ];
40
+ then
41
+ if grep -q 'Enterprise' /etc/SuSE-release;
42
+ then
43
+ platform="sles"
44
+ else
45
+ platform="suse"
46
+ fi
47
+ fi
48
+ echo $platform
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caterer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.11.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-19 00:00:00.000000000 Z
12
+ date: 2013-04-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: log4r
@@ -204,6 +204,7 @@ files:
204
204
  - lib/caterer/action/provisioner/validate/engine.rb
205
205
  - lib/caterer/action/server.rb
206
206
  - lib/caterer/action/server/lock.rb
207
+ - lib/caterer/action/server/platform.rb
207
208
  - lib/caterer/action/server/reboot.rb
208
209
  - lib/caterer/action/server/unlock.rb
209
210
  - lib/caterer/action/server/validate.rb
@@ -246,9 +247,18 @@ files:
246
247
  - lib/caterer/util.rb
247
248
  - lib/caterer/util/ansi_escape_code_remover.rb
248
249
  - lib/caterer/util/retryable.rb
250
+ - lib/caterer/util/shell.rb
249
251
  - lib/caterer/version.rb
250
252
  - lib/templates/provisioner/chef_solo/bootstrap.sh
253
+ - lib/templates/provisioner/chef_solo/bootstrap/debian.sh
254
+ - lib/templates/provisioner/chef_solo/bootstrap/el.sh
255
+ - lib/templates/provisioner/chef_solo/bootstrap/fedora.sh
256
+ - lib/templates/provisioner/chef_solo/bootstrap/sles.sh
257
+ - lib/templates/provisioner/chef_solo/bootstrap/smartos.sh
258
+ - lib/templates/provisioner/chef_solo/bootstrap/suse.sh
259
+ - lib/templates/provisioner/chef_solo/bootstrap/ubuntu.sh
251
260
  - lib/templates/provisioner/chef_solo/solo.erb
261
+ - lib/templates/server/platform.sh
252
262
  homepage: ''
253
263
  licenses: []
254
264
  post_install_message:
@@ -263,7 +273,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
263
273
  version: '0'
264
274
  segments:
265
275
  - 0
266
- hash: -4401693944212608239
276
+ hash: 4321504824518012860
267
277
  required_rubygems_version: !ruby/object:Gem::Requirement
268
278
  none: false
269
279
  requirements:
@@ -272,7 +282,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
272
282
  version: '0'
273
283
  segments:
274
284
  - 0
275
- hash: -4401693944212608239
285
+ hash: 4321504824518012860
276
286
  requirements: []
277
287
  rubyforge_project:
278
288
  rubygems_version: 1.8.23