. * * @category Installation * @package Installation * * @author Adrian Lang * @author Brenda Wallace * @author Brett Taylor * @author Brion Vibber * @author CiaranG * @author Craig Andrews * @author Eric Helgeson * @author Evan Prodromou * @author Robin Millette * @author Sarven Capadisli * @author Tom Adams * @license GNU Affero General Public License http://www.gnu.org/licenses/ * @version 0.9 * @link http://status.net */ 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' ) ); $dbModules = array( 'mysql' => array( 'name' => 'MySQL', 'check_module' => 'mysql', // mysqli? 'installer' => 'mysql_db_installer', ), 'pgsql' => array( 'name' => 'PostgreSQL', 'check_module' => 'pgsql', 'installer' => 'pgsql_db_installer', ), ); /** * the actual installation. * If call libraries are present, then install * * @return void */ function main() { if (!checkPrereqs()) { return; } if (!empty($_GET['checklibs'])) { showLibs(); } else { if ($_SERVER['REQUEST_METHOD'] == 'POST') { handlePost(); } else { showForm(); } } } /** * checks if an external libary is present * * @param string $external_library Name of library * * @return boolean indicates if library present */ 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; } // Attempt to include a PHP file and report if it worked, while // suppressing the annoying warning messages on failure. function haveIncludeFile($filename) { $old = error_reporting(error_reporting() & ~E_WARNING); $ok = include_once($filename); error_reporting($old); return $ok; } /** * Check if all is ready for installation * * @return void */ function checkPrereqs() { $pass = true; if (file_exists(INSTALLDIR.'/config.php')) { printf('

Config file "config.php" already exists.

'); $pass = false; } if (version_compare(PHP_VERSION, '5.2.3', '<')) { printf('

Require PHP version 5.2.3 or greater.

'); $pass = false; } $reqs = array('gd', 'curl', 'xmlwriter', 'mbstring','tidy'); foreach ($reqs as $req) { if (!checkExtension($req)) { printf('

Cannot load required extension: %s

', $req); $pass = false; } } // Make sure we have at least one database module available global $dbModules; $missingExtensions = array(); foreach ($dbModules as $type => $info) { if (!checkExtension($info['check_module'])) { $missingExtensions[] = $info['check_module']; } } if (count($missingExtensions) == count($dbModules)) { $req = implode(', ', $missingExtensions); printf('

Cannot find mysql or pgsql extension. You need one or the other.'); $pass = false; } if (!is_writable(INSTALLDIR)) { printf('

Cannot write config file to: %s

', INSTALLDIR); printf('

On your server, try this command: chmod a+w %s', INSTALLDIR); $pass = false; } // Check the subdirs used for file uploads $fileSubdirs = array('avatar', 'background', 'file'); foreach ($fileSubdirs as $fileSubdir) { $fileFullPath = INSTALLDIR."/$fileSubdir/"; if (!is_writable($fileFullPath)) { printf('

Cannot write to %s directory: %s

', $fileSubdir, $fileFullPath); printf('

On your server, try this command: chmod a+w %s

', $fileFullPath); $pass = false; } } return $pass; } /** * Checks if a php extension is both installed and loaded * * @param string $name of extension to check * * @return boolean whether extension is installed and loaded */ function checkExtension($name) { if (extension_loaded($name)) { return true; } elseif (function_exists('dl') && ini_get('enable_dl') && !ini_get('safe_mode')) { // dl will throw a fatal error if it's disabled or we're in safe mode. // More fun, it may not even exist under some SAPIs in 5.3.0 or later... $soname = $name . '.' . PHP_SHLIB_SUFFIX; if (PHP_SHLIB_SUFFIX == 'dll') { $soname = "php_" . $soname; } return @dl($soname); } else { return false; } } /** * Show list of libraries * * @return void */ 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<<

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.

On Debian based distributions, such as Ubuntu, use a package manager (such as "aptitude", "apt-get", and "synaptic") to install the package listed.

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 "yum", "apt-rpm", and "up2date") to install the package listed.

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 "pear install <name>".

