| 
									
										
										
										
											2010-04-07 17:47:08 -07:00
										 |  |  | #!/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> | 
					
						
							| 
									
										
										
										
											2013-08-12 13:08:14 +02:00
										 |  |  |  * @author   Mikael Nordfeldth <mmn@hethane.se> | 
					
						
							| 
									
										
										
										
											2010-04-07 17:47:08 -07:00
										 |  |  |  * @license  GNU Affero General Public License http://www.gnu.org/licenses/ | 
					
						
							| 
									
										
										
										
											2013-08-12 13:08:14 +02:00
										 |  |  |  * @version  1.1.x | 
					
						
							| 
									
										
										
										
											2010-04-07 17:47:08 -07:00
										 |  |  |  * @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', | 
					
						
							| 
									
										
										
										
											2013-08-12 13:08:14 +02:00
										 |  |  |             '--ssl'      => 'ssl', | 
					
						
							| 
									
										
										
										
											2010-04-07 17:47:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |             '--dbtype'   => 'dbtype', | 
					
						
							|  |  |  |             '--host'     => 'host', | 
					
						
							|  |  |  |             '--database' => 'database', | 
					
						
							|  |  |  |             '--username' => 'username', | 
					
						
							|  |  |  |             '--password' => 'password', | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             '--admin-nick' => 'adminNick', | 
					
						
							|  |  |  |             '--admin-pass' => 'adminPass', | 
					
						
							|  |  |  |             '--admin-email' => 'adminEmail', | 
					
						
							| 
									
										
										
										
											2013-06-17 20:16:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |             '--site-profile' => 'siteProfile' | 
					
						
							| 
									
										
										
										
											2010-04-07 17:47:08 -07:00
										 |  |  |         ); | 
					
						
							|  |  |  |         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->verbose = true; | 
					
						
							| 
									
										
										
										
											2013-08-12 13:08:14 +02:00
										 |  |  |         // ssl is defaulted in lib/installer.php
 | 
					
						
							| 
									
										
										
										
											2010-04-07 17:47:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         foreach ($options as $option) { | 
					
						
							|  |  |  |             $arg = $option[0]; | 
					
						
							|  |  |  |             if (isset($map[$arg])) { | 
					
						
							|  |  |  |                 $var = $map[$arg]; | 
					
						
							|  |  |  |                 $this->$var = $option[1]; | 
					
						
							| 
									
										
										
										
											2014-05-19 14:53:11 +02:00
										 |  |  |                 if ($arg == '--fancy') { | 
					
						
							| 
									
										
										
										
											2010-04-07 17:47:08 -07:00
										 |  |  |                     $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) | 
					
						
							| 
									
										
										
										
											2013-08-12 13:08:14 +02:00
										 |  |  |        --ssl             Server SSL enabled (default never),  | 
					
						
							| 
									
										
										
										
											2016-02-10 00:57:39 +01:00
										 |  |  |                          [never | always] | 
					
						
							| 
									
										
										
										
											2010-04-07 17:47:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |        --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) | 
					
						
							|  |  |  |         | 
					
						
							| 
									
										
										
										
											2013-06-17 20:16:31 -07:00
										 |  |  |        --site-profile    site profile ['public', 'private' (default), 'community', 'singleuser'] | 
					
						
							|  |  |  |         | 
					
						
							| 
									
										
										
										
											2010-04-07 17:47:08 -07:00
										 |  |  |        --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); | 
					
						
							| 
									
										
										
										
											2010-09-30 11:29:31 -07:00
										 |  |  |         return html_entity_decode(strip_tags($breakout), ENT_QUOTES, 'UTF-8'); | 
					
						
							| 
									
										
										
										
											2010-04-07 17:47:08 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $installer = new CliInstaller(); | 
					
						
							|  |  |  | $ok = $installer->main(); | 
					
						
							|  |  |  | exit($ok ? 0 : 1); |