Compare commits

..

2 Commits

Author SHA1 Message Date
Basti 0cda379c19
Upgrade Sockethub, move proxy to LB/host 2022-03-18 11:10:46 -06:00
Basti 9cb77c54db
Upgrade Sockethub to latest alpha version 2022-03-17 15:21:39 -06:00
1166 changed files with 43964 additions and 25205 deletions

View File

@ -25,8 +25,6 @@ knife[:automatic_attribute_whitelist] = %w[
cloud_v2
chef_packages
]
# Added to /etc/chef/client.rb on node bootstrap
# https://docs.chef.io/attribute_persistence/
knife[:normal_attribute_allowlist] = ['knife_zero', 'kosmos_kvm', 'kosmos-ejabberd', 'openresty']
knife[:allowed_normal_attributes] = ['knife_zero', 'kosmos_kvm', 'kosmos-ejabberd', 'openresty']
knife[:default_attribute_whitelist] = []
knife[:normal_attribute_whitelist] = ['knife_zero','kosmos-ejabberd']
knife[:override_attribute_whitelist] = []

3
.gitmodules vendored
View File

@ -1,6 +1,3 @@
[submodule "site-cookbooks/postgresql"]
path = site-cookbooks/postgresql
url = git@github.com:67P/postgresql.git
[submodule "site-cookbooks/openresty"]
path = site-cookbooks/openresty
url = https://github.com/67P/chef-openresty.git

View File

@ -2,43 +2,55 @@
source 'https://supermarket.chef.io'
cookbook 'elasticsearch', '~> 5.1.3'
cookbook 'firewall', '~> 6.2.16'
cookbook 'redisio', '~> 6.4.1'
cookbook 'ruby_build', '~> 2.5.0'
cookbook 'ipfs',
git: 'https://gitea.kosmos.org/kosmos/ipfs-cookbook.git',
ref: 'v0.7.0'
cookbook 'mediawiki',
git: 'https://github.com/67P/mediawiki-cookbook.git',
ref: 'nginx'
cookbook 'apache2', '= 3.3.0'
cookbook 'apt', '~> 7.3.0'
cookbook 'ark', '>= 5.0.0'
cookbook 'composer', '~> 2.7.0'
cookbook 'fail2ban', '~> 7.0.4'
cookbook 'git', '~> 10.0.0'
cookbook 'golang', '~> 5.3.1'
cookbook 'hostname', '= 0.4.2'
cookbook 'hostsfile', '~> 3.0.1'
cookbook 'java', '~> 4.3.0'
cookbook 'logrotate', '= 2.2.0'
cookbook 'mysql', '~> 8.7.3'
cookbook 'nginx', '= 9.0.0'
cookbook 'nodejs', '~> 7.3.1'
cookbook 'ntp', '= 3.4.0'
cookbook 'ohai', '~> 5.2.5'
cookbook 'openssl', '~> 8.5.5'
cookbook 'redis',
git: 'https://github.com/phlipper/chef-redis.git',
ref: 'v0.5.6'
cookbook 'redisio', '= 5.0.0' # TODO upgrade to 6.x when we use Chef 16
cookbook 'postfix', '= 5.0.2'
cookbook 'php', '~> 8.0.0'
cookbook 'postfix', '~> 6.0.26'
cookbook 'timezone_iii', '= 1.0.4'
cookbook 'ulimit', '~> 1.0.0'
cookbook 'composer', '~> 2.7.0'
cookbook 'poise-ruby-build', '~> 1.1.0'
cookbook 'application', '~> 5.2.0'
cookbook 'application_javascript', '~> 1.0.0'
cookbook 'application_git', '= 1.1.0' # 1.2.0 doesn't work with knife-solo
cookbook 'poise', '~> 2.8.2'
cookbook 'poise-languages', '~> 2.1.1'
cookbook 'poise-javascript', git: 'https://github.com/67p/poise-javascript.git',
ref: 'e5fff15'
cookbook 'poise-archive', '~> 1.5.0'
cookbook 'poise-service', '~> 1.5.2'
cookbook 'users', '~> 5.3.1'
cookbook 'hostname', '= 0.4.2'
cookbook 'firewall', '~> 2.6.3'
cookbook 'nginx', '= 9.0.0'
# Remove when cookbooks stop depending on it, the build_essential resource is
# part of Chef 14 (https://docs.chef.io/resource_build_essential.html)
cookbook 'build-essential', '~> 8.2.1'
cookbook 'mysql', '~> 8.7.3'
# cookbook 'postgresql', '= 7.1.8'
cookbook 'apt', '~> 7.3.0'
cookbook 'git', '~> 10.0.0'
cookbook 'hostsfile', '~> 3.0.1'
cookbook 'ohai', '~> 5.2.5'
cookbook 'nodejs', '~> 7.3.1'
cookbook 'timezone_iii', '= 1.0.4'
cookbook 'ark', '>= 5.0.0'
cookbook 'logrotate', '= 2.2.0'
cookbook 'openssl', '~> 8.5.5'
cookbook 'ntp', '= 3.4.0'
cookbook 'apache2', '= 3.3.0'
cookbook 'chef-sugar', '= 3.3.0'
cookbook 'compat_resource', '= 12.19.0'
cookbook 'homebrew', '= 3.0.0'
cookbook 'mariadb', '= 0.3.1'
cookbook 'ipfs',
git: 'https://gitea.kosmos.org/kosmos/ipfs-cookbook.git',
ref: 'v0.7.0'
cookbook 'elasticsearch', '= 4.2.0'
cookbook 'java', '~> 4.3.0'
cookbook 'ulimit', '~> 1.0.0'
cookbook 'golang', '~> 5.3.1'
cookbook 'zerotier', '~> 1.0.7'
cookbook 'unbound', '~> 3.0.2'
# openresty dependency
cookbook 'jemalloc', '~> 0.1.7'
cookbook 'yum'

View File

@ -1,13 +1,19 @@
DEPENDENCIES
apache2 (= 3.3.0)
application (~> 5.2.0)
application_git (= 1.1.0)
application_javascript (~> 1.0.0)
apt (~> 7.3.0)
ark (>= 5.0.0)
build-essential (~> 8.2.1)
chef-sugar (= 3.3.0)
compat_resource (= 12.19.0)
composer (~> 2.7.0)
elasticsearch (~> 5.1.3)
fail2ban (~> 7.0.4)
firewall (~> 6.2.16)
elasticsearch (= 4.2.0)
firewall (~> 2.6.3)
git (~> 10.0.0)
golang (~> 5.3.1)
homebrew (= 3.0.0)
hostname (= 0.4.2)
hostsfile (~> 3.0.1)
ipfs
@ -15,8 +21,8 @@ DEPENDENCIES
revision: d7c25b6ce5fa490b6de3529fdc163fb64f1ece8a
ref: v0.7.0
java (~> 4.3.0)
jemalloc (~> 0.1.7)
logrotate (= 2.2.0)
mariadb (= 0.3.1)
mediawiki
git: https://github.com/67P/mediawiki-cookbook.git
revision: 78641e53635ba6cbd4a2a51fd597adb8fef1e8ad
@ -28,38 +34,64 @@ DEPENDENCIES
ohai (~> 5.2.5)
openssl (~> 8.5.5)
php (~> 8.0.0)
postfix (~> 6.0.26)
redisio (~> 6.4.1)
ruby_build (~> 2.5.0)
poise (~> 2.8.2)
poise-archive (~> 1.5.0)
poise-javascript
git: https://github.com/67p/poise-javascript.git
revision: e5fff15098ac80c2a625b8d77d4eaf39d48f7ba7
ref: e5fff15
poise-languages (~> 2.1.1)
poise-ruby-build (~> 1.1.0)
poise-service (~> 1.5.2)
postfix (= 5.0.2)
redis
git: https://github.com/phlipper/chef-redis.git
revision: 7476279fc9c8727f082b8d77b5e1922dc2ef437b
ref: v0.5.6
redisio (= 5.0.0)
timezone_iii (= 1.0.4)
ulimit (~> 1.0.0)
unbound (~> 3.0.2)
users (~> 5.3.1)
yum
zerotier (~> 1.0.7)
GRAPH
apache2 (3.3.0)
application (5.2.0)
poise (~> 2.4)
poise-service (~> 1.0)
application_git (1.1.0)
application (~> 5.0)
git (>= 0.0.0)
poise (~> 2.0)
application_javascript (1.0.0)
application (~> 5.0)
poise (~> 2.0)
poise-javascript (~> 1.0)
poise-service (~> 1.0)
apt (7.3.0)
ark (6.0.3)
seven_zip (>= 3.1)
build-essential (8.2.1)
mingw (>= 1.1)
seven_zip (>= 0.0.0)
chef-sugar (3.3.0)
chocolatey (3.0.0)
compat_resource (12.19.0)
composer (2.7.0)
apt (>= 0.0.0)
php (>= 0.0.0)
windows (>= 0.0.0)
elasticsearch (5.1.3)
elasticsearch (4.2.0)
apt (>= 0.0.0)
ark (>= 0.0.0)
fail2ban (7.0.4)
yum-epel (>= 0.0.0)
firewall (6.2.16)
chef-sugar (>= 0.0.0)
yum (>= 0.0.0)
firewall (2.6.5)
chef-sugar (>= 0.0.0)
git (10.0.0)
golang (5.3.1)
ark (>= 6.0)
homebrew (5.4.1)
homebrew (3.0.0)
hostname (0.4.2)
hostsfile (>= 0.0.0)
hostsfile (3.0.1)
@ -68,14 +100,16 @@ GRAPH
java (4.3.0)
homebrew (>= 0.0.0)
windows (>= 0.0.0)
jemalloc (0.1.7)
build-essential (>= 0.0.0)
logrotate (2.2.0)
mariadb (0.3.1)
apt (>= 0.0.0)
yum (>= 0.0.0)
yum-epel (>= 0.0.0)
mediawiki (0.5.0)
apache2 (>= 0.0.0)
nginx (>= 0.0.0)
php (>= 0.0.0)
mingw (2.1.7)
mingw (2.1.3)
seven_zip (>= 0.0.0)
mysql (8.7.4)
nginx (9.0.0)
@ -90,20 +124,43 @@ GRAPH
openssl (8.5.5)
php (8.0.1)
yum-epel (>= 0.0.0)
postfix (6.0.26)
redisio (6.4.1)
selinux (>= 0.0.0)
ruby_build (2.5.0)
homebrew (>= 0.0.0)
yum-epel (>= 0.0.0)
selinux (6.1.12)
poise (2.8.2)
poise-archive (1.5.0)
poise (~> 2.6)
poise-build-essential (1.0.0)
poise (~> 2.6)
poise-git (1.0.0)
poise (~> 2.6)
poise-languages (~> 2.1)
poise-javascript (1.2.1)
poise (~> 2.0)
poise-languages (~> 2.0)
poise-languages (2.1.2)
poise (~> 2.5)
poise-archive (~> 1.0)
poise-ruby (2.4.0)
poise (~> 2.0)
poise-languages (~> 2.0)
poise-ruby-build (1.1.0)
poise (~> 2.0)
poise-build-essential (~> 1.0)
poise-git (~> 1.0)
poise-ruby (~> 2.1)
poise-service (1.5.2)
poise (~> 2.0)
postfix (5.0.2)
redis (0.5.6)
apt (>= 0.0.0)
redisio (5.0.0)
selinux_policy (>= 2.2.0)
ulimit (>= 0.1.2)
selinux_policy (2.4.3)
seven_zip (4.2.2)
timezone_iii (1.0.4)
ulimit (1.0.0)
unbound (3.0.2)
users (5.3.1)
windows (7.0.2)
yum (7.4.13)
yum (7.2.0)
yum-epel (4.2.3)
zerotier (1.0.7)
ohai (>= 0.0.0)

View File

@ -306,7 +306,6 @@ GEM
PLATFORMS
x86_64-darwin-18
x86_64-darwin-19
x86_64-linux
DEPENDENCIES

View File

