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