diff options
author | Brion Vibber <brion@pobox.com> | 2010-04-07 17:47:08 -0700 |
---|---|---|
committer | Brion Vibber <brion@pobox.com> | 2010-04-07 17:47:08 -0700 |
commit | f255b368edc06db8af57f7ad4d13542a126c42bc (patch) | |
tree | 2bf7f9e95b2e63bc88ab82327945a7fa9250adc7 /scripts | |
parent | 86361712f724aa6f1efc4d9bd6e2b01cfe6c522e (diff) |
Refactor installer into base class plus web and CLI installers.
scripts/install_cli.php is a bit experimental at present but works.
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/install_cli.php | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/scripts/install_cli.php b/scripts/install_cli.php new file mode 100755 index 000000000..61fbe18ef --- /dev/null +++ b/scripts/install_cli.php @@ -0,0 +1,217 @@ +#!/usr/bin/env php +<?php +/** + * StatusNet - the distributed open-source microblogging tool + * Copyright (C) 2010, 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/>. + * + * @category Installation + * @package Installation + * + * @author Brion Vibber <brion@status.net> + * @license GNU Affero General Public License http://www.gnu.org/licenses/ + * @version 0.9.x + * @link http://status.net + */ + +if (php_sapi_name() !== 'cli') { + exit(1); +} + +define('INSTALLDIR', dirname(dirname(__FILE__))); +set_include_path(get_include_path() . PATH_SEPARATOR . INSTALLDIR . '/extlib'); + +require_once INSTALLDIR . '/lib/installer.php'; +require_once 'Console/Getopt.php'; + +class CliInstaller extends Installer +{ + public $verbose = true; + + /** + * Go for it! + * @return boolean success + */ + function main() + { + if (!$this->checkPrereqs()) { + return false; + } + if ($this->prepare()) { + return $this->handle(); + } else { + $this->showHelp(); + return false; + } + } + + /** + * Get our input parameters... + * @return boolean success + */ + function prepare() + { + $shortoptions = 'qvh'; + $longoptions = array('quiet', 'verbose', 'help', 'skip-config'); + $map = array( + '-s' => 'server', + '--server' => 'server', + '-p' => 'path', + '--path' => 'path', + '--sitename' => 'sitename', + '--fancy' => 'fancy', + + '--dbtype' => 'dbtype', + '--host' => 'host', + '--database' => 'database', + '--username' => 'username', + '--password' => 'password', + + '--admin-nick' => 'adminNick', + '--admin-pass' => 'adminPass', + '--admin-email' => 'adminEmail', + '--admin-updates' => 'adminUpdates' + ); + foreach ($map as $arg => $target) { + if (substr($arg, 0, 2) == '--') { + $longoptions[] = substr($arg, 2) . '='; + } else { + $shortoptions .= substr($arg, 1) . ':'; + } + } + + $parser = new Console_Getopt(); + $result = $parser->getopt($_SERVER['argv'], $shortoptions, $longoptions); + if (PEAR::isError($result)) { + $this->warning($result->getMessage()); + return false; + } + list($options, $args) = $result; + + // defaults + $this->dbtype = 'mysql'; + $this->adminUpdates = true; + $this->verbose = true; + + foreach ($options as $option) { + $arg = $option[0]; + if (isset($map[$arg])) { + $var = $map[$arg]; + $this->$var = $option[1]; + if ($var == 'adminUpdates' || $arg == '--fancy') { + $this->$var = ($option[1] != 'false') && ($option[1] != 'no'); + } + } else if ($arg == '--skip-config') { + $this->skipConfig = true; + } else if ($arg == 'q' || $arg == '--quiet') { + $this->verbose = false; + } else if ($arg == 'v' || $arg == '--verbose') { + $this->verbose = true; + } else if ($arg == 'h' || $arg == '--help') { + // will go back to show help + return false; + } + } + + $fail = false; + if (empty($this->server)) { + $this->updateStatus("You must specify a web server for the site.", true); + // path is optional though + $fail = true; + } + + if (!$this->validateDb()) { + $fail = true; + } + + if (!$this->validateAdmin()) { + $fail = true; + } + + return !$fail; + } + + function handle() + { + return $this->doInstall(); + } + + function showHelp() + { + echo <<<END_HELP +install_cli.php - StatusNet command-line installer + + -s --server=<name> Use <name> as server name (required) + -p --path=<path> Use <path> as path name + --sitename User-friendly site name (required) + --fancy Whether to use fancy URLs (default no) + + --dbtype 'mysql' (default) or 'pgsql' + --host Database hostname (required) + --database Database/schema name (required) + --username Database username (required) + --password Database password (required) + + --admin-nick Administrator nickname (required) + --admin-pass Initial password for admin user (required) + --admin-email Initial email address for admin user + --admin-updates 'yes' (default) or 'no', whether to subscribe + admin to update@status.net (default yes) + + --skip-config Don't write a config.php -- use with caution, + requires a global configuration file. + + General options: + + -q --quiet Quiet (little output) + -v --verbose Verbose (lots of output) + -h --help Show this message and quit. + +END_HELP; + } + + function warning($message, $submessage='') + { + print $this->html2text($message) . "\n"; + if ($submessage != '') { + print " " . $this->html2text($submessage) . "\n"; + } + print "\n"; + } + + function updateStatus($status, $error=false) + { + if ($this->verbose || $error) { + if ($error) { + print "ERROR: "; + } + print $this->html2text($status); + print "\n"; + } + } + + private function html2text($html) + { + // break out any links for text legibility + $breakout = preg_replace('/<a[^>+]\bhref="(.*)"[^>]*>(.*)<\/a>/', + '\2 <\1>', + $html); + return html_entity_decode(strip_tags($breakout)); + } +} + +$installer = new CliInstaller(); +$ok = $installer->main(); +exit($ok ? 0 : 1); |