Updated vagrant box

This commit is contained in:
Marcos García de La Fuente 2014-07-12 14:56:22 +02:00
parent d02814192f
commit 0c8765bfe3
58 changed files with 1491 additions and 375 deletions

View File

@ -23,7 +23,7 @@ Usage
`cd` into the vagrant box directory and simply type `vagrant up`. `cd` into the vagrant box directory and simply type `vagrant up`.
That's all you need to do. It will build a brand new VirtalBox machine for you with everything you need to develop on Dolibarr. That's all you need to do. It will build a brand new VirtualBox machine for you with everything you need to develop on Dolibarr.
### Name resolution ### Name resolution
For easy access to the VM you need to setup name resolution to the machines IP. For easy access to the VM you need to setup name resolution to the machines IP.
@ -45,9 +45,16 @@ Somewhat bleeding edge vagrant box for develop branch related work.
- IP: 192.168.42.101 - IP: 192.168.42.101
- Vhost: dev.dolibarr.org - Vhost: dev.dolibarr.org
- OS: Debian Wheezy 7.5 - OS: Debian Wheezy 7.5 x64
- Webserver: Apache 2.2.22 - Webserver: Apache 2.2.22
- PHP: mod_php 5.5.13-1~dotdeb.1 - PHP: mod_php 5.5.14-1~dotdeb.1
Installed modules:
- cli
- curl
- gd
- imagick
- intl
- mcrypt
- Database: MySQL 5.5 - Database: MySQL 5.5
- Root user: root - Root user: root
- Root password: root - Root password: root
@ -55,7 +62,13 @@ Somewhat bleeding edge vagrant box for develop branch related work.
- Database user: user - Database user: user
- Database password: user - Database password: user
- Initial data: dev/initdata/mysqldump_dolibarr-3.5.0.sql - Initial data: dev/initdata/mysqldump_dolibarr-3.5.0.sql
- Database: PostgreSQL 9.3
- Adminer: lightweight database management. Access through http://192.168.42.101/adminer
- Debugger: XDebug - Debugger: XDebug
- Profiler: Xhprof - Profiler: Xhprof. Access through http://192.168.42.101/xhprof/xhprof_html
You can access MailCatcher to read all outgoing emails at http://192.168.42.101:1080 You can access MailCatcher to read all outgoing emails at http://192.168.42.101:1080
To access the machine you must use the following private keys:
- User root: located at puphpet/files/dot/ssh/root_rsa
- User vagrant: located at puphpet/files/dot/ssh/id_rsa

View File

@ -25,11 +25,19 @@ Vagrant.configure("2") do |config|
data['vm']['synced_folder'].each do |i, folder| data['vm']['synced_folder'].each do |i, folder|
if folder['source'] != '' && folder['target'] != '' if folder['source'] != '' && folder['target'] != ''
nfs = (folder['nfs'] == "true") ? "nfs" : nil if folder['sync_type'] == 'nfs'
if nfs == "nfs" config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}", type: "nfs"
config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}", type: nfs elsif folder['sync_type'] == 'smb'
config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}", type: "smb"
elsif folder['sync_type'] == 'rsync'
rsync_args = !folder['rsync']['args'].nil? ? folder['rsync']['args'] : ["--verbose", "--archive", "--delete", "-z"]
rsync_auto = !folder['rsync']['auto'].nil? ? folder['rsync']['auto'] : true
rsync_exclude = !folder['rsync']['exclude'].nil? ? folder['rsync']['exclude'] : [".vagrant/"]
config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}",
rsync__args: rsync_args, rsync__exclude: rsync_exclude, rsync__auto: rsync_auto, type: "rsync"
else else
config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}", type: nfs, config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}",
group: 'www-data', owner: 'www-data', mount_options: ["dmode=775", "fmode=764"] group: 'www-data', owner: 'www-data', mount_options: ["dmode=775", "fmode=764"]
end end
end end
@ -128,7 +136,14 @@ Vagrant.configure("2") do |config|
end end
end end
config.vm.provision :shell, :path => "puphpet/shell/execute-files.sh" config.vm.provision :shell do |s|
s.path = "puphpet/shell/execute-files.sh"
s.args = ["exec-once", "exec-always"]
end
config.vm.provision :shell, run: "always" do |s|
s.path = "puphpet/shell/execute-files.sh"
s.args = ["startup-once", "startup-always"]
end
config.vm.provision :shell, :path => "puphpet/shell/important-notices.sh" config.vm.provision :shell, :path => "puphpet/shell/important-notices.sh"
if File.file?("#{dir}/puphpet/files/dot/ssh/id_rsa") if File.file?("#{dir}/puphpet/files/dot/ssh/id_rsa")

View File

@ -29,10 +29,12 @@ vagrantfile-local:
- '--hiera_config /vagrant/puphpet/puppet/hiera.yaml' - '--hiera_config /vagrant/puphpet/puppet/hiera.yaml'
- '--parser future' - '--parser future'
synced_folder: synced_folder:
PL1BkioqqvGY: jopH6005bn96:
source: ../../../ source: ../../../
target: /var/www target: /var/www
nfs: 'false' sync_type: default
rsync:
auto: 'false'
usable_port_range: 2200..2250 usable_port_range: 2200..2250
ssh: ssh:
host: null host: null
@ -71,7 +73,7 @@ apache:
settings: settings:
user: www-data user: www-data
group: www-data group: www-data
default_vhost: false default_vhost: true
manage_user: false manage_user: false
manage_group: false manage_group: false
sendfile: 0 sendfile: 0
@ -79,7 +81,7 @@ apache:
- php - php
- rewrite - rewrite
vhosts: vhosts:
CGyWQB0fx4x0: b2tOrs1TMtoF:
servername: dev.dolibarr.org servername: dev.dolibarr.org
docroot: /var/www/htdocs docroot: /var/www/htdocs
port: '80' port: '80'
@ -97,7 +99,7 @@ apache:
nginx: nginx:
install: 0 install: 0
vhosts: vhosts:
jeF1sybIJ3V2: 0dU5luf5AnIe:
server_name: awesome.dev server_name: awesome.dev
server_aliases: server_aliases:
- www.awesome.dev - www.awesome.dev
@ -152,7 +154,7 @@ mysql:
root_password: root root_password: root
adminer: 0 adminer: 0
databases: databases:
2OfuuapoIqsl: V6H3W2FVB7Yq:
grant: grant:
- ALTER - ALTER
- CREATE - CREATE
@ -168,14 +170,14 @@ mysql:
password: user password: user
sql_file: /var/www/dev/initdata/mysqldump_dolibarr_3.5.0.sql sql_file: /var/www/dev/initdata/mysqldump_dolibarr_3.5.0.sql
postgresql: postgresql:
install: 0 install: '1'
settings: settings:
root_password: '123' root_password: root
user_group: postgres user_group: postgres
encoding: UTF8 encoding: UTF8
version: '9.3' version: '9.3'
databases: { } databases: { }
adminer: 0 adminer: '1'
mariadb: mariadb:
install: 0 install: 0
root_password: '123' root_password: '123'

View File

