We are no longer offering accounts on this server. Consider https://gitlab.freedesktop.org/ as a place to host projects.

install.php 22.9 KB
Newer Older
1
<?php
Brenda Wallace's avatar
Brenda Wallace committed
2
/** 
3
 * StatusNet - the distributed open-source microblogging tool
4
 * Copyright (C) 2009, StatusNet, Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17
 *
 * 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/>.
Brenda Wallace's avatar
Brenda Wallace committed
18 19 20 21 22
 * 
 * @category Installation
 * @package  Installation
 * @license  GNU Affero General Public License http://www.gnu.org/licenses/
 * 
23
 */
Brenda Wallace's avatar
Brenda Wallace committed
24 25
 

26

27 28
define('INSTALLDIR', dirname(__FILE__));

Craig Andrews's avatar
Craig Andrews committed
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
$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'
    )
);
191 192 193 194 195 196 197 198 199 200 201 202
$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',
    ),
);
Craig Andrews's avatar
Craig Andrews committed
203

Brenda Wallace's avatar
Brenda Wallace committed
204 205 206 207 208 209
/** 
 * the actual installation.
 * If call libraries are present, then install
 * 
 * @return void
 */
Evan Prodromou's avatar
Evan Prodromou committed
210 211
function main()
{
212
    if (!checkPrereqs()) {
213 214
        return;
    }
Craig Andrews's avatar
Craig Andrews committed
215
    
216
    if ($_GET['checklibs']) {
Craig Andrews's avatar
Craig Andrews committed
217
        showLibs();
218
    } else {
Craig Andrews's avatar
Craig Andrews committed
219 220 221 222 223 224 225
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            handlePost();
        } else {
            showForm();
        }
    }
}
226

Craig Andrews's avatar
Craig Andrews committed
227 228
function haveExternalLibrary($external_library)
{
229
    if (isset($external_library['include']) && ! include_once $external_library['include'] ) {
Craig Andrews's avatar
Craig Andrews committed
230 231
        return false;
    }
232
    if (isset($external_library['check_function']) && ! function_exists($external_library['check_function'])) {
Craig Andrews's avatar
Craig Andrews committed
233 234
        return false;
    }
235
    if (isset($external_library['check_class']) && ! class_exists($external_library['check_class'])) {
Craig Andrews's avatar
Craig Andrews committed
236
        return false;
Evan Prodromou's avatar
Evan Prodromou committed
237
    }
Craig Andrews's avatar
Craig Andrews committed
238
    return true;
Evan Prodromou's avatar
Evan Prodromou committed
239 240
}

241 242
function checkPrereqs()
{
243
	$pass = true;
244

245 246
    if (file_exists(INSTALLDIR.'/config.php')) {
         ?><p class="error">Config file &quot;config.php&quot; already exists.</p>
247
         <?php
248
        $pass = false;
249 250
    }

Craig Andrews's avatar
Craig Andrews committed
251 252
    if (version_compare(PHP_VERSION, '5.2.3', '<')) {
            ?><p class="error">Require PHP version 5.2.3 or greater.</p><?php
253
		    $pass = false;
254 255
    }

256
    $reqs = array('gd', 'curl',
257
                  'xmlwriter', 'mbstring','tidy');
258 259 260

    foreach ($reqs as $req) {
        if (!checkExtension($req)) {
Sarven Capadisli's avatar
Sarven Capadisli committed
261
            ?><p class="error">Cannot load required extension: <code><?php echo $req; ?></code></p><?php
262
		    $pass = false;
263 264
        }
    }
265 266 267 268 269 270 271 272 273 274 275 276
    
    // 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);
      ?><p class="error">Cannot find database support. You need at least one of these PHP extensions installed: <code><?php echo $req; ?></code></p><?php
277 278
                    $pass = false;
    }
279 280

	if (!is_writable(INSTALLDIR)) {
Sarven Capadisli's avatar
Sarven Capadisli committed
281 282
         ?><p class="error">Cannot write config file to: <code><?php echo INSTALLDIR; ?></code></p>
	       <p>On your server, try this command: <code>chmod a+w <?php echo INSTALLDIR; ?></code>
283
         <?php
284
	     $pass = false;
285 286
	}

