]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - maintenance/addwiki.php
MediaWiki 1.17.1-scripts
[autoinstalls/mediawiki.git] / maintenance / addwiki.php
1 <?php
2 /**
3  * @defgroup Wikimedia Wikimedia
4  */
5
6 /**
7  * Add a new wiki
8  * Wikimedia specific!
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License along
21  * with this program; if not, write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23  * http://www.gnu.org/copyleft/gpl.html
24  *
25  * @file
26  * @ingroup Maintenance
27  * @ingroup Wikimedia
28  */
29
30 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
31
32 class AddWiki extends Maintenance {
33         public function __construct() {
34                 parent::__construct();
35                 $this->mDescription = "Add a new wiki to the family. Wikimedia specific!";
36                 $this->addArg( 'language', 'Language code of new site, e.g. en' );
37                 $this->addArg( 'site', 'Type of site, e.g. wikipedia' );
38                 $this->addArg( 'dbname', 'Name of database to create, e.g. enwiki' );
39                 $this->addArg( 'domain', 'Domain name of the wiki, e.g. en.wikipedia.org' );
40         }
41
42         public function getDbType() {
43                 return Maintenance::DB_ADMIN;
44         }
45
46         public function execute() {
47                 global $IP, $wgDefaultExternalStore, $wgNoDBParam;
48
49                 $wgNoDBParam = true;
50                 $lang = $this->getArg( 0 );
51                 $site = $this->getArg( 1 );
52                 $dbName = $this->getArg( 2 );
53                 $domain = $this->getArg( 3 );
54                 $languageNames = Language::getLanguageNames();
55
56                 if ( !isset( $languageNames[$lang] ) ) {
57                         $this->error( "Language $lang not found in \$wgLanguageNames", true );
58                 }
59                 $name = $languageNames[$lang];
60
61                 $dbw = wfGetDB( DB_MASTER );
62                 $common = "/home/wikipedia/common";
63
64                 $this->output( "Creating database $dbName for $lang.$site ($name)\n" );
65
66                 # Set up the database
67                 $dbw->query( "SET table_type=Innodb" );
68                 $dbw->query( "CREATE DATABASE $dbName" );
69                 $dbw->selectDB( $dbName );
70
71                 $this->output( "Initialising tables\n" );
72                 $dbw->sourceFile( $this->getDir() . '/tables.sql' );
73                 $dbw->sourceFile( "$IP/extensions/OAI/update_table.sql" );
74                 $dbw->sourceFile( "$IP/extensions/AntiSpoof/sql/patch-antispoof.mysql.sql" );
75                 $dbw->sourceFile( "$IP/extensions/CheckUser/cu_changes.sql" );
76                 $dbw->sourceFile( "$IP/extensions/CheckUser/cu_log.sql" );
77                 $dbw->sourceFile( "$IP/extensions/TitleKey/titlekey.sql" );
78                 $dbw->sourceFile( "$IP/extensions/Oversight/hidden.sql" );
79                 $dbw->sourceFile( "$IP/extensions/GlobalBlocking/localdb_patches/setup-global_block_whitelist.sql" );
80                 $dbw->sourceFile( "$IP/extensions/AbuseFilter/abusefilter.tables.sql" );
81                 $dbw->sourceFile( "$IP/extensions/UsabilityInitiative/PrefStats/PrefStats.sql" );
82                 $dbw->sourceFile( "$IP/extensions/ProofreadPage/ProofreadPage.sql" );
83                 $dbw->sourceFile( "$IP/extensions/UsabilityInitiative/ClickTracking/ClickTrackingEvents.sql" );
84                 $dbw->sourceFile( "$IP/extensions/UsabilityInitiative/ClickTracking/ClickTracking.sql" );
85                 $dbw->sourceFile( "$IP/extensions/UsabilityInitiative/UserDailyContribs/UserDailyContribs.sql" );
86                 $dbw->sourceFile( "$IP/extensions/UsabilityInitiative/OptIn/OptIn.sql" );
87
88                 $dbw->query( "INSERT INTO site_stats(ss_row_id) VALUES (1)" );
89
90                 # Initialise external storage
91                 if ( is_array( $wgDefaultExternalStore ) ) {
92                         $stores = $wgDefaultExternalStore;
93                 } elseif ( $wgDefaultExternalStore ) {
94                         $stores = array( $wgDefaultExternalStore );
95                 } else {
96                         $stores = array();
97                 }
98                 if ( count( $stores ) ) {
99                         global $wgDBuser, $wgDBpassword, $wgExternalServers;
100                         foreach ( $stores as $storeURL ) {
101                                 $m = array();
102                                 if ( !preg_match( '!^DB://(.*)$!', $storeURL, $m ) ) {
103                                         continue;
104                                 }
105
106                                 $cluster = $m[1];
107                                 $this->output( "Initialising external storage $cluster...\n" );
108
109                                 # Hack
110                                 $wgExternalServers[$cluster][0]['user'] = $wgDBuser;
111                                 $wgExternalServers[$cluster][0]['password'] = $wgDBpassword;
112
113                                 $store = new ExternalStoreDB;
114                                 $extdb = $store->getMaster( $cluster );
115                                 $extdb->query( "SET table_type=InnoDB" );
116                                 $extdb->query( "CREATE DATABASE $dbName" );
117                                 $extdb->selectDB( $dbName );
118
119                                 # Hack x2
120                                 $blobsTable = $store->getTable( $extdb );
121                                 $sedCmd = "sed s/blobs\\\\\\>/$blobsTable/ " . $this->getDir() . "/storage/blobs.sql";
122                                 $blobsFile = popen( $sedCmd, 'r' );
123                                 $extdb->sourceStream( $blobsFile );
124                                 pclose( $blobsFile );
125                                 $extdb->commit();
126                         }
127                 }
128
129                 global $wgTitle, $wgArticle;
130                 $wgTitle = Title::newFromText( wfMsgWeirdKey( "mainpage/$lang" ) );
131                 $this->output( "Writing main page to " . $wgTitle->getPrefixedDBkey() . "\n" );
132                 $wgArticle = new Article( $wgTitle );
133                 $ucsite = ucfirst( $site );
134
135                 $wgArticle->insertNewArticle( $this->getFirstArticle( $ucsite, $name ), '', false, false );
136
137                 $this->output( "Adding to dblists\n" );
138
139                 # Add to dblist
140                 $file = fopen( "$common/all.dblist", "a" );
141                 fwrite( $file, "$dbName\n" );
142                 fclose( $file );
143
144                 # Update the sublists
145                 shell_exec( "cd $common && ./refresh-dblist" );
146
147                 # print "Constructing interwiki SQL\n";
148                 # Rebuild interwiki tables
149                 # passthru( '/home/wikipedia/conf/interwiki/update' );
150
151                 $time = wfTimestamp( TS_RFC2822 );
152                 // These arguments need to be escaped twice: once for echo and once for at
153                 $escDbName = wfEscapeShellArg( wfEscapeShellArg( $dbName ) );
154                 $escTime = wfEscapeShellArg( wfEscapeShellArg( $time ) );
155                 $escUcsite = wfEscapeShellArg( wfEscapeShellArg( $ucsite ) );
156                 $escName = wfEscapeShellArg( wfEscapeShellArg( $name ) );
157                 $escLang = wfEscapeShellArg( wfEscapeShellArg( $lang ) );
158                 $escDomain = wfEscapeShellArg( wfEscapeShellArg( $domain ) );
159                 shell_exec( "echo notifyNewProjects $escDbName $escTime $escUcsite $escName $escLang $escDomain | at now + 15 minutes" );
160
161                 $this->output( "Script ended. You still have to:
162         * Add any required settings in InitialiseSettings.php
163         * Run sync-common-all
164         * Run /home/wikipedia/conf/interwiki/update
165         " );
166         }
167
168         private function getFirstArticle( $ucsite, $name ) {
169                 return <<<EOT
170 ==This subdomain is reserved for the creation of a [[wikimedia:Our projects|$ucsite]] in '''[[w:en:{$name}|{$name}]]''' language==
171
172 * Please '''do not start editing''' this new site. This site has a test project on the [[incubator:|Wikimedia Incubator]] (or on the [[betawikiversity:|BetaWikiversity]] or on the [[oldwikisource:|Old Wikisource]]) and it will be imported to here.
173
174 * If you would like to help translating the interface to this language, please do not translate here, but go to [[translatewiki:|translatewiki]], a special wiki for translating the interface. That way everyone can use it on every wiki using the [[mw:|same software]].
175
176 * For information about how to edit and for other general help, see [[m:Help:Contents|Help on Wikimedia's Meta-Wiki]] or [[mw:Help:Contents|Help on MediaWiki.org]].
177
178 == Sister projects ==
179 <span class="plainlinks">
180 [http://www.wikipedia.org Wikipedia] |
181 [http://www.wiktionary.org Wiktonary] |
182 [http://www.wikibooks.org Wikibooks] |
183 [http://www.wikinews.org Wikinews] |
184 [http://www.wikiquote.org Wikiquote] |
185 [http://www.wikisource.org Wikisource]
186 [http://www.wikiversity.org Wikiversity]
187 </span>
188
189 See Wikimedia's [[m:|Meta-Wiki]] for the coordination of these projects.
190
191 [[aa:]]
192 [[ab:]]
193 [[ace:]]
194 [[af:]]
195 [[ak:]]
196 [[als:]]
197 [[am:]]
198 [[an:]]
199 [[ang:]]
200 [[ar:]]
201 [[arc:]]
202 [[arz:]]
203 [[as:]]
204 [[ast:]]
205 [[av:]]
206 [[ay:]]
207 [[az:]]
208 [[ba:]]
209 [[bar:]]
210 [[bat-smg:]]
211 [[bcl:]]
212 [[be:]]
213 [[be-x-old:]]
214 [[bg:]]
215 [[bh:]]
216 [[bi:]]
217 [[bm:]]
218 [[bn:]]
219 [[bo:]]
220 [[bpy:]]
221 [[br:]]
222 [[bs:]]
223 [[bug:]]
224 [[bxr:]]
225 [[ca:]]
226 [[cbk-zam:]]
227 [[cdo:]]
228 [[ce:]]
229 [[ceb:]]
230 [[ch:]]
231 [[cho:]]
232 [[chr:]]
233 [[chy:]]
234 [[ckb:]]
235 [[co:]]
236 [[cr:]]
237 [[crh:]]
238 [[cs:]]
239 [[csb:]]
240 [[cu:]]
241 [[cv:]]
242 [[cy:]]
243 [[da:]]
244 [[de:]]
245 [[diq:]]
246 [[dk:]]
247 [[dsb:]]
248 [[dv:]]
249 [[dz:]]
250 [[ee:]]
251 [[el:]]
252 [[eml:]]
253 [[en:]]
254 [[eo:]]
255 [[es:]]
256 [[et:]]
257 [[eu:]]
258 [[ext:]]
259 [[fa:]]
260 [[ff:]]
261 [[fi:]]
262 [[fiu-vro:]]
263 [[fj:]]
264 [[fo:]]
265 [[fr:]]
266 [[frp:]]
267 [[fur:]]
268 [[fy:]]
269 [[ga:]]
270 [[gan:]]
271 [[gd:]]
272 [[gl:]]
273 [[glk:]]
274 [[gn:]]
275 [[got:]]
276 [[gu:]]
277 [[gv:]]
278 [[ha:]]
279 [[hak:]]
280 [[haw:]]
281 [[he:]]
282 [[hi:]]
283 [[hif:]]
284 [[ho:]]
285 [[hr:]]
286 [[hsb:]]
287 [[ht:]]
288 [[hu:]]
289 [[hy:]]
290 [[hz:]]
291 [[ia:]]
292 [[id:]]
293 [[ie:]]
294 [[ig:]]
295 [[ii:]]
296 [[ik:]]
297 [[ilo:]]
298 [[io:]]
299 [[is:]]
300 [[it:]]
301 [[iu:]]
302 [[ja:]]
303 [[jbo:]]
304 [[jv:]]
305 [[ka:]]
306 [[kaa:]]
307 [[kab:]]
308 [[kg:]]
309 [[ki:]]
310 [[kj:]]
311 [[kk:]]
312 [[kl:]]
313 [[km:]]
314 [[kn:]]
315 [[ko:]]
316 [[kr:]]
317 [[ks:]]
318 [[ksh:]]
319 [[ku:]]
320 [[kv:]]
321 [[kw:]]
322 [[ky:]]
323 [[la:]]
324 [[lad:]]
325 [[lb:]]
326 [[lbe:]]
327 [[lg:]]
328 [[li:]]
329 [[lij:]]
330 [[lmo:]]
331 [[ln:]]
332 [[lo:]]
333 [[lt:]]
334 [[lv:]]
335 [[map-bms:]]
336 [[mdf:]]
337 [[mg:]]
338 [[mh:]]
339 [[mhr:]]
340 [[mi:]]
341 [[mk:]]
342 [[ml:]]
343 [[mn:]]
344 [[mo:]]
345 [[mr:]]
346 [[ms:]]
347 [[mt:]]
348 [[mus:]]
349 [[mwl:]]
350 [[my:]]
351 [[myv:]]
352 [[mzn:]]
353 [[na:]]
354 [[nan:]]
355 [[nap:]]
356 [[nds:]]
357 [[nds-nl:]]
358 [[ne:]]
359 [[new:]]
360 [[ng:]]
361 [[nl:]]
362 [[nn:]]
363 [[no:]]
364 [[nov:]]
365 [[nrm:]]
366 [[nv:]]
367 [[ny:]]
368 [[oc:]]
369 [[om:]]
370 [[or:]]
371 [[os:]]
372 [[pa:]]
373 [[pag:]]
374 [[pam:]]
375 [[pap:]]
376 [[pdc:]]
377 [[pi:]]
378 [[pih:]]
379 [[pl:]]
380 [[pms:]]
381 [[pnt:]]
382 [[pnb:]]
383 [[ps:]]
384 [[pt:]]
385 [[qu:]]
386 [[rm:]]
387 [[rmy:]]
388 [[rn:]]
389 [[ro:]]
390 [[roa-rup:]]
391 [[roa-tara:]]
392 [[ru:]]
393 [[rw:]]
394 [[sa:]]
395 [[sah:]]
396 [[sc:]]
397 [[scn:]]
398 [[sco:]]
399 [[sd:]]
400 [[se:]]
401 [[sg:]]
402 [[sh:]]
403 [[si:]]
404 [[simple:]]
405 [[sk:]]
406 [[sl:]]
407 [[sm:]]
408 [[sn:]]
409 [[so:]]
410 [[sq:]]
411 [[sr:]]
412 [[srn:]]
413 [[ss:]]
414 [[st:]]
415 [[stq:]]
416 [[su:]]
417 [[sv:]]
418 [[sw:]]
419 [[szl:]]
420 [[ta:]]
421 [[te:]]
422 [[tet:]]
423 [[tg:]]
424 [[th:]]
425 [[ti:]]
426 [[tk:]]
427 [[tl:]]
428 [[tn:]]
429 [[to:]]
430 [[tpi:]]
431 [[tr:]]
432 [[ts:]]
433 [[tt:]]
434 [[tum:]]
435 [[tw:]]
436 [[ty:]]
437 [[udm:]]
438 [[ug:]]
439 [[uk:]]
440 [[ur:]]
441 [[uz:]]
442 [[ve:]]
443 [[vec:]]
444 [[vi:]]
445 [[vls:]]
446 [[vo:]]
447 [[wa:]]
448 [[war:]]
449 [[wo:]]
450 [[wuu:]]
451 [[xal:]]
452 [[xh:]]
453 [[yi:]]
454 [[yo:]]
455 [[za:]]
456 [[zea:]]
457 [[zh:]]
458 [[zh-classical:]]
459 [[zh-min-nan:]]
460 [[zh-yue:]]
461 [[zu:]]
462
463 EOT;
464         }
465 }
466
467 $maintClass = "AddWiki";
468 require_once( RUN_MAINTENANCE_IF_MAIN );