summaryrefslogtreecommitdiff
path: root/install.php
diff options
context:
space:
mode:
Diffstat (limited to 'install.php')
-rw-r--r--install.php331
1 files changed, 292 insertions, 39 deletions
diff --git a/install.php b/install.php
index 1826a8494..e828fa814 100644
--- a/install.php
+++ b/install.php
@@ -1,7 +1,7 @@
<?php
/**
- * Laconica - a distributed open-source microblogging tool
- * Copyright (C) 2009, Control Yourself, Inc.
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2009, 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
@@ -19,18 +19,199 @@
define('INSTALLDIR', dirname(__FILE__));
+$external_libraries=array(
+ array(
+ 'name'=>'gettext',
+ 'url'=>'http://us.php.net/manual/en/book.gettext.php',
+ 'check_function'=>'gettext'
+ ),
+ array(
+ 'name'=>'PEAR',
+ 'url'=>'http://pear.php.net/',
+ 'deb'=>'php-pear',
+ 'include'=>'PEAR.php',
+ 'check_class'=>'PEAR'
+ ),
+ array(
+ 'name'=>'DB',
+ 'pear'=>'DB',
+ 'url'=>'http://pear.php.net/package/DB',
+ 'deb'=>'php-db',
+ 'include'=>'DB/common.php',
+ 'check_class'=>'DB_common'
+ ),
+ array(
+ 'name'=>'DB_DataObject',
+ 'pear'=>'DB_DataObject',
+ 'url'=>'http://pear.php.net/package/DB_DataObject',
+ 'include'=>'DB/DataObject.php',
+ 'check_class'=>'DB_DataObject'
+ ),
+ array(
+ 'name'=>'Console_Getopt',
+ 'pear'=>'Console_Getopt',
+ 'url'=>'http://pear.php.net/package/Console_Getopt',
+ 'include'=>'Console/Getopt.php',
+ 'check_class'=>'Console_Getopt'
+ ),
+ array(
+ 'name'=>'Facebook API',
+ 'url'=>'http://developers.facebook.com/',
+ 'include'=>'facebook/facebook.php',
+ 'check_class'=>'Facebook'
+ ),
+ array(
+ 'name'=>'htmLawed',
+ 'url'=>'http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed',
+ 'include'=>'htmLawed/htmLawed.php',
+ 'check_function'=>'htmLawed'
+ ),
+ array(
+ 'name'=>'HTTP_Request',
+ 'pear'=>'HTTP_Request',
+ 'url'=>'http://pear.php.net/package/HTTP_Request',
+ 'deb'=>'php-http-request',
+ 'include'=>'HTTP/Request.php',
+ 'check_class'=>'HTTP_Request'
+ ),
+ array(
+ 'name'=>'Mail',
+ 'pear'=>'Mail',
+ 'url'=>'http://pear.php.net/package/Mail',
+ 'deb'=>'php-mail',
+ 'include'=>'Mail.php',
+ 'check_class'=>'Mail'
+ ),
+ array(
+ 'name'=>'Mail_mimeDecode',
+ 'pear'=>'Mail_mimeDecode',
+ 'url'=>'http://pear.php.net/package/Mail_mimeDecode',
+ 'deb'=>'php-mail-mimedecode',
+ 'include'=>'Mail/mimeDecode.php',
+ 'check_class'=>'Mail_mimeDecode'
+ ),
+ array(
+ 'name'=>'Mime_Type',
+ 'pear'=>'Mime_Type',
+ 'url'=>'http://pear.php.net/package/Mime_Type',
+ 'include'=>'MIME/Type.php',
+ 'check_class'=>'Mime_Type'
+ ),
+ array(
+ 'name'=>'Net_URL_Mapper',
+ 'pear'=>'Net_URL_Mapper',
+ 'url'=>'http://pear.php.net/package/Net_URL_Mapper',
+ 'include'=>'Net/URL/Mapper.php',
+ 'check_class'=>'Net_URL_Mapper'
+ ),
+ array(
+ 'name'=>'Net_Socket',
+ 'pear'=>'Net_Socket',
+ 'url'=>'http://pear.php.net/package/Net_Socket',
+ 'deb'=>'php-net-socket',
+ 'include'=>'Net/Socket.php',
+ 'check_class'=>'Net_Socket'
+ ),
+ array(
+ 'name'=>'Net_SMTP',
+ 'pear'=>'Net_SMTP',
+ 'url'=>'http://pear.php.net/package/Net_SMTP',
+ 'deb'=>'php-net-smtp',
+ 'include'=>'Net/SMTP.php',
+ 'check_class'=>'Net_SMTP'
+ ),
+ array(
+ 'name'=>'Net_URL',
+ 'pear'=>'Net_URL',
+ 'url'=>'http://pear.php.net/package/Net_URL',
+ 'deb'=>'php-net-url',
+ 'include'=>'Net/URL.php',
+ 'check_class'=>'Net_URL'
+ ),
+ array(
+ 'name'=>'Net_URL2',
+ 'pear'=>'Net_URL2',
+ 'url'=>'http://pear.php.net/package/Net_URL2',
+ 'include'=>'Net/URL2.php',
+ 'check_class'=>'Net_URL2'
+ ),
+ array(
+ 'name'=>'Services_oEmbed',
+ 'pear'=>'Services_oEmbed',
+ 'url'=>'http://pear.php.net/package/Services_oEmbed',
+ 'include'=>'Services/oEmbed.php',
+ 'check_class'=>'Services_oEmbed'
+ ),
+ array(
+ 'name'=>'Stomp',
+ 'url'=>'http://stomp.codehaus.org/PHP',
+ 'include'=>'Stomp.php',
+ 'check_class'=>'Stomp'
+ ),
+ array(
+ 'name'=>'System_Command',
+ 'pear'=>'System_Command',
+ 'url'=>'http://pear.php.net/package/System_Command',
+ 'include'=>'System/Command.php',
+ 'check_class'=>'System_Command'
+ ),
+ array(
+ 'name'=>'XMPPHP',
+ 'url'=>'http://code.google.com/p/xmpphp',
+ 'include'=>'XMPPHP/XMPP.php',
+ 'check_class'=>'XMPPHP_XMPP'
+ ),
+ array(
+ 'name'=>'PHP Markdown',
+ 'url'=>'http://www.michelf.com/projects/php-markdown/',
+ 'include'=>'markdown.php',
+ 'check_class'=>'Markdown_Parser'
+ ),
+ array(
+ 'name'=>'OAuth',
+ 'url'=>'http://code.google.com/p/oauth-php',
+ 'include'=>'OAuth.php',
+ 'check_class'=>'OAuthRequest'
+ ),
+ array(
+ 'name'=>'Validate',
+ 'pear'=>'Validate',
+ 'url'=>'http://pear.php.net/package/Validate',
+ 'include'=>'Validate.php',
+ 'check_class'=>'Validate'
+ )
+);
+
function main()
{
if (!checkPrereqs())
{
return;
}
+
+ if( $_GET['checklibs'] ){
+ showLibs();
+ }else{
+ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+ handlePost();
+ } else {
+ showForm();
+ }
+ }
+}
- if ($_SERVER['REQUEST_METHOD'] == 'POST') {
- handlePost();
- } else {
- showForm();
+function haveExternalLibrary($external_library)
+{
+ if(isset($external_library['include']) && ! include_once($external_library['include'])){
+ return false;
+ }
+ if(isset($external_library['check_function']) && ! function_exists($external_library['check_function'])){
+ return false;
}
+ if(isset($external_library['check_class']) && ! class_exists($external_library['check_class'])){
+ return false;
+ }
+ return true;
}
function checkPrereqs()
@@ -49,8 +230,7 @@ function checkPrereqs()
}
$reqs = array('gd', 'curl',
- 'xmlwriter', 'mbstring',
- 'gettext');
+ 'xmlwriter', 'mbstring','tidy');
foreach ($reqs as $req) {
if (!checkExtension($req)) {
@@ -88,13 +268,76 @@ function checkPrereqs()
function checkExtension($name)
{
if (!extension_loaded($name)) {
- if (!dl($name.'.so')) {
+ if (!@dl($name.'.so')) {
return false;
}
}
return true;
}
+function showLibs()
+{
+ global $external_libraries;
+ $present_libraries=array();
+ $absent_libraries=array();
+ foreach($external_libraries as $external_library){
+ if(haveExternalLibrary($external_library)){
+ $present_libraries[]=$external_library;
+ }else{
+ $absent_libraries[]=$external_library;
+ }
+ }
+ echo<<<E_O_T
+ <div class="instructions">
+ <p>Laconica comes bundled with a number of libraries required for the application to work. However, it is best that you use PEAR or you distribution to manage
+ libraries instead, as they tend to provide security updates faster, and may offer improved performance.</p>
+ <p>On Debian based distributions, such as Ubuntu, use a package manager (such as &quot;aptitude&quot;, &quot;apt-get&quot;, and &quot;synaptic&quot;) to install the package listed.</p>
+ <p>On RPM based distributions, such as Red Hat, Fedora, CentOS, Scientific Linux, Yellow Dog Linux and Oracle Enterprise Linux, use a package manager (such as &quot;yum&quot;, &quot;apt-rpm&quot;, and &quot;up2date&quot;) to install the package listed.</p>
+ <p>On servers without a package manager (such as Windows), or if the library is not packaged for your distribution, you can use PHP's PEAR to install the library. Simply run &quot;pear install &lt;name&gt;&quot;.</p>
+ </div>
+ <h2>Absent Libraries</h2>
+ <ul id="absent_libraries">
+E_O_T;
+ foreach($absent_libraries as $library)
+ {
+ echo '<li>';
+ if($library['url']){
+ echo '<a href=">'.$library['url'].'">'.htmlentities($library['name']).'</a>';
+ }else{
+ echo htmlentities($library['name']);
+ }
+ echo '<ul>';
+ if($library['deb']){
+ echo '<li class="deb package">deb: <a href="apt:' . urlencode($library['deb']) . '">' . htmlentities($library['deb']) . '</a></li>';
+ }
+ if($library['rpm']){
+ echo '<li class="rpm package">rpm: ' . htmlentities($library['rpm']) . '</li>';
+ }
+ if($library['pear']){
+ echo '<li class="pear package">pear: ' . htmlentities($library['pear']) . '</li>';
+ }
+ echo '</ul>';
+ }
+ echo<<<E_O_T
+ </ul>
+ <h2>Installed Libraries</h2>
+ <ul id="present_libraries">
+E_O_T;
+ foreach($present_libraries as $library)
+ {
+ echo '<li>';
+ if($library['url']){
+ echo '<a href=">'.$library['url'].'">'.htmlentities($library['name']).'</a>';
+ }else{
+ echo htmlentities($library['name']);
+ }
+ echo '</li>';
+ }
+ echo<<<E_O_T
+ </ul>
+E_O_T;
+}
+
function showForm()
{
echo<<<E_O_T
@@ -106,6 +349,7 @@ function showForm()
<dd>
<div class="instructions">
<p>Enter your database connection information below to initialize the database.</p>
+ <p>Laconica bundles a number of libraries for ease of installation. <a href="?checklibs=true">You can see what bundled libraries you are using, versus what libraries are installed on your server.</a>
</div>
</dd>
</dl>
@@ -130,7 +374,7 @@ function showForm()
<p class="form_guide">Database hostname</p>
</li>
<li>
-
+
<label for="dbtype">Type</label>
<input type="radio" name="dbtype" id="fancy-mysql" value="mysql" checked='checked' /> MySQL<br />
<input type="radio" name="dbtype" id="dbtype-pgsql" value="pgsql" /> PostgreSQL<br />
@@ -182,7 +426,7 @@ function handlePost()
$fancy = !empty($_POST['fancy']);
$server = $_SERVER['HTTP_HOST'];
$path = substr(dirname($_SERVER['PHP_SELF']), 1);
-
+
?>
<dl class="system_notice">
<dt>Page notice</dt>
@@ -220,7 +464,9 @@ function handlePost()
showForm();
return;
}
-
+
+ // FIXME: use PEAR::DB or PDO instead of our own switch
+
switch($dbtype) {
case 'mysql':
$db = mysql_db_installer($host, $database, $username, $password);
@@ -230,28 +476,28 @@ function handlePost()
break;
default:
}
-
+
if (!$db) {
// database connection failed, do not move on to create config file.
return false;
}
-
+
updateStatus("Writing config file...");
$res = writeConf($sitename, $server, $path, $fancy, $db);
-
+
if (!$res) {
updateStatus("Can't write config file.", true);
showForm();
return;
}
-
+
/*
TODO https needs to be considered
*/
$link = "http://".$server.'/'.$path;
-
- updateStatus("Laconica has been installed at $link");
- updateStatus("You can visit your <a href='$link'>new Laconica site</a>.");
+
+ updateStatus("StatusNet has been installed at $link");
+ updateStatus("You can visit your <a href='$link'>new StatusNet site</a>.");
?>
<?php
@@ -267,7 +513,7 @@ function pgsql_db_installer($host, $database, $username, $password) {
updateStatus("Starting installation...");
updateStatus("Checking database...");
$conn = pg_connect($connstring);
-
+
if ($conn ===false) {
updateStatus("Failed to connect to database: $connstring");
showForm();
@@ -277,7 +523,7 @@ function pgsql_db_installer($host, $database, $username, $password) {
//ensure database encoding is UTF8
$record = pg_fetch_object(pg_query($conn, 'SHOW server_encoding'));
if ($record->server_encoding != 'UTF8') {
- updateStatus("Laconica requires UTF8 character encoding. Your database is ". htmlentities($record->server_encoding));
+ updateStatus("StatusNet requires UTF8 character encoding. Your database is ". htmlentities($record->server_encoding));
showForm();
return false;
}
@@ -285,8 +531,8 @@ function pgsql_db_installer($host, $database, $username, $password) {
updateStatus("Running database script...");
//wrap in transaction;
pg_query($conn, 'BEGIN');
- $res = runDbScript(INSTALLDIR.'/db/laconica_pg.sql', $conn, 'pgsql');
-
+ $res = runDbScript(INSTALLDIR.'/db/statusnet_pg.sql', $conn, 'pgsql');
+
if ($res === false) {
updateStatus("Can't run database script.", true);
showForm();
@@ -312,9 +558,9 @@ function pgsql_db_installer($host, $database, $username, $password) {
else {
$sqlUrl = "pgsql://$username:$password@$host/$database";
}
-
+
$db = array('type' => 'pgsql', 'database' => $sqlUrl);
-
+
return $db;
}
@@ -336,7 +582,7 @@ function mysql_db_installer($host, $database, $username, $password) {
return false;
}
updateStatus("Running database script...");
- $res = runDbScript(INSTALLDIR.'/db/laconica.sql', $conn);
+ $res = runDbScript(INSTALLDIR.'/db/statusnet.sql', $conn);
if ($res === false) {
updateStatus("Can't run database script.", true);
showForm();
@@ -354,7 +600,7 @@ function mysql_db_installer($host, $database, $username, $password) {
return false;
}
}
-
+
$sqlUrl = "mysqli://$username:$password@$host/$database";
$db = array('type' => 'mysql', 'database' => $sqlUrl);
return $db;
@@ -364,23 +610,23 @@ function writeConf($sitename, $server, $path, $fancy, $db)
{
// assemble configuration file in a string
$cfg = "<?php\n".
- "if (!defined('LACONICA')) { exit(1); }\n\n".
-
+ "if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }\n\n".
+
// site name
"\$config['site']['name'] = '$sitename';\n\n".
-
+
// site location
"\$config['site']['server'] = '$server';\n".
"\$config['site']['path'] = '$path'; \n\n".
-
+
// checks if fancy URLs are enabled
($fancy ? "\$config['site']['fancy'] = true;\n\n":'').
-
+
// database
"\$config['db']['database'] = '{$db['database']}';\n\n".
- ($type == 'pgsql' ? "\$config['db']['quote_identifiers'] = true;\n\n":'').
+ ($db['type'] == 'pgsql' ? "\$config['db']['quote_identifiers'] = true;\n\n":'').
"\$config['db']['type'] = '{$db['type']}';\n\n".
-
+
"?>";
// write configuration file out to install directory
$res = file_put_contents(INSTALLDIR.'/config.php', $cfg);
@@ -397,18 +643,25 @@ function runDbScript($filename, $conn, $type = 'mysql')
if (!mb_strlen($stmt)) {
continue;
}
+ // FIXME: use PEAR::DB or PDO instead of our own switch
switch ($type) {
case 'mysql':
$res = mysql_query($stmt, $conn);
+ if ($res === false) {
+ $error = mysql_error();
+ }
break;
case 'pgsql':
$res = pg_query($conn, $stmt);
+ if ($res === false) {
+ $error = pg_last_error();
+ }
break;
default:
updateStatus("runDbScript() error: unknown database type ". $type ." provided.");
}
if ($res === false) {
- updateStatus("FAILED SQL: $stmt");
+ updateStatus("ERROR ($error) for SQL '$stmt'");
return $res;
}
}
@@ -422,7 +675,7 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en_US" lang="en_US">
<head>
- <title>Install Laconica</title>
+ <title>Install StatusNet</title>
<link rel="shortcut icon" href="favicon.ico"/>
<link rel="stylesheet" type="text/css" href="theme/default/css/display.css?version=0.8" media="screen, projection, tv"/>
<!--[if IE]><link rel="stylesheet" type="text/css" href="theme/base/css/ie.css?version=0.8" /><![endif]-->
@@ -436,14 +689,14 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
<div id="header">
<address id="site_contact" class="vcard">
<a class="url home bookmark" href=".">
- <img class="logo photo" src="theme/default/logo.png" alt="Laconica"/>
- <span class="fn org">Laconica</span>
+ <img class="logo photo" src="theme/default/logo.png" alt="StatusNet"/>
+ <span class="fn org">StatusNet</span>
</a>
</address>
</div>
<div id="core">
<div id="content">
- <h1>Install Laconica</h1>
+ <h1>Install StatusNet</h1>
<?php main(); ?>
</div>
</div>