@ -1,4 +1 @@
ssh/id_rsa ssh/*
ssh/id_rsa.pub
ssh/insecure_private_key
ssh/id_rsa.ppk

View File

@ -279,8 +279,14 @@ if hash_key_equals($mailcatcher_values, 'install', 1) {
} }
if ! defined(Class['supervisord']) { if ! defined(Class['supervisord']) {
class{ 'puphpet::python::pip': }
class { 'supervisord': class { 'supervisord':
install_pip => true, install_pip => false,
require => [
Class['my_fw::post'],
Class['Puphpet::Python::Pip'],
],
} }
} }
@ -467,15 +473,16 @@ if hash_key_equals($apache_values, 'install', 1) {
$apache_vhosts = merge($apache_values['vhosts'], { $apache_vhosts = merge($apache_values['vhosts'], {
'default_vhost_80' => { 'default_vhost_80' => {
'servername' => 'default', 'servername' => 'default',
'serveraliases' => ['*'],
'docroot' => '/var/www/default', 'docroot' => '/var/www/default',
'port' => 80, 'port' => 80,
'default_vhost' => true,
}, },
'default_vhost_443' => { 'default_vhost_443' => {
'servername' => 'default', 'servername' => 'default',
'serveraliases' => ['*'],
'docroot' => '/var/www/default', 'docroot' => '/var/www/default',
'port' => 443, 'port' => 443,
'default_vhost' => true,
'ssl' => 1,
}, },
}) })
} else { } else {
@ -515,11 +522,11 @@ if hash_key_equals($apache_values, 'install', 1) {
create_resources(apache::vhost, { "${key}" => merge($vhost, { create_resources(apache::vhost, { "${key}" => merge($vhost, {
'custom_fragment' => template('puphpet/apache/custom_fragment.erb'), 'custom_fragment' => template('puphpet/apache/custom_fragment.erb'),
'ssl' => 'ssl' in $vhost and str2bool($vhost['ssl']) ? { true => true, default => false }, 'ssl' => 'ssl' in $vhost and str2bool($vhost['ssl']) ? { true => true, default => false },
'ssl_cert' => 'ssl_cert' in $vhost and $vhost['ssl_cert'] ? { undef => undef, '' => undef, default => $vhost['ssl_cert'] }, 'ssl_cert' => hash_key_true($vhost, 'ssl_cert') ? { true => $vhost['ssl_cert'], default => undef },
'ssl_key' => 'ssl_key' in $vhost and $vhost['ssl_key'] ? { undef => undef, '' => undef, default => $vhost['ssl_key'] }, 'ssl_key' => hash_key_true($vhost, 'ssl_cert') ? { true => $vhost['ssl_key'], default => undef },
'ssl_chain' => 'ssl_chain' in $vhost and $vhost['ssl_chain'] ? { undef => undef, '' => undef, default => $vhost['ssl_chain'] }, 'ssl_chain' => hash_key_true($vhost, 'ssl_cert') ? { true => $vhost['ssl_chain'], default => undef },
'ssl_certs_dir' => 'ssl_certs_dir' in $vhost and $vhost['ssl_certs_dir'] ? { undef => undef, '' => undef, default => $vhost['ssl_certs_dir'] } 'ssl_certs_dir' => hash_key_true($vhost, 'ssl_cert') ? { true => $vhost['ssl_certs_dir'], default => undef }
}) })
}) })
@ -662,10 +669,6 @@ if hash_key_equals($nginx_values, 'install', 1) {
} }
} elsif hash_key_equals($hhvm_values, 'install', 1) { } elsif hash_key_equals($hhvm_values, 'install', 1) {
$fastcgi_pass = '127.0.0.1:9000' $fastcgi_pass = '127.0.0.1:9000'
set_php5_fpm_sock_group_and_user { 'hhvm':
require => Package['nginx'],
}
} else { } else {
$fastcgi_pass = '' $fastcgi_pass = ''
} }
@ -1096,7 +1099,7 @@ if hash_key_equals($xhprof_values, 'install', 1)
} }
if hash_key_equals($apache_values, 'install', 1) { if hash_key_equals($apache_values, 'install', 1) {
$xhprof_webroot_location = $puphpet::params::apache_webroot_location $xhprof_webroot_location = '/var/www/default'
$xhprof_webserver_service = 'httpd' $xhprof_webserver_service = 'httpd'
} elsif hash_key_equals($nginx_values, 'install', 1) { } elsif hash_key_equals($nginx_values, 'install', 1) {
$xhprof_webroot_location = $puphpet::params::nginx_webroot_location $xhprof_webroot_location = $puphpet::params::nginx_webroot_location
@ -1216,11 +1219,11 @@ if hash_key_equals($mysql_values, 'install', 1) {
if hash_key_equals($mysql_values, 'adminer', 1) and $mysql_php_installed { if hash_key_equals($mysql_values, 'adminer', 1) and $mysql_php_installed {
if hash_key_equals($apache_values, 'install', 1) { if hash_key_equals($apache_values, 'install', 1) {
$mysql_adminer_webroot_location = $puphpet::params::apache_webroot_location $mysql_adminer_webroot_location = '/var/www/default'
} elsif hash_key_equals($nginx_values, 'install', 1) { } elsif hash_key_equals($nginx_values, 'install', 1) {
$mysql_adminer_webroot_location = $puphpet::params::nginx_webroot_location $mysql_adminer_webroot_location = $puphpet::params::nginx_webroot_location
} else { } else {
$mysql_adminer_webroot_location = $puphpet::params::apache_webroot_location $mysql_adminer_webroot_location = '/var/www/default'
} }
class { 'puphpet::adminer': class { 'puphpet::adminer':
@ -1329,11 +1332,11 @@ if hash_key_equals($postgresql_values, 'install', 1) {
if hash_key_equals($postgresql_values, 'adminer', 1) and $postgresql_php_installed { if hash_key_equals($postgresql_values, 'adminer', 1) and $postgresql_php_installed {
if hash_key_equals($apache_values, 'install', 1) { if hash_key_equals($apache_values, 'install', 1) {
$postgresql_adminer_webroot_location = $puphpet::params::apache_webroot_location $postgresql_adminer_webroot_location = '/var/www/default'
} elsif hash_key_equals($nginx_values, 'install', 1) { } elsif hash_key_equals($nginx_values, 'install', 1) {
$postgresql_adminer_webroot_location = $puphpet::params::nginx_webroot_location $postgresql_adminer_webroot_location = $puphpet::params::nginx_webroot_location
} else { } else {
$postgresql_adminer_webroot_location = $puphpet::params::apache_webroot_location $postgresql_adminer_webroot_location = '/var/www/default'
} }
class { 'puphpet::adminer': class { 'puphpet::adminer':
@ -1364,7 +1367,7 @@ define postgresql_db (
$table = "${name}.*" $table = "${name}.*"
exec{ "${name}-import": exec{ "${name}-import":
command => "psql ${name} < ${sql_file}", command => "sudo -u postgres psql ${name} < ${sql_file}",
logoutput => true, logoutput => true,
refreshonly => $refresh, refreshonly => $refresh,
require => Postgresql::Server::Db[$name], require => Postgresql::Server::Db[$name],
@ -1491,11 +1494,11 @@ if hash_key_equals($mariadb_values, 'install', 1) {
if hash_key_equals($mariadb_values, 'adminer', 1) and $mariadb_php_installed { if hash_key_equals($mariadb_values, 'adminer', 1) and $mariadb_php_installed {
if hash_key_equals($apache_values, 'install', 1) { if hash_key_equals($apache_values, 'install', 1) {
$mariadb_adminer_webroot_location = $puphpet::params::apache_webroot_location $mariadb_adminer_webroot_location = '/var/www/default'
} elsif hash_key_equals($nginx_values, 'install', 1) { } elsif hash_key_equals($nginx_values, 'install', 1) {
$mariadb_adminer_webroot_location = $puphpet::params::nginx_webroot_location $mariadb_adminer_webroot_location = $puphpet::params::nginx_webroot_location
} else { } else {
$mariadb_adminer_webroot_location = $puphpet::params::apache_webroot_location $mariadb_adminer_webroot_location = '/var/www/default'
} }
class { 'puphpet::adminer': class { 'puphpet::adminer':
@ -1662,7 +1665,7 @@ if $beanstalkd_values == undef {
} }
if hash_key_equals($apache_values, 'install', 1) { if hash_key_equals($apache_values, 'install', 1) {
$beanstalk_console_webroot_location = "${puphpet::params::apache_webroot_location}/beanstalk_console" $beanstalk_console_webroot_location = '/var/www/default/beanstalk_console'
} elsif hash_key_equals($nginx_values, 'install', 1) { } elsif hash_key_equals($nginx_values, 'install', 1) {
$beanstalk_console_webroot_location = "${puphpet::params::nginx_webroot_location}/beanstalk_console" $beanstalk_console_webroot_location = "${puphpet::params::nginx_webroot_location}/beanstalk_console"
} else { } else {

View File

@ -0,0 +1,42 @@
#
# hash_key_true.rb
#
module Puppet::Parser::Functions
newfunction(:hash_key_true, :type => :rvalue, :doc => <<-'ENDHEREDOC') do |args|
Returns true if the key within hash is truthy
ENDHEREDOC
unless args.length == 2
raise Puppet::ParseError, ("hash_key_true(): wrong number of arguments (#{args.length}; must be 2)")
end
arr = args[0]
key = args[1]
unless arr.is_a?(Hash)
return false
end
unless arr.has_key?(key)
return false
end
if arr[key].nil?
return false
end
if arr[key].empty?
return false
end
if arr[key] == 'false'
return false
end
return true
end
end

View File

@ -69,17 +69,39 @@ class puphpet::hhvm(
} }
} }
'centos': { 'centos': {
$jemalloc_url = 'http://files.puphpet.com/centos6/jemalloc-3.6.0-1.el6.x86_64.rpm'
$jemalloc_download_location = '/.puphpet-stuff/jemalloc-3.6.0-1.el6.x86_64.rpm'
$require = defined(Class['my_fw::post']) ? {
true => Class['my_fw::post'],
default => [],
}
exec { "download jemalloc to ${download_location}":
creates => $download_location,
command => "wget --quiet --tries=5 --connect-timeout=10 -O '${jemalloc_download_location}' '${jemalloc_url}'",
timeout => 30,
path => '/usr/bin',
require => $require
}
package { 'jemalloc':
ensure => latest,
provider => yum,
source => $download_location,
require => Exec["download jemalloc to ${download_location}"],
}
yum::managed_yumrepo { 'hop5': yum::managed_yumrepo { 'hop5':
descr => 'hop5 repository', descr => 'hop5 repository',
baseurl => 'http://www.hop5.in/yum/el6/', baseurl => 'http://www.hop5.in/yum/el6/',
gpgkey => 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-HOP5', gpgkey => 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-HOP5',
enabled => 1, enabled => 1,
gpgcheck => 0, gpgcheck => 0,
priority => 1 priority => 1,
} }
} }
} }
if $real_webserver == 'apache2' { if $real_webserver == 'apache2' {
if ! defined(Class['apache::mod::mime']) { if ! defined(Class['apache::mod::mime']) {
class { 'apache::mod::mime': } class { 'apache::mod::mime': }

View File

@ -0,0 +1,22 @@
class puphpet::python::pip {
Exec { path => [ '/usr/bin/', '/usr/local/bin', '/bin', '/usr/local/sbin', '/usr/sbin', '/sbin' ] }
if ! defined(Package['python-setuptools']) {
package { 'python-setuptools': }
}
exec { 'easy_install pip':
unless => 'which pip',
require => Package['python-setuptools'],
}
if $::osfamily == 'RedHat' {
exec { 'rhel pip_provider_name_fix':
command => 'alternatives --install /usr/bin/pip-python pip-python /usr/bin/pip 1',
subscribe => Exec['easy_install pip'],
unless => 'which pip-python',
}
}
}

View File

@ -1,6 +1,10 @@
fixtures: fixtures:
repositories: repositories:
stdlib: "git://github.com/puppetlabs/puppetlabs-stdlib" 'stdlib':
concat: "git://github.com/puppetlabs/puppetlabs-concat" repo: 'git://github.com/puppetlabs/puppetlabs-stdlib'
ref: '4.1.0'
'concat':
repo: 'git://github.com/puppetlabs/puppetlabs-concat'
ref: '1.0.1'
symlinks: symlinks:
supervisord: "#{source_dir}" supervisord: "#{source_dir}"

View File

@ -1,21 +1,28 @@
language: ruby language: ruby
bundler_args: --without development bundler_args: --without development
script: "bundle exec rake spec lint" script: "bundle exec rake test"
rvm: rvm:
- 1.8.7 - 1.8.7
- 1.9.3 - 1.9.3
- 2.0.0 - 2.0.0
env: env:
matrix: - PUPPET_VERSION="~> 2.7.0"
- PUPPET_GEM_VERSION="~> 2.7.0" - PUPPET_VERSION="~> 3.1.0"
- PUPPET_GEM_VERSION="~> 3.3.0" - PUPPET_VERSION="~> 3.2.0"
- PUPPET_GEM_VERSION="~> 3.4.0" - PUPPET_VERSION="~> 3.3.0"
- PUPPET_VERSION="~> 3.4.0"
- PUPPET_VERSION="~> 3.5.0"
- PUPPET_VERSION="~> 3.6.0"
matrix: matrix:
exclude: exclude:
- rvm: 1.9.3
env: PUPPET_GEM_VERSION="~> 2.7.0"
- rvm: 2.0.0 - rvm: 2.0.0
env: PUPPET_GEM_VERSION="~> 2.7.0" env: PUPPET_VERSION="~> 2.7.0"
- rvm: 1.9.3
env: PUPPET_VERSION="~> 2.7.0"
- rvm: 2.0.0
env: PUPPET_VERSION="~> 3.1.0"
- rvm: 1.8.7
env: PUPPET_VERSION="~> 3.2.0"
notifications: notifications:
email: false email: false

View File

@ -1,3 +1,66 @@
2014-06-20 - v0.4.0
Fixes:
- Removed root as group and replaced with uid 0 to enhance system
compatibility
Enhancements:
- Made package provider a user definable param see supervisord::package_provider and README for details of how to change this.
- All define types can now be automatically pulled in from hiera see example https://github.com/ajcrowe/puppet-supervisord#configure-a-program
- You can now override the default include path of $config_include/*.conf with your own array using $config_dirs. Bear in mind this would need to include whatever you set $config_include to be, with *.conf on the end.
Many thanks for the PRs from @jasperla, @mvantellingen for the bug report on the service name and @hasc for the enhancement ideas.
2014-06-06 - v0.3.3
Fixes:
- Fixed typo in stopwaitsec param, should have been stopwaitsecs, thanks to @rchrd2
2014-05-03 - v0.3.2
Changes:
- Added supervisord::executable_ctl variable for supervisorctl binary path, thanks to @bpgoldsb
2014-04-22 - v0.3.1
Fixes:
- Fixed typo in unix_socket_group param, thanks to @dig412
2014-03-11 - v0.3.0
Fixes:
- Fixed typo in fcgi config
- Fixed typo in supervisord config with minfds and minprocs, thanks to @peefourtee
- Typo in README fixed thanks to @hopkinsth
- Removed refreshonly from pip_install exec resource
- Number of syntax fixes thanks to `puppet lint`
Important Changes:
- Lots of input validation has been added **PLEASE** check your config works before upgrading!
- Changed init_extras naming to defaults and cleaned things up.
- Starting and stopping apps is now done with supervisorctl commands to avoid service restarts
Other Changes:
- CSV functions now order things consistently
- Included description for classes and functions
- Expanded spec testing built with Travis CI
- Added beaker acceptance tests
- Added greater validation of various parameters
- Added coverage reporting for resources
To-Do:
- Add support for additional OS families such as Solaris.
2013-10-31 - v0.2.3 2013-10-31 - v0.2.3
Fixes: Fixes:

View File

@ -1,14 +1,26 @@
source 'https://rubygems.org' source 'https://rubygems.org'
group :development, :test do group :test do
gem 'rake' gem 'rake'
gem 'puppetlabs_spec_helper', :require => false gem 'puppet-lint'
gem 'rspec-system-puppet', '~> 2.0' gem 'puppet-syntax'
gem 'puppet-lint', '~> 0.3.2' gem 'puppetlabs_spec_helper'
gem 'rspec-puppet', :git => 'https://github.com/rodjek/rspec-puppet.git' , :ref => 'c44381a240ec420d4ffda7bffc55ee4d9c08d682'
gem 'rspec', '2.14.1'
end end
if puppetversion = ENV['PUPPET_GEM_VERSION'] group :development do
gem 'puppet', puppetversion, :require => false gem 'travis'
else gem 'travis-lint'
gem 'puppet', :require => false gem 'beaker'
gem 'beaker-rspec'
gem 'pry'
gem 'guard-rake'
end
if puppetversion = ENV['PUPPET_VERSION']
gem 'puppet', puppetversion
else
gem 'puppet', '~> 3.4.0'
end end

View File

@ -1,5 +1,5 @@
name 'ajcrowe-supervisord' name 'ajcrowe-supervisord'
version '0.2.3' version '0.4.0'
source 'git@github.com/ajcrowe/puppet-supervisord.git' source 'git@github.com/ajcrowe/puppet-supervisord.git'
author 'Alex Crowe' author 'Alex Crowe'
license 'Apache License, Version 2.0' license 'Apache License, Version 2.0'

View File

@ -4,7 +4,7 @@
Puppet module to manage the [supervisord](http://supervisord.org/) process control system. Puppet module to manage the [supervisord](http://supervisord.org/) process control system.
Functions available to configure Functions available to configure
* [programs](http://supervisord.org/configuration.html#program-x-section-settings) * [programs](http://supervisord.org/configuration.html#program-x-section-settings)
* [groups](http://supervisord.org/configuration.html#group-x-section-settings) * [groups](http://supervisord.org/configuration.html#group-x-section-settings)
@ -31,10 +31,16 @@ class supervisord {
} }
``` ```
This will download [setuptool](https://bitbucket.org/pypa/setuptools) and install pip with easy_install. This will download [setuptool](https://bitbucket.org/pypa/setuptools) and install pip with easy_install.
You can pass a specific url with `$setuptools_url = 'url'` You can pass a specific url with `$setuptools_url = 'url'`
### Install without pip
If you want to use your system package manager you can specify that with `supervisord::package_provider`.
You'll also likely need to adjust the `supervisord::service_name` to match that installed by the system package. If you're using Debian or Redhat OS families you'll also want to disable the init scripts with `supervisord::install_init = false`.
Note: Only Debian and RedHat families have an init script currently. Note: Only Debian and RedHat families have an init script currently.
### Configure a program ### Configure a program
@ -61,23 +67,61 @@ supervisord::program { 'myprogram':
} }
``` ```
Or you can fully define your programs in hiera:
```yaml
supervisord::programs:
'myprogram':
command: 'command --args'
autostart: yes
autorestart: 'true'
environment:
HOME: '/home/myuser'
PATH: '/bin:/sbin:/usr/bin:/usr/sbin'
SECRET: 'mysecret'
```
### Configure a group ### Configure a group
```ruby ```ruby
supervisord::group { 'mygroup': supervisord::group { 'mygroup':
priority => 100, priority => 100,
program => ['program1', 'program2', 'program3'] programs => ['program1', 'program2', 'program3']
} }
``` ```
### Configure an eventlistener
```ruby
supervisord::eventlistener { 'mylistener':
command => 'command --args',
events => ['PROCESS_STATE', 'PROCESS_STATE_START']
priority => '100',
env_var => 'my_common_envs'
}
```
### Run supervisorctl Commands
Should you need to run a sequence of command with `supervisorctl` you can use the define type `supervisord::supervisorctl`
```ruby
supervisord::supervisorctl { 'restart_myapp':
command => 'restart',
process => 'myapp'
}
```
You can also issue a command without specifying a process.
### Development ### Development
If you have suggestions or improvements please file an issue or pull request, i'll try and sort them as quickly as possble. If you have suggestions or improvements please file an issue or pull request, i'll try and sort them as quickly as possble.
If you submit a pull please try and include tests for the new functionality. The module is tested with [Travis-CI](https://travis-ci.org/ajcrowe/puppet-supervisord). If you submit a pull please try and include tests for the new functionality/fix. The module is tested with [Travis-CI](https://travis-ci.org/ajcrowe/puppet-supervisord).
### Credits ### Credits
* Debian init script sourced from the system package. * Debian init script sourced from the system package.
* RedHat/Centos init script sourced from https://github.com/Supervisor/initscripts * RedHat/Centos init script sourced from https://github.com/Supervisor/initscripts

View File

@ -1,7 +1,28 @@
require 'puppetlabs_spec_helper/rake_tasks' require 'puppetlabs_spec_helper/rake_tasks'
require 'puppet-lint/tasks/puppet-lint' require 'puppet-lint/tasks/puppet-lint'
require 'rspec-system/rake_task' require 'puppet-syntax/tasks/puppet-syntax'
PuppetLint.configuration.send('disable_80chars') PuppetLint.configuration.send('disable_80chars')
PuppetLint.configuration.send('disable_class_inherits_from_params_class') PuppetLint.configuration.send('disable_class_inherits_from_params_class')
PuppetLint.configuration.send('disable_documentation') PuppetLint.configuration.send('disable_quoted_booleans')
PuppetLint.configuration.send('disable_autoloader_layout')
exclude_paths = [
"pkg/**/*",
"vendor/**/*",
"spec/**/*",
]
PuppetLint.configuration.ignore_paths = exclude_paths
PuppetSyntax.exclude_paths = exclude_paths
desc "Acceptance Tests"
RSpec::Core::RakeTask.new(:acceptance) do |t|
t.pattern = 'spec/acceptance'
end
desc "Test Suite"
task :test => [
:lint,
:syntax,
:spec
]

