Пример #1
0
    /**
     * This helper function parses httpd.conf and adds needed information
     * for pearweb to run.
     *
     * In essence, this takes the contents of docs/apache_setup.txt and
     * adds them to httpd.conf with paths replaced that are needed to
     * make the thing work.
     *
     * @param array $answers
     * @return boolean
     */
    function setupHttpdconf($answers)
    {
        $eol = defined('PHP_EOL') ? PHP_EOL : (OS_WINDOWS ? "\r\n" : "\n");
        if (!realpath($answers['path']) || !file_exists($answers['path'])) {
            $this->_ui->outputData('No such file: "' . $answers['path'] . '"');
            return false;
        }
        $httpdconf = file(realpath($answers['path']));
        $found = array();
        foreach ($httpdconf as $num => $line) {
            $line = trim($line);
            if (!$line) {
                continue;
            }
            if (strpos($line, '# inserted by pearweb #### (do not remove) start') === 0) {
                $found['start'] = $num;
                continue;
            }
            if (strpos($line, '# inserted by pearweb #### (do not remove) end') === 0) {
                $found['end'] = $num;
            }
        }
        if (array_key_exists('start', $found) && array_key_exists('end', $found)) {
            $one = array_slice($httpdconf, 0, $found['start'] - 1);
            $two = array_slice($httpdconf, $found['end'] + 1);
        } else {
            $one = $httpdconf;
            $two = array();
        }
        // here we go...
        $middle = array();
        $middle[] = $eol;
        $middle[] = '# inserted by pearweb #### (do not remove) start' . $eol;
        $middle[] = '<VirtualHost ' . $answers['namehost'] . '>' . $eol;
        $middle[] = ' ServerName ' . $answers['pear'] . $eol;
        $middle[] = $eol;
        // apache requires all path separators to be "/" even on windows
        $middle[] = ' DocumentRoot ' . str_replace('\\', '/', '@www-dir@') . '/public_html' . $eol;
        $middle[] = ' DirectoryIndex index.php index.html' . $eol;
        $middle[] = $eol;
        $middle[] = ' php_value include_path .' . PATH_SEPARATOR . str_replace('\\', '/', '@www-dir@') . '/include' . PATH_SEPARATOR . str_replace('\\', '/', '@php-dir@') . $eol;
        $middle[] = ' php_value auto_prepend_file pear-prepend.php' . $eol;
        $middle[] = ' php_flag magic_quotes_gpc off' . $eol;
        $middle[] = ' php_flag magic_quotes_runtime off' . $eol;
        $middle[] = ' php_flag register_globals Off' . $eol;
        $middle[] = $eol;
        $middle[] = ' ErrorDocument 404 /error/404.php' . $eol;
        $middle[] = $eol;
        $middle[] = ' Alias /package ' . str_replace('\\', '/', '@www-dir@') . '/public_html/package-info.php' . $eol;
        $middle[] = ' Alias /user    ' . str_replace('\\', '/', '@www-dir@') . '/public_html/account-info.php' . $eol;
        $middle[] = ' Alias /sidebar/pear.gif ' . str_replace('\\', '/', '@www-dir@') . '/public_html/gifs/pear_item.gif' . $eol;
        $middle[] = ' Alias /distributions/manual/chm /var/lib/pear/chm' . $eol;
        $middle[] = ' Alias /reference /var/lib/pear/apidoc' . $eol;
        $middle[] = $eol;
        $middle[] = ' RedirectPermanent /download-docs.php          http://' . $answers['pear'] . '/manual/' . $eol;
        $middle[] = ' RedirectPermanent /rss.php                    http://' . $answers['pear'] . '/feeds/latest.rss' . $eol;
        $middle[] = ' RedirectPermanent /weeklynews.php             http://' . $answers['pear'] . '/' . $eol;
        $middle[] = ' RedirectPermanent /support.php                http://' . $answers['pear'] . '/support/' . $eol;
        $middle[] = ' RedirectPermanent /credits.php                http://' . $answers['pear'] . '/about/credits.php' . $eol;
        $middle[] = ' RedirectPermanent /pepr/pepr-overview.php     http://' . $answers['pear'] . '/pepr/' . $eol;
        $middle[] = $eol;
        $middle[] = ' RewriteEngine On' . $eol;
        $middle[] = $eol;
        $middle[] = ' #' . $eol;
        $middle[] = ' # Rewriting rules for the RSS feeds' . $eol;
        $middle[] = ' #' . $eol;
        $middle[] = $eol;
        $middle[] = ' RewriteRule   /feeds/(.+)\\.rss$ /feeds/feeds.php?type=$1' . $eol;
        $middle[] = $eol;
        $middle[] = ' #' . $eol;
        $middle[] = ' # Rewriting rule for the API documentation' . $eol;
        $middle[] = ' #' . $eol;
        $middle[] = $eol;
        $middle[] = ' RewriteRule   /package/([a-zA-Z0-9_]+)/docs/(.+)($/|$) /reference/$1-$2 [PT]' . $eol;
        $middle[] = $eol;
        $middle[] = ' #' . $eol;
        $middle[] = ' # Rewriting rule for the Bug system' . $eol;
        $middle[] = ' #' . $eol;
        $middle[] = $eol;
        $middle[] = ' RewriteRule   /bugs/([0-9]+)/*$ /bugs/bug.php?id=$1 [R]
' . $eol;
        $middle[] = $eol;
        $middle[] = ' #' . $eol;
        $middle[] = ' # Rewriting rule for the manual' . $eol;
        $middle[] = ' # throw pecl doc people to the php manual' . $eol;
        $middle[] = ' #' . $eol;
        $middle[] = $eol;
        $middle[] = '  RewriteRule   /manual/[a-z]{2}/pecl.([a-zA-Z0-9_-]+)\\.php$ http://www.php.net/$1 [R=301]' . $eol;
        $middle[] = $eol;
        $middle[] = ' SetEnvIf User-Agent "MS Search 4\\.0 Robot\\)$" badrobot' . $eol;
        $middle[] = $eol;
        $middle[] = ' <Directory />' . $eol;
        $middle[] = '  order deny,allow' . $eol;
        $middle[] = '  deny from env=badrobot' . $eol;
        $middle[] = ' </Directory>' . $eol;
        $middle[] = $eol;
        $middle[] = ' <Location /get>' . $eol;
        $middle[] = '  ForceType application/x-httpd-php' . $eol;
        $middle[] = $eol;
        $middle[] = '  Deny From 194.51.105.35' . $eol;
        $middle[] = ' </Location>' . $eol;
        $middle[] = $eol;
        $middle[] = ' <Location /manual>' . $eol;
        $middle[] = '  ErrorDocument 404 /error/404-manual.php' . $eol;
        $middle[] = ' </Location>' . $eol;
        $middle[] = $eol;
        $middle[] = ' <Location /bugs/include>' . $eol;
        $middle[] = '  deny from all' . $eol;
        $middle[] = ' </Location>' . $eol;
        $middle[] = $eol;
        $middle[] = ' <Location /trackback>' . $eol;
        $middle[] = '  DirectoryIndex trackback.php' . $eol;
        $middle[] = ' </Location>' . $eol;
        $middle[] = $eol;
        $middle[] = '</VirtualHost>' . $eol;
        $middle[] = '# inserted by pearweb #### (do not remove) end' . $eol;
        $one = array_merge($one, $middle);
        $httpdconf = array_merge($one, $two);
        $this->_ui->outputData('opening ' . $answers['path'] . ' for writing');
        $fp = fopen(realpath($answers['path']), 'w');
        $this->_ui->outputData('writing data...');
        fwrite($fp, implode('', $httpdconf));
        fclose($fp);
        $this->_ui->outputData('...done');
        return true;
    }