287 288 289 290 291 292 293
	// Check the subdirs used for file uploads
	$fileSubdirs = array('avatar', 'background', 'file');
	foreach ($fileSubdirs as $fileSubdir) {
		$fileFullPath = INSTALLDIR."/$fileSubdir/";
		if (!is_writable($fileFullPath)) {
    	     ?><p class="error">Cannot write <?php echo $fileSubdir; ?> directory: <code><?php echo $fileFullPath; ?></code></p>
		       <p>On your server, try this command: <code>chmod a+w <?php echo $fileFullPath; ?></code></p>
Tom Adams's avatar
Tom Adams committed
294
	     <?php
295 296
		     $pass = false;
		}
297
	}
298

299
	return $pass;
300 301 302 303 304
}

function checkExtension($name)
{
    if (!extension_loaded($name)) {
305
        if (!@dl($name.'.so')) {
306 307 308 309
            return false;
        }
    }
    return true;
310 311
}

Craig Andrews's avatar
Craig Andrews committed
312 313 314 315 316
function showLibs()
{
    global $external_libraries;
    $present_libraries=array();
    $absent_libraries=array();
317 318
    foreach ($external_libraries as $external_library){
        if (haveExternalLibrary($external_library)) {
Craig Andrews's avatar
Craig Andrews committed
319
            $present_libraries[]=$external_library;
320
        } else {
Craig Andrews's avatar
Craig Andrews committed
321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
            $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;
}

Evan Prodromou's avatar
Evan Prodromou committed
375 376
function showForm()
{
377 378 379 380 381 382 383 384 385
    global $dbModules;
    $dbRadios = '';
    $checked = 'checked="checked" '; // Check the first one which exists
    foreach ($dbModules as $type => $info) {
        if (checkExtension($info['check_module'])) {
            $dbRadios .= "<input type=\"radio\" name=\"dbtype\" id=\"dbtype-$type\" value=\"$type\" $checked/> $info[name]<br />\n";
            $checked = '';
        }
    }
386
    echo<<<E_O_T
Sarven Capadisli's avatar
Sarven Capadisli committed
387 388 389 390 391 392 393 394
        </ul>
    </dd>
</dl>
<dl id="page_notice" class="system_notice">
    <dt>Page notice</dt>
    <dd>
        <div class="instructions">
            <p>Enter your database connection information below to initialize the database.</p>
Craig Andrews's avatar
Craig Andrews committed
395
            <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>
Sarven Capadisli's avatar
Sarven Capadisli committed
396 397 398 399 400 401 402 403 404 405 406 407 408
        </div>
    </dd>
</dl>
<form method="post" action="install.php" class="form_settings" id="form_install">
    <fieldset>
        <legend>Connection settings</legend>
        <ul class="form_data">
            <li>
                <label for="sitename">Site name</label>
                <input type="text" id="sitename" name="sitename" />
                <p class="form_guide">The name of your site</p>
            </li>
            <li>
409 410 411 412 413
                <label for="fancy-enable">Fancy URLs</label>
                <input type="radio" name="fancy" id="fancy-enable" value="enable" checked='checked' /> enable<br />
                <input type="radio" name="fancy" id="fancy-disable" value="" /> disable<br />
                <p class="form_guide" id='fancy-form_guide'>Enable fancy (pretty) URLs. Auto-detection failed, it depends on Javascript.</p>
            </li>
414 415 416 417 418
            <li>
                <label for="host">Hostname</label>
                <input type="text" id="host" name="host" />
                <p class="form_guide">Database hostname</p>
            </li>
Sarven Capadisli's avatar
Sarven Capadisli committed
419
            <li>
420

421
                <label for="dbtype">Type</label>
422
                $dbRadios
423
                <p class="form_guide">Database type</p>
424
            </li>
425

Sarven Capadisli's avatar
Sarven Capadisli committed
426
            <li>
427
                <label for="database">Name</label>
Sarven Capadisli's avatar
Sarven Capadisli committed
428 429 430 431 432 433 434 435 436 437 438
                <input type="text" id="database" name="database" />
                <p class="form_guide">Database name</p>
            </li>
            <li>
                <label for="username">Username</label>
                <input type="text" id="username" name="username" />
                <p class="form_guide">Database username</p>
            </li>
            <li>
                <label for="password">Password</label>
                <input type="password" id="password" name="password" />
439
                <p class="form_guide">Database password (optional)</p>
Sarven Capadisli's avatar
Sarven Capadisli committed
440 441 442 443
            </li>
        </ul>
        <input type="submit" name="submit" class="submit" value="Submit" />
    </fieldset>
Evan Prodromou's avatar
Evan Prodromou committed
444
</form>
445 446

E_O_T;
Evan Prodromou's avatar
Evan Prodromou committed
447 448
}

449 450 451
function updateStatus($status, $error=false)
{
?>
Tom Adams's avatar
Tom Adams committed
452
                <li <?php echo ($error) ? 'class="error"': ''; ?>><?php echo $status;?></li>
Sarven Capadisli's avatar
Sarven Capadisli committed
453 454

<?php
455 456
}

Evan Prodromou's avatar
Evan Prodromou committed
457 458
function handlePost()
{
459
?>
Sarven Capadisli's avatar
Sarven Capadisli committed
460 461

<?php
462
    $host     = $_POST['host'];
463
    $dbtype   = $_POST['dbtype'];
464 465 466 467
    $database = $_POST['database'];
    $username = $_POST['username'];
    $password = $_POST['password'];
    $sitename = $_POST['sitename'];
468
    $fancy    = !empty($_POST['fancy']);
469 470
    $server = $_SERVER['HTTP_HOST'];
    $path = substr(dirname($_SERVER['PHP_SELF']), 1);
471

Sarven Capadisli's avatar
Sarven Capadisli committed
472 473 474 475 476 477
?>
    <dl class="system_notice">
        <dt>Page notice</dt>
        <dd>
            <ul>
<?php
478
	$fail = false;
479

Evan Prodromou's avatar
Evan Prodromou committed
480 481
    if (empty($host)) {
        updateStatus("No hostname specified.", true);
482
		$fail = true;
Evan Prodromou's avatar
Evan Prodromou committed
483 484 485 486
    }

    if (empty($database)) {
        updateStatus("No database specified.", true);
487
		$fail = true;
Evan Prodromou's avatar
Evan Prodromou committed
488 489 490 491
    }

    if (empty($username)) {
        updateStatus("No username specified.", true);
492
		$fail = true;
Evan Prodromou's avatar
Evan Prodromou committed
493 494
    }

Brenda Wallace's avatar
Brenda Wallace committed
495 496 497 498
//     if (empty($password)) {
//         updateStatus("No password specified.", true);
// 		$fail = true;
//     }
Evan Prodromou's avatar
Evan Prodromou committed
499 500 501

    if (empty($sitename)) {
        updateStatus("No sitename specified.", true);
502
		$fail = true;
Evan Prodromou's avatar
Evan Prodromou committed
503 504
    }

Brenda Wallace's avatar
Brenda Wallace committed
505
    if($fail){
506
            showForm();
507 508
        return;
    }
509

510 511 512
    global $dbModules;
    $db = call_user_func($dbModules[$dbtype]['installer'],
        $host, $database, $username, $password);
513

514 515 516 517
    if (!$db) {
        // database connection failed, do not move on to create config file.
        return false;
    }
518

519 520
    updateStatus("Writing config file...");
    $res = writeConf($sitename, $server, $path, $fancy, $db);
521

522 523 524 525
    if (!$res) {
        updateStatus("Can't write config file.", true);
        showForm();
        return;
Evan Prodromou's avatar
Evan Prodromou committed
526
    }
527

528 529 530 531
    /*
        TODO https needs to be considered
    */
    $link = "http://".$server.'/'.$path;
532

533 534
    updateStatus("StatusNet has been installed at $link");
    updateStatus("You can visit your <a href='$link'>new StatusNet site</a>.");
535
?>
Sarven Capadisli's avatar
Sarven Capadisli committed
536 537

<?php
538 539
}

540
function pgsql_db_installer($host, $database, $username, $password) {
Brenda Wallace's avatar
Brenda Wallace committed
541
  $connstring = "dbname=$database host=$host user=$username";
542

Brenda Wallace's avatar
Brenda Wallace committed
543 544 545 546 547 548 549
  //No password would mean trust authentication used.
  if (!empty($password)) {
    $connstring .= " password=$password";
  }
  updateStatus("Starting installation...");
  updateStatus("Checking database...");
  $conn = pg_connect($connstring);
550

551 552 553 554 555
  if ($conn ===false) {
    updateStatus("Failed to connect to database: $connstring");
    showForm();
    return false;
  }
Brenda Wallace's avatar
Brenda Wallace committed
556

557 558 559
  //ensure database encoding is UTF8
  $record = pg_fetch_object(pg_query($conn, 'SHOW server_encoding'));
  if ($record->server_encoding != 'UTF8') {
560
    updateStatus("StatusNet requires UTF8 character encoding. Your database is ". htmlentities($record->server_encoding));
561 562 563 564
    showForm();
    return false;
  }

565 566 567
  updateStatus("Running database script...");
  //wrap in transaction;
  pg_query($conn, 'BEGIN');
568
  $res = runDbScript(INSTALLDIR.'/db/statusnet_pg.sql', $conn, 'pgsql');
569

570 571 572
  if ($res === false) {
      updateStatus("Can't run database script.", true);
      showForm();
573
      return false;
574 575 576 577 578 579 580 581 582 583
  }
  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();
584
          return false;
585 586 587 588 589 590 591 592 593 594
      }
  }
  pg_query($conn, 'COMMIT');

  if (empty($password)) {
    $sqlUrl = "pgsql://$username@$host/$database";
  }
  else {
    $sqlUrl = "pgsql://$username:$password@$host/$database";
  }
595

596
  $db = array('type' => 'pgsql', 'database' => $sqlUrl);
597

598
  return $db;
Brenda Wallace's avatar
Brenda Wallace committed
599 600
}

