Use declare_resource to avoid need for template_source wart
[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     only_if { new_resource.ssl_enabled }
130   end
131
132   apache_site new_resource.name do
133     cookbook "wordpress"
134     template "apache.erb"
135     directory site_directory
136     variables :aliases => Array(new_resource.aliases),
137               :urls => new_resource.urls,
138               :ssl_enabled => new_resource.ssl_enabled
139     reload_apache false
140   end
141
142   http_request "http://#{new_resource.name}/wp-admin/upgrade.php" do
143     action :nothing
144     url "http://#{new_resource.name}/wp-admin/upgrade.php?step=1"
145     subscribes :get, "subversion[#{site_directory}]"
146   end
147
148   wordpress_plugin "wp-fail2ban" do
149     site new_resource.name
150     reload_apache false
151   end
152
153   script "#{site_directory}/wp-content/plugins/wp-fail2ban" do
154     action :nothing
155     interpreter "php"
156     cwd site_directory
157     user "wordpress"
158     code <<-WP_FAIL2BAN
159     <?php
160     @include "wp-config.php";
161     @include_once "wp-includes/functions.php";
162     @include_once "wp-admin/includes/plugin.php";
163     activate_plugin("wp-fail2ban/wp-fail2ban.php", '', false, false);
164     ?>
165     WP_FAIL2BAN
166     subscribes :run, "wordpress_plugin[wp-fail2ban]"
167   end
168 end
169
170 action :delete do
171   wordpress_plugin "wp-fail2ban" do
172     action :delete
173     site new_resource.name
174     reload_apache false
175   end
176
177   apache_site new_resource.name do
178     action :delete
179     reload_apache false
180   end
181
182   directory site_directory do
183     action :delete
184     recursive true
185   end
186
187   mysql_database new_resource.database_name do
188     action :drop
189   end
190
191   mysql_user "#{new_resource.database_user}@localhost" do
192     action :drop
193   end
194 end
195
196 def site_directory
197   new_resource.directory || "/srv/#{new_resource.name}"
198 end