0995c11fee918c2f19f892838db98eee217537d3
[chef.git] / cookbooks / mediawiki / resources / site.rb
1 #
2 # Cookbook Name:: mediawiki
3 # Resource:: mediawiki_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 default_action :create
21
22 property :site, :kind_of => String, :name_attribute => true
23 property :aliases, :kind_of => [String, Array]
24 property :directory, :kind_of => String
25 property :version, :kind_of => String, :default => "1.28"
26 property :database_name, :kind_of => String, :required => true
27 property :database_user, :kind_of => String, :required => true
28 property :database_password, :kind_of => String, :required => true
29 property :sitename, :kind_of => String, :default => "OpenStreetMap Wiki"
30 property :metanamespace, :kind_of => String, :default => "OpenStreetMap"
31 property :logo, :kind_of => String, :default => "$wgStylePath/common/images/wiki.png"
32 property :email_contact, :kind_of => String, :default => ""
33 property :email_sender, :kind_of => String, :default => ""
34 property :email_sender_name, :kind_of => String, :default => "MediaWiki Mail"
35 property :commons, :kind_of => [TrueClass, FalseClass], :default => true
36 property :skin, :kind_of => String, :default => "vector"
37 property :site_notice, :kind_of => [String, TrueClass, FalseClass], :default => false
38 property :site_readonly, :kind_of => [String, TrueClass, FalseClass], :default => false
39 property :admin_user, :kind_of => String, :default => "Admin"
40 property :admin_password, :kind_of => String, :required => true
41 property :ssl_enabled, :kind_of => [TrueClass, FalseClass], :default => false
42 property :private_accounts, :kind_of => [TrueClass, FalseClass], :default => false
43 property :private, :kind_of => [TrueClass, FalseClass], :default => false
44 property :recaptcha_public_key, :kind_of => String
45 property :recaptcha_private_key, :kind_of => String
46 property :extra_file_extensions, :kind_of => [String, Array], :default => []
47 property :reload_apache, :kind_of => [TrueClass, FalseClass], :default => true
48
49 action :create do
50   node.normal_unless[:mediawiki][:sites][new_resource.site] = {}
51
52   node.normal[:mediawiki][:sites][new_resource.site][:directory] = site_directory
53   node.normal[:mediawiki][:sites][new_resource.site][:version] = new_resource.version
54
55   node.normal_unless[:mediawiki][:sites][new_resource.site][:wgSecretKey] = SecureRandom.base64(48)
56
57   mysql_user "#{new_resource.database_user}@localhost" do
58     password new_resource.database_password
59   end
60
61   mysql_database new_resource.database_name do
62     permissions "#{new_resource.database_user}@localhost" => :all
63   end
64
65   mediawiki_directory = "#{site_directory}/w"
66
67   ruby_block "rename-installer-localsettings" do
68     action :nothing
69     block do
70       ::File.rename("#{mediawiki_directory}/LocalSettings.php", "#{mediawiki_directory}/LocalSettings-install.php")
71     end
72   end
73
74   execute "#{mediawiki_directory}/maintenance/install.php" do
75     action :nothing
76     # Use metanamespace as Site Name to ensure correct set namespace
77     command "php maintenance/install.php --server '#{name}' --dbtype 'mysql' --dbname '#{new_resource.database_name}' --dbuser '#{new_resource.database_user}' --dbpass '#{new_resource.database_password}' --dbserver 'localhost' --scriptpath /w --pass '#{new_resource.admin_password}' '#{new_resource.metanamespace}' '#{new_resource.admin_user}'"
78     cwd mediawiki_directory
79     user node[:mediawiki][:user]
80     group node[:mediawiki][:group]
81     not_if do
82       ::File.exist?("#{mediawiki_directory}/LocalSettings-install.php")
83     end
84     notifies :run, "ruby_block[rename-installer-localsettings]", :immediately
85   end
86
87   execute "#{mediawiki_directory}/maintenance/update.php" do
88     action :nothing
89     command "php maintenance/update.php --quick"
90     cwd mediawiki_directory
91     user node[:mediawiki][:user]
92     group node[:mediawiki][:group]
93   end
94
95   declare_resource :directory, site_directory do
96     owner node[:mediawiki][:user]
97     group node[:mediawiki][:group]
98     mode 0o775
99   end
100
101   declare_resource :directory, mediawiki_directory do
102     owner node[:mediawiki][:user]
103     group node[:mediawiki][:group]
104     mode 0o775
105   end
106
107   mediawiki_reference = "REL#{new_resource.version}".tr(".", "_")
108
109   git "#{mediawiki_directory}/vendor" do
110     action :nothing
111     repository "https://gerrit.wikimedia.org/r/p/mediawiki/vendor.git"
112     revision mediawiki_reference
113     user node[:mediawiki][:user]
114     group node[:mediawiki][:group]
115   end
116
117   git mediawiki_directory do
118     action :sync
119     repository "https://gerrit.wikimedia.org/r/p/mediawiki/core.git"
120     revision mediawiki_reference
121     user node[:mediawiki][:user]
122     group node[:mediawiki][:group]
123     notifies :sync, "git[#{mediawiki_directory}/vendor]", :immediately
124     notifies :run, "execute[#{mediawiki_directory}/maintenance/install.php]", :immediately
125     notifies :run, "execute[#{mediawiki_directory}/maintenance/update.php]"
126   end
127
128   # Safety catch if git doesn't update but install.php hasn't run
129   ruby_block "catch-installer-localsettings-run" do
130     action :run
131     block do
132       #
133     end
134     not_if do
135       ::File.exist?("#{mediawiki_directory}/LocalSettings-install.php")
136     end
137     notifies :run, "execute[#{mediawiki_directory}/maintenance/install.php]", :immediately
138   end
139
140   declare_resource :directory, "#{mediawiki_directory}/images" do
141     owner "www-data"
142     group node[:mediawiki][:group]
143     mode 0o775
144   end
145
146   declare_resource :directory, "#{mediawiki_directory}/cache" do
147     owner "www-data"
148     group node[:mediawiki][:group]
149     mode 0o775
150   end
151
152   declare_resource :directory, "#{mediawiki_directory}/LocalSettings.d" do
153     user node[:mediawiki][:user]
154     group node[:mediawiki][:group]
155     mode 0o775
156   end
157
158   template "#{mediawiki_directory}/LocalSettings.php" do
159     cookbook "mediawiki"
160     source "LocalSettings.php.erb"
161     owner node[:mediawiki][:user]
162     group node[:mediawiki][:group]
163     mode 0o664
164     variables :name => new_resource.site,
165               :directory => mediawiki_directory,
166               :database_params => database_params,
167               :mediawiki => mediawiki_params
168     notifies :run, "execute[#{mediawiki_directory}/maintenance/update.php]"
169   end
170
171   template "/etc/cron.d/mediawiki-#{cron_name}" do
172     cookbook "mediawiki"
173     source "mediawiki.cron.erb"
174     owner "root"
175     group "root"
176     mode 0o644
177     variables :name => new_resource.site, :directory => site_directory,
178               :user => node[:mediawiki][:user]
179   end
180
181   template "/etc/cron.daily/mediawiki-#{cron_name}-backup" do
182     cookbook "mediawiki"
183     source "mediawiki-backup.cron.erb"
184     owner "root"
185     group "root"
186     mode 0o700
187     variables :name => new_resource.site,
188               :directory => site_directory,
189               :database_params => database_params
190   end
191
192   mediawiki_skin "CologneBlue" do # ~FC005
193     site new_resource.site
194     update_site false
195   end
196
197   mediawiki_skin "Modern" do
198     site new_resource.site
199     update_site false
200   end
201
202   mediawiki_skin "MonoBook" do
203     site new_resource.site
204     update_site false
205   end
206
207   mediawiki_skin "Vector" do
208     site new_resource.site
209     update_site false
210   end
211
212   mediawiki_extension "Cite" do
213     site new_resource.site
214     update_site false
215   end
216
217   mediawiki_extension "CiteThisPage" do
218     site new_resource.site
219     update_site false
220   end
221
222   if new_resource.private_accounts || new_resource.private
223     mediawiki_extension "ConfirmEdit" do
224       site new_resource.site
225       update_site false
226       action :delete
227     end
228   else
229     mediawiki_extension "ConfirmEdit" do
230       site new_resource.site
231       template "mw-ext-ConfirmEdit.inc.php.erb"
232       variables :public_key => new_resource.recaptcha_public_key,
233                 :private_key => new_resource.recaptcha_private_key
234       update_site false
235     end
236   end
237
238   mediawiki_extension "Gadgets" do
239     site new_resource.site
240     update_site false
241   end
242
243   mediawiki_extension "ImageMap" do
244     site new_resource.site
245     update_site false
246   end
247
248   mediawiki_extension "InputBox" do
249     site new_resource.site
250     update_site false
251   end
252
253   mediawiki_extension "Interwiki" do
254     site new_resource.site
255     update_site false
256   end
257
258   mediawiki_extension "Nuke" do
259     site new_resource.site
260     update_site false
261   end
262
263   mediawiki_extension "ParserFunctions" do
264     site new_resource.site
265     template "mw-ext-ParserFunctions.inc.php.erb"
266     update_site false
267   end
268
269   mediawiki_extension "PdfHandler" do
270     site new_resource.site
271     template "mw-ext-PdfHandler.inc.php.erb"
272     update_site false
273   end
274
275   mediawiki_extension "Poem" do
276     site new_resource.site
277     update_site false
278   end
279
280   mediawiki_extension "Renameuser" do
281     site new_resource.site
282     update_site false
283   end
284
285   mediawiki_extension "SimpleAntiSpam" do
286     site new_resource.site
287     update_site false
288     action :delete
289   end
290
291   mediawiki_extension "SpamBlacklist" do
292     site new_resource.site
293     template "mw-ext-SpamBlacklist.inc.php.erb"
294     update_site false
295   end
296
297   mediawiki_extension "SyntaxHighlight_GeSHi" do
298     site new_resource.site
299     template "mw-ext-SyntaxHighlight.inc.php.erb"
300     update_site false
301   end
302
303   mediawiki_extension "TitleBlacklist" do
304     site new_resource.site
305     template "mw-ext-TitleBlacklist.inc.php.erb"
306     update_site false
307   end
308
309   mediawiki_extension "WikiEditor" do
310     site new_resource.site
311     update_site false
312   end
313
314   # MediaWiki Language Extension Bundle
315   # FIXME: should automatically resolve tag
316   mw_lang_ext_bundle_tag = "2017.01"
317
318   mediawiki_extension "Babel" do
319     site new_resource.site
320     template "mw-ext-Babel.inc.php.erb"
321     # tag mw_lang_ext_bundle_tag
322     tag mw_lang_ext_bundle_tag
323     update_site false
324   end
325
326   mediawiki_extension "cldr" do
327     site new_resource.site
328     template "mw-ext-cldr.inc.php.erb"
329     tag mw_lang_ext_bundle_tag
330     update_site false
331   end
332
333   mediawiki_extension "CleanChanges" do
334     site new_resource.site
335     template "mw-ext-CleanChanges.inc.php.erb"
336     tag mw_lang_ext_bundle_tag
337     update_site false
338   end
339
340   mediawiki_extension "LocalisationUpdate" do
341     site new_resource.site
342     template "mw-ext-LocalisationUpdate.inc.php.erb"
343     tag mw_lang_ext_bundle_tag
344     update_site false
345   end
346
347   # LocalisationUpdate Update Cron
348   # template "/etc/cron.d/mediawiki-#{name}-LocalisationUpdate" do
349   #   cookbook "mediawiki"
350   #   source "mediawiki-LocalisationUpdate.cron.erb"
351   #   owner "root"
352   #   group "root"
353   #   mode 0755
354   #   variables :name => name, :directory => site_directory, :user => node[:mediawiki][:user]
355   # end
356
357   # mediawiki_extension "Translate" do
358   #   site new_resource.site
359   #   template "mw-ext-Translate.inc.php.erb"
360   #   tag mw_lang_ext_bundle_tag
361   #   update_site false
362   # end
363
364   mediawiki_extension "UniversalLanguageSelector" do
365     site new_resource.site
366     tag mw_lang_ext_bundle_tag
367     update_site false
368   end
369
370   mediawiki_extension "AntiSpoof" do
371     site new_resource.site
372     template "mw-ext-AntiSpoof.inc.php.erb"
373     update_site false
374   end
375
376   mediawiki_extension "AbuseFilter" do
377     site new_resource.site
378     template "mw-ext-AbuseFilter.inc.php.erb"
379     update_site false
380   end
381
382   mediawiki_extension "CheckUser" do
383     site new_resource.site
384     template "mw-ext-CheckUser.inc.php.erb"
385     update_site false
386   end
387
388   mediawiki_extension "DismissableSiteNotice" do
389     site new_resource.site
390     update_site false
391   end
392
393   mediawiki_extension "Elastica" do
394     site new_resource.site
395     update_site false
396   end
397
398   mediawiki_extension "CirrusSearch" do
399     site new_resource.site
400     template "mw-ext-CirrusSearch.inc.php.erb"
401     update_site false
402   end
403
404   mediawiki_extension "osmtaginfo" do
405     site new_resource.site
406     template "mw-ext-osmtaginfo.inc.php.erb"
407     repository "git://github.com/Firefishy/osmtaginfo.git"
408     tag "live"
409     update_site false
410   end
411
412   mediawiki_extension "SimpleMap" do
413     site new_resource.site
414     template "mw-ext-SimpleMap.inc.php.erb"
415     repository "git://github.com/Firefishy/SimpleMap.git"
416     tag "live"
417     update_site false
418   end
419
420   mediawiki_extension "SlippyMap" do
421     site new_resource.site
422     template "mw-ext-SlippyMap.inc.php.erb"
423     repository "git://github.com/Firefishy/SlippyMap.git"
424     tag "live"
425     update_site false
426   end
427
428   mediawiki_extension "Mantle" do
429     site new_resource.site
430     update_site false
431     action :delete
432   end
433
434   mediawiki_extension "MobileFrontend" do
435     site new_resource.site
436     template "mw-ext-MobileFrontend.inc.php.erb"
437     update_site false
438   end
439
440   mediawiki_extension "DisableAccount" do
441     site new_resource.site
442     template "mw-ext-DisableAccount.inc.php.erb"
443     update_site false
444   end
445
446   mediawiki_extension "VisualEditor" do
447     site new_resource.site
448     template "mw-ext-VisualEditor.inc.php.erb"
449     update_site false
450   end
451
452   cookbook_file "#{site_directory}/cc-wiki.png" do
453     cookbook "mediawiki"
454     owner node[:mediawiki][:user]
455     group node[:mediawiki][:group]
456     mode 0o644
457     backup false
458   end
459
460   cookbook_file "#{site_directory}/googled06a989d1ccc8364.html" do
461     cookbook "mediawiki"
462     owner node[:mediawiki][:user]
463     group node[:mediawiki][:group]
464     mode 0o644
465     backup false
466   end
467
468   cookbook_file "#{site_directory}/googlefac54c35e800caab.html" do
469     cookbook "mediawiki"
470     owner node[:mediawiki][:user]
471     group node[:mediawiki][:group]
472     mode 0o644
473     backup false
474   end
475
476   ports = new_resource.ssl_enabled ? [80, 443] : [80]
477
478   ssl_certificate new_resource.site do
479     domains [new_resource.site] + Array(new_resource.aliases)
480     only_if { new_resource.ssl_enabled }
481   end
482
483   apache_site new_resource.site do
484     cookbook "mediawiki"
485     template "apache.erb"
486     directory site_directory
487     variables :aliases => Array(new_resource.aliases),
488               :private => new_resource.private,
489               :ssl_enabled => new_resource.ssl_enabled,
490               :ports => ports
491     reload_apache false
492   end
493
494   # FIXME: needs to run one
495   execute "#{mediawiki_directory}/extensions/CirrusSearch/maintenance/updateSearchIndexConfig.php" do
496     action :nothing
497     command "php extensions/CirrusSearch/maintenance/updateSearchIndexConfig.php"
498     cwd mediawiki_directory
499     user node[:mediawiki][:user]
500     group node[:mediawiki][:group]
501   end
502 end
503
504 action :update do
505   mediawiki_directory = "#{site_directory}/w"
506
507   template "#{mediawiki_directory}/LocalSettings.php" do
508     cookbook "mediawiki"
509     source "LocalSettings.php.erb"
510     owner node[:mediawiki][:user]
511     group node[:mediawiki][:group]
512     mode 0o664
513     variables :name => new_resource.site,
514               :directory => mediawiki_directory,
515               :database_params => database_params,
516               :mediawiki => mediawiki_params
517     notifies :run, "execute[#{mediawiki_directory}/maintenance/update.php]"
518   end
519
520   execute "#{mediawiki_directory}/maintenance/update.php" do
521     action :run
522     command "php maintenance/update.php --quick"
523     cwd mediawiki_directory
524     user node[:mediawiki][:user]
525     group node[:mediawiki][:group]
526   end
527 end
528
529 action :delete do
530   apache_site new_resource.site do
531     action :delete
532     reload_apache false
533   end
534
535   declare_resource :directory, site_directory do
536     action :delete
537     recursive true
538   end
539
540   mysql_database new_resource.database_name do
541     action :drop
542   end
543
544   mysql_user "#{new_resource.database_user}@localhost" do
545     action :drop
546   end
547 end
548
549 action_class do
550   def site_directory
551     new_resource.directory || "/srv/#{new_resource.site}"
552   end
553
554   def cron_name
555     new_resource.site.tr(".", "_")
556   end
557
558   def database_params
559     {
560       :host => "localhost",
561       :name => new_resource.database_name,
562       :username => new_resource.database_user,
563       :password => new_resource.database_password
564     }
565   end
566
567   def mediawiki_params
568     {
569       :sitename => new_resource.sitename,
570       :metanamespace => new_resource.metanamespace,
571       :logo => new_resource.logo,
572       :email_contact => new_resource.email_contact,
573       :email_sender => new_resource.email_sender,
574       :email_sender_name => new_resource.email_sender_name,
575       :commons => new_resource.commons,
576       :skin => new_resource.skin,
577       :site_notice => new_resource.site_notice,
578       :site_readonly => new_resource.site_readonly,
579       :ssl_enabled => new_resource.ssl_enabled,
580       :extra_file_extensions => new_resource.extra_file_extensions,
581       :private_accounts => new_resource.private_accounts,
582       :private => new_resource.private
583     }
584   end
585 end
586
587 def after_created
588   notifies :reload, "service[apache2]" if reload_apache
589 end