]> git.openstreetmap.org Git - chef.git/blob - cookbooks/wordpress/providers/site.rb
a664b0ea8e85584026ca01574decb1929c8167d4
[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.set_unless[:wordpress][:sites][new_resource.name] = {}
34
35   node.set[:wordpress][:sites][new_resource.name][:directory] = site_directory
36
37   node.set_unless[:wordpress][:sites][new_resource.name][:auth_key] = SecureRandom.base64(48)
38   node.set_unless[:wordpress][:sites][new_resource.name][:secure_auth_key] = SecureRandom.base64(48)
39   node.set_unless[:wordpress][:sites][new_resource.name][:logged_in_key] = SecureRandom.base64(48)
40   node.set_unless[:wordpress][:sites][new_resource.name][:nonce_key] = SecureRandom.base64(48)
41   node.set_unless[:wordpress][:sites][new_resource.name][:auth_salt] = SecureRandom.base64(48)
42   node.set_unless[:wordpress][:sites][new_resource.name][:secure_auth_salt] = SecureRandom.base64(48)
43   node.set_unless[:wordpress][:sites][new_resource.name][:logged_in_salt] = SecureRandom.base64(48)
44   node.set_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   apache_site new_resource.name do
128     cookbook "wordpress"
129     template "apache.erb"
130     directory site_directory
131     variables :aliases => Array(new_resource.aliases),
132               :urls => new_resource.urls,
133               :ssl_enabled => new_resource.ssl_enabled,
134               :ssl_certificate => new_resource.ssl_certificate,
135               :ssl_certificate_chain => new_resource.ssl_certificate_chain
136     reload_apache false
137   end
138
139   http_request "http://#{new_resource.name}/wp-admin/upgrade.php" do
140     action :nothing
141     url "http://#{new_resource.name}/wp-admin/upgrade.php?step=1"
142     subscribes :get, "subversion[#{site_directory}]"
143   end
144
145   wordpress_plugin "wp-fail2ban" do
146     site new_resource.name
147     reload_apache false
148   end
149
150   script "#{site_directory}/wp-content/plugins/wp-fail2ban" do
151     action :nothing
152     interpreter "php"
153     cwd site_directory
154     user "wordpress"
155     code <<-EOS
156     <?php
157     @include "wp-config.php";
158     @include_once "wp-includes/functions.php";
159     @include_once "wp-admin/includes/plugin.php";
160     activate_plugin("wp-fail2ban/wp-fail2ban.php", '', false, false);
161     ?>
162     EOS
163     subscribes :run, "wordpress_plugin[wp-fail2ban]"
164   end
165 end
166
167 action :delete do
168   wordpress_plugin "wp-fail2ban" do
169     action :delete
170     site new_resource.name
171     reload_apache false
172   end
173
174   apache_site new_resource.name do
175     action :delete
176     reload_apache false
177   end
178
179   directory site_directory do
180     action :delete
181     recursive true
182   end
183
184   mysql_database new_resource.database_name do
185     action :drop
186   end
187
188   mysql_user "#{new_resource.database_user}@localhost" do
189     action :drop
190   end
191 end
192
193 def site_directory
194   new_resource.directory || "/srv/#{new_resource.name}"
195 end