@ -1,16 +1,3 @@
This repository contains all infrastructure automation code that we use to set
up and configure servers, virtual machines, and applications for Kosmos hosted
services.
Chef cookbooks are written in Ruby, and based on [Chef Infra
resources](https://docs.chef.io/resources/). Some cookbooks contain integration
test suites based on [Test Kitchen](https://docs.chef.io/workstation/kitchen/).
Note: Manual configuration of servers and applications is highly discouraged,
and can be overwritten or lost without notice!
## Setup
### Install Chef Workstation
* macOS, Windows, RHEL, Ubuntu: https://docs.chef.io/workstation/install_workstation/
@ -19,28 +6,24 @@ and can be overwritten or lost without notice!
#### rbenv
If you use rbenv to manage Ruby versions on your system, install the
[rbenv-chef-workstation](https://github.com/docwhat/rbenv-chef-workstation)
(rbenv-chef-workstation)[https://github.com/docwhat/rbenv-chef-workstation]
plugin.
### Install gem dependencies
Clone this repository, `cd` into it, and run:
bundle install
## Common tasks
### Bootstrap a new server
### Bootstrap a new host server
knife zero bootstrap root@server-name.kosmos.org --run-list "role[base],role[kvm_host]" --secret-file .chef/encrypted_data_bag_secret
knife zero bootstrap root@dev.kosmos.org --run-list "recipe[kosmos-base],..." -j '{"example_cookbook":{"memory_max":"256M"}}' --secret-file .chef/encrypted_data_bag_secret
### Bootstrap a new VM
knife zero bootstrap ubuntu@zerotier-ip-address -x ubuntu --sudo --run-list "role[base],role[kvm_guest]" --secret-file .chef/encrypted_data_bag_secret
knife zero bootstrap ubuntu@zerotier-ip-address -x ubuntu --sudo --run-list "recipe[kosmos-base]" --secret-file .chef/encrypted_data_bag_secret
### Run Chef Zero on a host server
### Run Chef Zero
knife zero converge -p2222 name:server-name.kosmos.org
knife zero converge name:dev.kosmos.org
### Run Chef Zero on a VM
@ -50,7 +33,7 @@ Clone this repository, `cd` into it, and run:
knife zero converge name:dev.kosmos.org --client-version 15.3.14
## Managing cookbooks
### Managing cookbooks
Cookbooks are managed via Berkshelf. Run `berks --help` for command help.
@ -62,7 +45,7 @@ Vendor installed cookbooks to the `cookbooks/` dir:
berks vendor cookbooks/ --delete
## "Expired" TLS certificates
### "Expired" TLS certificates
If you encounter expired TLS certificates during a Chef run (e.g. for remote
files), the issue is likely that the certificate has been issued by Let's

171
Vagrantfile vendored
View File

@ -2,91 +2,110 @@
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version.
#
# Documentation for all configuration options can be found here:
# https://www.vagrantup.com/docs/vagrantfile
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure(2) do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.
# Every Vagrant development environment requires a box. You can search for
# boxes at https://atlas.hashicorp.com/search.
config.vm.box = "bento/ubuntu-18.04"
config.vm.provider :virtualbox do |vb|
# Customize the amount of memory on the VM:
vb.memory = "1024"
vb.cpus = 2
end
# config.vm.provider :docker do |d, override|
# d.image = "nishidayuya/docker-vagrant-ubuntu:xenial"
# d.has_ssh = true
# override.vm.box = nil
# override.ssh.port = 22
config.vm.provider :docker do |d, override|
d.image = "nishidayuya/docker-vagrant-ubuntu:xenial"
d.has_ssh = true
override.vm.box = nil
override.ssh.port = 22
end
# Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
# config.vm.box_check_update = false
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# config.vm.network "forwarded_port", guest: 80, host: 8080
# Create a private network, which allows host-only access to the machine
# using a specific IP.
config.vm.network "private_network", ip: "192.168.56.5"
# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
# config.vm.network "public_network"
# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
# config.vm.synced_folder "../data", "/vagrant_data"
# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
# config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
# vb.memory = "1024"
# end
#
# View the documentation for the provider you are using for more
# information on available options.
# Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
# such as FTP and Heroku are also available. See the documentation at
# https://docs.vagrantup.com/v2/push/atlas.html for more information.
# config.push.define "atlas" do |push|
# push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
# end
config.vm.define "ldap" do |ldap|
ldap.vm.box = "bento/ubuntu-18.04"
ldap.vm.network "forwarded_port", guest: 389, host: 389
ldap.vm.network "private_network", ip: "192.168.56.5"
# Enable provisioning with a shell script. Additional provisioners such as
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
# documentation for more information about their specific syntax and use.
# config.vm.provision "shell", inline: <<-SHELL
# sudo apt-get update
# sudo apt-get install -y apache2
# SHELL
ldap.vm.provision :chef_zero do |chef|
chef.version = "18.2.7"
chef.node_name = "vagrant-node-ldap"
chef.arguments = "--chef-license accept"
chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
chef.data_bags_path = "data_bags"
chef.roles_path = "roles"
chef.nodes_path = "nodes"
chef.environments_path = "environments"
chef.encrypted_data_bag_secret_key_path = ".chef/encrypted_data_bag_secret"
chef.environment = "development"
chef.add_recipe "kosmos-base"
chef.add_recipe "kosmos-dirsrv"
end
config.vm.provision :chef_zero do |chef|
chef.version = '15.3.14'
chef.arguments = "--chef-license accept"
chef.cookbooks_path = ['cookbooks', 'site-cookbooks']
chef.data_bags_path = 'data_bags'
chef.roles_path = 'roles'
chef.node_name = "vagrant-node"
chef.nodes_path = 'nodes'
chef.environments_path = 'environments'
chef.encrypted_data_bag_secret_key_path = '.chef/encrypted_data_bag_secret'
chef.environment = 'development'
chef.add_recipe 'kosmos-base'
chef.add_recipe 'kosmos_encfs'
# chef.add_recipe 'kosmos-bitcoin::source'
# chef.add_recipe 'kosmos-mediawiki'
# chef.add_recipe 'kosmos-wordpress'
# chef.add_recipe 'kosmos-ejabberd'
# chef.add_recipe 'kosmos-hubot::botka_freenode'
# chef.add_recipe 'ipfs'
# chef.add_recipe 'kredits-github'
# chef.add_recipe 'sockethub'
# chef.add_recipe 'kosmos-mastodon'
# chef.add_recipe 'kosmos-mastodon::nginx'
# chef.add_recipe '5apps-hubot::xmpp_botka'
# chef.add_recipe 'kosmos-hubot'
end
config.vm.define "bitcoin" do |bitcoin|
bitcoin.vm.box = "generic/ubuntu2004"
bitcoin.vm.network "forwarded_port", guest: 4201, host: 4201
bitcoin.vm.network "private_network", ip: "192.168.56.6"
# bitcoin.vm.synced_folder "../kredits/yap/", "/opt/yap"
bitcoin.vm.provision :chef_zero do |chef|
chef.version = "18.2.7"
chef.node_name = "vagrant-node-bitcoin"
chef.arguments = "--chef-license accept"
chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
chef.data_bags_path = "data_bags"
chef.roles_path = "roles"
chef.nodes_path = "nodes"
chef.environments_path = "environments"
chef.encrypted_data_bag_secret_key_path = ".chef/encrypted_data_bag_secret"
chef.environment = "development"
chef.add_recipe "kosmos-base"
chef.add_recipe "kosmos-bitcoin::source"
# chef.add_recipe "kosmos-bitcoin::foo"
end
end
config.vm.define "openresty" do |openresty|
openresty.vm.box = "bento/ubuntu-20.04"
openresty.vm.network "forwarded_port", guest: 6379, host: 6379
openresty.vm.network "private_network", ip: "192.168.56.7"
openresty.vm.provision :chef_zero do |chef|
chef.version = "18.2.7"
chef.node_name = "vagrant-openresty"
chef.arguments = "--chef-license accept"
chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
chef.data_bags_path = "data_bags"
chef.roles_path = "roles"
chef.nodes_path = "nodes"
chef.environments_path = "environments"
chef.encrypted_data_bag_secret_key_path = ".chef/encrypted_data_bag_secret"
chef.environment = "development"
chef.add_recipe "kosmos-base"
chef.add_role "openresty"
chef.add_role "openresty_proxy"
end
end
end

View File

@ -0,0 +1,4 @@
{
"name": "barnard.kosmos.org",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5Rr+3giLkr0xqZPRPn9Z\ngxvmAaUo6VSs1qnMfznNNN/CGCYett0ndEJp4wI8xp2fq75b2TSm4jqhqjtgYVVD\nEeSOKTZEnoE7YSssodGTAK5YnrVIPNyWd61Ih/NkHzCjlcuVX6sJD7z/pgK+WMao\nAAxzMrefvHALFBmJIxbugakru/nvDcQeV8DOF+UjzsO5CTC0BUzCFeXBG7HD3W+6\nP2wQlMKteM9uQU6Agx7XegeWS2Lfnxg1em5TNbw1PbLofROwr1pCUPfVzQ0CAVxm\nXLzmA2xtMqCT2j83DU9WleZPYiS0rg+r9T1jsDX0TyH4NTV8gO2SJ9BMUNcX+3Ox\nmQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -0,0 +1,4 @@
{
"name": "centaurus.kosmos.org",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsVV0j8DQSlefAAAmafjx\nyT1j1idLQF0oltTp2p4jFEsnEdFeP4Plpluy+detra1gM9sBBBuvRKGt8NP+Yoc7\nbnn7qU13E/nWUQh9n15+jjgUirXg7CxluKfj2VvsdchJRIvzDwwZz5sqITiGG7/S\n2r2KBBBnuGlGShQJZhhcLW4P+3YgxW8DUgUsRdvreVuvF1hcnaSymldfos1CqYL8\nawtsZ2rtdZHmZxfguXl91WBCu2OxsT13i3kInnDQsFB0tYKq+TFSLAHxneKTYPRW\ngYgP9RSBZ51iQ+6R1CenYsr4SePVCmwaZGb8bmd0QLvGKlBhjX29a5bE5tjzeoBD\nuwIDAQAB\n-----END PUBLIC KEY-----\n"
}

4
clients/discourse-1.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "discourse-1",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxJBhKUtTcmjP8eG4aLNF\n9UfNU9lRIFhfywjFJjtXoYdNaUatZHE3s1HKND0SjJs5BRQbZBEKLxTHCgnPZD4U\nlRgZ65JtHwi+JNM6ac4TQm5JYKA++KxX7FtOiJV6oGX6foNoFVHrGi+fhTlLE9hL\npHRQWTpM8ErpUEj3VHez+k6KT1Mr3QO5T9L5kqu1BdTYwtyfXJE0VfyDKz/rwrvc\ngPvZd167p8YCTu/rWLG9X8tag+ySUR9cmlEn5sCsBLmq56Zurf0VIe/0tuGPI8DP\nAVc4dIXHsfGuKLwBfFPSDy9YbI7F8gbaD05UnUVn60IWPmWsE19K/iIc/OnJZwRO\nkQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "discourse-2",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwinJNGMUzUdrZwx/ZCkU\nxZRnuWqZHXHdZtkEG6beMY1sB/PpGknLgcfTjhh4FR/5hIXqBcVdUj3DZiTmhd8o\n0QpEkJPNKd08PN12CyShPwCcIA1KTqsCsNys+bp6Wff84JClAe/Oza6DonoRmhqO\ncFxSQcscuv8a6Gc/1X/aySmS01hwL+r9p0VZBEPNKEObgJXHsGIIbajlxgq037X/\n2/IsIk2etXTUSWPJLxNKSXzxC3l4Izw4NfvUgipByPTeJQ2YAVxbvrDEqquBGk5S\nll/mlF+fKX0QvUhm7sdLiSy++rHc8R1ny+4LnR1gAOscYMuLbDbpJnW0Rc0GEJOL\nVwIDAQAB\n-----END PUBLIC KEY-----\n"
}

4
clients/ejabberd-6.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "ejabberd-6",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqvGOanDqJOhf0xl/TYcs\nqYhhGz4ptFzxmfxiCMWbnbDcICBLHni28dJHhP2ggfUKOGcp+OIqiy783eRUrPsf\nnH9VmvTnz4NdXIB5J45FgBtfYiF9ZseaPL+ufTSCbZj7Ih3lzTAbO5Ug+UOj852B\nnnqH2Ht2jXMp2v3NW4gAG9QyRpr6P5cyVWBrMFExjuhNWg119tJv+33oGnflrNRi\njV3yGbRFRpqAomAVCr6DAA9SX/R8J3yKTky6MdRGrXKH/7eXH0ehDi33Y9Pyy9Ci\nkQX/JRHffuJeBF3Tndiojqdx81C6oIh2s/H3JMew/DdRxjzlPP4nemYWXv1/YVcS\nCwIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "ejabberd-8",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2r+emfhx7bl7MxEeIDGY\nKnj3xEyFvVgXL7GwOsbKszFVgZ17yuPwa6vuiJsZsbcFC/nXgGNH2WF5FEv7XhOi\nwE8KMeNrR4xQ9BEANRlRgUTfrkhZG1NCy7PpVBb7L2r36STBuFSdQJmruJAfvTHm\na4hhmfaSIJ0Wa+Q24gL1GNwkSRdOhXRYxB4OvNIJzzuC3XqgugQVG5xzZh0kULQs\nkZVvkL5dM0FEZzBn8aK2sohTFDivvYJy7PAogC9Z5M1nPatZBowruUZvCym3Wh1J\nRtBwsS9SsTcsUqaT9FpEa7vYUney1/R8G2FAFufTyztjgBQzh78GhU+dek+ycIf1\nVQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "email-1",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxDRdvMYKRjejoFsOxS6s\n4gj0Gsaxk/j25A5VPHBcEhr+NOh8W/6NnTTHuFMaorEIl/2kscgrcwriDN7xIFmO\nz/C1+spDLPMGSWd+422KSS3fjVfByLlMwxh171RDZBlZVze7H7CIV/rxCG7Ri85y\nPvyp2rT4ioyVGyYK3e8CiXwQckpFC1ex9VRk/GR8zbCYUIw+qbTFRcl/mQuxKqWK\n22vrgAR+6OL8lcyhssmKiQ1r3GtxwJusgffw4/5S8sRR1z8OB4wiwgOWR1E36EbF\nhTBjFzPiKVjVjP/TQpUoYdnBhuD223M8nPWJl1HMVQPMjL6R2BBOF+iK0Wx9SiFD\nJwIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "garage-2",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwuZbclnx/1Oas1+q5vUz\nsvCpTwKBrb3dah2YoZfZg0K15+MZshSyCZxo5T+SGp2OwhV65UptMJZbeyhVtzEp\ncN62G7exf65rNesXOL82PNQC6iInxNvyOgzdTOo7tdQ2ln/3QRpZOtUOB9PEkK17\nNmHfVIWKEc9YajRff5zE1LzSWulTNJ3D4GAIhsli//Rv45MhjyYoQKf1AXtqI72A\n2FE2YWXOjjSHJIPRfcUrmBOmEt/gkWySxGAs8Dg112vOC1ftk0KiQFWKVydMicIj\nyySQH1/neQFSq2HLNajDc9S2l7cjhPEjov7taS9LkXfPtnfN8ajEEP0S2MgZnf4N\ngwIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "garage-4",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8it7QtT6zDiJJqlyHKfQ\nLqwu6bLblD15WWxlUSiOdhz3njWDv1BIDCAdkCR3HAXgxvk8sMj9QkvWS7u1+bc4\nxvHrY4Tgfg+Tk1h3gGa7ukll8s1WLIbGjj89vrK8PFr4iuDqRytYRMmcdMsNzPkS\nKcsOjFYWGV7KM/OwoQGVIOUPB+WtkrFAvNkXtIU6Wd5orzFMjt/9DPF2aO7QegL8\nG1mQmXcPGl9NSDUXptn/kzFKm/p4n7pjy6OypFT192ak7OA/s+CvQlaVE2tb/M3c\ne4J6A+PInV5AGKY6BxI3QRQLZIlqE0FXawFKr1iRU4JP4tVnICXZqy+SDXQU1zar\nTQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "garage-5",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnJxLFOBbml94W/GAe7nm\ntZs1Ziy8IbqXySsm8bSwWhRMQ8UuseqQLG30R3Q5X5AoJbtNfd26l63qLtP2fFtL\n5km9dV+2FoIJWFetl8Wzr7CaLYAiNzTQSFHlV7+6DKmPMDcJ63GKrFR77vkSGOG6\nOWL1bJy5BOaClp/sKL/0WQ0+mRbTP6RCQ2eI+46clAg702SenBU6Nz9HDm+teKN7\nYlP1CvzXgfgfpDOsat7wGn5+oKcmKavZxcdn8bt5jRpg8v3JezaZIjMXt7XcNS4n\n0F4XO/efnZE5B5SN68j4BpD8N79zJw4HlRIGP+RaYv2qLtBeWgLHCCs9wXQXfj6b\nLwIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "garage-6",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwasYgWLM8ShvirFiKRE6\nGWqc3pMlvcrk4YnWAUW5Y/H26EnyexxWNfnwlEcq8thJ3M3hs7zkoF3Yk4uqX869\n4/niYqXwYgeE1K3gzLp4K1+w3yVupYAFVFStVEHJyuMlLJ+ulDEGvNdQDuIfw7+E\nr6DcDLa1o92Eo0wL1ihYyMilduH0LdFTixL+tEBXbbPWBa3RDJJCFsRF1+UC6hAH\nzmaWL661Gdzdabxjm/FlGUYkdbDqeInZq/1GMQqv+9/DcNRkWA9H7i4Ykrfpx4/2\nRZ8xtx/DbnJVB1zYoORygFMMAkTu5E+R8ropeI7Wi77Yq0S7laiRlYQYQml3x9ak\nzQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "garage-7",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwoAigZUSwsfbBHx2PQ6W\n38Ght6eCvbpW1lsS58hTieRmRn+pgZVjvixhsBh57rUasCjaBywXk9BpNj2Foxck\nReHeoDI0RHsgniClyMrYj80y2NhoB6J8NB+cHkhdzIKplm6AH6M5xaAedtZU639a\n1nHMtpDlJhzgIYsiq1q06Aqd1w0Z9tf1RXQ1WvMDhTY4wlE5RZ2epBb6Usnlbjo2\nSqCIGIjRLmZxdsSWoiUUTlVPdUCzTNsN5G/ZVdRswhgseDmVJCIkK2Aji/XzhIrR\nh4RvUv9dhFemOVsFctJ/dQILXz5MZLUgakKf970M5R/Zggv//pqRSsYcB2UfaBpV\nLQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "garage-8",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt4hXODzgHsIeWxXJm/F6\nSTFJ8JC89mWru7pOFzPWenOVMHgp4UpUB4rDTwQqojsWTDiq0x3ckUyOPw3Nj0jv\nxP4MMGS4SI0oRSJKzrYYss0hgUDTOBBd+Wxn0UiNEpN/PfQo9VZj9v/jak57cz7z\n5+rpl5v27fhgUIChjsHxdy+EamvCrYc+1JhyrLOlwlt8JxkZ8UPhoeZLWAbDgGLS\nEzHWSSVtBUPK+KYmVb2OK4lB56zPfek0U3gKN+04a1650jzOit8LzE6NaT180QDv\nX+gG6tk53vSXDmkBXsQ1mtB8aF+HaEG2Pra5HyihlweCPYdJT+e28wpq6+P5l3YR\ndQIDAQAB\n-----END PUBLIC KEY-----\n"
}

4
clients/gitea-1.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "gitea-1",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0bp4I/f5dLL22GRHanLV\nw57sNBEWT3Vx32B24hScKNP5nYDW0dIRkt1c7SLEpe+diNgyIwk7JlI20Vl+oaVo\njdCpmHSB18yXxQT2Ub6aI8ApwFLECVA6SckekcwxLJc/oGRMB52PonI8opJOVbPa\nF+heZ5NNDiMvn3E8qODdMWSjDiJNSVLJgsCPFHAt32aJgLaXQTqG5lrmltaamscW\njGlFqiBJw/5saCkKBPdPwdX4RcDqvGX1FdE1LVB42cskv8CrnvEVFLBxKXAhAr6s\nNhOhenzLGHpy58tNoUoUw3v4WiPRtcnlNxeSVG5LKkjaK04f2oxeZx3SiSU/1naY\nkwIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "gitea-2",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7MKbO2vvX7TD1cFKjITh\ntvsf6hgAQRcu7F0kiekx15aC3VLnRgsB9A6SXySVrqvhq/vOSTXZsIC62IQi4Oks\nhhtAA/uvwcOmZ7JkMi0vJ3Ary94dTsg/L8i/0/k2V/D4FRKTV4414wSkpglFGLhl\nvbZ6P17LrqfyAzNJwIDzwd9d6cvt4a0qxvuxbTOHkBuY8tpyGdNzhg6fATadxbBa\nRASEVFb+xqxG3K+8zRmaCFyYqmSPS/8liVVbLPAeUlK6pDyQ5g4T37E5o+CpWfPF\nkBgYw/hHQe6zt1Z4wNJ6mb8YIN/l9kFF3EE99laYxp9Ua7ffrZkRgw12C5Yrn3N6\noQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "her",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsuj7OCWX2qz/WbsjMgpi\nI4CM13Pxrj+8Enrl4IorkK6O338rhdtfXmOJt2AuDuj6u12Xtnk0LN2n01hffXNu\nU0Hwy+szavnbjiqC8jw1nyCFwYgdy8lCj3WV4t/gRWFhiHZGkhBKaksAoo8jJqZv\nXi/4ZuRov01HJgT6CJBEfR5TUaRCHM4hz2Y60mmegmUNLTRUNIDy6rg5W8JplMlJ\ny0dJc6uEp8asKhPnEfMz1kXukjnsBLXZmxglqdAQeaZ1I78QvRV3rYh0Ge2ZPF8t\nv2c+mUMbH7e80lJPgp7rwqjKrjLfaYo/1ZqTqr3ArWw3253ttLp8KX1ltX69nIHq\nMwIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "ldap-3",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzLndVZtKubbJf2izx6vN\ntU0gwZUhcCz4Dq+Ilu9D8tPVEWUqKp9RyPkSO8iIxdLXJ8ZjtG3oBVPFGka/fW1a\n/SSf4Yn6ArkNhP9dmDKzrOYOuoPF+h+Fa9Jecy2PtNzhGdBdynIK4ezJIdq5vPEG\nAsJf/Ad9EIU8D4Aj/nhNUwfUwsFTTE++LL9yCzRiDHg6pjNToM75V/+fFPk0UL1/\neLcaJzqi5WeXhfq7DbjMtqnt/+vUxO2YAk9MDb3U15hnH4xkxtDfRth1UGkpR/PK\naLn/RTS9sqk3oMZVzDSioXO0TGp00sWDmvpBvEBwlYgWnx1o8JQnkClvn2OSo6va\nzQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "ldap-4",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmzFyZh5/J2BsKRunghis\nwUGbv4j/ynAF7QY+CYoOwDBcbLHk6odn1JyUqCgfhCIX0mh8F/fDKyU9Aw6+HHZ/\nX0DTt/enLTaWc2vxRfyJLRXP7/ymHOr4u6HYEINMdVJp4yQ9XLcWpuRHfA+fHrZ7\n9fI8sCMSEawvVpEKytYdVnm3VCjfIVrfCAkY0lP0mNG908edX2ZuJ4GS1UwADUZX\nLZuMhbGX9JqIQYWCyiMDakD7P7PlEDf/JVkvkao4HQatkqJGmGDhvfIPodIo8JC0\n6FsYxWtvrLJBArYjnVBKRuxIlBqq/7Yx0gj09kGf84aSXvkMDgio7AO4xSp9GJTJ\n4wIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "lq-1",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6mrJdvfx2pvuYIOCwDe4\nXJ4NJSEq+9oyqW/JWNDnUN/GAZLCfTOa+qu1nA8sOspWWpaikHpo2meYlzA1HCPh\nF4LX7C83dA9CXB8BDCddmkAxhPPXIeFM3AmaEwfv+dLYNuO6bWvOKcHjJdw7Mp4W\nrdg9MsIh28W9jf7KehvPWx3ZvrJm2vyiFGQNBDWGdkVq40P2lhvCISvWb+Ugpjos\nJzq/HZNFq6Fc72jWfwwGcDgwfc1/jmWJlz2J5v8xHwwhVtcWTg1AWqfcVQZ6OKtf\nwP6s/pAK4dAXqPz8OE17GPJ42r94AeWr39Cn5b8EzrVhKOeODlpihfzIaa/sfb44\n6wIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "lq-2",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzyquIPPckL4Bybw4H0t6\nHexR7u97//eXBGpN+PJcp3PAUTJVWr1m7uDnpD9JAP370Cp05Tz0ydYXk/2NTpFf\nvRu20401VWTWbClIdN7n89edtER/XX90KrcKplV4bZcFN0UC2Il6SGH0uvUYzZRr\nPV2eXftDvu7Mhl1xlmeJ0S6bH95v1G2k6TrTLAOBs6gpqiCWyjrNB9AY3SpEv9Ya\nK8T0M10LAY0UwKccSp/eTZzCfbmzvNIyyRlJbzEAsHmoDPyR2/4LB1ndtbkTszmk\noHvpBJu3noKXo0SW/WqhSvwxBVV0bZUYjgH3Bx8nudNkHgL6ZH6FVQ6ED+70jWiq\ngwIDAQAB\n-----END PUBLIC KEY-----\n"
}

4
clients/mastodon-2.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "mastodon-2",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA27a8h17CCQLP8JY59n+M\nURsrbeVvRi3yIUe1IklOlRSTy0L3Z37rFuSNC3dC9rKl/pHDKtorgeukxbFADXQx\nkta2LNX8gf09jCWsUdga5lWIbfOdtlCLRDG1MVEUSA0f6Sxdqr8RbjM2ch31T6Me\n5Z6DYdggwBujcPHwZC1AugI1wJ0T5XHY9f2MDs/XjNEdw3ThYbAdbl1e09ql6Gtg\nSVCa4RlLg/KICdLJtVOLkX6049/XRxi41I6xvu9tXsqgV3+bs8dYbeGLsTWmpPIv\naAUMcf/A5t4B2DVpnlXDytPqfvZQPD3aBVyfEJRGI1yD6Vi9zL3RyIhDQ/I7PMNI\naQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "mastodon-3",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArBsrwKV1RtDfw/5y/L2N\n/x7UL2q6G4JypcD5Q8/aDQOTaGuTR+4RCup+Zcn2wzpdGnX6IzS7cy4/LqMoR2pB\nq8K1FZOXvcCtwsBqsyGWiFdy5aLXy2CkHhTRbkwOLPyb1rBy+qPCBdr055BPZUWm\nTfJaxTmph+Z1J+INz0YndYxz3iKET2V99OP27D7tUdZ7yPgMDbDJWqVxPdYrmAUr\n3QLpmYWsYlmPKhpTAXlvbvzE5vgh5EC8RGfhfYRpacc6QdwbahtxMQAV9+1S2+Vj\nntHfB6PSnYwewUHs9MMn8e33KmNlOZdMAVlyJymBZ4pNceC44vxvZYElp077A6tN\nFwIDAQAB\n-----END PUBLIC KEY-----\n"
}

4
clients/nodejs-1.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "nodejs-1",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9L4BQgLEpQSSbSLwXOab\nfFey5VSk8ynDmj2I9sOpPMIXkXpmbONkyXqZ4CqKrMRtesXAg1F1lIwzE/WJy0wP\n9CRhEgnclHRHE3TVqWt8dC6+u5kx5o48EF8X9UWgV1098c21gcn68NZ7+l/janws\ntLYrgMynikcadaGtAkRszGG0dX+qdeRx9hRzhTNUIG4AYe6bUA6/LfOEPyRyuo3Q\ncaN5fAJSK+RRMWr1d7Mzd8k+l3xXzcUTMUL2To+Zh0Fw2SIEocM4NS1W9nAm4+Cq\nhlQUhsoHDwk7bDsIQtRNfy3bX59PSIVMcWLNkWilLzZW1yRtFGPTJfPlR4Y1XJb5\nuwIDAQAB\n-----END PUBLIC KEY-----\n"
}