Пример #2
0
 /**
  * Create or upgrade the database needed for pearweb
  *
  * This helper function scans for previous database versions,
  * and upgrades the database based on differences between the
  * previous version's schema and the one distributed with this
  * version.
  *
  * If the database has never been created, then it is created.
  *
  * @param array $answers
  * @return boolean
  */
 function initializeDatabase($answers)
 {
     //include_once dirname(__FILE__) . 'include/pear-config.php';
     //$a = MDB2_Schema::factory(PEAR_DATABASE_DSN,
     $this->dsn = array('phptype' => $answers['driver'], 'username' => $answers['user'], 'password' => $answers['password'], 'hostspec' => $answers['host'], 'database' => $answers['database']);
     $a = MDB2_Schema::factory($this->dsn, array('idxname_format' => '%s', 'seqname_format' => 'id', 'quote_identifier' => true));
     // for upgrade purposes
     if (!file_exists('@www-dir@' . DIRECTORY_SEPARATOR . 'sql' . DIRECTORY_SEPARATOR . '.pearweb-upgrade')) {
         if (!mkdir('@www-dir@' . DIRECTORY_SEPARATOR . 'sql' . DIRECTORY_SEPARATOR . '.pearweb-upgrade')) {
             $this->_ui->outputData('error - make sure we can create directories');
             return false;
         }
     }
     PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
     $c = $a->parseDatabaseDefinitionFile(realpath('@www-dir@/sql/pearweb_election.xml'));
     PEAR::staticPopErrorHandling();
     if (PEAR::isError($c)) {
         $extra = '';
         if (MDB2_Schema::isError($c) || MDB2::isError($c)) {
             $extra = "\n" . $c->getUserInfo();
         }
         $this->_ui->outputData('ERROR: ' . $c->getMessage() . $extra);
         return false;
     }
     $c['name'] = $answers['database'];
     $c['create'] = 1;
     $c['overwrite'] = 0;
     $dir = opendir('@www-dir@/sql/.pearweb-upgrade');
     $oldversion = false;
     while (false !== ($entry = readdir($dir))) {
         if ($entry[0] === '.') {
             continue;
         }
         if (strpos($entry, $answers['database']) === 0) {
             // this is one of ours
             // strip databasename-
             $entry = substr($entry, strlen($answers['database']) + 1);
             // strip ".ser"
             $entry = substr($entry, 0, strlen($entry) - 4);
             // ... and we're left with just the version
             if (!$oldversion) {
                 $oldversion = $entry;
                 continue;
             }
             if (version_compare($entry, $oldversion, '>')) {
                 $oldversion = $entry;
             }
         }
     }
     if (!file_exists('@www-dir@/sql/.pearweb-upgrade/' . $answers['database'] . '-@version@.ser')) {
         $fp = fopen('@www-dir@/sql/.pearweb-upgrade/' . $answers['database'] . '-@version@.ser', 'w');
         fwrite($fp, serialize($c));
         fclose($fp);
     }
     if ($oldversion == '@version@') {
         // this is where to change if we need to add a "force upgrade of
         // structure" option
         // we would uncomment the following line:
         //$c['overwrite'] = true;
         $oldversion = false;
     }
     if ($oldversion) {
         $curdef = unserialize(file_get_contents('@www-dir@/sql/.pearweb-upgrade/' . $answers['database'] . '-' . $oldversion . '.ser'));
         if (!is_array($curdef)) {
             $this->_ui->outputData('invalid data returned from previous version');
         }
         // get a database diff (MDB2_Schema is very useful here)
         PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
         $c = $a->compareDefinitions($c, $curdef);
         if (PEAR::isError($c)) {
             $this->_ui->outputData($err->getMessage());
             $this->_ui->outputData($err->getUserInfo());
             $this->_ui->outputData('Unable to automatically update database');
             return false;
         }
         $err = $a->updateDatabase($curdef, $c);
         PEAR::staticPopErrorHandling();
     } else {
         PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
         $err = $a->createDatabase($c);
         PEAR::staticPopErrorHandling();
     }
     if (PEAR::isError($err)) {
         $this->_ui->outputData($err->getUserInfo());
         $this->_ui->outputData($err->getMessage());
         return false;
     }
     return true;
 }