Absent Libraries

    E_O_T; foreach ($absent_libraries as $library) { echo '
  • '; if (isset($library['url'])) { echo ''.htmlentities($library['name']).''; } else { echo htmlentities($library['name']); } echo '
      '; if (isset($library['deb'])) { echo '
    • deb: ' . htmlentities($library['deb']) . '
    • '; } if (isset($library['rpm'])) { echo '
    • rpm: ' . htmlentities($library['rpm']) . '
    • '; } if (isset($library['pear'])) { echo '
    • pear: ' . htmlentities($library['pear']) . '
    • '; } echo '
    '; } echo<<

    Installed Libraries

      E_O_T; foreach ($present_libraries as $library) { echo '
    • '; if (isset($library['url'])) { echo ''.htmlentities($library['name']).''; } else { echo htmlentities($library['name']); } echo '
    • '; } echo<< E_O_T; } function showForm() { global $dbModules; $dbRadios = ''; $checked = 'checked="checked" '; // Check the first one which exists foreach ($dbModules as $type => $info) { if (checkExtension($info['check_module'])) { $dbRadios .= " $info[name]
      \n"; $checked = ''; } } echo<<
      Page notice

      Enter your database connection information below to initialize the database.

      Laconica bundles a number of libraries for ease of installation. You can see what bundled libraries you are using, versus what libraries are installed on your server.

      Connection settings
      • The name of your site

      • enable
        disable

        Enable fancy (pretty) URLs. Auto-detection failed, it depends on Javascript.

      • Database hostname

      • $dbRadios

        Database type

      • Database name

      • Database username

      • Database password (optional)

      E_O_T; } function updateStatus($status, $error=false) { echo '$status"; } function handlePost() { $host = $_POST['host']; $dbtype = $_POST['dbtype']; $database = $_POST['database']; $username = $_POST['username']; $password = $_POST['password']; $sitename = $_POST['sitename']; $fancy = !empty($_POST['fancy']); $server = $_SERVER['HTTP_HOST']; $path = substr(dirname($_SERVER['PHP_SELF']), 1); echo <<
      Page notice
        STR; $fail = false; if (empty($host)) { updateStatus("No hostname specified.", true); $fail = true; } if (empty($database)) { updateStatus("No database specified.", true); $fail = true; } if (empty($username)) { updateStatus("No username specified.", true); $fail = true; } if (empty($sitename)) { updateStatus("No sitename specified.", true); $fail = true; } if ($fail) { showForm(); return; } global $dbModules; $db = call_user_func($dbModules[$dbtype]['installer'], $host, $database, $username, $password); 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("StatusNet has been installed at $link"); updateStatus("You can visit your new StatusNet site."); } function Pgsql_Db_installer($host, $database, $username, $password) { $connstring = "dbname=$database host=$host user=$username"; //No password would mean trust authentication used. if (!empty($password)) { $connstring .= " password=$password"; } updateStatus("Starting installation..."); updateStatus("Checking database..."); $conn = pg_connect($connstring); if ($conn ===false) { updateStatus("Failed to connect to database: $connstring"); showForm(); return false; } //ensure database encoding is UTF8 $record = pg_fetch_object(pg_query($conn, 'SHOW server_encoding')); if ($record->server_encoding != 'UTF8') { updateStatus("StatusNet requires UTF8 character encoding. Your database is ". htmlentities($record->server_encoding)); showForm(); return false; } updateStatus("Running database script..."); //wrap in transaction; pg_query($conn, 'BEGIN'); $res = runDbScript(INSTALLDIR.'/db/statusnet_pg.sql', $conn, 'pgsql'); if ($res === false) { updateStatus("Can't run database script.", true); showForm(); return false; } foreach (array('sms_carrier' => 'SMS carrier', 'notice_source' => 'notice source', 'foreign_services' => 'foreign service') as $scr => $name) { updateStatus(sprintf("Adding %s data to database...", $name)); $res = runDbScript(INSTALLDIR.'/db/'.$scr.'.sql', $conn, 'pgsql'); if ($res === false) { updateStatus(sprintf("Can't run %d script.", $name), true); showForm(); return false; } } pg_query($conn, 'COMMIT'); if (empty($password)) { $sqlUrl = "pgsql://$username@$host/$database"; } else { $sqlUrl = "pgsql://$username:$password@$host/$database"; } $db = array('type' => 'pgsql', 'database' => $sqlUrl); return $db; } function Mysql_Db_installer($host, $database, $username, $password) { updateStatus("Starting installation..."); updateStatus("Checking database..."); $conn = mysql_connect($host, $username, $password); if (!$conn) { updateStatus("Can't connect to server '$host' as '$username'.", true); showForm(); return false; } updateStatus("Changing to database..."); $res = mysql_select_db($database, $conn); if (!$res) { updateStatus("Can't change to database.", true); showForm(); return false; } updateStatus("Running database script..."); $res = runDbScript(INSTALLDIR.'/db/statusnet.sql', $conn); if ($res === false) { updateStatus("Can't run database script.", true); showForm(); return false; } foreach (array('sms_carrier' => 'SMS carrier', 'notice_source' => 'notice source', 'foreign_services' => 'foreign service') as $scr => $name) { updateStatus(sprintf("Adding %s data to database...", $name)); $res = runDbScript(INSTALLDIR.'/db/'.$scr.'.sql', $conn); if ($res === false) { updateStatus(sprintf("Can't run %d script.", $name), true); showForm(); return false; } } $sqlUrl = "mysqli://$username:$password@$host/$database"; $db = array('type' => 'mysql', 'database' => $sqlUrl); return $db; } function writeConf($sitename, $server, $path, $fancy, $db) { // assemble configuration file in a string $cfg = ""; // write configuration file out to install directory $res = file_put_contents(INSTALLDIR.'/config.php', $cfg); return $res; } /** * Install schema into the database * * @param string $filename location of database schema file * @param dbconn $conn connection to database * @param string $type type of database, currently mysql or pgsql * * @return boolean - indicating success or failure */ function runDbScript($filename, $conn, $type = 'mysqli') { $sql = trim(file_get_contents($filename)); $stmts = explode(';', $sql); foreach ($stmts as $stmt) { $stmt = trim($stmt); if (!mb_strlen($stmt)) { continue; } // FIXME: use PEAR::DB or PDO instead of our own switch switch ($type) { case 'mysqli': $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("ERROR ($error) for SQL '$stmt'"); return $res; } } return true; } ?> xml version="1.0" encoding="UTF-8" "; ?> Install StatusNet

        Install StatusNet