Switch wordpress sites to letsencrypt certificates
[chef.git] / cookbooks / wordpress / providers / site.rb
1 #
2 # Cookbook Name:: wordpress
3 # Provider:: wordpress_site
4 #
5 # Copyright 2015, OpenStreetMap Foundation
6 #
7 # Licensed under the Apache License, Version 2.0 (the "License");
8 # you may not use this file except in compliance with the License.
9 # You may obtain a copy of the License at
10 #
11 #     http://www.apache.org/licenses/LICENSE-2.0
12 #
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
18 #
19
20 require "securerandom"
21
22 include Chef::Mixin::EditFile
23
24 def whyrun_supported?
25   true
26 end
27
28 use_inline_resources
29
30 action :create do
31   version = new_resource.version || Chef::Wordpress.current_version
32
33   node.normal_unless[:wordpress][:sites][new_resource.name] = {}
34
35   node.normal[:wordpress][:sites][new_resource.name][:directory] = site_directory
36
37   node.normal_unless[:wordpress][:sites][new_resource.name][:auth_key] = SecureRandom.base64(48)
38   node.normal_unless[:wordpress][:sites][new_resource.name][:secure_auth_key] = SecureRandom.base64(48)
39   node.normal_unless[:wordpress][:sites][new_resource.name][:logged_in_key] = SecureRandom.base64(48)
40   node.normal_unless[:wordpress][:sites][new_resource.name][:nonce_key] = SecureRandom.base64(48)
41   node.normal_unless[:wordpress][:sites][new_resource.name][:auth_salt] = SecureRandom.base64(48)
42   node.normal_unless[:wordpress][:sites][new_resource.name][:secure_auth_salt] = SecureRandom.base64(48)
43   node.normal_unless[:wordpress][:sites][new_resource.name][:logged_in_salt] = SecureRandom.base64(48)
44   node.normal_unless[:wordpress][:sites][new_resource.name][:nonce_salt] = SecureRandom.base64(48)
45
46   mysql_user "#{new_resource.database_user}@localhost" do
47     password new_resource.database_password
48   end
49
50   mysql_database new_resource.database_name do
51     permissions "#{new_resource.database_user}@localhost" => :all
52   end
53
54   directory site_directory do
55     owner node[:wordpress][:user]
56     group node[:wordpress][:group]
57     mode 0o755
58   end
59
60   subversion site_directory do
61     action :sync
62     repository "http://core.svn.wordpress.org/tags/#{version}"
63     user node[:wordpress][:user]
64     group node[:wordpress][:group]
65     ignore_failure true
66   end
67
68   wp_config = edit_file "#{site_directory}/wp-config-sample.php" do |line|
69     line.gsub!(/database_name_here/, new_resource.database_name)
70     line.gsub!(/username_here/, new_resource.database_user)
71     line.gsub!(/password_here/, new_resource.database_password)
72     line.gsub!(/wp_/, new_resource.database_prefix)
73
74     line.gsub!(/('AUTH_KEY', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.name][:auth_key]}'")
75     line.gsub!(/('SECURE_AUTH_KEY', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.name][:secure_auth_key]}'")
76     line.gsub!(/('LOGGED_IN_KEY', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.name][:logged_in_key]}'")
77     line.gsub!(/('NONCE_KEY', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.name][:nonce_key]}'")
78     line.gsub!(/('AUTH_SALT', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.name][:auth_salt]}'")
79     line.gsub!(/('SECURE_AUTH_SALT', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.name][:secure_auth_salt]}'")
80     line.gsub!(/('LOGGED_IN_SALT', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.name][:logged_in_salt]}'")
81     line.gsub!(/('NONCE_SALT', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.name][:nonce_salt]}'")
82
83     if line =~ /define\('WP_DEBUG'/
84       line += "\n"
85       line += "/**\n"
86       line += " * Don't allow file editing.\n"
87       line += " */\n"
88       line += "define('DISALLOW_FILE_EDIT', true);\n"
89       if new_resource.ssl_enabled
90         line += "define('FORCE_SSL_LOGIN', true);\n"
91         line += "define('FORCE_SSL_ADMIN', true);\n"
92       end
93     end
94
95     line
96   end
97
98   file "#{site_directory}/wp-config.php" do
99     owner node[:wordpress][:user]
100     group node[:wordpress][:group]
101     mode 0o644
102     content wp_config
103   end
104
105   directory "#{site_directory}/wp-content/uploads" do
106     owner "www-data"
107     group "www-data"
108     mode 0o755
109   end
110
111   file "#{site_directory}/sitemap.xml" do
112     action :delete
113   end
114
115   file "#{site_directory}/sitemap.xml.gz" do
116     action :delete
117   end
118
119   cookbook_file "#{site_directory}/googlefac54c35e800caab.html" do
120     cookbook "wordpress"
121     owner node[:wordpress][:user]
122     group node[:wordpress][:group]
123     mode 0o644
124     backup false
125   end
126
127   ssl_certificate new_resource.name do
128     domains [new_resource.name] + Array(new_resource.aliases)
129   end
130
131   apache_site new_resource.name do
132     cookbook "wordpress"
133     template "apache.erb"
134     directory site_directory
135     variables :aliases => Array(new_resource.aliases),
136               :urls => new_resource.urls,
137               :ssl_enabled => new_resource.ssl_enabled
138     reload_apache false
139   end
140
141   http_request "http://#{new_resource.name}/wp-admin/upgrade.php" do
142     action :nothing
143     url "http://#{new_resource.name}/wp-admin/upgrade.php?step=1"
144     subscribes :get, "subversion[#{site_directory}]"
145   end
146
147   wordpress_plugin "wp-fail2ban" do
148     site new_resource.name
149     reload_apache false
150   end
151
152   script "#{site_directory}/wp-content/plugins/wp-fail2ban" do
153     action :nothing
154     interpreter "php"
155     cwd site_directory
156     user "wordpress"
157     code <<-EOS
158     <?php
159     @include "wp-config.php";
160     @include_once "wp-includes/functions.php";
161     @include_once "wp-admin/includes/plugin.php";
162     activate_plugin("wp-fail2ban/wp-fail2ban.php", '', false, false);
163     ?>
164     EOS
165     subscribes :run, "wordpress_plugin[wp-fail2ban]"
166   end
167 end
168
169 action :delete do
170   wordpress_plugin "wp-fail2ban" do
171     action :delete
172     site new_resource.name
173     reload_apache false
174   end
175
176   apache_site new_resource.name do
177     action :delete
178     reload_apache false
179   end
180
181   directory site_directory do
182     action :delete
183     recursive true
184   end
185
186   mysql_database new_resource.database_name do
187     action :drop
188   end
189
190   mysql_user "#{new_resource.database_user}@localhost" do
191     action :drop
192   end
193 end
194
195 def site_directory
196   new_resource.directory || "/srv/#{new_resource.name}"
197 end