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