cvs: pearweb / package.php package.xml pearweb.php

From: Date: Mon, 02 Oct 2006 04:36:09 +0000
Subject: cvs: pearweb / package.php package.xml pearweb.php
Groups: php.pear.cvs php.pear.core 
Request: Send a blank email to pear-cvs+get-42341@lists.php.net to get a copy of this message
cellog Mon Oct 2 04:36:09 2006 UTC Modified files: /pearweb package.php package.xml pearweb.php Log: complete post-install script. pearweb is now completely installable via PEAR installer features: * automatically adds/updates httpd.conf settings * creates AND upgrades pearweb database using MDB2_Schema ONLY differences are added/removed on upgrade

http://cvs.php.net/viewvc.cgi/pearweb/package.php?r1=1.5&r2=1.6&diff_format=u Index: pearweb/package.php diff -u pearweb/package.php:1.5 pearweb/package.php:1.6 --- pearweb/package.php:1.5 Sun Oct 1 22:31:55 2006 +++ pearweb/package.php Mon Oct 2 04:36:09 2006 @@ -66,11 +66,16 @@ 'httpdconf', array( $script->getParam('path', 'Full path to httpd.conf', 'string'), + $script->getParam('addnamev', 'Add NameVirtualHost directive? (yes/no)', 'string', 'yes'), + $script->getParam('namehost', 'Virtual Host IP address', 'string', '*'), + $script->getParam('pear', 'PEAR subdomain name', 'string', 'localhost'), ) ); $a->addPostinstallTask($script, 'pearweb.php'); $a->addReplacement('pearweb.php', 'pear-config', '@web-dir@', 'web_dir'); +$a->addReplacement('pearweb.php', 'pear-config', '@php-dir@', 'php_dir'); +$a->addReplacement('pearweb.php', 'package-info', '@version@', 'version'); $a->generateContents(); $a->writePackageFile(); ?> \ No newline at end of file http://cvs.php.net/viewvc.cgi/pearweb/package.xml?r1=1.30&r2=1.31&diff_format=u Index: pearweb/package.xml diff -u pearweb/package.xml:1.30 pearweb/package.xml:1.31 --- pearweb/package.xml:1.30 Sun Oct 1 22:31:55 2006 +++ pearweb/package.xml Mon Oct 2 04:36:09 2006 @@ -53,7 +53,7 @@ <active>no</active> </developer> <date>2006-10-01</date> - <time>17:31:08</time> + <time>23:33:23</time> <version> <release>0.3.0</release> <api>0.1.1</api> @@ -555,9 +555,29 @@ <tasks:prompt>Full path to httpd.conf</tasks:prompt> <tasks:type>string</tasks:type> </tasks:param> + <tasks:param> + <tasks:name>addnamev</tasks:name> + <tasks:prompt>Add NameVirtualHost directive? (yes/no)</tasks:prompt> + <tasks:type>string</tasks:type> + <tasks:default>yes</tasks:default> + </tasks:param> + <tasks:param> + <tasks:name>namehost</tasks:name> + <tasks:prompt>Virtual Host IP address</tasks:prompt> + <tasks:type>string</tasks:type> + <tasks:default>*</tasks:default> + </tasks:param> + <tasks:param> + <tasks:name>pear</tasks:name> + <tasks:prompt>PEAR subdomain name</tasks:prompt> + <tasks:type>string</tasks:type> + <tasks:default>localhost</tasks:default> + </tasks:param> </tasks:paramgroup> </tasks:postinstallscript> <tasks:replace from="@web-dir@" to="web_dir" type="pear-config" /> + <tasks:replace from="@php-dir@" to="php_dir" type="pear-config" /> + <tasks:replace from="@version@" to="version" type="package-info" /> </file> <file name="processReleases.php" role="web" /> <file name="README" role="web" /> http://cvs.php.net/viewvc.cgi/pearweb/pearweb.php?r1=1.3&r2=1.4&diff_format=u Index: pearweb/pearweb.php diff -u pearweb/pearweb.php:1.3 pearweb/pearweb.php:1.4 --- pearweb/pearweb.php:1.3 Sun Oct 1 22:31:55 2006 +++ pearweb/pearweb.php Mon Oct 2 04:36:09 2006 @@ -39,7 +39,11 @@ return false; } PEAR::popErrorHandling(); - return true; + if (!in_array($answers['driver'], array('mysql', 'mysqli'), true)) { + $this->_ui->outputData('pearweb only supports mysql or mysqli, ' . + 'not ' . $answers['driver']); + return false; + } return $this->initializeDatabase($answers); break; case 'askhttpd' : @@ -49,13 +53,25 @@ return true; break; case 'httpdconf' : - $this->_ui->outputData('httpdconf'); - return true; + return $this->setupHttpdconf($answers); break; } return true; } + /** + * 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) { $this->dsn = array( @@ -68,11 +84,65 @@ array('idxname_format' => '%s', 'seqname_format' => 'id', 'quote_identifier' => true)); + // for upgrade purposes + if (!file_exists('@web-dir@' . DIRECTORY_SEPARATOR . 'sql' . DIRECTORY_SEPARATOR . + '.pearweb-upgrade')) { + if (!mkdir('@web-dir@' . DIRECTORY_SEPARATOR . 'sql' . DIRECTORY_SEPARATOR . + '.pearweb-upgrade')) { + $this->_ui->outputData('error - make sure we can create directories'); + return false; + } + } $c = $a->parseDatabaseDefinitionFile( realpath('@web-dir@/sql/pearweb_mdb2schema.xml')); $c['name'] = $answers['database']; $c['create'] = 1; $c['overwrite'] = 0; + $dir = opendir('@web-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('@web-dir@/sql/.pearweb-upgrade/' . + $answers['database'] . '-@version@.ser')) { + $fp = fopen('@web-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('@web-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) + $c = $a->compareDefinitions($c, $curdef); + } PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); $err = $a->createDatabase($c); PEAR::staticPopErrorHandling(); @@ -83,4 +153,166 @@ } return true; } + + /** + * 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, 'NameVirtualHost') === 0) { + $found['NameVirtualHost'] = $num; + 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 (strtolower($answers['addnamev']) == 'yes') { + if (array_key_exists('NameVirtualHost', $found)) { + $httpdconf[$found['NameVirtualHost']] = + 'NameVirtualHost ' . $answers['namehost'] . $eol; + } else { + if (array_key_exists('start', $found) && array_key_exists('end', $found)) { + $one = array_slice($httpdconf, 0, $found['start'] - 1); + $found['start']++; + $one[] = $eol . 'NameVirtualHost ' . $answers['namehost'] . $eol; + $two = array_slice($httpdconf, $found['start']); + $httpdconf = array_merge($one, $two); + } else { + $httpdconf[] = $eol . 'NameVirtualHost ' . $answers['namehost'] . $eol; + } + } + } + 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[] = '# 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('\\', '/', '@web-dir@') . $eol; + $middle[] = ' DirectoryIndex index.php index.html' . $eol; + $middle[] = $eol; + $middle[] = ' php_value include_path .' . PATH_SEPARATOR . + str_replace('\\', '/', '@web-dir@') + . '/include' . PATH_SEPARATOR . str_replace('\\', '/', '@php-dir@') . $eol; + $middle[] = ' php_value auto_prepend_file pear-prepend.php' . $eol; + $middle[] = ' php_value auto_append_file pear-append.php' . $eol; + $middle[] = ' php_flag magic_quotes_gpc off' . $eol; + $middle[] = ' php_flag magic_quotes_runtime off' . $eol; + $middle[] = ' php_flag register_globals On' . $eol; + $middle[] = $eol; + $middle[] = ' ErrorDocument 404 /error/404.php' . $eol; + $middle[] = $eol; + $middle[] = ' Alias /package ' . str_replace('\\', '/', '@web-dir@') + . '/public_html/package-info.php' . $eol; + $middle[] = ' Alias /user ' . str_replace('\\', '/', '@web-dir@') + . '/public_html/account-info.php' . $eol; + $middle[] = ' Alias /sidebar/pear.gif ' . str_replace('\\', '/', '@web-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[] = ' 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; + } } \ No newline at end of file
« previous php.pear.cvs (#42341) next »