601
function mysql_db_installer($host, $database, $username, $password) {
Brenda Wallace's avatar
Brenda Wallace committed
602 603 604 605 606 607 608
  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();
609
      return false;
Brenda Wallace's avatar
Brenda Wallace committed
610 611 612 613 614 615
  }
  updateStatus("Changing to database...");
  $res = mysql_select_db($database, $conn);
  if (!$res) {
      updateStatus("Can't change to database.", true);
      showForm();
616
      return false;
Brenda Wallace's avatar
Brenda Wallace committed
617 618
  }
  updateStatus("Running database script...");
619
  $res = runDbScript(INSTALLDIR.'/db/statusnet.sql', $conn);
Brenda Wallace's avatar
Brenda Wallace committed
620 621 622
  if ($res === false) {
      updateStatus("Can't run database script.", true);
      showForm();
623
      return false;
Brenda Wallace's avatar
Brenda Wallace committed
624 625 626 627 628 629 630
  }
  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);
631
      if ($res === false) {
Brenda Wallace's avatar
Brenda Wallace committed
632
          updateStatus(sprintf("Can't run %d script.", $name), true);
633
          showForm();
634
          return false;
635
      }
Brenda Wallace's avatar
Brenda Wallace committed
636
  }
637

638
      $sqlUrl = "mysqli://$username:$password@$host/$database";
