00001 <?php 00030 require_once( dirname(__FILE__) . '/Maintenance.php' ); 00031 00032 class AddWiki extends Maintenance { 00033 public function __construct() { 00034 parent::__construct(); 00035 $this->mDescription = "Add a new wiki to the family. Wikimedia specific!"; 00036 $this->addArg( 'language', 'Language code of new site' ); 00037 $this->addArg( 'site', 'Type of site' ); 00038 $this->addArg( 'dbname', 'Name of database to create' ); 00039 } 00040 00041 public function getDbType() { 00042 return Maintenance::DB_ADMIN; 00043 } 00044 00045 public function execute() { 00046 global $IP, $wgLanguageNames, $wgDefaultExternalStore, $wgNoDBParam; 00047 00048 $wgNoDBParam = true; 00049 $lang = $this->getArg(0); 00050 $site = $this->getArg(1); 00051 $dbName = $this->getArg(2); 00052 00053 if ( !isset( $wgLanguageNames[$lang] ) ) { 00054 $this->error( "Language $lang not found in \$wgLanguageNames", true ); 00055 } 00056 $name = $wgLanguageNames[$lang]; 00057 00058 $dbw = wfGetDB( DB_MASTER ); 00059 $common = "/home/wikipedia/common"; 00060 00061 $this->output( "Creating database $dbName for $lang.$site ($name)\n" ); 00062 00063 # Set up the database 00064 $dbw->query( "SET table_type=Innodb" ); 00065 $dbw->query( "CREATE DATABASE $dbName" ); 00066 $dbw->selectDB( $dbName ); 00067 00068 $this->output( "Initialising tables\n" ); 00069 $dbw->sourceFile( $this->getDir() . '/tables.sql' ); 00070 $dbw->sourceFile( "$IP/extensions/OAI/update_table.sql" ); 00071 $dbw->sourceFile( "$IP/extensions/AntiSpoof/sql/patch-antispoof.mysql.sql" ); 00072 $dbw->sourceFile( "$IP/extensions/CheckUser/cu_changes.sql" ); 00073 $dbw->sourceFile( "$IP/extensions/CheckUser/cu_log.sql" ); 00074 $dbw->sourceFile( "$IP/extensions/TitleKey/titlekey.sql" ); 00075 $dbw->sourceFile( "$IP/extensions/Oversight/hidden.sql" ); 00076 $dbw->sourceFile( "$IP/extensions/GlobalBlocking/localdb_patches/setup-global_block_whitelist.sql" ); 00077 $dbw->sourceFile( "$IP/extensions/AbuseFilter/abusefilter.tables.sql" ); 00078 $dbw->sourceFile( "$IP/extensions/UsabilityInitiative/PrefStats/PrefStats.sql" ); 00079 $dbw->sourceFile( "$IP/extensions/ProofreadPage/ProofreadPage.sql" ); 00080 $dbw->sourceFile( "$IP/extensions/UsabilityInitiative/ClickTracking/ClickTrackingEvents.sql" ); 00081 $dbw->sourceFile( "$IP/extensions/UsabilityInitiative/ClickTracking/ClickTracking.sql" ); 00082 $dbw->sourceFile( "$IP/extensions/UsabilityInitiative/UserDailyContribs/UserDailyContribs.sql" ); 00083 00084 $dbw->query( "INSERT INTO site_stats(ss_row_id) VALUES (1)" ); 00085 00086 # Initialise external storage 00087 if ( is_array( $wgDefaultExternalStore ) ) { 00088 $stores = $wgDefaultExternalStore; 00089 } elseif ( $stores ) { 00090 $stores = array( $wgDefaultExternalStore ); 00091 } else { 00092 $stores = array(); 00093 } 00094 if ( count( $stores ) ) { 00095 global $wgDBuser, $wgDBpassword, $wgExternalServers; 00096 foreach ( $stores as $storeURL ) { 00097 $m = array(); 00098 if ( !preg_match( '!^DB://(.*)$!', $storeURL, $m ) ) { 00099 continue; 00100 } 00101 00102 $cluster = $m[1]; 00103 $this->output( "Initialising external storage $cluster...\n" ); 00104 00105 # Hack 00106 $wgExternalServers[$cluster][0]['user'] = $wgDBuser; 00107 $wgExternalServers[$cluster][0]['password'] = $wgDBpassword; 00108 00109 $store = new ExternalStoreDB; 00110 $extdb = $store->getMaster( $cluster ); 00111 $extdb->query( "SET table_type=InnoDB" ); 00112 $extdb->query( "CREATE DATABASE $dbName" ); 00113 $extdb->selectDB( $dbName ); 00114 00115 # Hack x2 00116 $blobsTable = $store->getTable( $extdb ); 00117 $sedCmd = "sed s/blobs\\\\\\>/$blobsTable/ " . $this->getDir() . "/storage/blobs.sql"; 00118 $blobsFile = popen( $sedCmd, 'r' ); 00119 $extdb->sourceStream( $blobsFile ); 00120 pclose( $blobsFile ); 00121 $extdb->commit(); 00122 } 00123 } 00124 00125 global $wgTitle, $wgArticle; 00126 $wgTitle = Title::newFromText( wfMsgWeirdKey( "mainpage/$lang" ) ); 00127 $this->output( "Writing main page to " . $wgTitle->getPrefixedDBkey() . "\n" ); 00128 $wgArticle = new Article( $wgTitle ); 00129 $ucsite = ucfirst( $site ); 00130 00131 $wgArticle->insertNewArticle( $this->getFirstArticle( $ucsite, $name ), '', false, false ); 00132 00133 $this->output( "Adding to dblists\n" ); 00134 00135 # Add to dblist 00136 $file = fopen( "$common/all.dblist", "a" ); 00137 fwrite( $file, "$dbName\n" ); 00138 fclose( $file ); 00139 00140 # Update the sublists 00141 shell_exec("cd $common && ./refresh-dblist"); 00142 00143 #print "Constructing interwiki SQL\n"; 00144 # Rebuild interwiki tables 00145 #passthru( '/home/wikipedia/conf/interwiki/update' ); 00146 00147 $this->output( "Script ended. You still have to: 00148 * Add any required settings in InitialiseSettings.php 00149 * Run sync-common-all 00150 * Run /home/wikipedia/conf/interwiki/update 00151 " ); 00152 } 00153 00154 private function getFirstArticle( $ucsite, $name ) { 00155 return <<<EOT 00156 ==This subdomain is reserved for the creation of a [[wikimedia:Our projects|$ucsite]] in '''[[w:en:{$name}|{$name}]]''' language== 00157 00158 * 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. 00159 00160 * 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]]. 00161 00162 * 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]]. 00163 00164 == Sister projects == 00165 <span class="plainlinks"> 00166 [http://www.wikipedia.org Wikipedia] | 00167 [http://www.wiktionary.org Wiktonary] | 00168 [http://www.wikibooks.org Wikibooks] | 00169 [http://www.wikinews.org Wikinews] | 00170 [http://www.wikiquote.org Wikiquote] | 00171 [http://www.wikisource.org Wikisource] 00172 [http://www.wikiversity.org Wikiversity] 00173 </span> 00174 00175 See Wikimedia's [[m:|Meta-Wiki]] for the coordination of these projects. 00176 00177 [[aa:]] 00178 [[ab:]] 00179 [[ace:]] 00180 [[af:]] 00181 [[ak:]] 00182 [[als:]] 00183 [[am:]] 00184 [[an:]] 00185 [[ang:]] 00186 [[ar:]] 00187 [[arc:]] 00188 [[arz:]] 00189 [[as:]] 00190 [[ast:]] 00191 [[av:]] 00192 [[ay:]] 00193 [[az:]] 00194 [[ba:]] 00195 [[bar:]] 00196 [[bat-smg:]] 00197 [[bcl:]] 00198 [[be:]] 00199 [[be-x-old:]] 00200 [[bg:]] 00201 [[bh:]] 00202 [[bi:]] 00203 [[bm:]] 00204 [[bn:]] 00205 [[bo:]] 00206 [[bpy:]] 00207 [[br:]] 00208 [[bs:]] 00209 [[bug:]] 00210 [[bxr:]] 00211 [[ca:]] 00212 [[cbk-zam:]] 00213 [[cdo:]] 00214 [[ce:]] 00215 [[ceb:]] 00216 [[ch:]] 00217 [[cho:]] 00218 [[chr:]] 00219 [[chy:]] 00220 [[ckb:]] 00221 [[co:]] 00222 [[cr:]] 00223 [[crh:]] 00224 [[cs:]] 00225 [[csb:]] 00226 [[cu:]] 00227 [[cv:]] 00228 [[cy:]] 00229 [[da:]] 00230 [[de:]] 00231 [[diq:]] 00232 [[dk:]] 00233 [[dsb:]] 00234 [[dv:]] 00235 [[dz:]] 00236 [[ee:]] 00237 [[el:]] 00238 [[eml:]] 00239 [[en:]] 00240 [[eo:]] 00241 [[es:]] 00242 [[et:]] 00243 [[eu:]] 00244 [[ext:]] 00245 [[fa:]] 00246 [[ff:]] 00247 [[fi:]] 00248 [[fiu-vro:]] 00249 [[fj:]] 00250 [[fo:]] 00251 [[fr:]] 00252 [[frp:]] 00253 [[fur:]] 00254 [[fy:]] 00255 [[ga:]] 00256 [[gan:]] 00257 [[gd:]] 00258 [[gl:]] 00259 [[glk:]] 00260 [[gn:]] 00261 [[got:]] 00262 [[gu:]] 00263 [[gv:]] 00264 [[ha:]] 00265 [[hak:]] 00266 [[haw:]] 00267 [[he:]] 00268 [[hi:]] 00269 [[hif:]] 00270 [[ho:]] 00271 [[hr:]] 00272 [[hsb:]] 00273 [[ht:]] 00274 [[hu:]] 00275 [[hy:]] 00276 [[hz:]] 00277 [[ia:]] 00278 [[id:]] 00279 [[ie:]] 00280 [[ig:]] 00281 [[ii:]] 00282 [[ik:]] 00283 [[ilo:]] 00284 [[io:]] 00285 [[is:]] 00286 [[it:]] 00287 [[iu:]] 00288 [[ja:]] 00289 [[jbo:]] 00290 [[jv:]] 00291 [[ka:]] 00292 [[kaa:]] 00293 [[kab:]] 00294 [[kg:]] 00295 [[ki:]] 00296 [[kj:]] 00297 [[kk:]] 00298 [[kl:]] 00299 [[km:]] 00300 [[kn:]] 00301 [[ko:]] 00302 [[kr:]] 00303 [[ks:]] 00304 [[ksh:]] 00305 [[ku:]] 00306 [[kv:]] 00307 [[kw:]] 00308 [[ky:]] 00309 [[la:]] 00310 [[lad:]] 00311 [[lb:]] 00312 [[lbe:]] 00313 [[lg:]] 00314 [[li:]] 00315 [[lij:]] 00316 [[lmo:]] 00317 [[ln:]] 00318 [[lo:]] 00319 [[lt:]] 00320 [[lv:]] 00321 [[map-bms:]] 00322 [[mdf:]] 00323 [[mg:]] 00324 [[mh:]] 00325 [[mhr:]] 00326 [[mi:]] 00327 [[mk:]] 00328 [[ml:]] 00329 [[mn:]] 00330 [[mo:]] 00331 [[mr:]] 00332 [[ms:]] 00333 [[mt:]] 00334 [[mus:]] 00335 [[mwl:]] 00336 [[my:]] 00337 [[myv:]] 00338 [[mzn:]] 00339 [[na:]] 00340 [[nan:]] 00341 [[nap:]] 00342 [[nds:]] 00343 [[nds-nl:]] 00344 [[ne:]] 00345 [[new:]] 00346 [[ng:]] 00347 [[nl:]] 00348 [[nn:]] 00349 [[no:]] 00350 [[nov:]] 00351 [[nrm:]] 00352 [[nv:]] 00353 [[ny:]] 00354 [[oc:]] 00355 [[om:]] 00356 [[or:]] 00357 [[os:]] 00358 [[pa:]] 00359 [[pag:]] 00360 [[pam:]] 00361 [[pap:]] 00362 [[pdc:]] 00363 [[pi:]] 00364 [[pih:]] 00365 [[pl:]] 00366 [[pms:]] 00367 [[pnt:]] 00368 [[pnb:]] 00369 [[ps:]] 00370 [[pt:]] 00371 [[qu:]] 00372 [[rm:]] 00373 [[rmy:]] 00374 [[rn:]] 00375 [[ro:]] 00376 [[roa-rup:]] 00377 [[roa-tara:]] 00378 [[ru:]] 00379 [[rw:]] 00380 [[sa:]] 00381 [[sah:]] 00382 [[sc:]] 00383 [[scn:]] 00384 [[sco:]] 00385 [[sd:]] 00386 [[se:]] 00387 [[sg:]] 00388 [[sh:]] 00389 [[si:]] 00390 [[simple:]] 00391 [[sk:]] 00392 [[sl:]] 00393 [[sm:]] 00394 [[sn:]] 00395 [[so:]] 00396 [[sq:]] 00397 [[sr:]] 00398 [[srn:]] 00399 [[ss:]] 00400 [[st:]] 00401 [[stq:]] 00402 [[su:]] 00403 [[sv:]] 00404 [[sw:]] 00405 [[szl:]] 00406 [[ta:]] 00407 [[te:]] 00408 [[tet:]] 00409 [[tg:]] 00410 [[th:]] 00411 [[ti:]] 00412 [[tk:]] 00413 [[tl:]] 00414 [[tn:]] 00415 [[to:]] 00416 [[tpi:]] 00417 [[tr:]] 00418 [[ts:]] 00419 [[tt:]] 00420 [[tum:]] 00421 [[tw:]] 00422 [[ty:]] 00423 [[udm:]] 00424 [[ug:]] 00425 [[uk:]] 00426 [[ur:]] 00427 [[uz:]] 00428 [[ve:]] 00429 [[vec:]] 00430 [[vi:]] 00431 [[vls:]] 00432 [[vo:]] 00433 [[wa:]] 00434 [[war:]] 00435 [[wo:]] 00436 [[wuu:]] 00437 [[xal:]] 00438 [[xh:]] 00439 [[yi:]] 00440 [[yo:]] 00441 [[za:]] 00442 [[zea:]] 00443 [[zh:]] 00444 [[zh-classical:]] 00445 [[zh-min-nan:]] 00446 [[zh-yue:]] 00447 [[zu:]] 00448 00449 EOT; 00450 } 00451 } 00452 00453 $maintClass = "AddWiki"; 00454 require_once( DO_MAINTENANCE );