4
clients/nodejs-2.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "nodejs-2",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWyrBQXathrKzRO7HbX7\nZXqkeGo7X0q3qckO/Uh4Ht67bFb6iQDRo/gRkaVA0PM++2AhtW7wV2NYXR/3qowc\n1gGtO0zuQq56crcL7k9nVuFJ1IbYDyasEq+5nUKzEUVT0hK1/Vzh12gLFhDkBOX+\nCvISLTTQgEGljwNQLf1kZTraJcdDSN0R2k2jl+idJkeAuK5cjMEJa7Fog8scM2rR\nzGhB8gDRp+iq4HQ+yE3R1yXW9rBfWoConnXiNxholt3e2aAte2V1KnEmVLO/8ceo\nvqIp5xEcDKIAIrSqsmopRFXJ0PjS/nbS0Z2ynxpyh1BV4sqr/y4oOryrnwO+LqBB\nHwIDAQAB\n-----END PUBLIC KEY-----\n"
}

4
clients/nodejs-3.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "nodejs-3",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyqP7aGx+S9Mdt6xmaGnJ\nfNWWQsg4BvLiP1qtVt3VRrcXF2cy1bhgfnmqoBqnDk4bGlRoTzF+rSOw284+O2UQ\ntUlsBRos4TOyGfbYHehF12Re6NX51K9LHwaprr3eN5h08wLI8pjVrRJlbce8pHST\nXQ/CZvU+CBg43LE08cXr5kRmhnZrgh70g7zTO8+1E6y74r1LEh77Ar4uaaB5jXw7\n6o9TyfaA1HgyqvfYbH+9KPrJfMX/DeLrYPMI3IG/j3fzDUQQ8o9Pb5B+G1Apl+I+\nsTcgWRei5u06aZHLMMd8MMo4O1yUhbt05kxfVhlDGUDWBdi3cvsMf95t6MNdz/eq\niwIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "nodejs-4",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwIlB6swdT/Z7tRx/Sm24\n/ro3Jotpsi0DiNS6i7BA1fH0OdbX5CRel62jGC1Nja9QCY8aBd00E8u7KPCuK3iY\n5aA7v91sxWZ7nbXdSwBawaNsTZAe4rMaEkA74INpq7TOvLzHcmDcgRbo+MC2Nw3T\nl0mCOaWkUWFaukTLN8zBldzEbYxztKsaL+b2TbevnSCaPkdD9WmDbmjrUiWTlnpE\nDidMjZ9rp+PcODyjlvwka1yJCoPFoN/+ZL4yXxo49tJ2kbrxSh4tdDZqiZwnajRb\n4SAuRCaHTASDSmZ1Dj0ET/miXuvy6Jgvt06eSMPDKvb+84Dk8zLf4CW6DaE2TfX4\nzwIDAQAB\n-----END PUBLIC KEY-----\n"
}

4
clients/postgres-2.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "postgres-2",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoQmrHoW5X6jpN6cJnafW\nWKz1LpT2DvOFPeRmrlSPOPIUSVPUMZI8ojdxzmri/dzC8C4quCIYaL5ssARhe17L\no16LG3z/wdPENYONBj/oH5GRvmG1/uCgzL5+QQENk3kAWVAUb7EL3EgHNx90b2oC\nDNoHcjuoi3ZkCUXxkX7BESvw1jII4hP+HyoIqGh8TZLIAQ25/mS9aNL3TbcLYp5d\npqoM0Ruc4DHVuZTamN+zBZwNRCBz6uxMmaEBD+piYTEPJOnf7yUT7d2l/QzLftfE\nkSo80KOyrPOFdIPCpqKJyPOJZgg7fSgpR0YC6BH7I/JgIsIwUsQcMS8/ELUC5+Zg\nfwIDAQAB\n-----END PUBLIC KEY-----\n"
}

