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