639 640 641 642 643
      $db = array('type' => 'mysql', 'database' => $sqlUrl);
      return $db;
}

function writeConf($sitename, $server, $path, $fancy, $db)
644
{
645 646
    // assemble configuration file in a string
    $cfg =  "<?php\n".
647
            "if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }\n\n".
648

649 650
            // site name
            "\$config['site']['name'] = '$sitename';\n\n".
651

652 653 654
            // site location
            "\$config['site']['server'] = '$server';\n".
            "\$config['site']['path'] = '$path'; \n\n".
655

656 657
            // checks if fancy URLs are enabled
            ($fancy ? "\$config['site']['fancy'] = true;\n\n":'').
658

659 660
            // database
            "\$config['db']['database'] = '{$db['database']}';\n\n".
661
            ($db['type'] == 'pgsql' ? "\$config['db']['quote_identifiers'] = true;\n\n":'').
662
            "\$config['db']['type'] = '{$db['type']}';\n\n".
663

664 665 666 667
            "?>";
    // write configuration file out to install directory
    $res = file_put_contents(INSTALLDIR.'/config.php', $cfg);

668
    return $res;
Evan Prodromou's avatar
Evan Prodromou committed
669
}
670

671
function runDbScript($filename, $conn, $type = 'mysql')
672 673 674 675 676 677 678 679
{
    $sql = trim(file_get_contents($filename));
    $stmts = explode(';', $sql);
    foreach ($stmts as $stmt) {
        $stmt = trim($stmt);
        if (!mb_strlen($stmt)) {
            continue;
        }
Evan Prodromou's avatar
Evan Prodromou committed
680
        // FIXME: use PEAR::DB or PDO instead of our own switch
681 682 683
        switch ($type) {
        case 'mysql':
            $res = mysql_query($stmt, $conn);
Evan Prodromou's avatar
Evan Prodromou committed
684 685 686
            if ($res === false) {
                $error = mysql_error();
            }
687 688 689
            break;
        case 'pgsql':
            $res = pg_query($conn, $stmt);
Evan Prodromou's avatar
Evan Prodromou committed
690 691 692
            if ($res === false) {
                $error = pg_last_error();
            }
693 694 695
            break;
        default:
            updateStatus("runDbScript() error: unknown database type ". $type ." provided.");
696
        }
697
        if ($res === false) {
Evan Prodromou's avatar
Evan Prodromou committed
698
            updateStatus("ERROR ($error) for SQL '$stmt'");
699 700 701 702 703 704
            return $res;
        }
    }
    return true;
}

