f8c3458216
One of the problems we've had with running large-scale hosting systems for StatusNet is enabling new plugins. If the plugin is not enabled, its database tables are not checked at script time. Conversely, if it is enabled, it may take several hours to run checkschema for tens of thousands of sites -- during which time users might see DB errors. A new argument to checkschema lets it pre-load one or more plugins before checking the schema. This lets us prepare the plugins' database tables before they're used in production. In a multihome environment, this can be combined with tags to gradually roll out a new plugin. In the config file, a stanza like: $site = Status_network::getFromHostname(...); if ($site->hasTag('fooenabled')) { addPlugin('Foo'); } ...will only enable the plugin on certain sites. Meanwhile, a bash script like this should gradually enable the plugin: # For all sites... for site in `php allsites.php`; do # Update the schema for the Foo plugin php checkschema.php -s$site.wildcard -xFoo; # Enable the Foo plugin php settag.php -s$site.wildcard fooenabled; done
65 lines
1.8 KiB
PHP
Executable File
65 lines
1.8 KiB
PHP
Executable File
#!/usr/bin/env php
|
|
<?php
|
|
/*
|
|
* StatusNet - a distributed open-source microblogging tool
|
|
* Copyright (C) 2008-2011 StatusNet, Inc.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
|
|
|
|
$shortoptions = 'x::';
|
|
$longoptions = array('extensions=');
|
|
|
|
$helptext = <<<END_OF_CHECKSCHEMA_HELP
|
|
php checkschema.php [options]
|
|
Gives plugins a chance to update the database schema.
|
|
|
|
-x --extensions= Comma-separated list of plugins to load before checking
|
|
|
|
|
|
END_OF_CHECKSCHEMA_HELP;
|
|
|
|
require_once INSTALLDIR.'/scripts/commandline.inc';
|
|
|
|
function tableDefs()
|
|
{
|
|
$schema = array();
|
|
require INSTALLDIR.'/db/core.php';
|
|
return $schema;
|
|
}
|
|
|
|
$schema = Schema::get();
|
|
$schemaUpdater = new SchemaUpdater($schema);
|
|
foreach (tableDefs() as $table => $def) {
|
|
$schemaUpdater->register($table, $def);
|
|
}
|
|
$schemaUpdater->checkSchema();
|
|
|
|
if (have_option('x', 'extensions')) {
|
|
$ext = trim(get_option_value('x', 'extensions'));
|
|
$exts = explode(',', $ext);
|
|
foreach ($exts as $plugin) {
|
|
try {
|
|
addPlugin($plugin);
|
|
} catch (Exception $e) {
|
|
print $e->getMessage()."\n";
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
Event::handle('CheckSchema');
|