4
clients/postgres-4.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "postgres-4",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu6fPxOZeKloF/EgYvU0k\nOwv8bJjsCQcWaMTPle5//mRTszA6PM2z9RI+Mfr45qxTlsL9pQY8WJOWF6QOK31x\nszuqcr7oOjtAhrLI8f/oNDEDjcx325FqG9gNKQEAD7d4zodh+PhDe6x7GIyIS7lG\nIcD5Zre9iDwv8FGLR+5GLqS8SJOPL/wJkQ8w+N0f8YDFw81kiTta5NLhAx3fMDs0\n2kmoNlbmKlNZTtLjCfCV+/pa9oY6wycjck3GvobiFE/4cWaNkeGlPc+uAwlfmrOv\nHy0tq1XBX/BCvE5kMXmhnMT23JXjm2s2PgCLgEVGAXilXk/T597KDm+z4oBpAQma\nnQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "postgres-5",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXZv6Gk+dhIVkTXH9hJ1\nt2oqsMSLmTUj71uPN+4j0rxCQriXa095Nle9ifJAxfwzQyKEpWKyZd1Hpyye6bL1\nwgWATZ/u5ZS4B63NhRFyDxgPlHWBBohaZBN42zeq0Y0PNGHPVGDH/zFDrpP22Q9Q\nYScsyXTauE/Yf8a/rKR5jdnoVsVVMxk0LHxka8FcM2cqVsDAcK7GqIG6epqNFY8P\nUb1P+mVxRwnkzvf1VtG212ezV/yw9uiQcUkHS+JwZMAgbC34k9iDyRmk6l4sj/Zk\nNem20ImMqdDzsrX8zEe21K+KNvpejPH9fxaNCwR8W+woBMMzqD3I7P9PbLjc70Rx\nRwIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "postgres-6",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtVzM0fwlimmq11jTGTko\nK87LRYSar61tNF3qVWp9axNSMa6BSxVark9eYOqY4eLh/5vJVDqXDFq30/IUWg40\nH8hHWaOEvQrP2dm/XFw1RmunfbfN9gN07TuhaT3xFD5t+jFBuOSoJ4cPnFIABuVt\nFLrjgtYYjtZe5hGE9ZPmS7o2ATM5EU9mxeQ+TkgDbr8StvSPGdZ1ykhagf1pegGU\nRIfZ+4ZKzyDUAq+fYNhIbmlm5h2gP+XdtakPy43j7n0iN1vwDgBqJ2pdaVs/GcFf\nvaztoltguoknI2NPSez1N217asTTLuth0nHxVXiKCVXnqwDjxgWmuP6X2B7VYjyc\nxQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "redis-1",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7J/jWx6xCoz3ECDA9gr6\nAVVjd3MhE9LmE/bFLdQLariJjyNxJ1qLp/SN1P/H/aBS9YP6HEGkkTekRkWrHkDr\n5pliR9lmdS7c1W2pRKOaBm8r3pl98fBcFtxrkEhlULX5XMUCeGqANjDYeswaKYGb\nYF/OPsL2ZyIzUiejIVoPR9kuCWA8DNa1whgO84r2gMkBSzGu8hAhBoAlXQAoZWWj\nem3sNNwA9X+0WVGuG0X+RxdzNnZ6o28f5UZuDTCuMjJubKM4qg5uuwFtSXHoW8nU\nGl6Y7Owmqsdkh8ZCM8gA4lPu5Kh6XatqQ6Gzq0PXFyCykuXzJRwW4ZVCKC+UyhA0\nQQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "redis-2",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzjHtl5iChC5+uxr9YrQu\n3x4zihlVZGk+fYlpbHg2hV880NslRb1MJYFTaKcJrYmgVAnMaKZjfA4fGsWQ3tDl\n/2JcA95U0Soj9BMwr1EUfvna587xS5DnYNCd+OkVtNwqujdoU8Use13UcpwnaN4V\n/9bslQdw2qDeVmeqx7bfTvsATIedWt9eseMR/qnsMd9Rkz/Q3xJ9NgIdQL6cC7uf\nN6H/B+Y+qV5Kv84nwrkTGPyzNOt21mfzeYOiAMGUTUoS+l38hA4ehfVxb8dWTmNa\n8QENbx6DKP5xUEyCiluzFp5jiGJu9xSDngndLVsQ7de5+KvxTjfipczmrWSjPuYB\nXQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "rs-discourse-1",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApJquhCuRRN/O3rh2QShw\nYxGkEIoBImpVv8uF+VmdPLGQ3fYCO20OSr3y+yk1zGN1aQTEgD7LeCd+U2vBUPAh\nwr2uNkZotIsemkWZIMAPLb9d/2uv/GxBqku0L8JRAxGleHVO5eKsi6w1XdwO00dw\nwgEJa+mju86Vz6hzRzW+KzkdpkcfowH2+BVUV+zuzaR9/mPUiuQXZwSnR+Li4S6j\nR4x/AkRsN/43gzgiBwZz1UdAy6r6ZbUBPm4lZT/QKbURJ+x15swbFHKvR34GvdbT\n2mI15VFvLxr+h4bH5CCswcV4eThzISHGbiN3LZQVpneoWP8BjerFVqx0NfbKDu9t\nsQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -0,0 +1,4 @@
{
"name": "rsk-mainnet-1",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtavs6RQW6af9fWuEuhI1\nQa4Ff7Z1CfZ0fHz152UqUeUKatQ/psKVs5ULWDV/b69fSuNsUzkCny9OwtwyQB/F\n2U+vbv3/3As3z6i3V3q8q4ahCHd7tkMmxMLaWcdkfWbpupWTRkCEX+PSDKS0hdfp\n3EQKVA2FrqR0sSnnT+Q66kZw4/WJrNwtSLcps4D5OubG7xr/uUn3Vyv5qXvS/7kx\nGvMONs55qh64Gtc3FSFPEdVyZXasCMEWwXyadqzf+/qJtEYlK0Uy5E/u7CTsnmcH\n9TEiYVw0/6PomQ2HJfSlZVUUO007OliBHO9bWOwZ6qI5c53pt5KES0dyy6SQ4m+8\nawIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "rsk-mainnet-3",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwdrYfy0Spmt8VETCdUgW\nHbxV3uYA3kn2swvOdIjIR29gNO+t6wWv6FHnV/pfefIweIPaNlr9VMoUejUKX809\ngzdsiVWh1T6s4Yzbbt+O8mF3my5RXiSvizda8c6U65vofBSL2WVzE1AW9v7lXRHX\nJ4auKrpgKWkNLU52QLIP9/X5YLUHQtpTnplO31eb+jSD185aN1qoIxugunxnWSgm\n2NgUPlVbNCFrhv0PVv4Ts10eX6smRX3LKyNBtRRXM3GIrQHlAYRohIpy3lt8tKm4\nE/v9qpXQHvqEmX9FH1/Sonea849cWX3LuxUYLT2XFpaNwUxJK56Ef0HsgZESaxL+\n3QIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -0,0 +1,4 @@
{
"name": "rsk-testnet-1",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0JU46rCyLGOi5OdeeE2M\nobUUxO+Jqd9t9bP75Pyj0uH8WaxNv1PIdWZJiR+fcE+draBV86/YLxHzOFvsnMi+\nE/qgeXLKErGtTSb12mWq0gYv/wz9uqRbtcsv40gpu2BtNv9ycdXYACB/s0ipnuUO\nX/os4YHDvWV1cshwzgsQ87ad7OdT/Nldggtp4go60TkBi49VaftiJzYqVm1ey3xz\nd7+EsQWqhQHAac6POEuPjwNuM2valf/8+nI4Uday/CiFrDDV1SffRG30sd4rJF15\nh1S1Kxyetr72EmQwIGbJuDJL7eUU7blXjg6UtTxDDsl6rYUO5s/j7wZLoFhmC854\npQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -0,0 +1,4 @@
{
"name": "rsk-testnet-2",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzG2bgL0n5Q7bTR4WYHOB\nZNOuRem/jjarU/bL0VKKn0JqD3PPDAnhq9gRn7H8SwyGoVFN60YGzu45O4c+SqN3\nCXN+FeFabigH2tKLxBz3kNDYTT/F1ErLLi/6ydrCV3tpddR5KTqLSOntojG8KNzc\nyG4rMV9ebCE1wDVxAFdEA+YDZS8YjP0nO5sLWFacA0ZTx27t5ugqZP1acjSvKzWs\nZ+ekX5Pbws/oUHyaqEEPdz7er4MTBm0bdkCHZbM7132oBcH/huJZhmTXFEdoy4ML\nhP4MWWSvwo66HDYjnaID82a8W1RJZZu2irbPHrfVlaFAh8VQk1T1kkUu0bMovT3V\nYQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "rsk-testnet-4",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1NgmlPomxGRtu5oyro+m\ndQwBXwrhEuE73aLrUsqGOVSezph6LnETiEMFUIe1weoG+xdcykcUUMt7o1+nKs+E\nl8dxMIgbXAxdpI4n8gOpii70Sh30BDbh8+qZHsKBq32UmkCpz2ViVe/Vb3ViqB3e\n0GIkknPle5G4IC612O8EUkCenwcD1jSXYyug5zWI2T/TwnTuw4JdxfhkMgBM7Y2n\nR1YY6GwAMkK97wE/yBM74+Tiv/6lDy/JDbYmUVcQ55C937oodSWLAEM24EcOOtMA\nKfGumnthbdHzmHjONmLIegD3OJGYC2ulcB9qmaL/7cyIRhf6fEQrBolCH5881fxl\nxwIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "rsk-testnet-5",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx/UHlgcSeh9Do7CTCKXC\n/4/aO2OvT+ijDVmrMYCNtE4sMeuFqKPnV1zxJZmRm4VNhkSQDkdWYD+6XvuFYW60\nyjB/N6D5lLlyjG4HD6fTkfh0K6f7t5mOYV7o4T59OoA3cBZuSROjtWmJ8jEFJ+k9\nII2kcyhPQcFN01ckzvZKRSPbVRccMoc+AKTjB3ZUfs/ERtlVoDrK4jEHluXOxUJO\nBKCcLonjJuLlpRLh7QfKrKFcR4idn5Ir43R6aSUesI/ipKwKsXnR3Bu7vXp74VF3\nMJ3EkdSBG+qJzy51fbRfQiUPAr/vSoVQZwW7FkIhIqqLkMaYCymn7qKfTGujoNU7\nlwIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -1,4 +0,0 @@
{
"name": "sentry-1",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtZFwP58ym+92YFa0adU3\nVGEJW13NkfaHChx+akB3IioSPKyJ9eOXEI8pOmU3QyqOUKSbqth78DY84hobXlqs\n4O0A7TV029uepcj5zPN047gDsV1TJ6Dakma5eH+Pe5kP/TigCEOF0Cgo+fqtEBEJ\nT/rhSs3zHD1EfBnZdyj/7YyeDv1XLWI8dXoizDUAoBSCDeJ5d7fG56zmFYLV05Ex\nMrjJuHitEmeJXTZABKstRbEd+3Rld+gfJZ/jI4djEW2j1EKAYMT1SxoXdjKlCrpQ\nGux2RSe+Gspt1hyp/flU5gHGO+qLDNSU9tZInClToyFMVBfoW8kWg28Gm2kGkIvr\npQIDAQAB\n-----END PUBLIC KEY-----\n"
}

4
clients/zerotier-2.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "zerotier-2",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsild7NcktO5yVR3Uw0yA\negHFToXHaJMIR1z0WrfHgklHf27lRnWRHOiNjnR6SbsvKIT1MBntg4/mQgotah+n\npo6cKF+0pvUih+hOSBZ6+WwjRf5LxJTaj/R0e2j0Gig6PlDV3yWz8+2AB6gObVcb\nKOQT1w6p+T+S9t6Hv/E0Z8CJW+7ZXDZBvjKTg4kYb47P0J5704wATf38EcVAOuoa\nJsUJoE+dTygx2QUG78eiEYqVDgBak00MA7MpFI/yPrzfn4tjSO1aY2/vy1PyG0Zq\nfgAhuFNZPWQwxMvYsK68gFxfmfwsEn0iJOFh0rPCKYWgOCxzkMLk2z7ppCmNd+H6\nNQIDAQAB\n-----END PUBLIC KEY-----\n"
}

4
clients/zerotier-3.json Normal file
View File

@ -0,0 +1,4 @@
{
"name": "zerotier-3",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA70y96zXq3XiMlJhLM5Tm\nCzRiZjwqCBN1fKOoihZpsgXHtqDfYd+5BTyafAKTpzVpAZ7HJp+X4da8T/rb+Pym\nu0PrREXJSXGdWjKIgvsTVUtT51ZFYWtqbpu2l43wh57KCt7Q57JRgKTPyNbHJS0Z\ngrB6fifvQMfzFMf+WKK4X7Z6VXFP1r2cwzRvywC4/d3ZSbJ4fP3g+nnl1623Pxfc\n/BkqyaDeRt2dBEa5I8+OvFkKC8muU99fWR/gPZkkWD4pFNwLPLnPfgdk3bUd7tjN\n/0ardVX9lRJog1CjXCHaUG9aq+WFrtr/tfW+kLff/P7k00E5zplqq9Oz6VUvRMmu\nNQIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@ -0,0 +1,101 @@
# Application Changelog
## v5.2.0
* Add `application_directory` resource.
* Chef 13 compatibility.
## v5.1.0
* Add `application_cookbook_file`, `application_file`, and `application_template` resources.
## v5.0.0
* Massive rewrite on top of newer Chef patterns. See the 5.0 README for details.
## v4.1.6
* Support for Chef 12.
* Add `strict_ssh` option to enable host key checking.
* Add `keep_releases` option to control number of releases to keep.
* Allow passing a path to a file for `deploy_key`.
## v4.1.4
* [COOK-3343](https://tickets.opscode.com/browse/COOK-3343) - Can't parse release candidate version number.
## v4.1.2
* [COOK-3343](https://tickets.opscode.com/browse/COOK-3343) - Can't parse release candidate version number.
## v4.1.0
* [COOK-3343] - Can't parse release candidate version number.
## v4.0.0
* Removes compatability with Chef 10.
* [COOK-3564](https://tickets.opscode.com/browse/COOK-3564) - Replace calls to `Chef::Mixin::RecipeDefinitionDSLCore`.
## v3.0.0
* [COOK-3306]: Multiple Memory Leaks in Application Cookbook.
## v2.0.4
* [COOK-2812]: application cookbook doesn't allow to specify a block as `restart_command`.
## v2.0.2
* [COOK-2537]: Provide proper `respond_to` behavior when using `method_missing`.
* [COOK-2713]: application resource should Allow sub-resource attributes to propogate up.
### Improvement
* [COOK-2597]: Allow customization for `shallow_clone` when doing a git deploy.
## v2.0.0
This release is incompatible with previous releases (hence major version change). The recipes used in older versions are deprecated and completely removed. See README.md for further detail.
* [COOK-1673] - `deploy_revision` in the application cookbook gives an argument error.
* [COOK-1820] - Application cookbook: remove deprecated recipes.
## v1.0.4
* [COOK-1567] - Add git submodules to application cookbook.
## v1.0.2
* [COOK-1312] - string callbacks fail with method not found (really included this time).
* [COOK-1332] - add `release_path` and `shared_path` methods.
* [COOK-1333] - add example for running migrations.
* [COOK-1360] - fix minor typos in README.
* [COOK-1374] - use runit attributes in unicorn run script.
## v1.0.0
This release introduces the LWRP for application deployment, as well as other improvements. The recipes will be deprecated in August 2012 as indicated by their warning messages and in the README.md.
* [COOK-634] - Implement LWRP for application deployment.
* [COOK-1116] - use other SCMs than git.
* [COOK-1252] - add `:force_deploy` that maps to corresponding action of deploy resource.
* [COOK-1253] - fix rollback error.
* [COOK-1312] - string callbacks fail with method not found.
* [COOK-1313] - implicit file based hooks aren't invoked.
* [COOK-1318] - Create `to_ary` method to resolve issue in resources() lookup on "application[foo]" resources.
## v0.99.14
* [COOK-1065] - use pip in virtualenv during deploy.
## v0.99.12
* [COOK-606] application cookbook deployment recipes should use ipaddress instead of fqdn.
## v0.99.11
* make the `_default` `chef_environment` look like production rails env.
## v0.99.10
* Use Chef 0.10's `node.chef_environment` instead of `node['app_environment']`.

View File

@ -0,0 +1,260 @@
# Application cookbook
[![Build Status](https://img.shields.io/travis/poise/application.svg)](https://travis-ci.org/poise/application)
[![Gem Version](https://img.shields.io/gem/v/poise-application.svg)](https://rubygems.org/gems/poise-application)
[![Cookbook Version](https://img.shields.io/cookbook/v/application.svg)](https://supermarket.chef.io/cookbooks/application)
[![Coverage](https://img.shields.io/codeclimate/coverage/github/poise/application.svg)](https://codeclimate.com/github/poise/application)
[![Gemnasium](https://img.shields.io/gemnasium/poise/application.svg)](https://gemnasium.com/poise/application)
[![License](https://img.shields.io/badge/license-Apache_2-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
A [Chef](https://www.chef.io/) cookbook to deploy applications.
## Getting Started
The application cookbook provides a central framework to deploy applications
using Chef. Generally this will be web applications using things like Rails,
Django, or NodeJS, but the framework makes no specific assumptions. The core
`application` resource provides DSL support and helpers, but the heavy lifting
is all done in specific plugins detailed below. Each deployment starts with
an `application` resource:
```ruby
application '/path/to/deploy' do
owner 'root'
group 'root'
# ...
end
```
The `application` resource uses the Poise subresource system for plugins. This
means you configure the steps of the deployment like normal recipe code inside
the `application` resource, with a few special additions:
```ruby
application '/path/to/deploy' do
# Application resource properties.
owner 'root'
group 'root'
# Subresources, like normal recipe code.
package 'ruby'
git '/path/to/deploy' do
repository 'https://github.com/example/myapp.git'
end
application_rails '/path/to/deploy' do
database 'mysql://dbhost/myapp'
end
end
```
When evaluating the recipe inside the `application` resource, it first checks
for `application_#{resource}`, as well as looking for an LWRP of the same name
in any cookbook starting with `application_`. This means that a resource named
`application_foo` can be used as `foo` inside the `application` resource:
```ruby
application '/path/to/deploy' do
owner 'root'
group 'root'
rails '/path/to/deploy' do
database 'mysql://dbhost/myapp'
end
end
```
Additionally if a resource inside the `application` block doesn't have a name,
it uses the same name as the application resource itself:
```ruby
application '/path/to/deploy' do
owner 'root'
group 'root'
rails do
database 'mysql://dbhost/myapp'
end
end
```
Other than those two special features, the recipe code inside the `application`
resource is processed just like any other recipe.
## Available Plugins
* [`application_git`](https://github.com/poise/application_git) Deploy
application code from a git repository.
* [`application_ruby`](https://github.com/poise/application_ruby) Manage Ruby
deployments, such as Rails or Sinatra applications.
* [`application_python`](https://github.com/poise/application_python) Manage
Python deployments, such as Django or Flask applications.
* [`application_javascript`](https://github.com/poise/application_javascript)
Manage server-side JavaScript deployments using Node.js or io.js.
* `application_java` *Coming soon!*
* `application_go` *Coming soon!*
* `application_erlang` *Coming soon!*
## Requirements
Chef 12 or newer is required.
## Resources
### `application`
The `application` resource has top-level configuration properties for each
deployment and acts as a container for other deployment plugin resources.
```ruby
application '/opt/test_sinatra' do
git 'https://github.com/example/my_sinatra_app.git'
bundle_install do
deployment true
end
unicorn do
port 9000
end
end
```
#### Actions
* `:deploy` Deploy the application. *(default)*
* `:start` - Run `:start` on all subresources that support it.
* `:stop` - Run `:stop` on all subresources that support it.
* `:restart` - Run `:restart` on all subresources that support it.
* `:reload` - Run `:reload` on all subresources that support it.
#### Properties
* `path` Path to deploy the application to. *(name attribute)*
* `environment` Environment variables for all application deployment steps.
* `group` System group to deploy the application as.
* `owner` System user to deploy the application as.
* `action_on_update` Action to run on the application resource when any
subresource is updated. *(default: restart)*
* `action_on_update_immediately` Run the `action_on_update` notification with
`:immediately`. *(default: false)*
### `application_cookbook_file`, `application_directory`, `application_file`, `application_template`
The `application_cookbook_file`, `application_directory`, `application_file`, and `application_template`
resources extend the core Chef resources to take some application-level
configuration in to account:
```ruby
application '/opt/myapp' do
template 'myapp.conf' do
source 'myapp.conf.erb'
end
directory 'logs'
end
```
If the resource name is a relative path, it will be expanded relative to the
application path. If an owner or group is declared for the application, those
will be the default user and group for the resource.
All other actions and properties are the same as the similar resource in core Chef.
## Examples
Some test recipes are available as examples for common application frameworks:
* [Sinatra](https://github.com/poise/application_ruby/blob/master/test/cookbooks/application_ruby_test/recipes/sinatra.rb)
* [Rails](https://github.com/poise/application_ruby/blob/master/test/cookbooks/application_ruby_test/recipes/rails.rb)
* [Flask](https://github.com/poise/application_python/blob/master/test/cookbook/recipes/flask.rb)
* [Django](https://github.com/poise/application_python/blob/master/test/cookbook/recipes/django.rb)
* [Express](https://github.com/poise/application_javascript/blob/master/test/cookbook/recipes/express.rb)
## Upgrading From 4.x
While the overall design of the revamped application resource is similar to the
4.x version, some changes will need to be made. The `name` property no longer
exists, with the name attribute being used as the path to the deployment.
The `packages` property has been removed as this is more easily handled via
normal recipe code.
The SCM-related properties like `repository` and `revision` are now handled by
normal plugins. If you were deploying from a private git repository you will
likely want to use the `application_git` cookbook, otherwise just use the
built-in `git` or `svn` resources as per normal.
The properties related to the `deploy` resource like `strategy` and `symlinks`
have been removed. The `deploy` resource is no longer used so these aren't
relevant. As a side effect of this, you'll likely want to point the upgraded
deployment at a new folder or manually clean the `current` and `shared` folders
from the existing folder. The pseudo-Capistrano layout used by the `deploy`
resource has few benefits in a config-managed world and introduced a lot of
complexity and moving pieces that are no longer required.
With the removal of the `deploy` resource, the callback properties and commands
are no longer used as well. Subresources no longer use the complex
actions-as-callbacks arrangement as existed before, instead following normal
Chef recipe flow. Individual subresources may need to be tweaked to work with
newer versions of the cookbooks they come from, though most have stayed similar
in overall approach.
## Database Migrations and Chef
Several of the web application deployment plugins include optional support to
run database migrations from Chef. For "toy" applications where the app and
database run together on a single machine, this is fine and is a nice time
saver. For anything more complex I highly recommend not running database
migrations from Chef. Some initial operations like creating the database and/or
database user are more reasonable as they tend to be done only once and by their
nature the application does not yet have users so some level of eventual
consistency is more acceptable. With migrations on a production application, I
encourage using Chef and the application cookbooks to handle deploying the code
and writing configuration files, but use something more specific to run the
actual migration task. [Fabric](http://www.fabfile.org/),
[Capistrano](http://capistranorb.com/), and [Rundeck](http://rundeck.org/) are
all good choices for this orchestration tooling.
Migrations can generally be applied idempotently but they have unique
constraints (pun definitely intended) that make them tricky in a Chef-like,
convergence-based system. First and foremost is that many table alterations
lock the table for updating for at least some period of time. That can mean that
while staging the new code or configuration data can happen within a window, the
migration itself needs to be run in careful lockstep with the rest of the
deployment process (eg. moving things in and out of load balancers). Beyond
that, while most web frameworks have internal idempotence checks for migrations,
running the process on two servers at the same time can have unexpected effects.
Overall migrations are best thought of as a procedural step rather than a
declaratively modeled piece of the system.
## Application Signals and Updates
The `application` resource exposes `start`, `stop`, `restart`, and `reload`
actions which will dispatch to any subresources attached to the application.
This allows for generic application-level restart or reload signals that will
work with any type of deployment.
Additionally the `action_on_update` property is used to set a default
notification so any subresource that updates will trigger an application
restart or reload. This can be disabled by setting `action_on_update false` if
you want to take manual control of service restarts.
## Sponsors
Development sponsored by [Chef Software](https://www.chef.io/), [Symonds & Son](http://symondsandson.com/), and [Orion](https://www.orionlabs.co/).
The Poise test server infrastructure is sponsored by [Rackspace](https://rackspace.com/).
## License
Copyright 2015-2016, Noah Kantrowitz
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,25 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
module PoiseApplication
autoload :AppMixin, 'poise_application/app_mixin'
autoload :Error, 'poise_application/error'
autoload :Resources, 'poise_application/resources'
autoload :ServiceMixin, 'poise_application/service_mixin'
autoload :Utils, 'poise_application/utils'
autoload :VERSION, 'poise_application/version'
end

View File

@ -0,0 +1,64 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise/utils'
require 'poise_application/app_mixin'
module PoiseApplication
# A helper mixin for `file`-like resources to make them take application
# resource data. Relative paths are expanded against the application path and
# the app owner/group are the default user/group for the resource.
#
# @api private
# @since 5.1.0
module AppFileMixin
include Poise::Utils::ResourceProviderMixin
module Resource
include PoiseApplication::AppMixin
def initialize(*)
super
# So our lazy default below can work. Not needed on 12.7+.
remove_instance_variable(:@path) if instance_variable_defined?(:@path)
end
# @!attribute path
# Override the default path to be relative to the app path.
# @return [String]
attribute(:path, kind_of: String, default: lazy { parent ? ::File.expand_path(name, parent.path) : name })
# @!attribute group
# Override the default group to be the app group if unspecified.
# @return [String, Integer]
attribute(:group, kind_of: [String, Integer, NilClass], default: lazy { parent && parent.group })
# @!attribute owner
# Override the default user to be the app owner if unspecified.
# @return [String, Integer]
attribute(:owner, kind_of: [String, Integer, NilClass], default: lazy { parent && parent.owner })
# For the forgetful.
alias_method :user, :owner
end
module Provider
include PoiseApplication::AppMixin
end
end
end

View File

@ -0,0 +1,69 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'chef/mash'
require 'poise/provider'
require 'poise/resource'
require 'poise/utils'
module PoiseApplication
# A helper mixin for application resources and providers. These are things
# intended to be used as subresources of the `application` resource.
#
# @since 5.0.0
module AppMixin
include Poise::Utils::ResourceProviderMixin
# A helper mixin for application resources.
module Resource
include Poise::Resource
# Set the parent type and optional flag.
poise_subresource(:application, true)
# @!attribute path
# Base path for the application.
# @return [String]
attribute(:path, kind_of: String, name_attribute: true)
# A delegator for accessing the application state. If no application
# parent is found, the state will be tracked internally within the
# resource.
#
# @return [Hash<Symbol, Object>]
def app_state
if parent
parent.app_state
else
# If there isn't a parent, just track within the resource.
@local_app_state ||= Mash.new
end
end
# Environment variables stored in the application state.
#
# @return [Hash<String, String>]
def app_state_environment
app_state[:environment] ||= Mash.new
end
end
module Provider
include Poise::Provider
end
end
end

View File

@ -0,0 +1,17 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_application/resources'

View File

@ -0,0 +1,24 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
module PoiseApplication
# Base exception class for poise-application errors.
#
# @since 5.0.0
class Error < Exception
end
end

View File

@ -0,0 +1,30 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_application/resources/application'
require 'poise_application/resources/application_cookbook_file'
require 'poise_application/resources/application_directory'
require 'poise_application/resources/application_file'
require 'poise_application/resources/application_template'
module PoiseApplication
# Chef resources and providers for poise-application.
#
# @since 5.0.0
module Resources
end
end

View File

@ -0,0 +1,259 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'chef/dsl/recipe' # On 12.4+ this will pull in chef/dsl/resources.
require 'chef/resource'
require 'chef/provider'
require 'poise'
module PoiseApplication
module Resources
# (see Application::Resource)
# @since 5.0.0
module Application
# An `application` resource to manage application deployment.
#
# @since 5.0.0
# @provides application
# @action deploy
# @action start
# @action stop
# @action restart
# @action reload
# @example
# application '/srv/myapp' do
# git '...'
# poise_service 'myapp' do
# command '/srv/myapp/main'
# end
# end
class Resource < Chef::Resource
include Poise(container: true, container_namespace: false)
provides(:application)
actions(:deploy, :start, :stop, :restart, :reload)
# @!attribute path
# Application base path.
# @return [String]
attribute(:path, kind_of: String, name_attribute: true)
# @!attribute environment
# Environment variables to set for the whole application.
# @return [Hash<String, String>]
attribute(:environment, kind_of: Hash, default: lazy { Mash.new })
# @!attribute owner
# System user that will own the application. This can be overriden in
# individual subresources.
# @return [String]
attribute(:owner, kind_of: String)
# @!attribute group
# System group that will own the application. This can be overriden in
# individual subresources.
# @return [String]
attribute(:group, kind_of: String)
# @!attribute action_on_update
# Action to run when any subresource is updated. Defaults to `:restart`.
# @return [String, Symbol, nil, false]
attribute(:action_on_update, kind_of: [Symbol, String, NilClass, FalseClass], default: :restart)
# @!attribute action_on_update_immediately
# Run the {#action_on_update} notification with `:immediately`.
# @return [Boolean]
attribute(:action_on_update_immediately, equal_to: [true, false], default: false)
# Run the DSL rewire when the resource object is created.
# @api private
def initialize(*args)
super
_rewire_dsl! if node
end
# Application-specific state values used as a way to communicate between
# subresources.
#
# @return [Mash]
# @example
# if new_resource.parent && new_resource.parent.app_state['gemfile_path']
def app_state
@app_state ||= Mash.new(environment: environment)
end
# Override Container#register_subresource to add our action_on_update.
#
# @api private
def register_subresource(resource)
super.tap do |added|
if added && action_on_update
Chef::Log.debug("[#{self}] Registering #{action_on_update_immediately ? 'immediate ' : ''}#{action_on_update} notification from #{resource}")
resource.notifies action_on_update.to_sym, self, (action_on_update_immediately ? :immediately : :delayed)
end
end
end
private
# Find all resources that need to be rewired. This is anything with a
# name starting with application_.
#
# @return [Array<String>]
def _rewire_resources
if defined?(Chef::DSL::Resources)
# Chef >= 12.4.
Chef::DSL::Resources.instance_methods
else
# Chef < 12.4 >= 12.0.
Chef::Resource.descendants.map do |klass|
klass.node_map.instance_variable_get(:@map).keys + if klass.dsl_name.include?('::')
# Probably not valid.
# :nocov:
[]
# :nocov:
else
# Needed for things that don't call provides().
[klass.dsl_name]
end
end.flatten
end.map {|name| name.to_s }.select {|name| name.start_with?('application_') }.uniq
end
# Find all cookbooks that might contain LWRPs matching our name scheme.
#
# @return [Array<String>]
def _rewire_cookbooks
# Run context might be unset during test setup.
if run_context
run_context.cookbook_collection.keys.select {|cookbook_name| cookbook_name.start_with?('application_') }
else
[]
end
end
# Build the mapping of new_name => old_name for each resource to rewire.
#
# @return [Hash<String, String>]
def _rewire_map
application_cookbooks = _rewire_cookbooks
_rewire_resources.inject({}) do |memo, name|
# Grab the resource class to check if it is an LWRP.
klass = Chef::Resource.resource_for_node(name.to_sym, node)
# Find the part to trim. Check for LWRP first, then just application_.
trim = if klass < Chef::Resource::LWRPBase
application_cookbooks.find {|cookbook_name| name.start_with?(cookbook_name) && name != cookbook_name } || 'application'
else
# Non-LWRPs are assumed to have a better name.
'application'
end
# Map trimmed to untrimmed.
memo[name[trim.length+1..-1]] = name
memo
end
end
# Build new DSL methods to implement the foo -> application_foo behavior.
#
# @return [void]
def _rewire_dsl!
# Generate stub methods for all the rewiring.
_rewire_map.each do |new_name, old_name|
# This is defined as a singleton method on self so it looks like
# the DSL but is scoped to just this context.
define_singleton_method(new_name) do |name=nil, *args, &block|
# Store the caller to correct the source_line.
created_at = caller[0]
public_send(old_name, name, *args) do
# Set the declared type to be the native name.
self.declared_type = self.class.resource_name
# Fix the source location. For Chef 12.4 we could do this with the
# declared_at parameter on the initial send.
self.source_line = created_at
# Run the original block.
instance_exec(&block) if block
end
end
end
end
end
# Provider for `application`.
#
# @since 5.0.0
# @see Resource
# @provides application
class Provider < Chef::Provider
include Poise
provides(:application)
# `deploy` action for `application`. Creates the application base folder.
#
# @return [void]
def action_deploy
notifying_block do
directory new_resource.path do
owner new_resource.owner
group new_resource.group
mode '755'
end
end
end
# `start` action for `application`. Proxies to subresources.
#
# @return [void]
def action_start
proxy_action(:start)
end
# `stop` action for `application`. Proxies to subresources.
#
# @return [void]
def action_stop
proxy_action(:stop)
end
# `restart` action for `application`. Proxies to subresources.
#
# @return [void]
def action_restart
proxy_action(:restart)
end
# `reload` action for `application`. Proxies to subresources.
#
# @return [void]
def action_reload
proxy_action(:reload)
end
private
# Proxy an action to any subresources that support it.
#
# @param action [Symbol] Action to proxy.
# @return [void]
def proxy_action(action)
Chef::Log.debug("[#{new_resource} Running proxied #{action} action")
new_resource.subresources.each do |r|
begin
r.run_action(action) if r.allowed_actions.include?(action)
rescue Chef::Exceptions::UnsupportedAction
# Don't care, just move on.
end
end
end
end
end
end
end

View File

@ -0,0 +1,54 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_application/app_file_mixin'
module PoiseApplication
module Resources
# (see ApplicationCookbookFile::Resource)
# @since 5.1.0
module ApplicationCookbookFile
# An `application_cookbook_file` resource to manage Chef cookbook_files inside and
# Application cookbook deployment.
#
# @provides application_cookbook_file
# @action create
# @action create_if_missing
# @action delete
# @action touch
# @example
# application '/srv/myapp' do
# cookbook_file 'myapp.conf' do
# source 'myapp.conf'
# end
# end
class Resource < Chef::Resource::CookbookFile
include PoiseApplication::AppFileMixin
provides(:application_cookbook_file)
actions(:create, :create_if_missing, :delete, :touch)
subclass_providers!
def initialize(*args)
super
# For older Chef.
@resource_name = :application_cookbook_file
end
end
end
end
end

View File

@ -0,0 +1,50 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_application/app_file_mixin'
module PoiseApplication
module Resources
# (see ApplicationDirectory::Resource)
# @since 5.1.0
module ApplicationDirectory
# An `application_directory` resource to manage Chef files inside and
# Application cookbook deployment.
#
# @provides application_directory
# @action create
# @action delete
# @example
# application '/srv/myapp' do
# directory 'logs'
# end
class Resource < Chef::Resource::Directory
include PoiseApplication::AppFileMixin
provides(:application_directory)
actions(:create, :delete)
subclass_providers!
def initialize(*args)
super
# For older Chef.
@resource_name = :application_directory
end
end
end
end
end

View File

@ -0,0 +1,54 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_application/app_file_mixin'
module PoiseApplication
module Resources
# (see ApplicationFile::Resource)
# @since 5.1.0
module ApplicationFile
# An `application_file` resource to manage Chef files inside and
# Application cookbook deployment.
#
# @provides application_file
# @action create
# @action create_if_missing
# @action delete
# @action touch
# @example
# application '/srv/myapp' do
# file 'myapp.conf' do
# source 'myapp.conf.erb'
# end
# end
class Resource < Chef::Resource::File
include PoiseApplication::AppFileMixin
provides(:application_file)
actions(:create, :create_if_missing, :delete, :touch)
subclass_providers!
def initialize(*args)
super
# For older Chef.
@resource_name = :application_file
end
end
end
end
end

View File

@ -0,0 +1,54 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_application/app_file_mixin'
module PoiseApplication
module Resources
# (see ApplicationTemplate::Resource)
# @since 5.1.0
module ApplicationTemplate
# An `application_template` resource to manage Chef templates inside and
# Application cookbook deployment.
#
# @provides application_template
# @action create
# @action create_if_missing
# @action delete
# @action touch
# @example
# application '/srv/myapp' do
# template 'myapp.conf' do
# source 'myapp.conf.erb'
# end
# end
class Resource < Chef::Resource::Template
include PoiseApplication::AppFileMixin
provides(:application_template)
actions(:create, :create_if_missing, :delete, :touch)
subclass_providers!
def initialize(*args)
super
# For older Chef.
@resource_name = :application_template
end
end
end
end
end

View File

@ -0,0 +1,116 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'chef/resource'
require 'chef/provider'
require 'poise/utils'
require 'poise_service/service_mixin'
require 'poise_service/utils'
require 'poise_application/app_mixin'
require 'poise_application/utils'
module PoiseApplication
# Mixin for application services. This is any resource that will be part of
# an application deployment and involves running a persistent service.
#
# @api public
# @since 5.0.0
# @example
# module MyApp
# class Resource < Chef::Resource
# include Poise
# provides(:my_app)
# include PoiseApplication::ServiceMixin
# end
#
# class Provider < Chef::Provider
# include Poise
# provides(:my_app)
# include PoiseApplication::ServiceMixin
#
# def action_enable
# notifying_block do
# template '/etc/myapp.conf' do
# # ...
# end
# end
# super
# end
#
# def service_options(r)
# super
# r.command('myapp --serve')
# end
# end
# end
module ServiceMixin
include Poise::Utils::ResourceProviderMixin
# Mixin for application service resources.
#
# @see ServiceMixin
module Resource
include PoiseService::ServiceMixin::Resource
include PoiseApplication::AppMixin::Resource
module ClassMethods
# @api private
def included(klass)
super
klass.extend(ClassMethods)
klass.class_exec do
attribute(:path, kind_of: String, name_attribute: true)
# Redefines from the PoiseService version so we get a better default.
attribute(:service_name, kind_of: String, default: lazy { PoiseService::Utils.parse_service_name(path) })
attribute(:user, kind_of: [String, Integer], default: lazy { parent ? parent.owner : 'root' })
end
end
end
extend ClassMethods
end
# Mixin for application service providers.
#
# @see ServiceMixin
module Provider
include PoiseService::ServiceMixin::Provider
include PoiseApplication::AppMixin::Provider
private
# Abstract hook to set parameters on {#service_resource} when it is
# created. This is required to set at least `resource.command`.
#
# @api public
# @param resource [Chef::Resource] Resource instance to set parameters on.
# @return [void]
# @example
# def service_options(resource)
# super
# resource.command('myapp --serve')
# end
def service_options(resource)
super
resource.directory(new_resource.path)
resource.user(new_resource.user)
resource.environment.update(new_resource.app_state_environment) if new_resource.parent
end
end
end
end

View File

@ -0,0 +1,51 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'etc'
module PoiseApplication
# Utility methods for PoiseApplication.
#
# @api public
# @since 5.0.0
module Utils
# Methods are also available as module-level methods as well as a mixin.
extend self
# Try to find the primary group name for a given user.
#
# @param user [String, Integer] User to check, if given as an integer this
# is used as a UID, otherwise it is the username.
# @return [String]
# @example
# attribute(:group, kind_of: [String, Integer], default: lazy { PoiseApplication::Utils.primary_group_for(user) })
def primary_group_for(user)
# Force a reload in case any users were created earlier in the run.
Etc.endpwent
Etc.endgrent
user = if user.is_a?(Integer)
Etc.getpwuid(user)
else
Etc.getpwnam(user.to_s)
end
Etc.getgrgid(user.gid).name
rescue ArgumentError
# One of the get* calls exploded. ¯\_(ツ)_/¯
user.to_s
end
end
end

View File

@ -0,0 +1,20 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
module PoiseApplication
VERSION = '5.2.0'
end

View File

@ -0,0 +1,19 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
raise 'Halite is not compatible with no_lazy_load false, please set no_lazy_load true in your Chef configuration file.' unless Chef::Config[:no_lazy_load]
$LOAD_PATH << File.expand_path('../../files/halite_gem', __FILE__)
require "poise_application/cheftie"

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
# Application_Git Changelog
## v1.1.0
* [#2](https://github.com/poise/application_git/issues/2) Inherit user and group values from the parent `application` resource.
* [#3](https://github.com/poise/application_git/issues/3) Fix usage with users created during the current Chef run.
## v1.0.0
* Initial release.

View File

@ -0,0 +1,108 @@
# Application_Git Cookbook
[![Build Status](https://img.shields.io/travis/poise/application_git.svg)](https://travis-ci.org/poise/application_git)
[![Gem Version](https://img.shields.io/gem/v/poise-application-git.svg)](https://rubygems.org/gems/poise-application-git)
[![Cookbook Version](https://img.shields.io/cookbook/v/application_git.svg)](https://supermarket.chef.io/cookbooks/application_git)
[![Coverage](https://img.shields.io/codecov/c/github/poise/application_git.svg)](https://codecov.io/github/poise/application_git)
[![Gemnasium](https://img.shields.io/gemnasium/poise/application_git.svg)](https://gemnasium.com/poise/application_git)
[![License](https://img.shields.io/badge/license-Apache_2-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
A [Chef](https://www.chef.io/) cookbook to handle deploying code from git when
using the [application cookbook](https://github.com/poise/application).
## Quick Start
To deploy from a private GitHub repository:
```ruby
application '/srv/myapp' do
git 'git@github.com:example/myapp.git' do
deploy_key chef_vault_item('deploy_keys', 'myapp')['key']
end
end
```
## Requirements
Chef 12 or newer is required.
## Resources
### `application_git`
The `application_git` resource deploys code from git. It extends the core `git`
resource to support deploy keys and disabling strict host key verification.
```ruby
application '/srv/myapp' do
git 'git@github.com:example/myapp.git'
end
```
#### Actions
All actions work the same as the core `git` resource.
* `:sync` Clone and checkout the requested revision *(default)*
* `:checkout` Checkout the request revision. If the repository isn't already
cloned, this action does nothing.
* `:export` Export the repository without the `.git` folder.
#### Properties
All properties from the core `git` resource work the same way with the following
additions:
* `deploy_key` SSH key to use with git. Can be specified either as a path to
key file already created or as a string value containing the key directly.
* `strict_ssh` Enable strict SSH host key checking. *(default: false)*
### DSL Usage
The `application_git` resource can be used directly as a replacement for the
core `git` resource:
```ruby
application_git '/srv/myapp' do
repository 'git@github.com:example/myapp.git'
deploy_key chef_vault_item('deploy_keys', 'myapp')['key']
end
```
Within the `application` resource, a simplified DSL is available. As with other
`application` plugins, the default name of the resource if unspecified is the
application path. The following two examples are equivalent:
```ruby
application '/srv/myapp' do
git do
repository 'git@github.com:example/myapp.git'
end
end
application '/srv/myapp' do
git 'git@github.com:example/myapp.git'
end
```
## Sponsors
Development sponsored by [Chef Software](https://www.chef.io/), [Symonds & Son](http://symondsandson.com/), and [Orion](https://www.orionlabs.co/).
The Poise test server infrastructure is sponsored by [Rackspace](https://rackspace.com/).
## License
Copyright 2015-2016, Noah Kantrowitz
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,17 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_application_git'

View File

@ -0,0 +1,21 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_application_git/resource'
module PoiseApplicationGit
end

View File

@ -0,0 +1,17 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_application_git/resource'

View File

@ -0,0 +1,204 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'zlib'
require 'chef/provider'
require 'chef/resource'
require 'poise_application/app_mixin'
require 'poise_application/resources/application'
require 'poise_application_git/safe_string'
module PoiseApplicationGit
# An `application_git` resource to clone application code from git.
#
# @since 1.0.0
# @provides application_git
# @action sync
# @action checkout
# @action export
# @example
# application '/srv/myapp' do
# git 'git@github.com:example/myapp.git' do
# deploy_key data_bag_item('deploy_keys', 'myapp')['key']
# end
# end
class Resource < Chef::Resource::Git
include PoiseApplication::AppMixin
provides(:application_git)
# @api private
def initialize(*args)
super
# Because the superclass declares this, we have to as well. Should be
# removable at some point when Chef makes everything use the provider
# resolver system instead.
@resource_name = :application_git
@provider = PoiseApplicationGit::Provider
# Clear defaults in older versions of Chef.
remove_instance_variable(:@group) if instance_variable_defined?(:@group)
remove_instance_variable(:@user) if instance_variable_defined?(:@user)
end
# @!attribute group
# Group to run git as. Defaults to the application group.
# @return [String, Integer, nil, false]
attribute(:group, kind_of: [String, Integer, NilClass, FalseClass], default: lazy { parent && parent.group })
# @!attribute strict_ssh
# Enable strict SSH host key checking. Defaults to false.
# @return [Boolean]
attribute(:strict_ssh, equal_to: [true, false], default: false)
# @!attribute user
# User to run git as. Defaults to the application owner.
# @return [String, Integer, nil, false]
attribute(:user, kind_of: [String, Integer, NilClass, FalseClass], default: lazy { parent && parent.owner })
# @api private
def after_created
# Allow using the repository as the name in an application block.
if parent && !repository
destination(parent.path)
repository(name)
end
end
# @!attribute deploy_key
# SSH deploy key as either a string value or a path to a key file.
# @return [String]
def deploy_key(val=nil)
# Use a SafeString for literal deploy keys so they aren't shown.
val = SafeString.new(val) if val && !deploy_key_is_local?(val)
set_or_return(:deploy_key, val, kind_of: String)
end
# Default SSH wrapper path.
#
# @api private
# @return [String]
def ssh_wrapper_path
@ssh_wrapper_path ||= ::File.expand_path("~#{user}/.ssh/ssh_wrapper_#{Zlib.crc32(name)}")
end
# Guess if the deploy key is a local path or literal value.
#
# @api private
# @param key [String, nil] Key value to check. Defaults to self.key.
# @return [Boolean]
def deploy_key_is_local?(key=nil)
key ||= deploy_key
key && key[0] == '/'
end
# Path to deploy key.
#
# @api private
# @return [String]
def deploy_key_path
@deploy_key_path ||= if deploy_key_is_local?
deploy_key
else
::File.expand_path("~#{user}/.ssh/id_deploy_#{Zlib.crc32(name)}")
end
end
end
# Provider for `application_git`.
#
# @since 1.0.0
# @see Resource
# @provides application_git
class Provider < Chef::Provider::Git
include PoiseApplication::AppMixin
provides(:application_git)
# @api private
def initialize(*args)
super
# Set the SSH wrapper path in a late-binding kind of way. This better
# supports situations where the user doesn't exist until Chef converges.
new_resource.ssh_wrapper(new_resource.ssh_wrapper_path) if new_resource.deploy_key
end
# @api private
def whyrun_supported?
false # Just not dealing with this right now
end
# Hack our special login in before load_current_resource runs because that
# needs access to the git remote.
#
# @api private
def load_current_resource
include_recipe('git')
notifying_block do
create_dotssh
write_deploy_key
write_ssh_wrapper
end if new_resource.deploy_key
super
end
private
# Create a .ssh folder for the user.
#
# @return [void]
def create_dotssh
directory ::File.expand_path("~#{new_resource.user}/.ssh") do
owner new_resource.user
group new_resource.group
mode '755'
end
end
# Copy the deploy key to a file if needed.
#
# @return [void]
def write_deploy_key
# Check if we have a local path or some actual content
return if new_resource.deploy_key_is_local?
file new_resource.deploy_key_path do
owner new_resource.user
group new_resource.group
mode '600'
content new_resource.deploy_key
sensitive true
end
end
# Create the SSH wrapper script.
#
# @return [void]
def write_ssh_wrapper
# Write out the GIT_SSH script, it should already be enabled above
file new_resource.ssh_wrapper_path do
owner new_resource.user
group new_resource.group
mode '700'
content %Q{#!/bin/sh\n/usr/bin/env ssh #{'-o "StrictHostKeyChecking=no" ' unless new_resource.strict_ssh}-i "#{new_resource.deploy_key_path}" $@\n}
end
end
# Patch back in the `#git` from the git provider. This otherwise conflicts
# with the `#git` defined by the DSL, which gets included in such a way
# that the DSL takes priority.
def git(*args, &block)
Chef::Provider::Git.instance_method(:git).bind(self).call(*args, &block)
end
end
end

View File

@ -0,0 +1,25 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
module PoiseApplicationGit
# A string that won't be shown in Chef error output
class SafeString < String
def to_text
'"suppressed sensitive value"'
end
end
end

View File

@ -0,0 +1,20 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
module PoiseApplicationGit
VERSION = '1.1.0'
end

View File

@ -0,0 +1,19 @@
#
# Copyright 2015-2016, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
raise 'Halite is not compatible with no_lazy_load false, please set no_lazy_load true in your Chef configuration file.' unless Chef::Config[:no_lazy_load]
$LOAD_PATH << File.expand_path('../../files/halite_gem', __FILE__)
require "poise_application_git/cheftie"

View File

@ -0,0 +1 @@
{"name":"application_git","version":"1.1.0","description":"A plugin for poise-application to deploy applications from git.","long_description":"# Application_Git Cookbook\n\n[![Build Status](https://img.shields.io/travis/poise/application_git.svg)](https://travis-ci.org/poise/application_git)\n[![Gem Version](https://img.shields.io/gem/v/poise-application-git.svg)](https://rubygems.org/gems/poise-application-git)\n[![Cookbook Version](https://img.shields.io/cookbook/v/application_git.svg)](https://supermarket.chef.io/cookbooks/application_git)\n[![Coverage](https://img.shields.io/codecov/c/github/poise/application_git.svg)](https://codecov.io/github/poise/application_git)\n[![Gemnasium](https://img.shields.io/gemnasium/poise/application_git.svg)](https://gemnasium.com/poise/application_git)\n[![License](https://img.shields.io/badge/license-Apache_2-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)\n\nA [Chef](https://www.chef.io/) cookbook to handle deploying code from git when\nusing the [application cookbook](https://github.com/poise/application).\n\n## Quick Start\n\nTo deploy from a private GitHub repository:\n\n```ruby\napplication '/srv/myapp' do\n git 'git@github.com:example/myapp.git' do\n deploy_key chef_vault_item('deploy_keys', 'myapp')['key']\n end\nend\n```\n\n## Requirements\n\nChef 12 or newer is required.\n\n## Resources\n\n### `application_git`\n\nThe `application_git` resource deploys code from git. It extends the core `git`\nresource to support deploy keys and disabling strict host key verification.\n\n```ruby\napplication '/srv/myapp' do\n git 'git@github.com:example/myapp.git'\nend\n```\n\n#### Actions\n\nAll actions work the same as the core `git` resource.\n\n* `:sync` Clone and checkout the requested revision *(default)*\n* `:checkout` Checkout the request revision. If the repository isn't already\n cloned, this action does nothing.\n* `:export` Export the repository without the `.git` folder.\n\n#### Properties\n\nAll properties from the core `git` resource work the same way with the following\nadditions:\n\n* `deploy_key` SSH key to use with git. Can be specified either as a path to\n key file already created or as a string value containing the key directly.\n* `strict_ssh` Enable strict SSH host key checking. *(default: false)*\n\n### DSL Usage\n\nThe `application_git` resource can be used directly as a replacement for the\ncore `git` resource:\n\n```ruby\napplication_git '/srv/myapp' do\n repository 'git@github.com:example/myapp.git'\n deploy_key chef_vault_item('deploy_keys', 'myapp')['key']\nend\n```\n\nWithin the `application` resource, a simplified DSL is available. As with other\n`application` plugins, the default name of the resource if unspecified is the\napplication path. The following two examples are equivalent:\n\n```ruby\napplication '/srv/myapp' do\n git do\n repository 'git@github.com:example/myapp.git'\n end\nend\n\napplication '/srv/myapp' do\n git 'git@github.com:example/myapp.git'\nend\n```\n\n## Sponsors\n\nDevelopment sponsored by [Chef Software](https://www.chef.io/), [Symonds & Son](http://symondsandson.com/), and [Orion](https://www.orionlabs.co/).\n\nThe Poise test server infrastructure is sponsored by [Rackspace](https://rackspace.com/).\n\n## License\n\nCopyright 2015-2016, Noah Kantrowitz\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","maintainer":"Noah Kantrowitz","maintainer_email":"noah@coderanger.net","license":"Apache 2.0","platforms":{},"dependencies":{"git":">= 0.0.0","poise":"~> 2.0","application":"~> 5.0"},"recommendations":{},"suggestions":{},"conflicting":{},"providing":{},"replacing":{},"attributes":{},"groupings":{},"recipes":{}}

View File

@ -0,0 +1,5 @@
# Application_Javascript Changelog
## v1.0.0
Initial release!

View File

@ -0,0 +1,132 @@
# Application_Javascript Cookbook
[![Build Status](https://img.shields.io/travis/poise/application_javascript.svg)](https://travis-ci.org/poise/application_javascript)
[![Gem Version](https://img.shields.io/gem/v/poise-application-javascript.svg)](https://rubygems.org/gems/poise-application-javascript)
[![Cookbook Version](https://img.shields.io/cookbook/v/application_javascript.svg)](https://supermarket.chef.io/cookbooks/application_javascript)
[![Coverage](https://img.shields.io/codecov/c/github/poise/application_javascript.svg)](https://codecov.io/github/poise/application_javascript)
[![Gemnasium](https://img.shields.io/gemnasium/poise/application_javascript.svg)](https://gemnasium.com/poise/application_javascript)
[![License](https://img.shields.io/badge/license-Apache_2-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
A [Chef](https://www.chef.io/) cookbook to deploy server-side JavaScript
applications using Node.js or io.js.
## Quick Start
To deploy an Express application from git:
```ruby
application '/srv/myapp' do
git 'https://github.com/example/myapp.git'
npm_install
npm_start
end
```
## Requirements
Chef 12 or newer is required.
## Resources
### `application_javascript`
The `application_javascript` resource installs a JavaScript runtime for the
deployment.
```ruby
application '/srv/myapp' do
javascript '3'
end
```
All actions and properties are the same as the [`javascript_runtime` resource](https://github.com/poise/poise-javascript#javascript_runtime).
### `application_javascript_service`
The `application_javascript_javascript_service` resource creates a service for a
JavaScript command.
```ruby
application '/srv/myapp' do
javascript_service 'main.js'
end
```
#### Actions
* `:enable` Create, enable and start the service. *(default)*
* `:disable` Stop, disable, and destroy the service.
* `:start` Start the service.
* `:stop` Stop the service.
* `:restart` Stop and then start the service.
* `:reload` Send the configured reload signal to the service.
#### Properties
* `command` Command to run. *(name attribute)*
* `path` Base path for the application. *(default: application path)*
* `service_name` Name of the service to create. *(default: auto-detect)*
# `user` User to run the service as. *(default: application owner)*
### `application_node_package`
The `application_node_package` resource installs NPM packages for the deployment.
```ruby
application '/srv/myapp' do
node_package 'grunt-cli'
end
```
All actions and properties are the same as the [`node_package` resource](https://github.com/poise/poise-javascript#node_package),
except that the `group` and `user` properties default to the application-level
data if not specified.
### `application_npm_start`
The `application_npm_start` resource creates a service for a JavaScript
application using `npm start`.
```ruby
application '/srv/myapp' do
npm_start
end
```
#### Actions
* `:enable` Create, enable and start the service. *(default)*
* `:disable` Stop, disable, and destroy the service.
* `:start` Start the service.
* `:stop` Stop the service.
* `:restart` Stop and then start the service.
* `:reload` Send the configured reload signal to the service.
#### Properties
* `path` Base path for the application. *(default: name attribute)*
* `command` NPM subcommand to run. *(default: start)*
* `service_name` Name of the service to create. *(default: auto-detect)*
# `user` User to run the service as. *(default: application owner)*
## Sponsors
Development sponsored by [Chef Software](https://www.chef.io/), [Symonds & Son](http://symondsandson.com/), and [Orion](https://www.orionlabs.co/).
The Poise test server infrastructure is sponsored by [Rackspace](https://rackspace.com/).
## License
Copyright 2015, Noah Kantrowitz
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,23 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
module PoiseApplicationJavascript
autoload :AppMixin, 'poise_application_javascript/app_mixin'
autoload :Error, 'poise_application_javascript/error'
autoload :Resources, 'poise_application_javascript/resources'
autoload :VERSION, 'poise_application_javascript/version'
end

View File

@ -0,0 +1,67 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise/backports'
require 'poise/utils'
require 'poise_application/app_mixin'
require 'poise_javascript/javascript_command_mixin'
module PoiseApplicationJavascript
# A helper mixin for Javascript application resources and providers.
#
# @since 4.0.0
module AppMixin
include Poise::Utils::ResourceProviderMixin
# A helper mixin for Javascript application resources.
module Resource
include PoiseApplication::AppMixin::Resource
include PoiseJavascript::JavascriptCommandMixin::Resource
# @!attribute parent_javascript
# Override the #parent_javascript from JavascriptCommandMixin to grok the
# application level parent as a default value.
# @return [PoiseJavascript::Resources::JavascriptRuntime::Resource, nil]
parent_attribute(:javascript, type: :javascript_runtime, optional: true, default: lazy { app_state_javascript.equal?(self) ? nil : app_state_javascript })
# @attribute app_state_javascript
# The application-level Javascript parent.
# @return [PoiseJavascript::Resources::JavascriptRuntime::Resource, nil]
def app_state_javascript(javascript=Poise::NOT_PASSED)
unless javascript == Poise::NOT_PASSED
app_state[:javascript] = javascript
end
app_state[:javascript]
end
# A merged hash of environment variables for both the application state
# and parent javascript.
#
# @return [Hash<String, String>]
def app_state_environment_javascript
env = app_state_environment
env = env.merge(parent_javascript.javascript_environment) if parent_javascript
env
end
end
# A helper mixin for Javascript application providers.
module Provider
include PoiseApplication::AppMixin::Provider
end
end
end

View File

@ -0,0 +1,17 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_application_javascript/resources'

View File

@ -0,0 +1,25 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_application/error'
module PoiseApplicationJavascript
# Base exception class for poise-application-javascript errors.
#
# @since 1.0.0
class Error < PoiseApplication::Error
end
end

View File

@ -0,0 +1,22 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_application_javascript/resources/javascript'
require 'poise_application_javascript/resources/javascript_execute'
require 'poise_application_javascript/resources/javascript_service'
require 'poise_application_javascript/resources/node_package'
require 'poise_application_javascript/resources/npm_install'
require 'poise_application_javascript/resources/npm_start'

View File

@ -0,0 +1,64 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_javascript/resources/javascript_runtime'
require 'poise_application_javascript/app_mixin'
module PoiseApplicationJavascript
module Resources
# (see Javascript::Resource)
# @since 1.0.0
module Javascript
# An `application_javascript` resource to manage Javascript runtimes
# inside an Application cookbook deployment.
#
# @provides application_javascript
# @provides application_javascript_runtime
# @action install
# @action uninstall
# @example
# application '/app' do
# javascript '3'
# end
class Resource < PoiseJavascript::Resources::JavascriptRuntime::Resource
include PoiseApplicationJavascript::AppMixin
provides(:application_javascript)
# Need the double javascript for application resource rewriting.
provides(:application_javascript_runtime)
container_default(false)
subclass_providers!
# We want to run the base class version of this, not the one from the
# mixin. HULK SMASH.
def npm_binary
self.class.superclass.instance_method(:npm_binary).bind(self).call
end
# Set this resource as the app_state's parent javascript.
#
# @api private
def after_created
super.tap do |val|
app_state_javascript(self)
end
end
end
end
end
end

View File

@ -0,0 +1,88 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_javascript/resources/javascript_execute'
require 'poise_application_javascript/app_mixin'
module PoiseApplicationJavascript
module Resources
# (see JavascriptExecute::Resource)
# @since 1.0.0
module JavascriptExecute
# An `application_javascript_execute` resource to run Javascript commands inside an
# Application cookbook deployment.
#
# @provides application_javascript_execute
# @action run
# @example
# application '/srv/myapp' do
# javascript_execute 'setup.py install'
# end
class Resource < PoiseJavascript::Resources::JavascriptExecute::Resource
include PoiseApplicationJavascript::AppMixin
provides(:application_javascript_execute)
def initialize(*args)
super
# Clear some instance variables so my defaults work.
remove_instance_variable(:@cwd)
remove_instance_variable(:@group)
remove_instance_variable(:@user)
end
# #!attribute cwd
# Override the default directory to be the app path if unspecified.
# @return [String]
attribute(:cwd, kind_of: [String, NilClass, FalseClass], default: lazy { parent && parent.path })
# #!attribute group
# Override the default group to be the app group if unspecified.
# @return [String, Integer]
attribute(:group, kind_of: [String, Integer, NilClass, FalseClass], default: lazy { parent && parent.group })
# #!attribute user
# Override the default user to be the app owner if unspecified.
# @return [String, Integer]
attribute(:user, kind_of: [String, Integer, NilClass, FalseClass], default: lazy { parent && parent.owner })
end
# The default provider for `application_javascript_execute`.
#
# @see Resource
# @provides application_javascript_execute
class Provider < PoiseJavascript::Resources::JavascriptExecute::Provider
provides(:application_javascript_execute)
private
# Override environment to add the application envivonrment instead.
#
# @return [Hash]
def environment
super.tap do |environment|
# Don't use the app_state_environment_javascript because we already have
# those values in place.
environment.update(new_resource.app_state_environment)
# Re-apply the resource environment for correct ordering.
environment.update(new_resource.environment) if new_resource.environment
end
end
end
end
end
end

View File

@ -0,0 +1,59 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'chef/provider'
require 'chef/resource'
require 'poise'
require 'poise_application_javascript/service_mixin'
module PoiseApplicationJavascript
module Resources
# (see JavascriptService::Resource)
# @since 1.0.0
module JavascriptService
class Resource < Chef::Resource
include PoiseApplicationJavascript::ServiceMixin
provides(:application_javascript_service)
# @!attribute command
# Command to run.
# @return [String]
attribute(:command, kind_of: String, name_attribute: true)
# @!attribute path
# Override {PoiseApplicationJavascript::ServiceMixin#path} to make it
# not the name_attribute.
# @return [String]
attribute(:path, kind_of: String, default: lazy { parent && parent.path })
end
class Provider < Chef::Provider
include PoiseApplicationJavascript::ServiceMixin
provides(:application_javascript_service)
private
# (see PoiseApplication::ServiceMixin#service_options)
def service_options(resource)
super
resource.javascript_command(new_resource.command)
end
end
end
end
end

View File

@ -0,0 +1,63 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_javascript/resources/node_package'
require 'poise_application_javascript/app_mixin'
module PoiseApplicationJavascript
module Resources
# (see NodePackage::Resource)
# @since 1.0.0
module NodePackage
# An `application_node_package` resource to install NPM packages inside
# an Application cookbook deployment.
#
# @provides application_node_package
# @action install
# @action upgrade
# @action remove
# @example
# application '/app' do
# node_package %w{grunt-cli gulp}
# end
class Resource < PoiseJavascript::Resources::NodePackage::Resource
include PoiseApplicationJavascript::AppMixin
provides(:application_node_package)
subclass_providers!
def initialize(*args)
super
# For older Chef.
@resource_name = :application_node_package
end
# #!attribute group
# Override the default group to be the app group if unspecified.
# @return [String, Integer]
attribute(:group, kind_of: [String, Integer, NilClass], default: lazy { parent && parent.group })
# #!attribute user
# Override the default user to be the app owner if unspecified.
# @return [String, Integer]
attribute(:user, kind_of: [String, Integer, NilClass], default: lazy { parent && parent.owner })
# @todo This should handle relative paths against parent.path.
end
end
end
end

View File

@ -0,0 +1,45 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise_javascript/resources/npm_install'
require 'poise_application_javascript/app_mixin'
module PoiseApplicationJavascript
module Resources
# (see NpmInstall::Resource)
# @since 1.0.0
module NpmInstall
# An `application_npm_install` resource to install package
# dependencies inside an Application cookbook deployment.
#
# @provides application_npm_install
# @action install
# @example
# application '/app' do
# npm_install
# end
class Resource < PoiseJavascript::Resources::NpmInstall::Resource
include PoiseApplicationJavascript::AppMixin
provides(:application_npm_install)
subclass_providers!
# @todo This should handle relative paths against parent.path.
end
end
end
end

View File

@ -0,0 +1,78 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'shellwords'
require 'chef/provider'
require 'chef/resource'
require 'poise'
require 'poise_application_javascript/service_mixin'
module PoiseApplicationJavascript
module Resources
# (see NpmStart::Resource)
# @since 1.0.0
module NpmStart
# An `application_npm_start` resource to create a service for a Javascript
# application using `npm start`.
#
# @provides application_npm_start
# @action enable
# @action disable
# @action start
# @action stop
# @action restart
# @action reload
# @example
# application '/app' do
# npm_start
# end
class Resource < Chef::Resource
include PoiseApplicationJavascript::ServiceMixin
provides(:application_npm_start)
# @!attribute command
# NPM sub-command to run. Defaults to `start`.
# @return [String, Array<String>]
attribute(:command, kind_of: [String, Array], default: 'start')
end
# The default provider for `application_npm_start`.
#
# @see Resource
# @provides application_npm_start
class Provider < Chef::Provider
include PoiseApplicationJavascript::ServiceMixin
provides(:application_npm_start)
private
# (see PoiseApplication::ServiceMixin#service_options)
def service_options(resource)
super
npm_cmd = [new_resource.npm_binary] + Array(new_resource.command)
resource.javascript_command(Shellwords.join(npm_cmd))
# Make sure node is on $PATH because grrr.
new_path = [::File.dirname(new_resource.javascript), (new_resource.app_state_environment_javascript['PATH'] || ENV['PATH']).to_s].join(::File::PATH_SEPARATOR)
resource.environment['PATH'] = new_path
end
end
end
end
end

View File

@ -0,0 +1,57 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'poise/utils'
require 'poise_application/service_mixin'
require 'poise_languages/utils'
require 'poise_application_javascript/app_mixin'
module PoiseApplicationJavascript
# A helper mixin for Javascript service resources and providers.
#
# @since 1.0.0
module ServiceMixin
include Poise::Utils::ResourceProviderMixin
# A helper mixin for Javascript service resources.
module Resource
include PoiseApplication::ServiceMixin::Resource
include PoiseApplicationJavascript::AppMixin::Resource
end
# A helper mixin for Javascript service providers.
module Provider
include PoiseApplication::ServiceMixin::Provider
include PoiseApplicationJavascript::AppMixin::Provider
# Set up the service for running Javascript stuff.
def service_options(resource)
super
# Closure scoping for #javascript_command below.
self_ = self
# Create a new singleton method that fills in `node` for you.
resource.define_singleton_method(:javascript_command) do |val|
resource.command("#{self_.new_resource.javascript} #{PoiseLanguages::Utils.absolute_command(val, path: self_.new_resource.app_state_environment_javascript['PATH'])}")
end
# Include env vars as needed.
resource.environment.update(new_resource.parent_javascript.javascript_environment) if new_resource.parent_javascript
end
end
end
end

View File

@ -0,0 +1,19 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
module PoiseApplicationJavascript
VERSION = '1.0.0'
end

View File

@ -0,0 +1,19 @@
#
# Copyright 2015, Noah Kantrowitz
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
raise 'Halite is not compatible with no_lazy_load false, please set no_lazy_load true in your Chef configuration file.' unless Chef::Config[:no_lazy_load]
$LOAD_PATH << File.expand_path('../../files/halite_gem', __FILE__)
require "poise_application_javascript/cheftie"

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,189 @@
Chef Sugar Changelog
=========================
This file is used to list changes made in each version of the chef-sugar cookbook and gem.
v3.3.0 (2016-01-11)
-------------------
### Improvements
- Break up `Chef::Sugar::Constraints` into a class and a dsl file
- Add `platform_version` method with full constraints comparison support
v3.2.0 (2015-12-10)
-------------------
### Improvements
- Add platform matchers for `debian` and `fedora`
- Add `openvz` support under virtualization
- Add init system detection support
- Add support for `nexus`, `ios_xr` platforms and `wrlinux` platform_family
- Add additional `aix` helpers
### Bug Fixes
- Properly expose `Architecture#i386?` in the DSL
v3.1.1 (2015-06-23)
-------------------
### Improvements
- Update Intel CPU types based on existing Fauxhai data
- Update SPARC logic and 32/64-bit logic for x86 and i386
### Bug Fixes
- Fix 32-bit logic
- Fix default behavior to include chef-sugar at compile time
- Fix Chef 12.1.0 warnings for chef_gem compile time install
- Fix `redhat_enterprise_linux?` matcher
v3.0.2 (2015-03-26)
-------------------
### Improvements
- Add helpers for `ppc64` and `ppc64le` architecture
### Bug Fixes
- Adjustments to error message
v3.0.1 (2015-03-20)
-------------------
### Breaking Changes
- Rename `compile_time` `to at_compile_time` - if your recipes are affected by
this breaking change, your Chef Client run will produce a verbose error
message with details on how to fix the error.
v3.0.0 (2015-03-17)
-------------------
### Breaking Changes
- Drop support for Ruby 1.9 (it might still work, but it is no longer officially supported)
### Improvements
- Remove accidentially committed gem source
- Bump development dependencies
- Add `digitalocean?` matcher
- Expose the `rhel` platform as `el`
- Add `ppc64le` platform
- Add helper for determining if architecture is SPARC
- Add helper for determining if architecture is Intel
- Add dynamic platform/version matchers for Solaris
### Bug Fixes
- Reset namespace_options when reaching top-level resources
v2.5.0 (2015-01-05)
-------------------
### Improvements
- Add `data_bag_item_for_environment` function
- Add `kvm?` matcher
- Add `virtualbox?` matcher
### Bug Fixes
- Use `.key?` to check for hash key presence, raising an `AttributeDoesNotExist`
error sooner
v2.4.1 (2014-10-12)
-------------------
- No changes from v2.4.0 - forced a new version upload to the Chef Supermarket
v2.4.0 (2014-10-12)
-------------------
### Improvements
- Add `docker?` matcher
v2.3.2 (2014-10-07)
-------------------
### Big Fixues
- Include `amd64` in `_64_bit?` check
v2.3.1 (2014-10-07)
-------------------
### Improvements
- Check all 64-bit architectures that may be reported by Ohai
### Bug Fixes
- Be more tolerant of `nil` values return from sub functions
- Check to make sure `node['domain']` is not `nil` before calling `#include?`
v2.3.0 (2014-09-24)
-------------------
### Improvements
- Add `vmware?` matcher
- Allow the attribute DSL to access parent attributes
### Bug Fixes
- Return `true` or `false` from all Boolean methods (instead of `nil` or truthy values)
v2.2.0 (2014-08-20)
-------------------
### Improvements
- Add `smartos?` matcher
- Add `omnios?` matcher
v2.1.0 (2014-06-26)
-------------------
### Improvements
- Add `solaris2?` matcher
- Add `aix?` matcher
- Add 'lxc?' matcher
### Bug Fixes
- Fix a bug in namespace memoization during attribute initialization
v2.0.0 (2014-06-16)
-------------------
### Breaking
- Remove `not_linux?` method
- Remove `not_windows?` method
### Improvements
- Miscellaneous spelling fixes
- Update a failing unit test for `installed?`
- Add Mac OS X to the list of platforms (Yosemite)
- Upgrade to RSpec 3
- Fix `which` (and `installed?` and `installed_at_version?`) when given an absolute path
- Fix `linux?` check to only return true on real linuxes
v1.3.0 (2014-05-05)
-------------------
- Check both `$stdout` and `$stderr` in `version_for`
- Add additional platform versions
- Make `includes_recipe?` a top-level API (instead of just Node)
- Match on the highest version number instead of direct equality checking on platform versions
- Define `Object#blank?` as a core extension
- Define `String#flush` as a core extension
- Remove Stove
v1.2.6 (2014-03-16)
-------------------
- Fix a bug in `vagrant?` returning false on newer Vagrant versions
- Remove Coveralls
v1.2.4 (2014-03-13)
-------------------
- See (1.2.2), but I botched the release
v1.2.2 (2014-03-13)
-------------------
- Fix a critical bug with `encrypted_data_bag_item` using the wrong key
v1.2.0 (2014-03-09)
-------------------
- Add `namespace` functionality for specifying attributes in a DSL
- Add constraints helpers for comparing version strings
- Add `require_chef_gem` to safely require and degrade if a gem is not installed
- Add `deep_fetch` and `deep_fetch!` to fetch deeply nested keys
- Accept an optional secret key in `encrypted_data_bag_item` helper and raise a helpful error if one is not set (NOTE: this changes the airity of the method, but it's backward-compatible because Ruby is magic)
- Add Stove for releasing
- Updated copyrights for 2014
v1.1.0 (2013-12-10)
-------------------
- Add `cloudstack?` helper
- Add data bag helpers
- Remove foodcritic checks
- Upgrade development gem versions
- Randomize spec order
v1.0.1 (2013-10-15)
-------------------
- Add development recipe
- Add `compile_time`, `before`, and `after` filters
v1.0.0 (2013-10-15)
-------------------
- First public release

View File

@ -0,0 +1,20 @@
Contributing to Chef Sugar
===============================
The process for contributing to Chef sugar is rather straight-forward. It is unlikely that you'll need to modify the actual Chef recipe, so it's assumed that you want to work on the Gem itself.
1. Fork the repository on GitHub.
2. Clone your fork.
3. Create a new, semantically-named branch:
$ git checkout -b my_feature_branch
4. Make any changes, ensuring you write adequate test coverage.
5. Document your changes (YARD).
6. Run the tests (make sure they pass).
7. Submit a Pull Request on GitHub.
8. (optional) Ping me on Twitter (@sethvargo)
Additionally, please **DO NOT**:
- Modify the version of the cookbook or gem.
- Update the CHANGELOG
- Make unnecessary changes to the gemspec

View File

@ -0,0 +1,495 @@
Chef Sugar
==========
[![Gem Version](http://img.shields.io/gem/v/chef-sugar.svg?style=flat-square)][gem]
[![Build Status](http://img.shields.io/travis/sethvargo/chef-sugar.svg?style=flat-square)][travis]
[gem]: https://rubygems.org/gems/chef-sugar
[travis]: http://travis-ci.org/sethvargo/chef-sugar
Chef Sugar is a Gem & Chef Recipe that includes series of helpful sugar of the Chef core and other resources to make a cleaner, more lean recipe DSL, enforce DRY principles, and make writing Chef recipes an awesome experience!
Installation
------------
If you want to develop/hack on chef-sugar, please see the Contributing.md.
If you are using Berkshelf, add `chef-sugar` to your `Berksfile`:
```ruby
cookbook 'chef-sugar'
```
Otherwise, you can use `knife` or download the tarball directly from the community site:
```ruby
knife cookbook site install chef-sugar
```
Usage
-----
In order to use Chef Sugar in your Chef Recipes, you'll first need to include it:
```ruby
include_recipe 'chef-sugar::default'
```
Alternatively you can put it in a base role or recipe and it will be included subsequently.
Requiring the Chef Sugar Gem will automatically extend the Recipe DSL, `Chef::Resource`, and `Chef::Provider` with helpful convenience methods.
### Module Method
If you are working outside of the Recipe DSL, you can use the module methods instead of the Recipe DSL. In general, the module methods have the same name as their Recipe-DSL counterparts, but require the node object as a parameter. For example:
In a Recipe:
```ruby
# cookbook/recipes/default.rb
do_something if windows?
```
In a Library as a singleton:
```ruby
# cookbook/libraries/default.rb
def only_on_windows(&block)
yield if Chef::Sugar::PlatformFamily.windows?(@node)
end
```
In a Library as a Mixin:
```ruby
# cookbook/libraries/default.rb
include Chef::Sugar::PlatformFamily
def only_on_windows(&block)
yield if windows?(@node)
end
```
API
---
**Note:** For the most extensive API documentation, please see the YARD documentation.
### Architecture
**Note:** Some of the architecture commands begin with an underscore (`_`) because Ruby does not permit methods to start with a numeric.
- `_64_bit?`
- `_32_bit?`
- `intel?`
- `sparc?`
- `ppc64?`
- `ppc64le?`
- `powerpc?`
#### Examples
```ruby
execute 'build[my binary]' do
command '...'
not_if { _64_bit? }
end
```
### Cloud
- `azure?`
- `cloud?`
- `digitalocean?`
- `ec2?`
- `eucalyptus?`
- `gce?`
- `linode?`
- `openstack?`
- `cloudstack?`
- `rackspace?`
#### Examples
```ruby
template '/tmp/config' do
variables(
# See also: best_ip_for
ipaddress: cloud? ? node['local_ipv4'] : node['public_ipv4']
)
end
```
### Core Extensions
**Note:** Core extensions are **not** included by default. You must require the `chef/sugar/core_extensions` module manually to gain access to these APIs:
```ruby
require 'chef/sugar/core_extensions'
```
- `String#satisfies?`
- `String#satisfied_by?`
- `Array#satisfied_by?`
- `Object#blank?`
#### Examples
```ruby
# Checking version constraints
'1.0.0'.satisfies?('~> 1.0') #=> true
'~> 1.0'.satisfied_by?('1.0') #=> true
```
```ruby
# Check for an object's presence
''.blank? #=> true
['hello'].blank? #=> false
```
### Data Bag
- `encrypted_data_bag_item` - a handy DSL method for loading encrypted data bag items the same way you load a regular data bag item; this requires `Chef::Config[:encrypted_data_bag_secret]` is set!
- `encrypted_data_bag_item_for_environment` - find the encrypted data bag entry for the current node's Chef environment.
- `data_bag_item_for_environment` - find the data bag entry for the current node's Chef environment.
#### Examples
```ruby
encrypted_data_bag_item('accounts', 'hipchat')
```
```ruby
encrypted_data_bag_item_for_environment('accounts', 'github')
```
```ruby
data_bag_item_for_environment('accounts', 'github')
```
### Docker
Chef Sugar looks for hints to see if the node being converged is a Docker container. When [Ohai supports checking other nodes](https://github.com/opscode/ohai/pull/428), Chef Sugar will automatically pick up the information.
- `docker?`
#### Examples
```ruby
template '/runme' do
only_if { docker?(node) }
end
```
### Attributes
Chef Sugar adds more Chef-like DSL to attribute definitions. Instead of using the Ruby hash syntax, you can define attributes using nested namespaces. This DSL may be more friendly to non-Ruby developers. It can safely be mixed-and-matched with the standard syntax.
```ruby
# This is functionally the same as default['apache2']['config']['root'] = '/var/www'
namespace 'apache2' do
namespace 'config' do
root '/var/www'
end
end
```
```ruby
# Specify multiple keys instead of nesting namespaces
namespace 'apache2', 'config' do
root '/var/www'
end
```
```ruby
# Specify different nested precedence levels
namespace 'apache2', precedence: normal do
namespace 'config', precedence: override do
root '/var/www' #=> override['apache2']['config']['root'] = '/var/www'
end
end
```
### Constraints
- `constraints` - create a new constraint (or requirement) that can be used to test version validations.
- `chef_version` - (DSL only) a wrapper for `version(Chef::VERSION)`
- `version` - create a new version that can be used to test constraint validation.
#### Examples
```ruby
# Check if a version is satisfied by a constraint
version('1.2.3').satisfies?('~> 1.2.0')
```
```ruby
# Check if a constraint is satisfied by a version
constraint('~> 1.2.0').satisfied_by?('1.2.3')
```
```ruby
# Support multiple constraints
version('1.2.3').satisfies?('> 1.2', '< 2.0')
constraint('> 1.2', '< 2.0').satisfied_by?('1.2.3')
```
```ruby
# Only perform an operation if Chef is at a certain version
package 'apache2' do
not_if { chef_version.satisfies?('~> 11.0') } # Ignore Chef 11
end
```
### Kernel
- `require_chef_gem` - "safely" require a gem. Loading a gem with Chef is sometimes difficult and confusing. The errors that Chef produces are also sometimes not very intuitive. In the event you require a gem to exist on the system, you can use `require_chef_gem`, which will attempt to require the gem and then produce helpful output if the gem is not installed:
Chef could not load the gem `#{name}'! You may need to install the gem
manually with `gem install #{name}', or include a recipe before you can
use this resource. Please consult the documentation for this cookbook
for proper usage.
#### Examples
```ruby
# LWRP
require_chef_gem 'pry'
```
```ruby
class Chef
class Provider
class MyProvider > Provider
require_chef_gem 'pry'
end
end
end
```
### Init
- `systemd?` - detect if init system is systemd
- `upstart?` - detect if init system is upstart
- `runit?` - detect if init system is runit
#### Examples
```ruby
systemd_service 'my-service' do
description 'My Service'
install do
wanted_by 'multi-user.target'
end
service do
exec_start '/usr/bin/myserviced'
end
action [:create, :enable, :start]
only_if { systemd? }
end
cookbook_file '/etc/init/my-service.conf' do
source 'my-service.conf'
only_if { upstart? }
end
```
### IP
- `best_ip_for` - determine the best IP address for the given "other" node, preferring local IP addresses over public ones.
#### Examples
```ruby
redis = search('node', 'role:redis').first
template '/tmp/config' do
variables(
ipaddress: best_ip_for(redis)
)
end
```
### Node
Additional methods for the `node` object
- `deep_fetch` - safely fetch a nested attribute.
- `deep_fetch!` - fetch a nested attribute, raising a more semantic error if the key does not exist.
- `in?` - determine if the node is in the given Chef environment.
#### Examples
```ruby
credentials = if node.in?('production')
Chef::EncryptedDataBag.new('...')
else
data_bag('...')
end
```
```ruby
node.deep_fetch('apache2', 'config', 'root') => node['apache2']['config']['root']
```
### Platform
- `amazon_linux?`
- `centos?`
- `linux_mint?`
- `oracle_linux?`
- `redhat_enterprise_linux?`
- `scientific_linux?`
- `ubuntu?`
- `solaris2?`
- `aix?`
- `smartos?`
- `omnios?`
- `raspbian?`
- `nexus?`
- `ios_xr?`
There are also a series of dynamically defined matchers that map named operating system release versions and comparison operators in the form "#{platform}\_#{operator}\_#{name}?". For example:
- `debian_after_squeeze?`
- `linuxmint_after_or_at_olivia?`
- `mac_os_x_lion?`
- `ubuntu_before_lucid?`
- `ubuntu_before_or_at_maverick?`
- `solaris_10?`
- `solaris_11?`
To get a full list, run the following in IRB:
```ruby
require 'chef/sugar'
puts Chef::Sugar::Platform.instance_methods
```
#### Examples
```ruby
if ubuntu?
execute 'apt-get update'
end
```
### Platform Family
- `arch_linux?`
- `debian?`
- `fedora?`
- `freebsd?`
- `gentoo?`
- `linux?`
- `mac_os_x?`
- `openbsd?`
- `rhel?`
- `slackware?`
- `suse?`
- `windows?`
- `wrlinux?`
#### Examples
```ruby
node['attribute'] = if windows?
'C:\Foo\BarDrive'
else
'/foo/bar_drive'
end
```
### Ruby
**Note:** The applies to the Ruby found at `node['languages']['ruby']`.
- `ruby_20?`
- `ruby_19?`
#### Examples
```ruby
log 'This has been known to fail on Ruby 2.0' if ruby_20?
```
### Run Context
- `includes_recipe?` - determines if the current run context includes the recipe
```ruby
if includes_recipe?('apache2::default')
apache_module 'my_module' do
# ...
end
end
```
### Shell
- `which`
- `dev_null`
- `installed?`
- `installed_at_version?`
- `version_for`
#### Examples
```ruby
log "Using `mongo` at `#{which('mongo')}`"
if installed?('apt')
execute 'apt-get update'
end
execute 'install[thing]' do
command "... 2>&1 #{dev_null}"
not_if { installed_at_version?('thing', node['thing']['version']) }
end
log "Skipping git install, version is at #{version_for('mongo', '-v')}"
```
### Vagrant
- `vagrant?`
#### Examples
```ruby
http_request 'http://...' do
not_if { vagrant? }
end
```
### Virtualization
- `kvm?`
- `lxc?`
- `virtualbox?`
- `vmware?`
- `openvz?`
#### Examples
```ruby
service 'ntpd' do
action [:enable, :start]
not_if { lxc? }
end
```
### Filters
- `at_compile_time` - accepts a block of resources to run at compile time
- `before` - insert resource in the collection before the given resource
- `after` - insert resource in the collection after the given resource
#### Examples
```ruby
at_compile_time do
package 'apache2'
end
# This is equivalent to
package 'apache2' do
action :nothing
end.run_action(:install)
```
```ruby
before 'service[apache2]' do
log 'I am before the apache 2 service fires!'
end
```
```ruby
after 'service[apache2]' do
log 'I am after the apache 2 service fires!'
end
```
License & Authors
-----------------
- Author: Seth Vargo (sethvargo@gmail.com)
```text
Copyright 2013-2015 Seth Vargo
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```

View File

@ -0,0 +1 @@
{"name":"chef-sugar","version":"3.3.0","description":"Installs chef-sugar. Please see the chef-sugar Ruby gem for more information.","long_description":"Chef Sugar is a Gem & Chef Recipe that includes series of helpful syntactic\nsugars on top of the Chef core and other resources to make a cleaner, more lean\nrecipe DSL, enforce DRY principles, and make writing Chef recipes an awesome and\nfun experience!\n\nFor the most up-to-date information and documentation, please visit the [Chef\nSugar project page on GitHub](https://github.com/sethvargo/chef-sugar).\n","maintainer":"Seth Vargo","maintainer_email":"sethvargo@gmail.com","license":"Apache 2.0","platforms":{},"dependencies":{},"recommendations":{},"suggestions":{},"conflicting":{},"providing":{},"replacing":{},"attributes":{},"groupings":{},"recipes":{}}

View File

@ -0,0 +1,34 @@
#
# Cookbook Name:: chef-sugar
# Recipe:: default
#
# Copyright 2013-2015, Seth Vargo <sethvargo@gmail.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
gem_version = run_context.cookbook_collection[cookbook_name].metadata.version
if Chef::Resource::ChefGem.instance_methods(false).include?(:compile_time)
chef_gem 'chef-sugar' do
version gem_version
compile_time true
end
else
chef_gem 'chef-sugar' do
version gem_version
action :nothing
end.run_action(:install)
end
require 'chef/sugar'

View File

@ -0,0 +1,53 @@
# compat_resource Cookbook CHANGELOG
This file is used to list changes made in each version of the compat_resource cookbook.
## 12.19.0 (2017-04-17)
- Suppress warning already initialized constant
- Backport yum/apt changes from 12.19
## 12.16.2 (2016-11-09)
- Sync chef-client changes from Chef 12.16.42
## 12.16.1 (2016-10-20)
- add delayed_action helper
## 12.16.0 (2016-10-19)
- Sync chef-client changes from Chef 12.16.14
## 12.14.7 (2016-09-26)
- Update to 12.14.89 Chef
- Fix autoload by applying fix from #106
## 12.14.6 (2016-09-20)
- Update backported codebase to Chef 12.14.77 which brings in yum_repository updates and why-run enabled by default in custom resources
## 12.14.5 (2016-09-19)
- Prevent spamming messages in Chefspec runs for cookbooks that depend on compat_resource
## 12.14.4 (2016-09-19)
- Fix delayed notifications cloning
## 12.14.3 (2016-09-12)
- Fix subscribes notifications
## 12.14.2 (2016-09-09)
- Improve documentation
- keep ChefCompat::Resource defined even if we don't load
## 12.14.1 (2016-09-07)
- add yum_repository resource from Chef 12.14
- Update the minimum chef version in the metadata to 12.1
- Added maintainers files
- suppress constant redef warnings when running chefspec

Some files were not shown because too many files have changed in this diff Show More