Evan Prodromou's avatar
Evan Prodromou committed
705
?>
Sarven Capadisli's avatar
Sarven Capadisli committed
706 707 708 709 710 711
<?php echo"<?"; ?> xml version="1.0" encoding="UTF-8" <?php echo "?>"; ?>
<!DOCTYPE html
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>
712
        <title>Install StatusNet</title>
713
	<link rel="shortcut icon" href="favicon.ico"/>
Sarven Capadisli's avatar
Sarven Capadisli committed
714 715 716
        <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]-->
        <!--[if lte IE 6]><link rel="stylesheet" type="text/css" theme/base/css/ie6.css?version=0.8" /><![endif]-->
717 718 719
        <!--[if IE]><link rel="stylesheet" type="text/css" href="theme/default/css/ie.css?version=0.8" /><![endif]-->
        <script src="js/jquery.min.js"></script>
        <script src="js/install.js"></script>
Sarven Capadisli's avatar
Sarven Capadisli committed
720 721 722 723 724 725
    </head>
    <body id="install">
        <div id="wrap">
            <div id="header">
                <address id="site_contact" class="vcard">
                    <a class="url home bookmark" href=".">
726 727
                        <img class="logo photo" src="theme/default/logo.png" alt="StatusNet"/>
                        <span class="fn org">StatusNet</span>
Sarven Capadisli's avatar
Sarven Capadisli committed
728 729 730 731 732
                    </a>
                </address>
            </div>
            <div id="core">
                <div id="content">
733
                    <h1>Install StatusNet</h1>
734
<?php main(); ?>
Sarven Capadisli's avatar
Sarven Capadisli committed
735 736 737 738
                </div>
            </div>
        </div>
    </body>
739
</html>