Remove ssl_enabled option for wordpress sites
[chef.git] / cookbooks / wordpress / resources / site.rb
1 http
2 # Cookbook Name:: wordpress
3 # Resource:: 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 # https://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 default_action :create
23
24 property :site, :kind_of => String, :name_attribute => true
25 property :aliases, :kind_of => [String, Array]
26 property :directory, :kind_of => String
27 property :version, :kind_of => String
28 property :database_name, :kind_of => String, :required => true
29 property :database_user, :kind_of => String, :required => true
30 property :database_password, :kind_of => String, :required => true
31 property :database_prefix, :kind_of => String, :default => "wp_"
32 property :urls, :kind_of => Hash, :default => {}
33 property :reload_apache, :kind_of => [TrueClass, FalseClass], :default => true
34
35 action :create do
36   version = new_resource.version || Chef::Wordpress.current_version
37
38   node.normal_unless[:wordpress][:sites][new_resource.site] = {}
39
40   node.normal[:wordpress][:sites][new_resource.site][:directory] = site_directory
41
42   node.normal_unless[:wordpress][:sites][new_resource.site][:auth_key] = SecureRandom.base64(48)
43   node.normal_unless[:wordpress][:sites][new_resource.site][:secure_auth_key] = SecureRandom.base64(48)
44   node.normal_unless[:wordpress][:sites][new_resource.site][:logged_in_key] = SecureRandom.base64(48)
45   node.normal_unless[:wordpress][:sites][new_resource.site][:nonce_key] = SecureRandom.base64(48)
46   node.normal_unless[:wordpress][:sites][new_resource.site][:auth_salt] = SecureRandom.base64(48)
47   node.normal_unless[:wordpress][:sites][new_resource.site][:secure_auth_salt] = SecureRandom.base64(48)
48   node.normal_unless[:wordpress][:sites][new_resource.site][:logged_in_salt] = SecureRandom.base64(48)
49   node.normal_unless[:wordpress][:sites][new_resource.site][:nonce_salt] = SecureRandom.base64(48)
50
51   mysql_user "#{new_resource.database_user}@localhost" do
52     password new_resource.database_password
53   end
54
55   mysql_database new_resource.database_name do
56     permissions "#{new_resource.database_user}@localhost" => :all
57   end
58
59   declare_resource :directory, site_directory do
60     owner node[:wordpress][:user]
61     group node[:wordpress][:group]
62     mode 0o755
63   end
64
65   subversion site_directory do
66     action :sync
67     repository "https://core.svn.wordpress.org/tags/#{version}"
68     user node[:wordpress][:user]
69     group node[:wordpress][:group]
70     ignore_failure true
71   end
72
73   wp_config = edit_file "#{site_directory}/wp-config-sample.php" do |line|
74     line.gsub!(/database_name_here/, new_resource.database_name)
75     line.gsub!(/username_here/, new_resource.database_user)
76     line.gsub!(/password_here/, new_resource.database_password)
77     line.gsub!(/wp_/, new_resource.database_prefix)
78
79     line.gsub!(/('AUTH_KEY', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.site][:auth_key]}'")
80     line.gsub!(/('SECURE_AUTH_KEY', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.site][:secure_auth_key]}'")
81     line.gsub!(/('LOGGED_IN_KEY', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.site][:logged_in_key]}'")
82     line.gsub!(/('NONCE_KEY', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.site][:nonce_key]}'")
83     line.gsub!(/('AUTH_SALT', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.site][:auth_salt]}'")
84     line.gsub!(/('SECURE_AUTH_SALT', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.site][:secure_auth_salt]}'")
85     line.gsub!(/('LOGGED_IN_SALT', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.site][:logged_in_salt]}'")
86     line.gsub!(/('NONCE_SALT', *)'put your unique phrase here'/, "\\1'#{node[:wordpress][:sites][new_resource.site][:nonce_salt]}'")
87
88     if line =~ /define\('WP_DEBUG'/
89       line += "\n"
90       line += "/**\n"
91       line += " * Don't allow file editing.\n"
92       line += " */\n"
93       line += "define('DISALLOW_FILE_EDIT', true);\n"
94       line += "define('FORCE_SSL_LOGIN', true);\n"
95       line += "define('FORCE_SSL_ADMIN', true);\n"
96     end
97
98     line
99   end
100
101   file "#{site_directory}/wp-config.php" do
102     owner node[:wordpress][:user]
103     group node[:wordpress][:group]
104     mode 0o644
105     content wp_config
106   end
107
108   declare_resource :directory, "#{site_directory}/wp-content/uploads" do
109     owner "www-data"
110     group "www-data"
111     mode 0o755
112   end
113
114   file "#{site_directory}/sitemap.xml" do
115     action :delete
116   end
117
118   file "#{site_directory}/sitemap.xml.gz" do
119     action :delete
120   end
121
122   cookbook_file "#{site_directory}/googlefac54c35e800caab.html" do
123     cookbook "wordpress"
124     owner node[:wordpress][:user]
125     group node[:wordpress][:group]
126     mode 0o644
127     backup false
128   end
129
130   ssl_certificate new_resource.site do
131     domains [new_resource.site] + Array(new_resource.aliases)
132   end
133
134   apache_site new_resource.site do
135     cookbook "wordpress"
136     template "apache.erb"
137     directory site_directory
138     variables :aliases => Array(new_resource.aliases),
139               :urls => new_resource.urls
140     reload_apache false
141   end
142
143   http_request "https://#{new_resource.site}/wp-admin/upgrade.php" do
144     action :nothing
145     url "https://#{new_resource.site}/wp-admin/upgrade.php?step=1"
146     subscribes :get, "subversion[#{site_directory}]"
147   end
148
149   wordpress_plugin "wp-fail2ban" do
150     site new_resource.site
151     reload_apache false
152   end
153
154   script "#{site_directory}/wp-content/plugins/wp-fail2ban" do
155     action :nothing
156     interpreter "php"
157     cwd site_directory
158     user "wordpress"
159     code <<-WP_FAIL2BAN
160     <?php
161     @include "wp-config.php";
162     @include_once "wp-includes/functions.php";
163     @include_once "wp-admin/includes/plugin.php";
164     activate_plugin("wp-fail2ban/wp-fail2ban.php", '', false, false);
165     ?>
166     WP_FAIL2BAN
167     subscribes :run, "wordpress_plugin[wp-fail2ban]"
168   end
169 end
170
171 action :delete do
172   wordpress_plugin "wp-fail2ban" do
173     action :delete
174     site new_resource.site
175     reload_apache false
176   end
177
178   apache_site new_resource.site do
179     action :delete
180     reload_apache false
181   end
182
183   declare_resource :directory, site_directory do
184     action :delete
185     recursive true
186   end
187
188   mysql_database new_resource.database_name do
189     action :drop
190   end
191
192   mysql_user "#{new_resource.database_user}@localhost" do
193     action :drop
194   end
195 end
196
197 action_class do
198   include Chef::Mixin::EditFile
199
200   def site_directory
201     new_resource.directory || "/srv/#{new_resource.site}"
202   end
203 end
204
205 def after_created
206   notifies :reload, "service[apache2]" if reload_apache
207 end