3 * @defgroup Wikimedia Wikimedia
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.
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.
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
26 * @ingroup Maintenance
30 require_once( dirname( __FILE__
) . '/Maintenance.php' );
32 class AddWiki
extends Maintenance
{
33 public function __construct() {
36 parent
::__construct();
37 $this->mDescription
= "Add a new wiki to the family. Wikimedia specific!";
38 $this->addArg( 'language', 'Language code of new site, e.g. en' );
39 $this->addArg( 'site', 'Type of site, e.g. wikipedia' );
40 $this->addArg( 'dbname', 'Name of database to create, e.g. enwiki' );
41 $this->addArg( 'domain', 'Domain name of the wiki, e.g. en.wikipedia.org' );
46 public function getDbType() {
47 return Maintenance
::DB_ADMIN
;
50 public function execute() {
51 global $IP, $wgDefaultExternalStore;
53 $lang = $this->getArg( 0 );
54 $site = $this->getArg( 1 );
55 $dbName = $this->getArg( 2 );
56 $domain = $this->getArg( 3 );
57 $languageNames = Language
::getLanguageNames();
59 if ( !isset( $languageNames[$lang] ) ) {
60 $this->error( "Language $lang not found in Names.php", true );
62 $name = $languageNames[$lang];
64 $dbw = wfGetDB( DB_MASTER
);
65 $common = "/home/wikipedia/common";
67 $this->output( "Creating database $dbName for $lang.$site ($name)\n" );
70 $dbw->query( "SET table_type=Innodb" );
71 $dbw->query( "CREATE DATABASE $dbName" );
72 $dbw->selectDB( $dbName );
74 $this->output( "Initialising tables\n" );
75 $dbw->sourceFile( $this->getDir() . '/tables.sql' );
76 $dbw->sourceFile( "$IP/extensions/OAI/update_table.sql" );
77 $dbw->sourceFile( "$IP/extensions/AntiSpoof/sql/patch-antispoof.mysql.sql" );
78 $dbw->sourceFile( "$IP/extensions/CheckUser/cu_changes.sql" );
79 $dbw->sourceFile( "$IP/extensions/CheckUser/cu_log.sql" );
80 $dbw->sourceFile( "$IP/extensions/TitleKey/titlekey.sql" );
81 $dbw->sourceFile( "$IP/extensions/Oversight/hidden.sql" );
82 $dbw->sourceFile( "$IP/extensions/GlobalBlocking/localdb_patches/setup-global_block_whitelist.sql" );
83 $dbw->sourceFile( "$IP/extensions/AbuseFilter/abusefilter.tables.sql" );
84 $dbw->sourceFile( "$IP/extensions/PrefStats/patches/PrefStats.sql" );
85 $dbw->sourceFile( "$IP/extensions/ProofreadPage/ProofreadPage.sql" );
86 $dbw->sourceFile( "$IP/extensions/ClickTracking/patches/ClickTrackingEvents.sql" );
87 $dbw->sourceFile( "$IP/extensions/ClickTracking/patches/ClickTracking.sql" );
88 $dbw->sourceFile( "$IP/extensions/UserDailyContribs/patches/UserDailyContribs.sql" );
90 $dbw->query( "INSERT INTO site_stats(ss_row_id) VALUES (1)" );
92 # Initialise external storage
93 if ( is_array( $wgDefaultExternalStore ) ) {
94 $stores = $wgDefaultExternalStore;
95 } elseif ( $wgDefaultExternalStore ) {
96 $stores = array( $wgDefaultExternalStore );
100 if ( count( $stores ) ) {
101 global $wgDBuser, $wgDBpassword, $wgExternalServers;
102 foreach ( $stores as $storeURL ) {
104 if ( !preg_match( '!^DB://(.*)$!', $storeURL, $m ) ) {
109 $this->output( "Initialising external storage $cluster...\n" );
112 $wgExternalServers[$cluster][0]['user'] = $wgDBuser;
113 $wgExternalServers[$cluster][0]['password'] = $wgDBpassword;
115 $store = new ExternalStoreDB
;
116 $extdb = $store->getMaster( $cluster );
117 $extdb->query( "SET table_type=InnoDB" );
118 $extdb->query( "CREATE DATABASE $dbName" );
119 $extdb->selectDB( $dbName );
122 $blobsTable = $store->getTable( $extdb );
123 $sedCmd = "sed s/blobs\\\\\\>/$blobsTable/ " . $this->getDir() . "/storage/blobs.sql";
124 $blobsFile = popen( $sedCmd, 'r' );
125 $extdb->sourceStream( $blobsFile );
126 pclose( $blobsFile );
131 $title = Title
::newFromText( wfMessage( 'mainpage' )->inLanguage( $lang )->useDatabase( false )->plain() );
132 $this->output( "Writing main page to " . $title->getPrefixedDBkey() . "\n" );
133 $article = new Article( $title );
134 $ucsite = ucfirst( $site );
136 $article->doEdit( $this->getFirstArticle( $ucsite, $name ), '', EDIT_NEW | EDIT_AUTOSUMMARY
);
138 $this->output( "Adding to dblists\n" );
141 $file = fopen( "$common/all.dblist", "a" );
142 fwrite( $file, "$dbName\n" );
145 # Update the sublists
146 shell_exec( "cd $common && ./refresh-dblist" );
148 # print "Constructing interwiki SQL\n";
149 # Rebuild interwiki tables
150 # passthru( '/home/wikipedia/conf/interwiki/update' );
152 $time = wfTimestamp( TS_RFC2822
);
153 // These arguments need to be escaped twice: once for echo and once for at
154 $escDbName = wfEscapeShellArg( wfEscapeShellArg( $dbName ) );
155 $escTime = wfEscapeShellArg( wfEscapeShellArg( $time ) );
156 $escUcsite = wfEscapeShellArg( wfEscapeShellArg( $ucsite ) );
157 $escName = wfEscapeShellArg( wfEscapeShellArg( $name ) );
158 $escLang = wfEscapeShellArg( wfEscapeShellArg( $lang ) );
159 $escDomain = wfEscapeShellArg( wfEscapeShellArg( $domain ) );
160 shell_exec( "echo notifyNewProjects $escDbName $escTime $escUcsite $escName $escLang $escDomain | at now + 15 minutes" );
162 $this->output( "Script ended. You still have to:
163 * Add any required settings in InitialiseSettings.php
164 * Run sync-common-all
165 * Run /home/wikipedia/conf/interwiki/update
169 private function getFirstArticle( $ucsite, $name ) {
171 ==This subdomain is reserved for the creation of a [[wikimedia:Our projects|$ucsite]] in '''[[w:en:{$name}|{$name}]]''' language==
173 * 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.
175 * 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]].
177 * 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]].
179 == Sister projects ==
180 <span class="plainlinks">
181 [http://www.wikipedia.org Wikipedia] |
182 [http://www.wiktionary.org Wiktonary] |
183 [http://www.wikibooks.org Wikibooks] |
184 [http://www.wikinews.org Wikinews] |
185 [http://www.wikiquote.org Wikiquote] |
186 [http://www.wikisource.org Wikisource]
187 [http://www.wikiversity.org Wikiversity]
190 See Wikimedia's [[m:|Meta-Wiki]] for the coordination of these projects.
468 $maintClass = "AddWiki";
469 require_once( RUN_MAINTENANCE_IF_MAIN
);