View File

@ -1,14 +1,12 @@
# #
# Converts the array to a csv string # Converts the array to a csv string
# #
#
# $array = [ 'string1', 'string2', 'string3' ] # $array = [ 'string1', 'string2', 'string3' ]
# #
# becomes: # becomes:
# #
# $string = "string1,string2,string3" # $string = "string1,string2,string3"
# #
module Puppet::Parser::Functions module Puppet::Parser::Functions
newfunction(:array2csv, :type => :rvalue, :doc => <<-'EOS' newfunction(:array2csv, :type => :rvalue, :doc => <<-'EOS'
Returns a sorted csv formatted string from an array in the form Returns a sorted csv formatted string from an array in the form

View File

@ -1,7 +1,6 @@
# #
# Converts the hash to a csv string # Converts the hash to a csv string
# #
#
# $hash = { # $hash = {
# HOME => '/home/user', # HOME => '/home/user',
# ENV1 => 'env1', # ENV1 => 'env1',
@ -12,7 +11,6 @@
# #
# $string = "HOME='/home/user',ENV1='env1',SECRET='secret'" # $string = "HOME='/home/user',ENV1='env1',SECRET='secret'"
# #
module Puppet::Parser::Functions module Puppet::Parser::Functions
newfunction(:hash2csv, :type => :rvalue, :doc => <<-'EOS' newfunction(:hash2csv, :type => :rvalue, :doc => <<-'EOS'
Returns a csv formatted string from an hash in the form Returns a csv formatted string from an hash in the form

View File

@ -1,6 +1,16 @@
# Class: supervisord::config
#
# Configuration class for supervisor init and conf directories
#
class supervisord::config inherits supervisord { class supervisord::config inherits supervisord {
file { [ "${supervisord::config_include}", "${supervisord::log_path}"]: file { $supervisord::config_include:
ensure => directory,
owner => 'root',
mode => '0755'
}
file { $supervisord::log_path:
ensure => directory, ensure => directory,
owner => 'root', owner => 'root',
mode => '0755' mode => '0755'
@ -15,30 +25,26 @@ class supervisord::config inherits supervisord {
} }
if $supervisord::install_init { if $supervisord::install_init {
$osname = downcase($::osfamily)
file { '/etc/init.d/supervisord': file { '/etc/init.d/supervisord':
ensure => present, ensure => present,
owner => 'root', owner => 'root',
mode => '0755', mode => '0755',
content => template("supervisord/init/${osname}_init.erb") content => template("supervisord/init/${::osfamily}/init.erb")
} }
if $supervisord::init_extras { if $supervisord::init_defaults {
file { $supervisord::init_extras: file { $supervisord::init_defaults:
ensure => present, ensure => present,
owner => 'root', owner => 'root',
mode => '0755', mode => '0755',
content => template("supervisord/init/${osname}_extra.erb") content => template("supervisord/init/${::osfamily}/defaults.erb")
} }
} }
} }
concat { $supervisord::config_file: concat { $supervisord::config_file:
owner => 'root', owner => 'root',
group => 'root', group => '0',
mode => '0755' mode => '0755'
} }

View File

@ -1,8 +1,16 @@
# Define: supervisord::eventlistener
#
# This define creates an eventlistener configuration file
#
# Documentation on parameters available at:
# http://supervisord.org/configuration.html#eventlistener-x-section-settings
#
define supervisord::eventlistener( define supervisord::eventlistener(
$command, $command,
$ensure = present, $ensure = present,
$ensure_process = 'running',
$buffer_size = 10,
$events = undef, $events = undef,
$buffer_size = undef,
$result_handler = undef, $result_handler = undef,
$env_var = undef, $env_var = undef,
$process_name = undef, $process_name = undef,
@ -15,16 +23,16 @@ define supervisord::eventlistener(
$startretries = undef, $startretries = undef,
$exitcodes = undef, $exitcodes = undef,
$stopsignal = undef, $stopsignal = undef,
$stopwaitsec = undef, $stopwaitsecs = undef,
$stopasgroup = undef, $stopasgroup = undef,
$killasgroup = undef, $killasgroup = undef,
$user = undef, $user = undef,
$redirect_stderr = undef, $redirect_stderr = undef,
$stdout_logfile = "${supervisord::log_path}/eventlistener_${name}.log", $stdout_logfile = "eventlistener_${name}.log",
$stdout_logfile_maxbytes = undef, $stdout_logfile_maxbytes = undef,
$stdout_logfile_backups = undef, $stdout_logfile_backups = undef,
$stdout_events_enabled = undef, $stdout_events_enabled = undef,
$stderr_logfile = "${supervisord::log_path}/eventlistener_${name}.error", $stderr_logfile = "eventlistener_${name}.error",
$stderr_logfile_maxbytes = undef, $stderr_logfile_maxbytes = undef,
$stderr_logfile_backups = undef, $stderr_logfile_backups = undef,
$stderr_events_enabled = undef, $stderr_events_enabled = undef,
@ -36,11 +44,45 @@ define supervisord::eventlistener(
include supervisord include supervisord
# parameter validation
validate_string($command)
validate_re($ensure_process, ['running', 'stopped', 'removed'])
validate_re($buffer_size, '^\d+')
if $events { validate_array($events) }
if $result_handler { validate_string($result_handler) }
if $numprocs { validate_re($numprocs, '^\d+')}
if $numprocs_start { validate_re($numprocs_start, '^\d+')}
if $priority { validate_re($priority, '^\d+') }
if $autostart { validate_bool($autostart) }
if $autorestart { validate_re($autorestart, ['true', 'false', 'unexpected']) }
if $startsecs { validate_re($startsecs, '^\d+')}
if $startretries { validate_re($startretries, '^\d+')}
if $exitcodes { validate_string($exitcodes)}
if $stopsignal { validate_re($stopsignal, ['TERM', 'HUP', 'INT', 'QUIT', 'KILL', 'USR1', 'USR2']) }
if $stopwaitsecs { validate_re($stopwaitsecs, '^\d+')}
if $stopasgroup { validate_bool($stopasgroup) }
if $killasgroup { validate_bool($killasgroup) }
if $user { validate_string($user) }
if $redirect_stderr { validate_bool($redirect_stderr) }
validate_string($stdout_logfile)
if $stdout_logfile_maxbytes { validate_string($stdout_logfile_maxbytes) }
if $stdout_logfile_backups { validate_re($stdout_logfile_backups, '^\d+')}
if $stdout_events_enabled { validate_bool($stdout_events_enabled) }
validate_string($stderr_logfile)
if $stderr_logfile_maxbytes { validate_string($stderr_logfile_maxbytes) }
if $stderr_logfile_backups { validate_re($stderr_logfile_backups, '^\d+')}
if $stderr_events_enabled { validate_bool($stderr_events_enabled) }
if $directory { validate_absolute_path($directory) }
if $umask { validate_re($umask, '^[0-7][0-7][0-7]$') }
# convert environment data into a csv
if $env_var { if $env_var {
$env_hash = hiera($env_var) $env_hash = hiera_hash($env_var)
validate_hash($env_hash)
$env_string = hash2csv($env_hash) $env_string = hash2csv($env_hash)
} }
elsif $environment { elsif $environment {
validate_hash($environment)
$env_string = hash2csv($environment) $env_string = hash2csv($environment)
} }
@ -55,6 +97,22 @@ define supervisord::eventlistener(
owner => 'root', owner => 'root',
mode => '0755', mode => '0755',
content => template('supervisord/conf/eventlistener.erb'), content => template('supervisord/conf/eventlistener.erb'),
notify => Class['supervisord::service'] notify => Class['supervisord::reload']
}
case $ensure_process {
'stopped': {
supervisord::supervisorctl { "stop_${name}":
command => 'stop',
process => $name
}
}
'removed': {
supervisord::supervisorctl { "remove_${name}":
command => 'remove',
process => $name
}
}
default: { }
} }
} }

View File

@ -1,7 +1,15 @@
# Define: supervisord::fcgi_program
#
# This define creates an eventlistener configuration file
#
# Documentation on parameters available at:
# http://supervisord.org/configuration.html#fcgi-program-x-section-settings
#
define supervisord::fcgi_program( define supervisord::fcgi_program(
$command, $command,
$socket, $socket,
$ensure = present, $ensure = present,
$ensure_process = 'running',
$socket_owner = undef, $socket_owner = undef,
$socket_mode = undef, $socket_mode = undef,
$env_var = undef, $env_var = undef,
@ -15,17 +23,17 @@ define supervisord::fcgi_program(
$startretries = undef, $startretries = undef,
$exitcodes = undef, $exitcodes = undef,
$stopsignal = undef, $stopsignal = undef,
$stopwaitsec = undef, $stopwaitsecs = undef,
$stopasgroup = undef, $stopasgroup = undef,
$killasgroup = undef, $killasgroup = undef,
$user = undef, $user = undef,
$redirect_stderr = undef, $redirect_stderr = undef,
$stdout_logfile = "${supervisord::log_path}/fcgi-program_${name}.log", $stdout_logfile = "fcgi-program_${name}.log",
$stdout_logfile_maxbytes = undef, $stdout_logfile_maxbytes = undef,
$stdout_logfile_backups = undef, $stdout_logfile_backups = undef,
$stdout_capture_maxbytes = undef, $stdout_capture_maxbytes = undef,
$stdout_events_enabled = undef, $stdout_events_enabled = undef,
$stderr_logfile = "${supervisord::log_path}/fcgi-program_${name}.error", $stderr_logfile = "fcgi-program_${name}.error",
$stderr_logfile_maxbytes = undef, $stderr_logfile_maxbytes = undef,
$stderr_logfile_backups = undef, $stderr_logfile_backups = undef,
$stderr_capture_maxbytes = undef, $stderr_capture_maxbytes = undef,
@ -38,11 +46,46 @@ define supervisord::fcgi_program(
include supervisord include supervisord
# parameter validation
validate_string($command)
validate_re($ensure_process, ['running', 'stopped', 'removed'])
validate_re($socket, ['^tcp:\/\/.*:\d+$', '^unix:\/\/\/'])
if $process_name { validate_string($process_name) }
if $numprocs { validate_re($numprocs, '^\d+')}
if $numprocs_start { validate_re($numprocs_start, '^\d+')}
if $priority { validate_re($priority, '^\d+') }
if $autostart { validate_bool($autostart) }
if $autorestart { validate_re($autorestart, ['true', 'false', 'unexpected']) }
if $startsecs { validate_re($startsecs, '^\d+')}
if $startretries { validate_re($startretries, '^\d+')}
if $exitcodes { validate_string($exitcodes)}
if $stopsignal { validate_re($stopsignal, ['TERM', 'HUP', 'INT', 'QUIT', 'KILL', 'USR1', 'USR2']) }
if $stopwaitsecs { validate_re($stopwaitsecs, '^\d+')}
if $stopasgroup { validate_bool($stopasgroup) }
if $killasgroup { validate_bool($killasgroup) }
if $user { validate_string($user) }
if $redirect_stderr { validate_bool($redirect_stderr) }
validate_string($stdout_logfile)
if $stdout_logfile_maxbytes { validate_string($stdout_logfile_maxbytes) }
if $stdout_logfile_backups { validate_re($stdout_logfile_backups, '^\d+')}
if $stdout_capture_maxbytes { validate_string($stdout_capture_maxbytes) }
if $stdout_events_enabled { validate_bool($stdout_events_enabled) }
validate_string($stderr_logfile)
if $stderr_logfile_maxbytes { validate_string($stderr_logfile_maxbytes) }
if $stderr_logfile_backups { validate_re($stderr_logfile_backups, '^\d+')}
if $stderr_capture_maxbytes { validate_string($stderr_capture_maxbytes) }
if $stderr_events_enabled { validate_bool($stderr_events_enabled) }
if $directory { validate_absolute_path($directory) }
if $umask { validate_re($umask, '^[0-7][0-7][0-7]$') }
# convert environment data into a csv
if $env_var { if $env_var {
$env_hash = hiera($env_var) $env_hash = hiera_hash($env_var)
validate_hash($env_hash)
$env_string = hash2csv($env_hash) $env_string = hash2csv($env_hash)
} }
elsif $environment { elsif $environment {
validate_hash($environment)
$env_string = hash2csv($environment) $env_string = hash2csv($environment)
} }
@ -53,6 +96,22 @@ define supervisord::fcgi_program(
owner => 'root', owner => 'root',
mode => '0755', mode => '0755',
content => template('supervisord/conf/fcgi_program.erb'), content => template('supervisord/conf/fcgi_program.erb'),
notify => Class['supervisord::service'] notify => Class['supervisord::reload']
}
case $ensure_process {
'stopped': {
supervisord::supervisorctl { "stop_${name}":
command => 'stop',
process => $name
}
}
'removed': {
supervisord::supervisorctl { "remove_${name}":
command => 'remove',
process => $name
}
}
default: { }
} }
} }

View File

@ -1,3 +1,10 @@
# Define: supervisord::group
#
# This define creates an group configuration file
#
# Documentation on parameters available at:
# http://supervisord.org/configuration.html#group-x-section-settings
#
define supervisord::group ( define supervisord::group (
$programs, $programs,
$ensure = present, $ensure = present,
@ -6,6 +13,10 @@ define supervisord::group (
include supervisord include supervisord
# parameter validation
validate_array($programs)
if $priority { validate_re($priority, '^\d+', "invalid priority value of: ${priority}") }
$progstring = array2csv($programs) $progstring = array2csv($programs)
$conf = "${supervisord::config_include}/group_${name}.conf" $conf = "${supervisord::config_include}/group_${name}.conf"
@ -13,6 +24,7 @@ define supervisord::group (
ensure => $ensure, ensure => $ensure,
owner => 'root', owner => 'root',
mode => '0755', mode => '0755',
content => template('supervisord/conf/group.erb') content => template('supervisord/conf/group.erb'),
notify => Class['supervisord::reload']
} }
} }

View File

@ -1,12 +1,18 @@
# This class installs supervisord and configured it to run on boot # Class: supervisord
#
# This class installs supervisord via pip
#
class supervisord( class supervisord(
$package_ensure = $supervisord::params::package_ensure, $package_ensure = $supervisord::params::package_ensure,
$package_provider = $supervisord::params::package_provider,
$service_ensure = $supervisord::params::service_ensure, $service_ensure = $supervisord::params::service_ensure,
$service_name = $supervisord::params::service_name,
$install_init = $supervisord::params::install_init, $install_init = $supervisord::params::install_init,
$install_pip = false, $install_pip = false,
$init_extras = $supervisord::params::init_extras, $init_defaults = $supervisord::params::init_defaults,
$setuptools_url = $supervisord::params::setuptools_url, $setuptools_url = $supervisord::params::setuptools_url,
$executable = $supervisord::params::executable, $executable = $supervisord::params::executable,
$executable_ctl = $supervisord::params::executable_ctl,
$log_path = $supervisord::params::log_path, $log_path = $supervisord::params::log_path,
$log_file = $supervisord::params::log_file, $log_file = $supervisord::params::log_file,
@ -19,20 +25,20 @@ class supervisord(
$nodaemon = $supervisord::params::nodaemon, $nodaemon = $supervisord::params::nodaemon,
$minfds = $supervisord::params::minfds, $minfds = $supervisord::params::minfds,
$minprocs = $supervisord::params::minprocs, $minprocs = $supervisord::params::minprocs,
$config_path = $supervisord::params::config_path,
$config_include = $supervisord::params::config_include, $config_include = $supervisord::params::config_include,
$config_file = $supervisord::params::config_file, $config_file = $supervisord::params::config_file,
$config_dirs = undef,
$umask = $supervisord::params::umask, $umask = $supervisord::params::umask,
$unix_socket = $supervisord::params::unix_socket, $unix_socket = $supervisord::params::unix_socket,
$unix_socket_file = $supervisord::params::unix_socket_file, $unix_socket_file = $supervisord::params::unix_socket_file,
$unix_socket_mode = $supervisord::params::unix_socket_mode, $unix_socket_mode = $supervisord::params::unix_socket_mode,
$unix_socket_owner = $supervisord::params::unix_socket_owner, $unix_socket_owner = $supervisord::params::unix_socket_owner,
$unix_scoket_group = $supervisord::params::unix_socket_group, $unix_socket_group = $supervisord::params::unix_socket_group,
$inet_server = $supervisord::params::inet_server, $inet_server = $supervisord::params::inet_server,
$inet_server_hostname = $supervisord::params::inet_hostname, $inet_server_hostname = $supervisord::params::inet_server_hostname,
$inet_server_port = $supervisord::params::inet_port, $inet_server_port = $supervisord::params::inet_server_port,
$unix_auth = false, $unix_auth = false,
$unix_username = undef, $unix_username = undef,
@ -47,26 +53,76 @@ class supervisord(
$childlogdir = undef, $childlogdir = undef,
$environment = undef, $environment = undef,
$env_var = undef, $env_var = undef,
$directory = undef,
$strip_ansi = false, $strip_ansi = false,
$nocleanup = false $nocleanup = false,
$eventlisteners = {},
$fcgi_programs = {},
$groups = {},
$programs = {}
) inherits supervisord::params { ) inherits supervisord::params {
validate_bool($install_pip)
validate_bool($install_init)
validate_bool($nodaemon)
validate_bool($unix_auth)
validate_bool($inet_auth)
validate_bool($strip_ansi)
validate_bool($nocleanup)
validate_hash($eventlisteners)
validate_hash($fcgi_programs)
validate_hash($groups)
validate_hash($programs)
validate_absolute_path($config_include)
validate_absolute_path($log_path)
validate_absolute_path($run_path)
if $childlogdir { validate_absolute_path($childlogdir) }
if $directory { validate_absolute_path($directory) }
$log_levels = ['^critical$', '^error$', '^warn$', '^info$', '^debug$', '^trace$', '^blather$']
validate_re($log_level, $log_levels, "invalid log_level: ${log_level}")
validate_re($umask, '^0[0-7][0-7]$', "invalid umask: ${umask}.")
validate_re($unix_socket_mode, '^[0-7][0-7][0-7][0-7]$', "invalid unix_socket_mode: ${unix_socket_mode}")
if ! is_integer($logfile_backups) { fail("invalid logfile_backups: ${logfile_backups}.")}
if ! is_integer($minfds) { fail("invalid minfds: ${minfds}.")}
if ! is_integer($minprocs) { fail("invalid minprocs: ${minprocs}.")}
if ! is_integer($inet_server_port) { fail("invalid inet_server_port: ${inet_server_port}.")}
if $env_var { if $env_var {
validate_hash($env_var)
$env_hash = hiera($env_var) $env_hash = hiera($env_var)
$env_string = hash2csv($env_hash) $env_string = hash2csv($env_hash)
} }
elsif $environment { elsif $environment {
validate_hash($environment)
$env_string = hash2csv($environment) $env_string = hash2csv($environment)
} }
if $config_dirs {
validate_array($config_dirs)
$config_include_string = join($config_dirs, " ")
}
else {
$config_include_string = "${config_include}/*.conf"
}
create_resources('supervisord::eventlistener', $eventlisteners)
create_resources('supervisord::fcgi_program', $fcgi_programs)
create_resources('supervisord::group', $groups)
create_resources('supervisord::program', $programs)
if $install_pip { if $install_pip {
include supervisord::pip include supervisord::pip
Class['supervisord::pip'] -> Class['supervisord::install'] Class['supervisord::pip'] -> Class['supervisord::install']
} }
include supervisord::install, supervisord::config, supervisord::service include supervisord::install, supervisord::config, supervisord::service, supervisord::reload
Class['supervisord::install'] -> Class['supervisord::config'] ~> Class['supervisord::service'] Class['supervisord::install'] -> Class['supervisord::config'] ~> Class['supervisord::service']
Class['supervisord::reload'] -> Supervisord::Supervisorctl <| |>
} }

View File

@ -1,6 +1,10 @@
# Class supervisord::install
#
# Installs supervisor package (defaults to using pip)
#
class supervisord::install inherits supervisord { class supervisord::install inherits supervisord {
package { 'supervisor': package { 'supervisor':
ensure => $supervisord::package_ensure, ensure => $supervisord::package_ensure,
provider => 'pip' provider => $supervisord::package_provider
} }
} }

View File

@ -1,13 +1,21 @@
# Class: supervisord::params
#
# Default parameters for supervisord
#
class supervisord::params { class supervisord::params {
# default supervisord params
$package_ensure = 'installed' $package_ensure = 'installed'
$package_provider = 'pip'
$service_ensure = 'running' $service_ensure = 'running'
$service_name = 'supervisord'
$package_name = 'supervisor' $package_name = 'supervisor'
$executable = '/usr/local/bin/supervisord' $executable = 'supervisord'
$executable_ctl = 'supervisorctl'
$run_path = '/var/run' $run_path = '/var/run'
$pid_file = "${run_path}/supervisord.pid" $pid_file = 'supervisord.pid'
$log_path = '/var/log/supervisor' $log_path = '/var/log/supervisor'
$log_file = "${log_path}/supervisord.log" $log_file = 'supervisord.log'
$logfile_maxbytes = '50MB' $logfile_maxbytes = '50MB'
$logfile_backups = '10' $logfile_backups = '10'
$log_level = 'info' $log_level = 'info'
@ -20,7 +28,7 @@ class supervisord::params {
$setuptools_url = 'https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py' $setuptools_url = 'https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py'
$unix_socket = true $unix_socket = true
$unix_socket_file = "${run_path}/supervisor.sock" $unix_socket_file = 'supervisor.sock'
$unix_socket_mode = '0700' $unix_socket_mode = '0700'
$unix_socket_owner = 'nobody' $unix_socket_owner = 'nobody'
@ -31,17 +39,17 @@ class supervisord::params {
case $::osfamily { case $::osfamily {
'RedHat': { 'RedHat': {
$init_extras = '/etc/sysconfig/supervisord' $init_defaults = '/etc/sysconfig/supervisord'
$unix_socket_group = 'nobody' $unix_socket_group = 'nobody'
$install_init = true $install_init = true
} }
'Debian': { 'Debian': {
$init_extras = '/etc/default/supervisor' $init_defaults = '/etc/default/supervisor'
$unix_socket_group = 'nogroup' $unix_socket_group = 'nogroup'
$install_init = true $install_init = true
} }
default: { default: {
$init_extras = false $init_defaults = false
$unix_socket_group = 'nogroup' $unix_socket_group = 'nogroup'
$install_init = false $install_init = false
} }

View File

@ -1,8 +1,10 @@
# Class: supervisord::pip
#
# Optional class to install setuptool and pip
#
class supervisord::pip inherits supervisord { class supervisord::pip inherits supervisord {
Exec { Exec { path => [ '/usr/bin/', '/usr/local/bin', '/bin', '/usr/local/sbin', '/usr/sbin', '/sbin' ] }
path => '/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin'
}
exec { 'install_setuptools': exec { 'install_setuptools':
command => "curl ${supervisord::setuptools_url} | python", command => "curl ${supervisord::setuptools_url} | python",

View File

@ -1,6 +1,14 @@
# Define: supervisord::program
#
# This define creates an program configuration file
#
# Documentation on parameters available at:
# http://supervisord.org/configuration.html#program-x-section-settings
#
define supervisord::program( define supervisord::program(
$command, $command,
$ensure = present, $ensure = present,
$ensure_process = 'running',
$env_var = undef, $env_var = undef,
$process_name = undef, $process_name = undef,
$numprocs = undef, $numprocs = undef,
@ -12,17 +20,17 @@ define supervisord::program(
$startretries = undef, $startretries = undef,
$exitcodes = undef, $exitcodes = undef,
$stopsignal = undef, $stopsignal = undef,
$stopwaitsec = undef, $stopwaitsecs = undef,
$stopasgroup = undef, $stopasgroup = undef,
$killasgroup = undef, $killasgroup = undef,
$user = undef, $user = undef,
$redirect_stderr = undef, $redirect_stderr = undef,
$stdout_logfile = "${supervisord::log_path}/program_${name}.log", $stdout_logfile = "program_${name}.log",
$stdout_logfile_maxbytes = undef, $stdout_logfile_maxbytes = undef,
$stdout_logfile_backups = undef, $stdout_logfile_backups = undef,
$stdout_capture_maxbytes = undef, $stdout_capture_maxbytes = undef,
$stdout_events_enabled = undef, $stdout_events_enabled = undef,
$stderr_logfile = "${supervisord::log_path}/program_${name}.error", $stderr_logfile = "program_${name}.error",
$stderr_logfile_maxbytes = undef, $stderr_logfile_maxbytes = undef,
$stderr_logfile_backups = undef, $stderr_logfile_backups = undef,
$stderr_capture_maxbytes = undef, $stderr_capture_maxbytes = undef,
@ -35,11 +43,45 @@ define supervisord::program(
include supervisord include supervisord
# parameter validation
validate_string($command)
validate_re($ensure_process, ['running', 'stopped', 'removed'])
if $process_name { validate_string($process_name) }
if $numprocs { validate_re($numprocs, '^\d+')}
if $numprocs_start { validate_re($numprocs_start, '^\d+')}
if $priority { validate_re($priority, '^\d+') }
if $autostart { validate_bool($autostart) }
if $autorestart { validate_re($autorestart, ['true', 'false', 'unexpected']) }
if $startsecs { validate_re($startsecs, '^\d+')}
if $startretries { validate_re($startretries, '^\d+')}
if $exitcodes { validate_string($exitcodes)}
if $stopsignal { validate_re($stopsignal, ['TERM', 'HUP', 'INT', 'QUIT', 'KILL', 'USR1', 'USR2']) }
if $stopwaitsecs { validate_re($stopwaitsecs, '^\d+')}
if $stopasgroup { validate_bool($stopasgroup) }
if $killasgroup { validate_bool($killasgroup) }
if $user { validate_string($user) }
if $redirect_stderr { validate_bool($redirect_stderr) }
validate_string($stdout_logfile)
if $stdout_logfile_maxbytes { validate_string($stdout_logfile_maxbytes) }
if $stdout_logfile_backups { validate_re($stdout_logfile_backups, '^\d+')}
if $stdout_capture_maxbytes { validate_string($stdout_capture_maxbytes) }
if $stdout_events_enabled { validate_bool($stdout_events_enabled) }
validate_string($stderr_logfile)
if $stderr_logfile_maxbytes { validate_string($stderr_logfile_maxbytes) }
if $stderr_logfile_backups { validate_re($stderr_logfile_backups, '^\d+')}
if $stderr_capture_maxbytes { validate_string($stderr_capture_maxbytes) }
if $stderr_events_enabled { validate_bool($stderr_events_enabled) }
if $directory { validate_absolute_path($directory) }
if $umask { validate_re($umask, '^[0-7][0-7][0-7]$') }
# convert environment data into a csv
if $env_var { if $env_var {
$env_hash = hiera($env_var) $env_hash = hiera_hash($env_var)
validate_hash($env_hash)
$env_string = hash2csv($env_hash) $env_string = hash2csv($env_hash)
} }
elsif $environment { elsif $environment {
validate_hash($environment)
$env_string = hash2csv($environment) $env_string = hash2csv($environment)
} }
@ -50,6 +92,22 @@ define supervisord::program(
owner => 'root', owner => 'root',
mode => '0755', mode => '0755',
content => template('supervisord/conf/program.erb'), content => template('supervisord/conf/program.erb'),
notify => Class['supervisord::service'] notify => Class['supervisord::reload']
}
case $ensure_process {
'stopped': {
supervisord::supervisorctl { "stop_${name}":
command => 'stop',
process => $name
}
}
'removed': {
supervisord::supervisorctl { "remove_${name}":
command => 'remove',
process => $name
}
}
default: { }
} }
} }

View File

@ -0,0 +1,21 @@
# Class: supervisord::reload
#
# Class to reread and update supervisord with supervisorctl
#
class supervisord::reload {
Exec { path => [ '/usr/bin/', '/usr/local/bin' ] }
$supervisorctl = $::supervisord::executable_ctl
exec { 'supervisorctl_reread':
command => "${supervisorctl} reread",
refreshonly => true,
returns => [0, 2],
}
exec { 'supervisorctl_update':
command => "${supervisorctl} update",
refreshonly => true,
returns => [0, 2],
}
}

View File

@ -1,5 +1,9 @@
# Class: supervisord::service
#
# Class for the supervisord service
#
class supervisord::service inherits supervisord { class supervisord::service inherits supervisord {
service { 'supervisord': service { $supervisord::service_name:
ensure => $supervisord::service_ensure, ensure => $supervisord::service_ensure,
enable => true, enable => true,
hasrestart => true, hasrestart => true,

View File

@ -0,0 +1,29 @@
# Define: supervisord:supervisorctl
#
# This define executes command with the supervisorctl tool
#
define supervisord::supervisorctl(
$command,
$process = undef,
$refreshonly = false
) {
Exec { path => [ '/usr/bin/', '/usr/local/bin' ] }
validate_string($command)
validate_string($process)
$supervisorctl = $::supervisord::executable_ctl
if $process {
$cmd = join([$supervisorctl, $command, $process], ' ')
}
else {
$cmd = join([$supervisorctl, $command])
}
exec { "supervisorctl_command_${name}":
command => $cmd,
refreshonly => $refreshonly
}
}

View File

@ -0,0 +1,10 @@
HOSTS:
centos-65-i386:
roles:
- master
platform: el-6-i386
box : centos-65-i386-virtualbox-nocm
box_url : http://puppet-vagrant-boxes.puppetlabs.com/centos-65-i386-virtualbox-nocm.box
hypervisor : vagrant
CONFIG:
type: foss

View File

@ -0,0 +1,10 @@
HOSTS:
centos-65-x64:
roles:
- master
platform: el-6-x86_64
box : centos-65-x64-virtualbox-nocm
box_url : http://puppet-vagrant-boxes.puppetlabs.com/centos-65-x64-virtualbox-nocm.box
hypervisor : vagrant
CONFIG:
type: foss

View File

@ -0,0 +1,10 @@
HOSTS:
debian-73-i386:
roles:
- master
platform: debian-7-i386
box : debian-73-i386-virtualbox-nocm
box_url : http://puppet-vagrant-boxes.puppetlabs.com/debian-73-i386-virtualbox-nocm.box
hypervisor : vagrant
CONFIG:
type: foss

View File

@ -0,0 +1,10 @@
HOSTS:
debian-73-x64:
roles:
- master
platform: debian-7-amd64
box : debian-73-x64-virtualbox-nocm
box_url : http://puppet-vagrant-boxes.puppetlabs.com/debian-73-x64-virtualbox-nocm.box
hypervisor : vagrant
CONFIG:
type: foss

View File

@ -0,0 +1,10 @@
HOSTS:
debian-73-x64:
roles:
- master
platform: debian-7-amd64
box : debian-73-x64-virtualbox-nocm
box_url : http://puppet-vagrant-boxes.puppetlabs.com/debian-73-x64-virtualbox-nocm.box
hypervisor : vagrant
CONFIG:
type: foss

View File

@ -0,0 +1,114 @@
require 'spec_helper_acceptance'
describe 'supervisord install' do
context 'default parameters with pip and init install' do
it 'should work with no errors' do
pp = <<-EOS
class { 'supervisord': install_pip => true, install_init => true}
EOS
expect(apply_manifest(pp).exit_code).to_not eq(1)
expect(apply_manifest(pp).exit_code).to eq(0)
end
describe service('supervisord') do
it { should be_enabled }
it { should be_running }
it 'should restart successfully' do
cmd="service supervisord restart"
expect(shell(cmd).exit_code).to_not eq(1)
end
end
end
end
describe 'supervisord::program' do
context 'create a program config' do
it 'should install a program file' do
pp = <<-EOS
include supervisord
supervisord::program { 'test':
command => 'echo',
priority => '100',
environment => {
'HOME' => '/root',
'PATH' => '/bin',
}
}
EOS
expect(apply_manifest(pp).exit_code).to_not eq(1)
expect(apply_manifest(pp).exit_code).to eq(0)
end
it 'should contain the correct values' do
cmd='grep command=echo /etc/supervisor.d/program_test.conf'
expect(shell(cmd).exit_code).to eq(0)
cmd='grep priority=100 /etc/supervisor.d/program_test.conf'
expect(shell(cmd).exit_code).to eq(0)
cmd='grep "environment=" /etc/supervisor.d/program_test.conf'
expect(shell(cmd).exit_code).to eq(0)
end
end
end
describe 'supervisord::fcgi-program' do
context 'create fcgi-program config' do
it 'should install a fcgi-program file' do
pp = <<-EOS
include supervisord
supervisord::fcgi_program { 'test':
socket => 'tcp://localhost:1000',
command => 'echo',
priority => '100',
environment => {
'HOME' => '/root',
'PATH' => '/bin',
}
}
EOS
expect(apply_manifest(pp).exit_code).to_not eq(1)
expect(apply_manifest(pp).exit_code).to eq(0)
end
it 'should contain the correct values' do
cmd='grep socket=tcp://localhost:1000 /etc/supervisor.d/fcgi-program_test.conf'
expect(shell(cmd).exit_code).to eq(0)
cmd="grep command=echo /etc/supervisor.d/fcgi-program_test.conf"
expect(shell(cmd).exit_code).to eq(0)
cmd="grep priority=100 /etc/supervisor.d/fcgi-program_test.conf"
expect(shell(cmd).exit_code).to eq(0)
cmd='grep "environment=" /etc/supervisor.d/fcgi-program_test.conf'
expect(shell(cmd).exit_code).to eq(0)
end
end
end
describe 'supervisord::group' do
context 'create group config' do
it 'should install a group config' do
pp = <<-EOS
include supervisord
supervisord::group { 'test':
programs => ['test'],
priority => '100',
}
EOS
expect(apply_manifest(pp).exit_code).to_not eq(1)
expect(apply_manifest(pp).exit_code).to eq(0)
end
it 'should contain the correct values' do
cmd='grep "programs=test" /etc/supervisor.d/group_test.conf'
expect(shell(cmd).exit_code).to eq(0)
cmd="grep priority=100 /etc/supervisor.d/group_test.conf"
expect(shell(cmd).exit_code).to eq(0)
end
end
end

View File

@ -3,14 +3,26 @@ require 'spec_helper'
describe 'supervisord' do describe 'supervisord' do
concatdir = '/var/lib/puppet/concat' concatdir = '/var/lib/puppet/concat'
configfile = '/etc/supervisord.conf'
let(:facts) {{ :concat_basedir => concatdir }} let(:facts) {{ :concat_basedir => concatdir }}
it { should contain_class('supervisord') } it { should contain_class('supervisord') }
it { should contain_class('supervisord::install') } it { should contain_class('supervisord::install') }
it { should contain_class('supervisord::config') } it { should contain_class('supervisord::config') }
it { should contain_class('supervisord::service') } it { should contain_class('supervisord::service') }
it { should contain_concat__fragment('supervisord_main').with_content(/logfile/) } it { should contain_class('supervisord::params') }
it { should contain_class('supervisord::reload') }
it { should contain_package('supervisor') }
describe '#service_name' do
context 'default' do
it { should contain_service('supervisord') }
end
context 'specified' do
let(:params) {{ :service_name => 'myservicename' }}
it { should contain_service('myservicename') }
end
end
describe '#install_pip' do describe '#install_pip' do
context 'default' do context 'default' do
@ -18,8 +30,16 @@ describe 'supervisord' do
end end
context 'true' do context 'true' do
let (:params) {{ :install_pip => true }} let(:params) {{ :install_pip => true }}
it { should contain_class('supervisord::pip') } it { should contain_class('supervisord::pip') }
it { should contain_exec('install_setuptools') }
it { should contain_exec('install_pip') }
end
context 'true and RedHat' do
let(:params) {{ :install_pip => true }}
let(:facts) {{ :osfamily => 'RedHat', :concat_basedir => concatdir }}
it { should contain_exec('pip_provider_name_fix') }
end end
end end
@ -28,11 +48,6 @@ describe 'supervisord' do
it { should contain_class('supervisord').without_env_hash } it { should contain_class('supervisord').without_env_hash }
it { should contain_class('supervisord').without_env_string } it { should contain_class('supervisord').without_env_string }
end end
#context 'is specified' do
# let(:params) {{ :env_var => 'foovars' }}
# let(:hiera_data) {{ :foovars => { 'key1' => 'value1', 'key2' => 'value2' } }}
# it { should contain_concat__fragment('supervisord_main').with_content(/environment=key1='value1',key2='value2'/) }
#end
end end
describe '#environment' do describe '#environment' do
@ -41,7 +56,8 @@ describe 'supervisord' do
end end
context 'is specified' do context 'is specified' do
let(:params) {{ :environment => { 'key1' => 'value1', 'key2' => 'value2' } }} let(:params) {{ :environment => { 'key1' => 'value1', 'key2' => 'value2' } }}
it { should contain_concat__fragment('supervisord_main').with_content(/environment=key1='value1',key2='value2'/) } it { should contain_concat__fragment('supervisord_main')\
.with_content(/environment=key1='value1',key2='value2'/) }
end end
end end
@ -54,17 +70,20 @@ describe 'supervisord' do
it { should_not contain_file('/etc/init.d/supervisord') } it { should_not contain_file('/etc/init.d/supervisord') }
end end
describe 'on supported OS' describe 'on supported OS' do
context 'with Debian' do context 'with Debian' do
let(:facts) {{ :osfamily => 'Debian', :concat_basedir => concatdir }} let(:facts) {{ :osfamily => 'Debian', :concat_basedir => concatdir }}
it { should contain_file('/etc/init.d/supervisord') } it { should contain_file('/etc/init.d/supervisord') }
it { should contain_file('/etc/default/supervisor') }
end end
context 'with RedHat' do context 'with RedHat' do
let(:facts) {{ :osfamily => 'RedHat', :concat_basedir => concatdir }} let(:facts) {{ :osfamily => 'RedHat', :concat_basedir => concatdir }}
it { should contain_file('/etc/init.d/supervisord') } it { should contain_file('/etc/init.d/supervisord') }
it { should contain_file('/etc/sysconfig/supervisord') }
end end
end end
end
describe '#unix_socket' do describe '#unix_socket' do
context 'default' do context 'default' do
@ -89,10 +108,192 @@ describe 'supervisord' do
describe '#run_path' do describe '#run_path' do
context 'default' do context 'default' do
it { should_not contain_file('/var/run') } it { should_not contain_file('/var/run') }
it { should contain_concat__fragment('supervisord_main') \
.with_content(/pidfile=\/var\/run\/supervisord.pid$/) }
end end
context 'custom setting' do context 'is specified' do
let(:params) {{ :run_path => '/var/run/supervisord'}} let(:params) {{ :run_path => '/opt/supervisord/run' }}
it { should contain_file('/var/run/supervisord') } it { should contain_file('/opt/supervisord/run') }
it { should contain_concat__fragment('supervisord_main') \
.with_content(/pidfile=\/opt\/supervisord\/run\/supervisord.pid$/) }
end
end
describe '#log_path' do
context 'default' do
it { should contain_file('/var/log/supervisor') }
it { should contain_concat__fragment('supervisord_main') \
.with_content(/logfile=\/var\/log\/supervisor\/supervisord.log$/) }
end
context 'is specified' do
let(:params) {{ :log_path => '/opt/supervisord/logs' }}
it { should contain_file('/opt/supervisord/logs')}
it { should contain_concat__fragment('supervisord_main') \
.with_content(/logfile=\/opt\/supervisord\/logs\/supervisord.log$/) }
end
end
describe '#config_include' do
context 'default' do
it { should contain_file('/etc/supervisor.d') }
it { should contain_concat__fragment('supervisord_main') \
.with_content(/files=\/etc\/supervisor.d\/\*.conf$/) }
end
context 'is specified' do
let(:params) {{ :config_include => '/opt/supervisord/conf.d' }}
it { should contain_file('/opt/supervisord/conf.d') }
it { should contain_concat__fragment('supervisord_main') \
.with_content(/files=\/opt\/supervisord\/conf.d\/\*.conf$/) }
end
end
describe '#config_dirs' do
context 'is specified' do
let(:params) {{ :config_dirs => ['/etc/supervisor.d/*.conf', '/opt/supervisor.d/*', '/usr/share/supervisor.d/*.config'] }}
it { should contain_concat__fragment('supervisord_main') \
.with_content(/files=\/etc\/supervisor.d\/\*.conf \/opt\/supervisor.d\/\* \/usr\/share\/supervisor.d\/\*.config$/) }
end
end
describe '#config_file' do
context 'default' do
it { should contain_file('/etc/supervisord.conf') }
end
context 'is specified' do
let(:params) {{ :config_file => '/opt/supervisord/supervisor.conf' }}
it { should contain_file('/opt/supervisord/supervisor.conf') }
end
end
describe '#nodaemon' do
context 'default' do
it { should contain_concat__fragment('supervisord_main') \
.with_content(/nodaemon=false$/) }
end
context 'true' do
let(:params) {{ :nodaemon => true }}
it { should contain_concat__fragment('supervisord_main') \
.with_content(/nodaemon=true$/) }
end
context 'invalid' do
let(:params) {{ :nodaemon => 'invalid' }}
it { expect { raise_error(Puppet::Error, /is not a boolean/) }}
end
end
describe '#minfds' do
context 'default' do
it { should contain_concat__fragment('supervisord_main') \
.with_content(/minfds=1024$/) }
end
context 'specified' do
let(:params) {{ :minfds => 2048 }}
it { should contain_concat__fragment('supervisord_main') \
.with_content(/minfds=2048$/) }
end
context 'invalid' do
let(:params) {{ :minfds => 'string' }}
it { expect { raise_error(Puppet::Error, /invalid minfds/) }}
end
end
describe '#minprocs' do
context 'default' do
it { should contain_concat__fragment('supervisord_main') \
.with_content(/minprocs=200$/) }
end
context 'specified' do
let(:params) {{ :minprocs => 300 }}
it { should contain_concat__fragment('supervisord_main') \
.with_content(/minprocs=300$/) }
end
context 'invalid' do
let(:params) {{ :minfds => 'string' }}
it { expect { raise_error(Puppet::Error, /invalid minprocs/) }}
end
end
describe '#strip_ansi' do
context 'default' do
it { should_not contain_concat__fragment('supervisord_main') \
.with_content(/strip_ansi$/) }
end
context 'true' do
let(:params) {{ :strip_ansi => true }}
it { should contain_concat__fragment('supervisord_main') \
.with_content(/strip_ansi=true$/) }
end
context 'invalid' do
let(:params) {{ :strip_ansi => 'string' }}
it { expect { raise_error(Puppet::Error, /is not a boolean/) }}
end
end
describe '#user' do
context 'default' do
it { should_not contain_concat__fragment('supervisord_main') \
.with_content(/user$/) }
end
context 'specified' do
let(:params) {{ :user => 'myuser' }}
it { should contain_concat__fragment('supervisord_main') \
.with_content(/user=myuser$/) }
end
end
describe '#identifier' do
context 'default' do
it { should_not contain_concat__fragment('supervisord_main') \
.with_content(/identifier$/) }
end
context 'specified' do
let(:params) {{ :identifier => 'myidentifier' }}
it { should contain_concat__fragment('supervisord_main') \
.with_content(/identifier=myidentifier$/) }
end
end
describe '#directory' do
context 'default' do
it { should_not contain_concat__fragment('supervisord_main') \
.with_content(/directory$/) }
end
context 'specified' do
let(:params) {{ :directory => '/opt/supervisord' }}
it { should contain_concat__fragment('supervisord_main') \
.with_content(/directory=\/opt\/supervisord$/) }
end
end
describe '#nocleanup' do
context 'default' do
it { should_not contain_concat__fragment('supervisord_main') \
.with_content(/nocleanup$/) }
end
context 'true' do
let(:params) {{ :nocleanup => true }}
it { should contain_concat__fragment('supervisord_main') \
.with_content(/nocleanup=true$/) }
end
context 'invalid' do
let(:params) {{ :nocleanup => 'string' }}
it { expect { raise_error(Puppet::Error, /is not a boolean/) }}
end
end
describe '#childlogdir' do
context 'default' do
it { should_not contain_concat__fragment('supervisord_main') \
.with_content(/childlogdir$/) }
end
context 'specified' do
let(:params) {{ :childlogdir => '/opt/supervisord/logdir' }}
it { should contain_concat__fragment('supervisord_main') \
.with_content(/childlogdir=\/opt\/supervisord\/logdir$/) }
end
context 'invalid' do
let(:params) {{ :childlogdir => 'not_a_path' }}
it { expect { raise_error(Puppet::Error, /is not an absolute path/) }}
end end
end end
end end

View File

@ -2,14 +2,85 @@ require 'spec_helper'
describe 'supervisord::eventlistener', :type => :define do describe 'supervisord::eventlistener', :type => :define do
let(:title) {'foo'} let(:title) {'foo'}
let(:default_params) {{ :command => 'bar',
:stdout_logfile => '/var/log/supervisor/eventlistener_foo.log',
:stderr_logfile => '/var/log/supervisor/eventlistener_foo.error',
}}
let(:params) { default_params }
let(:facts) {{ :concat_basedir => '/var/lib/puppet/concat' }} let(:facts) {{ :concat_basedir => '/var/lib/puppet/concat' }}
let(:default_params) do
{
:command => 'bar',
:process_name => '%(process_num)s',
:events => ['PROCESS_STATE', 'PROCESS_STATE_STARTING'],
:buffer_size => 10,
:numprocs => '1',
:numprocs_start => '0',
:priority => '999',
:autostart => true,
:autorestart => 'unexpected',
:startsecs => '1',
:startretries => '3',
:exitcodes => '0,2',
:stopsignal => 'TERM',
:stopwaitsecs => '10',
:stopasgroup => true,
:killasgroup => true,
:user => 'baz',
:redirect_stderr => true,
:stdout_logfile => 'eventlistener_foo.log',
:stdout_logfile_maxbytes => '50MB',
:stdout_logfile_backups => '10',
:stdout_events_enabled => true,
:stderr_logfile => 'eventlistener_foo.error',
:stderr_logfile_maxbytes => '50MB',
:stderr_logfile_backups => '10',
:stderr_events_enabled => true,
:environment => { 'env1' => 'value1', 'env2' => 'value2' },
:directory => '/opt/supervisord/chroot',
:umask => '022',
:serverurl => 'AUTO'
}
end
it { should contain_supervisord__eventlistener('foo') } context 'default' do
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/command=bar/) } let(:params) { default_params }
it { should contain_supervisord__eventlistener('foo') }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/\[eventlistener:foo\]/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/command=bar/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/process_name=\%\(process_num\)s/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/events=PROCESS_STATE,PROCESS_STATE_STARTING/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/buffer_size=10/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/numprocs=1/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/numprocs_start=0/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/priority=999/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/autostart=true/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/startsecs=1/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/startretries=3/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/exitcodes=0,2/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stopsignal=TERM/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stopwaitsecs=10/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stopasgroup=true/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/killasgroup=true/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/user=baz/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/redirect_stderr=true/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stdout_logfile=\/var\/log\/supervisor\/eventlistener_foo.log/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stdout_logfile_maxbytes=50MB/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stdout_logfile_backups=10/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stdout_events_enabled=true/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stderr_logfile=\/var\/log\/supervisor\/eventlistener_foo.error/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stderr_logfile_maxbytes=50MB/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stderr_logfile_backups=10/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stderr_events_enabled=true/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/environment=env1='value1',env2='value2'/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/directory=\/opt\/supervisord\/chroot/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/umask=022/) }
it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/serverurl=AUTO/) }
end
context 'ensure_process_stopped' do
let(:params) { default_params.merge({ :ensure_process => 'stopped' }) }
it { should contain_supervisord__supervisorctl('stop_foo') }
end
context 'ensure_process_removed' do
let(:params) { default_params.merge({ :ensure_process => 'removed' }) }
it { should contain_supervisord__supervisorctl('remove_foo') }
end
end end

View File

@ -2,21 +2,87 @@ require 'spec_helper'
describe 'supervisord::fcgi_program', :type => :define do describe 'supervisord::fcgi_program', :type => :define do
let(:title) {'foo'} let(:title) {'foo'}
let(:default_params) {{ :command => 'bar',
:socket => 'tcp://localhost:1000',
:stdout_logfile => '/var/log/supervisor/fcgi-program_foo.log',
:stderr_logfile => '/var/log/supervisor/fcgi-program_foo.error',
:user => 'baz'
}}
let(:params) { default_params }
let(:facts) {{ :concat_basedir => '/var/lib/puppet/concat' }} let(:facts) {{ :concat_basedir => '/var/lib/puppet/concat' }}
let(:default_params) do
{
:command => 'bar',
:socket => 'tcp://localhost:1000',
:process_name => '%(process_num)s',
:numprocs => '1',
:numprocs_start => '0',
:priority => '999',
:autostart => true,
:autorestart => 'unexpected',
:startsecs => '1',
:startretries => '3',
:exitcodes => '0,2',
:stopsignal => 'TERM',
:stopwaitsecs => '10',
:stopasgroup => true,
:killasgroup => true,
:user => 'baz',
:redirect_stderr => true,
:stdout_logfile => 'fcgi-program_foo.log',
:stdout_logfile_maxbytes => '50MB',
:stdout_logfile_backups => '10',
:stdout_capture_maxbytes => '0',
:stdout_events_enabled => true,
:stderr_logfile => 'fcgi-program_foo.error',
:stderr_logfile_maxbytes => '50MB',
:stderr_logfile_backups => '10',
:stderr_capture_maxbytes => '0',
:stderr_events_enabled => true,
:environment => { 'env1' => 'value1', 'env2' => 'value2' },
:directory => '/opt/supervisord/chroot',
:umask => '022',
:serverurl => 'AUTO'
}
end
it { should contain_supervisord__fcgi_program('foo') } context 'default' do
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/\[fcgi-program:foo\]/) } let(:params) { default_params }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/socket=tcp:\/\/localhost:1000/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/command=bar/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/user=baz/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stdout_logfile=\/var\/log\/supervisor\/fcgi-program_foo.log/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stderr_logfile=\/var\/log\/supervisor\/fcgi-program_foo.error/) }
it { should contain_supervisord__fcgi_program('foo') }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/\[fcgi-program:foo\]/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/socket=tcp:\/\/localhost:1000/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/command=bar/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/process_name=\%\(process_num\)s/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/numprocs=1/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/numprocs_start=0/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/priority=999/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/autostart=true/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/startsecs=1/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/startretries=3/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/exitcodes=0,2/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stopsignal=TERM/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stopwaitsecs=10/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stopasgroup=true/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/killasgroup=true/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/user=baz/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/redirect_stderr=true/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stdout_logfile=\/var\/log\/supervisor\/fcgi-program_foo.log/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stdout_logfile_maxbytes=50MB/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stdout_logfile_backups=10/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stdout_capture_maxbytes=0/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stdout_events_enabled=true/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stderr_logfile=\/var\/log\/supervisor\/fcgi-program_foo.error/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stderr_logfile_maxbytes=50MB/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stderr_logfile_backups=10/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stderr_capture_maxbytes=0/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stderr_events_enabled=true/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/environment=env1='value1',env2='value2'/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/directory=\/opt\/supervisord\/chroot/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/umask=022/) }
it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/serverurl=AUTO/) }
end
context 'ensure_process_stopped' do
let(:params) { default_params.merge({ :ensure_process => 'stopped' }) }
it { should contain_supervisord__supervisorctl('stop_foo') }
end
context 'ensure_process_removed' do
let(:params) { default_params.merge({ :ensure_process => 'removed' }) }
it { should contain_supervisord__supervisorctl('remove_foo') }
end
end end

View File

@ -2,19 +2,85 @@ require 'spec_helper'
describe 'supervisord::program', :type => :define do describe 'supervisord::program', :type => :define do
let(:title) {'foo'} let(:title) {'foo'}
let(:default_params) {{ :command => 'bar',
:stdout_logfile => '/var/log/supervisor/program_foo.log',
:stderr_logfile => '/var/log/supervisor/program_foo.error',
:user => 'baz'
}}
let(:params) { default_params }
let(:facts) {{ :concat_basedir => '/var/lib/puppet/concat' }} let(:facts) {{ :concat_basedir => '/var/lib/puppet/concat' }}
let(:default_params) do
{
:command => 'bar',
:process_name => '%(process_num)s',
:numprocs => '1',
:numprocs_start => '0',
:priority => '999',
:autostart => true,
:autorestart => 'unexpected',
:startsecs => '1',
:startretries => '3',
:exitcodes => '0,2',
:stopsignal => 'TERM',
:stopwaitsecs => '10',
:stopasgroup => true,
:killasgroup => true,
:user => 'baz',
:redirect_stderr => true,
:stdout_logfile => 'program_foo.log',
:stdout_logfile_maxbytes => '50MB',
:stdout_logfile_backups => '10',
:stdout_capture_maxbytes => '0',
:stdout_events_enabled => true,
:stderr_logfile => 'program_foo.error',
:stderr_logfile_maxbytes => '50MB',
:stderr_logfile_backups => '10',
:stderr_capture_maxbytes => '0',
:stderr_events_enabled => true,
:environment => { 'env1' => 'value1', 'env2' => 'value2' },
:directory => '/opt/supervisord/chroot',
:umask => '022',
:serverurl => 'AUTO'
}
end
it { should contain_supervisord__program('foo') } context 'default' do
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/\[program:foo\]/) } let(:params) { default_params }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/command=bar/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/user=baz/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stdout_logfile=\/var\/log\/supervisor\/program_foo.log/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stderr_logfile=\/var\/log\/supervisor\/program_foo.error/) }
it { should contain_supervisord__program('foo') }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/\[program:foo\]/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/command=bar/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/process_name=\%\(process_num\)s/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/numprocs=1/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/numprocs_start=0/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/priority=999/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/autostart=true/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/startsecs=1/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/startretries=3/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/exitcodes=0,2/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stopsignal=TERM/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stopwaitsecs=10/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stopasgroup=true/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/killasgroup=true/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/user=baz/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/redirect_stderr=true/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stdout_logfile=\/var\/log\/supervisor\/program_foo.log/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stdout_logfile_maxbytes=50MB/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stdout_logfile_backups=10/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stdout_capture_maxbytes=0/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stdout_events_enabled=true/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stderr_logfile=\/var\/log\/supervisor\/program_foo.error/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stderr_logfile_maxbytes=50MB/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stderr_logfile_backups=10/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stderr_capture_maxbytes=0/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stderr_events_enabled=true/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/environment=env1='value1',env2='value2'/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/directory=\/opt\/supervisord\/chroot/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/umask=022/) }
it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/serverurl=AUTO/) }
end
context 'ensure_process_stopped' do
let(:params) { default_params.merge({ :ensure_process => 'stopped' }) }
it { should contain_supervisord__supervisorctl('stop_foo') }
end
context 'ensure_process_removed' do
let(:params) { default_params.merge({ :ensure_process => 'removed' }) }
it { should contain_supervisord__supervisorctl('remove_foo') }
end
end end

View File

@ -0,0 +1,13 @@
require 'spec_helper'
describe 'supervisord::supervisorctl', :type => :define do
let(:title) {'command_foo'}
let(:default_params) {{
:command => 'command',
:process => 'foo'
}}
let(:params) { default_params }
let(:facts) {{ :concat_basedir => '/var/lib/puppet/concat' }}
it { should contain_supervisord__supervisorctl('command_foo') }
end

View File

@ -7,3 +7,4 @@ RSpec.configure do |c|
c.manifest_dir = File.join(fixture_path, 'manifests') c.manifest_dir = File.join(fixture_path, 'manifests')
end end
at_exit { RSpec::Puppet::Coverage.report! }

View File

@ -0,0 +1,24 @@
require 'beaker-rspec'
hosts.each do |host|
# Install Puppet
install_puppet
end
RSpec.configure do |c|
# Project root
proj_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
# Readable test descriptions
c.formatter = :documentation
# Configure all nodes in nodeset
c.before :suite do
# Install module
puppet_module_install(:source => proj_root, :module_name => 'supervisord')
hosts.each do |host|
on host, puppet('module','install','puppetlabs-stdlib'), { :acceptable_exit_codes => [0,1] }
on host, puppet('module','install','puppetlabs-concat'), { :acceptable_exit_codes => [0,1] }
end
end
end

View File

@ -1,25 +0,0 @@
require 'rspec-system/spec_helper'
require 'rspec-system-puppet/helpers'
include RSpecSystemPuppet::Helpers
RSpec.configure do |c|
# Project root
proj_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
# Enable colour
c.tty = true
# This is where we 'setup' the nodes before running our tests
c.before :suite do
# Install puppet
puppet_install
puppet_master_install
# Replace mymodule with your module name
puppet_module_install(:source => proj_root, :module_name => 'supervisord')
shell('puppet module install puppetlabs/stdlib')
shell('puppet module install puppetlabs/concat')
end
end

View File

@ -1,120 +0,0 @@
require 'spec_helper_system'
describe 'basic install' do
it 'class should work with no errors' do
pp = <<-EOS
class { 'supervisord': install_pip => true, install_init => true}
EOS
puppet_apply(pp) do |r|
r.exit_code.should_not == 1
r.refresh
r.exit_code.should be_zero
end
shell("pgrep supervisord") do |r|
r.exit_code.should be_zero
end
end
end
describe 'add a program config' do
it 'supervisord::program should install a program config' do
pp = <<-EOS
include supervisord
supervisord::program { 'test':
command => 'echo',
priority => '100',
environment => {
'HOME' => '/root',
'PATH' => '/bin',
}
}
EOS
puppet_apply(pp) do |r|
r.exit_code.should_not == 1
r.refresh
r.exit_code.should be_zero
end
shell("grep command=echo /etc/supervisor.d/program_test.conf") do |r|
r.exit_code.should be_zero
end
shell("grep priority=100 /etc/supervisor.d/program_test.conf") do |r|
r.exit_code.should be_zero
end
shell('grep "environment=" /etc/supervisor.d/program_test.conf') do |r|
r.exit_code.should be_zero
end
end
end
describe 'add a fcgi-program config' do
it 'supervisord::fcgi_program should install a program config' do
pp = <<-EOS
include supervisord
supervisord::fcgi_program { 'test':
socket => 'tcp://localhost:1000',
command => 'echo',
priority => '100',
environment => {
'HOME' => '/root',
'PATH' => '/bin',
}
}
EOS
puppet_apply(pp) do |r|
r.exit_code.should_not == 1
r.refresh
r.exit_code.should be_zero
end
shell("grep socket=tcp://localhost:1000 /etc/supervisor.d/fcgi-program_test.conf") do |r|
r.exit_code.should be_zero
end
shell("grep command=echo /etc/supervisor.d/fcgi-program_test.conf") do |r|
r.exit_code.should be_zero
end
shell("grep priority=100 /etc/supervisor.d/fcgi-program_test.conf") do |r|
r.exit_code.should be_zero
end
shell('grep "environment=" /etc/supervisor.d/fcgi-program_test.conf') do |r|
r.exit_code.should be_zero
end
end
end
describe 'add a group config' do
it 'supervisord::group should install a program config' do
pp = <<-EOS
include supervisord
supervisord::group { 'test':
programs => ['program1', 'program2'],
priority => '100',
}
EOS
puppet_apply(pp) do |r|
r.exit_code.should_not == 1
r.refresh
r.exit_code.should be_zero
end
shell('grep "programs=program1,program2" /etc/supervisor.d/group_test.conf') do |r|
r.exit_code.should be_zero
end
shell("grep priority=100 /etc/supervisor.d/fcgi-program_test.conf") do |r|
r.exit_code.should be_zero
end
end
end

View File

@ -39,8 +39,8 @@ exitcodes=<%= @exitcodes %>
<% if @stopsignal -%> <% if @stopsignal -%>
stopsignal=<%= @stopsignal %> stopsignal=<%= @stopsignal %>
<% end -%> <% end -%>
<% if @stopwaitsec -%> <% if @stopwaitsecs -%>
stopwaitsec=<%= @stopwaitsec %> stopwaitsecs=<%= @stopwaitsecs %>
<% end -%> <% end -%>
<% if @stopasgroup -%> <% if @stopasgroup -%>
stopasgroup=<%= @stopasgroup %> stopasgroup=<%= @stopasgroup %>
@ -54,7 +54,7 @@ user=<%= @user %>
<% if @redirect_stderr -%> <% if @redirect_stderr -%>
redirect_stderr=<%= @redirect_stderr %> redirect_stderr=<%= @redirect_stderr %>
<% end -%> <% end -%>
stdout_logfile=<%= @stdout_logfile %> stdout_logfile=<%= scope.lookupvar('supervisord::log_path') %>/<%= @stdout_logfile %>
<% if @stdout_logfile_maxbytes -%> <% if @stdout_logfile_maxbytes -%>
stdout_logfile_maxbytes=<%= @stdout_logfile_maxbytes %> stdout_logfile_maxbytes=<%= @stdout_logfile_maxbytes %>
<% end -%> <% end -%>
@ -64,7 +64,7 @@ stdout_logfile_backups=<%= @stdout_logfile_backups %>
<% if @stdout_events_enabled -%> <% if @stdout_events_enabled -%>
stdout_events_enabled=<%= @stdout_events_enabled %> stdout_events_enabled=<%= @stdout_events_enabled %>
<% end -%> <% end -%>
stderr_logfile=<%= @stderr_logfile %> stderr_logfile=<%= scope.lookupvar('supervisord::log_path') %>/<%= @stderr_logfile %>
<% if @stderr_logfile_maxbytes -%> <% if @stderr_logfile_maxbytes -%>
stderr_logfile_maxbytes=<%= @stderr_logfile_maxbytes %> stderr_logfile_maxbytes=<%= @stderr_logfile_maxbytes %>
<% end -%> <% end -%>

View File

@ -37,8 +37,8 @@ exitcodes=<%= @exitcodes %>
<% if @stopsignal -%> <% if @stopsignal -%>
stopsignal=<%= @stopsignal %> stopsignal=<%= @stopsignal %>
<% end -%> <% end -%>
<% if @stopwaitsec -%> <% if @stopwaitsecs -%>
stopwaitsec=<%= @stopwaitsec %> stopwaitsecs=<%= @stopwaitsecs %>
<% end -%> <% end -%>
<% if @stopasgroup -%> <% if @stopasgroup -%>
stopasgroup=<%= @stopasgroup %> stopasgroup=<%= @stopasgroup %>
@ -53,7 +53,7 @@ user=<%= @user %>
redirect_stderr=<%= @redirect_stderr %> redirect_stderr=<%= @redirect_stderr %>
<% end -%> <% end -%>
<% if @stdout_logfile -%> <% if @stdout_logfile -%>
stdout_logfile=<%= @stdout_logfile %> stdout_logfile=<%= scope.lookupvar('supervisord::log_path') %>/<%= @stdout_logfile %>
<% end -%> <% end -%>
<% if @stdout_logfile_maxbytes -%> <% if @stdout_logfile_maxbytes -%>
stdout_logfile_maxbytes=<%= @stdout_logfile_maxbytes %> stdout_logfile_maxbytes=<%= @stdout_logfile_maxbytes %>
@ -68,7 +68,7 @@ stdout_capture_maxbytes=<%= @stdout_capture_maxbytes %>
stdout_events_enabled=<%= @stdout_events_enabled %> stdout_events_enabled=<%= @stdout_events_enabled %>
<% end -%> <% end -%>
<% if @stderr_logfile -%> <% if @stderr_logfile -%>
stderr_logfile=<%= @stderr_logfile %> stderr_logfile=<%= scope.lookupvar('supervisord::log_path') %>/<%= @stderr_logfile %>
<% end -%> <% end -%>
<% if @stderr_logfile_maxbytes -%> <% if @stderr_logfile_maxbytes -%>
stderr_logfile_maxbytes=<%= @stderr_logfile_maxbytes %> stderr_logfile_maxbytes=<%= @stderr_logfile_maxbytes %>

View File

@ -30,8 +30,8 @@ exitcodes=<%= @exitcodes %>
<% if @stopsignal -%> <% if @stopsignal -%>
stopsignal=<%= @stopsignal %> stopsignal=<%= @stopsignal %>
<% end -%> <% end -%>
<% if @stopwaitsec -%> <% if @stopwaitsecs -%>
stopwaitsec=<%= @stopwaitsec %> stopwaitsecs=<%= @stopwaitsecs %>
<% end -%> <% end -%>
<% if @stopasgroup -%> <% if @stopasgroup -%>
stopasgroup=<%= @stopasgroup %> stopasgroup=<%= @stopasgroup %>
@ -46,7 +46,7 @@ user=<%= @user %>
redirect_stderr=<%= @redirect_stderr %> redirect_stderr=<%= @redirect_stderr %>
<% end -%> <% end -%>
<% if @stdout_logfile -%> <% if @stdout_logfile -%>
stdout_logfile=<%= @stdout_logfile %> stdout_logfile=<%= scope.lookupvar('supervisord::log_path') %>/<%= @stdout_logfile %>
<% end -%> <% end -%>
<% if @stdout_logfile_maxbytes -%> <% if @stdout_logfile_maxbytes -%>
stdout_logfile_maxbytes=<%= @stdout_logfile_maxbytes %> stdout_logfile_maxbytes=<%= @stdout_logfile_maxbytes %>
@ -61,7 +61,7 @@ stdout_capture_maxbytes=<%= @stdout_capture_maxbytes %>
stdout_events_enabled=<%= @stdout_events_enabled %> stdout_events_enabled=<%= @stdout_events_enabled %>
<% end -%> <% end -%>
<% if @stderr_logfile -%> <% if @stderr_logfile -%>
stderr_logfile=<%= @stderr_logfile %> stderr_logfile=<%= scope.lookupvar('supervisord::log_path') %>/<%= @stderr_logfile %>
<% end -%> <% end -%>
<% if @stderr_logfile_maxbytes -%> <% if @stderr_logfile_maxbytes -%>
stderr_logfile_maxbytes=<%= @stderr_logfile_maxbytes %> stderr_logfile_maxbytes=<%= @stderr_logfile_maxbytes %>

View File

@ -19,15 +19,15 @@ DESC=supervisor
test -x $DAEMON || exit 0 test -x $DAEMON || exit 0
LOGDIR=<%= @log_path %> LOGDIR=<%= @log_path %>
PIDFILE=<%= @pid_file %> PIDFILE=<%= @run_path %>/<%= @pid_file %>
DODTIME=5 # Time to wait for the server to die, in seconds DODTIME=5 # Time to wait for the server to die, in seconds
# If this value is set too low you might not # If this value is set too low you might not
# let some servers to die gracefully and # let some servers to die gracefully and
# 'restart' will not work # 'restart' will not work
# Include supervisor defaults if available # Include supervisor defaults if available
if [ -f /etc/default/supervisor ] ; then if [ -f <%= @init_defaults %> ] ; then
. /etc/default/supervisor . <%= @init_defaults %>
fi fi
set -e set -e

View File

@ -5,4 +5,4 @@ set -a
# should probably put both of these options as runtime arguments # should probably put both of these options as runtime arguments
OPTIONS="-c <%= @config_file %>" OPTIONS="-c <%= @config_file %>"
PIDFILE=<%= @pid_file %> PIDFILE=<%= @run_path %><%= @pid_file %>

View File

@ -13,18 +13,19 @@
# xmlrpc interface as well as a few other nifty features. # xmlrpc interface as well as a few other nifty features.
# processname: supervisord # processname: supervisord
# config: <%= @config_file %> # config: <%= @config_file %>
# pidfile: <%= @pid_file %> # pidfile: <%= @run_path %>/<%= @pid_file %>
# #
# source function library # source function library
. /etc/rc.d/init.d/functions . /etc/rc.d/init.d/functions
# source system settings # source system settings
[ -e <%= @init_extras %> ] && . <%= @init_extras %> [ -e <%= @init_defaults %> ] && . <%= @init_defaults %>
RETVAL=0 RETVAL=0
DAEMON=/usr/bin/supervisord DAEMON=/usr/bin/supervisord
DESC=supervisord DESC=supervisord
PIDFILE=<%= @run_path %>/<%= @pid_file %>
running_pid() running_pid()
{ {

View File

@ -1,9 +1,9 @@
[supervisord] [supervisord]
logfile=<%= @log_file %> logfile=<%= @log_path %>/<%= @log_file %>
pidfile=<%= @pid_file %> pidfile=<%= @run_path %>/<%= @pid_file %>
nodaemon=<%= @nodaemon %> nodaemon=<%= @nodaemon %>
minfds=<%= @minfds %> minfds=<%= @minfds %>
minfds=<%= @minprocs %> minprocs=<%= @minprocs %>
umask=<%= @umask %> umask=<%= @umask %>
<% if @strip_ansi -%> <% if @strip_ansi -%>
strip_ansi=<%= @strip_ansi %> strip_ansi=<%= @strip_ansi %>
@ -12,7 +12,7 @@ strip_ansi=<%= @strip_ansi %>
user=<%= @user %> user=<%= @user %>
<% end -%> <% end -%>
<% if @identifier -%> <% if @identifier -%>
indentifier=<%= @identifier %> identifier=<%= @identifier %>
<% end -%> <% end -%>
<% if @directory -%> <% if @directory -%>
directory=<%= @directory %> directory=<%= @directory %>
@ -31,4 +31,4 @@ environment=<%= @env_string %>
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[include] [include]
files=<%= @config_include %>/*.conf files=<%= @config_include_string %>

View File

@ -1,5 +1,5 @@
[unix_http_server] [unix_http_server]
file=<%= @unix_socket_file %> file=<%= @run_path %>/<%= @unix_socket_file %>
chmod=<%= @unix_socket_mode %> chmod=<%= @unix_socket_mode %>
chown=<%= @unix_socket_owner %>:<%= @unix_socket_group %> chown=<%= @unix_socket_owner %>:<%= @unix_socket_group %>
<% if @unix_auth -%> <% if @unix_auth -%>
@ -8,7 +8,7 @@ password=<%= @unix_socket_password %>
<% end -%> <% end -%>
[supervisorctl] [supervisorctl]
serverurl=unix://<%= @unix_socket_file %> serverurl=unix://<%= @run_path %>/<%= @unix_socket_file %>
<% if @unix_auth -%> <% if @unix_auth -%>
username=<%= @unix_username %> username=<%= @unix_username %>
password=<%= @unix_password %> password=<%= @unix_password %>

View File

@ -1,9 +1,35 @@
supervisord::program { 'myprogram': supervisord::program { 'myprogram':
command => 'command --args', command => 'command --args',
priority => '100', process_name => '%(process_num)s',
environment => { numprocs => '1',
numprocs_start => '0',
priority => '999',
autostart => true,
autorestart => 'unexpected',
startsecs => '1',
startretries => '3',
exitcodes => '0,2',
stopsignal => 'TERM',
stopwaitsecs => '10',
stopasgroup => false,
killasgroup => false,
redirect_stderr => false,
stdout_logfile => 'program_foo.log',
stdout_logfile_maxbytes => '50MB',
stdout_logfile_backups => '10',
stdout_capture_maxbytes => '0',
stdout_events_enabled => false,
stderr_logfile => 'program_foo.error',
stderr_logfile_maxbytes => '50MB',
stderr_logfile_backups => '10',
stderr_capture_maxbytes => '0',
stderr_events_enabled => false,
environment => {
'HOME' => '/home/myuser', 'HOME' => '/home/myuser',
'PATH' => '/bin:/sbin:/usr/bin:/usr/sbin', 'PATH' => '/bin:/sbin:/usr/bin:/usr/sbin',
'SECRET' => 'mysecret' 'SECRET' => 'mysecret'
} },
directory => undef,
umask => '022',
serverurl => 'AUTO'
} }

View File

@ -4,17 +4,26 @@ export DEBIAN_FRONTEND=noninteractive
VAGRANT_CORE_FOLDER=$(cat '/.puphpet-stuff/vagrant-core-folder.txt') VAGRANT_CORE_FOLDER=$(cat '/.puphpet-stuff/vagrant-core-folder.txt')
shopt -s nullglob EXEC_ONCE_DIR="$1"
files=("${VAGRANT_CORE_FOLDER}"/files/exec-once/*) EXEC_ALWAYS_DIR="$2"
if [[ ! -f '/.puphpet-stuff/exec-once-ran' && (${#files[@]} -gt 0) ]]; then shopt -s nullglob
echo 'Running files in files/exec-once' files=("${VAGRANT_CORE_FOLDER}"/files/"${EXEC_ONCE_DIR}"/*)
find "${VAGRANT_CORE_FOLDER}/files/exec-once" -maxdepth 1 -not -path '*/\.*' -type f \( ! -iname "empty" \) -exec chmod +x '{}' \; -exec {} \;
echo 'Finished running files in files/exec-once' if [[ (${#files[@]} -gt 0) ]]; then
echo 'To run again, delete file /.puphpet-stuff/exec-once-ran' echo "Running files in files/${EXEC_ONCE_DIR}"
touch /.puphpet-stuff/exec-once-ran
if [ ! -d "/.puphpet-stuff/${EXEC_ONCE_DIR}-ran" ]; then
mkdir "/.puphpet-stuff/${EXEC_ONCE_DIR}-ran"
echo "Created directory /.puphpet-stuff/${EXEC_ONCE_DIR}-ran"
fi
find "${VAGRANT_CORE_FOLDER}/files/${EXEC_ONCE_DIR}" -maxdepth 1 -not -path '*/\.*' -type f \( ! -iname "empty" \) -exec cp -n '{}' "/.puphpet-stuff/${EXEC_ONCE_DIR}-ran" \;
find "/.puphpet-stuff/${EXEC_ONCE_DIR}-ran" -maxdepth 1 -type f -exec chmod +x '{}' \; -exec {} \; -exec sh -c '>{}' \;
echo "Finished running files in files/${EXEC_ONCE_DIR}"
echo "To run again, delete file(s) you want rerun in /.puphpet-stuff/${EXEC_ONCE_DIR}-ran or the whole folder to rerun all"
fi fi
echo 'Running files in files/exec-always' echo "Running files in files/${EXEC_ALWAYS_DIR}"
find "${VAGRANT_CORE_FOLDER}/files/exec-always" -maxdepth 1 -not -path '*/\.*' -type f \( ! -iname "empty" \) -exec chmod +x '{}' \; -exec {} \; find "${VAGRANT_CORE_FOLDER}/files/${EXEC_ALWAYS_DIR}" -maxdepth 1 -not -path '*/\.*' -type f \( ! -iname "empty" \) -exec chmod +x '{}' \; -exec {} \;
echo 'Finished running files in files/exec-always' echo "Finished running files in files/${EXEC_ALWAYS_DIR}"

View File

@ -5,37 +5,76 @@ VAGRANT_CORE_FOLDER=$(cat '/.puphpet-stuff/vagrant-core-folder.txt')
OS=$(/bin/bash "${VAGRANT_CORE_FOLDER}/shell/os-detect.sh" ID) OS=$(/bin/bash "${VAGRANT_CORE_FOLDER}/shell/os-detect.sh" ID)
VAGRANT_SSH_USERNAME=$(echo "$1") VAGRANT_SSH_USERNAME=$(echo "$1")
if [[ ! -f "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa" ]]; then function create_key()
ssh-keygen -f "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa" -P "" {
BASE_KEY_NAME=$(echo "$1")
if [[ ! -f "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.ppk" ]]; then if [[ ! -f "${VAGRANT_CORE_FOLDER}/files/dot/ssh/${BASE_KEY_NAME}" ]]; then
if [ "${OS}" == 'debian' ] || [ "${OS}" == 'ubuntu' ]; then ssh-keygen -f "${VAGRANT_CORE_FOLDER}/files/dot/ssh/${BASE_KEY_NAME}" -P ""
apt-get install -y putty-tools >/dev/null
elif [ "${OS}" == 'centos' ]; then if [[ ! -f "${VAGRANT_CORE_FOLDER}/files/dot/ssh/${BASE_KEY_NAME}.ppk" ]]; then
yum -y install putty >/dev/null if [ "${OS}" == 'debian' ] || [ "${OS}" == 'ubuntu' ]; then
apt-get install -y putty-tools >/dev/null
elif [ "${OS}" == 'centos' ]; then
yum -y install putty >/dev/null
fi
puttygen "${VAGRANT_CORE_FOLDER}/files/dot/ssh/${BASE_KEY_NAME}" -O private -o "${VAGRANT_CORE_FOLDER}/files/dot/ssh/${BASE_KEY_NAME}.ppk"
fi fi
puttygen "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa" -O private -o "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.ppk" echo "Your private key for SSH-based authentication has been saved to 'puphpet/files/dot/ssh/${BASE_KEY_NAME}'!"
else
echo "Pre-existing private key found at 'puphpet/files/dot/ssh/${BASE_KEY_NAME}'"
fi fi
}
echo 'Your private key for SSH-based authentication have been saved to "puphpet/files/dot/ssh/"!' create_key 'root_id_rsa'
else create_key 'id_rsa'
echo 'Using pre-existing private key at "puphpet/files/dot/ssh/id_rsa"'
PUBLIC_SSH_KEY=$(cat "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub")
echo 'Adding generated key to /root/.ssh/id_rsa'
echo 'Adding generated key to /root/.ssh/id_rsa.pub'
echo 'Adding generated key to /root/.ssh/authorized_keys'
mkdir -p /root/.ssh
cp "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa" '/root/.ssh/'
cp "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub" '/root/.ssh/'
if [[ ! -f '/root/.ssh/authorized_keys' ]] || ! grep -q "${PUBLIC_SSH_KEY}" '/root/.ssh/authorized_keys'; then
cat "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub" >> '/root/.ssh/authorized_keys'
fi fi
echo 'Adding generated key to /root/.ssh/authorized_keys' chown -R root '/root/.ssh'
mkdir -p /root/.ssh chgrp -R root '/root/.ssh'
cat "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub" > '/root/.ssh/authorized_keys' chmod 700 '/root/.ssh'
chmod 644 '/root/.ssh/id_rsa.pub'
chmod 600 '/root/.ssh/id_rsa'
chmod 600 '/root/.ssh/authorized_keys' chmod 600 '/root/.ssh/authorized_keys'
if [ "${VAGRANT_SSH_USERNAME}" != 'root' ]; then if [ "${VAGRANT_SSH_USERNAME}" != 'root' ]; then
VAGRANT_SSH_FOLDER="/home/${VAGRANT_SSH_USERNAME}/.ssh"; VAGRANT_SSH_FOLDER="/home/${VAGRANT_SSH_USERNAME}/.ssh";
echo "Adding generated key to ${VAGRANT_SSH_FOLDER}/authorized_keys" mkdir -p "${VAGRANT_SSH_FOLDER}"
cat "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub" > "${VAGRANT_SSH_FOLDER}/authorized_keys"
chown "${VAGRANT_SSH_USERNAME}" "${VAGRANT_SSH_FOLDER}/authorized_keys"
chgrp "${VAGRANT_SSH_USERNAME}" "${VAGRANT_SSH_FOLDER}/authorized_keys"
chmod 600 "${VAGRANT_SSH_FOLDER}/authorized_keys"
fi
passwd -d vagrant >/dev/null echo "Adding generated key to ${VAGRANT_SSH_FOLDER}/id_rsa"
echo "Adding generated key to ${VAGRANT_SSH_FOLDER}/id_rsa.pub"
echo "Adding generated key to ${VAGRANT_SSH_FOLDER}/authorized_keys"
cp "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa" "${VAGRANT_SSH_FOLDER}/id_rsa"
cp "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub" "${VAGRANT_SSH_FOLDER}/id_rsa.pub"
if [[ ! -f "${VAGRANT_SSH_FOLDER}/authorized_keys" ]] || ! grep -q "${PUBLIC_SSH_KEY}" "${VAGRANT_SSH_FOLDER}/authorized_keys"; then
cat "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub" >> "${VAGRANT_SSH_FOLDER}/authorized_keys"
fi
chown -R "${VAGRANT_SSH_USERNAME}" "${VAGRANT_SSH_FOLDER}"
chgrp -R "${VAGRANT_SSH_USERNAME}" "${VAGRANT_SSH_FOLDER}"
chmod 700 "${VAGRANT_SSH_FOLDER}"
chmod 644 "${VAGRANT_SSH_FOLDER}/id_rsa.pub"
chmod 600 "${VAGRANT_SSH_FOLDER}/id_rsa"
chmod 600 "${VAGRANT_SSH_FOLDER}/authorized_keys"
passwd -d "${VAGRANT_SSH_USERNAME}" >/dev/null
fi