summaryrefslogtreecommitdiff
path: root/includes/pear/PEAR/Start.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/pear/PEAR/Start.php')
-rw-r--r--includes/pear/PEAR/Start.php427
1 files changed, 427 insertions, 0 deletions
diff --git a/includes/pear/PEAR/Start.php b/includes/pear/PEAR/Start.php
new file mode 100644
index 0000000..da69246
--- /dev/null
+++ b/includes/pear/PEAR/Start.php
@@ -0,0 +1,427 @@
+<?php
+require_once 'PEAR.php';
+require_once 'System.php';
+require_once 'PEAR/Config.php';
+require_once 'PEAR/Command.php';
+require_once 'PEAR/Common.php';
+class PEAR_Start extends PEAR
+{
+ var $bin_dir;
+ var $data_dir;
+ var $cfg_dir;
+ var $www_dir;
+ var $install_pfc;
+ var $corePackages =
+ array(
+ 'Archive_Tar',
+ 'Console_Getopt',
+ 'PEAR',
+ 'Structures_Graph',
+ 'XML_Util',
+ );
+ var $local_dir = array();
+ var $origpwd;
+ var $pfc_packages = array(
+ 'DB',
+ 'Net_Socket',
+ 'Net_SMTP',
+ 'Mail',
+ 'XML_Parser',
+ 'XML_RPC',
+ 'PHPUnit'
+ );
+ var $php_dir;
+ var $php_bin;
+ var $pear_conf;
+ var $validPHPBin = false;
+ var $test_dir;
+ var $download_dir;
+ var $temp_dir;
+ var $config =
+ array(
+ 'prefix',
+ 'bin_dir',
+ 'php_dir',
+ 'doc_dir',
+ 'data_dir',
+ 'cfg_dir',
+ 'www_dir',
+ 'test_dir',
+ 'temp_dir',
+ 'download_dir',
+ 'pear_conf',
+ );
+ var $prefix;
+ var $progress = 0;
+ var $configPrompt =
+ array(
+ 'prefix' => 'Installation base ($prefix)',
+ 'temp_dir' => 'Temporary directory for processing',
+ 'download_dir' => 'Temporary directory for downloads',
+ 'bin_dir' => 'Binaries directory',
+ 'php_dir' => 'PHP code directory ($php_dir)',
+ 'doc_dir' => 'Documentation directory',
+ 'data_dir' => 'Data directory',
+ 'cfg_dir' => 'User-modifiable configuration files directory',
+ 'www_dir' => 'Public Web Files directory',
+ 'test_dir' => 'Tests directory',
+ 'pear_conf' => 'Name of configuration file',
+ );
+
+ var $localInstall;
+ var $PEARConfig;
+ var $tarball = array();
+
+ function PEAR_Start()
+ {
+ parent::PEAR();
+ if (OS_WINDOWS) {
+ $this->configPrompt['php_bin'] = 'Path to CLI php.exe';
+ $this->config[] = 'php_bin';
+ $this->prefix = getcwd();
+
+ if (!@is_dir($this->prefix)) {
+ if (@is_dir('c:\php5')) {
+ $this->prefix = 'c:\php5';
+ } elseif (@is_dir('c:\php4')) {
+ $this->prefix = 'c:\php4';
+ } elseif (@is_dir('c:\php')) {
+ $this->prefix = 'c:\php';
+ }
+ }
+
+ $slash = "\\";
+ if (strrpos($this->prefix, '\\') === (strlen($this->prefix) - 1)) {
+ $slash = '';
+ }
+
+ $this->localInstall = false;
+ $this->bin_dir = '$prefix';
+ $this->temp_dir = '$prefix' . $slash . 'tmp';
+ $this->download_dir = '$prefix' . $slash . 'tmp';
+ $this->php_dir = '$prefix' . $slash . 'pear';
+ $this->doc_dir = '$prefix' . $slash . 'docs';
+ $this->data_dir = '$prefix' . $slash . 'data';
+ $this->test_dir = '$prefix' . $slash . 'tests';
+ $this->www_dir = '$prefix' . $slash . 'www';
+ $this->cfg_dir = '$prefix' . $slash . 'cfg';
+ $this->pear_conf = PEAR_CONFIG_SYSCONFDIR . '\\pear.ini';
+ /*
+ * Detects php.exe
+ */
+ $this->validPHPBin = true;
+ if ($t = $this->safeGetenv('PHP_PEAR_PHP_BIN')) {
+ $this->php_bin = dirname($t);
+ } elseif ($t = $this->safeGetenv('PHP_BIN')) {
+ $this->php_bin = dirname($t);
+ } elseif ($t = System::which('php')) {
+ $this->php_bin = dirname($t);
+ } elseif (is_file($this->prefix . '\cli\php.exe')) {
+ $this->php_bin = $this->prefix . '\cli';
+ } elseif (is_file($this->prefix . '\php.exe')) {
+ $this->php_bin = $this->prefix;
+ }
+ $phpexe = OS_WINDOWS ? '\\php.exe' : '/php';
+ if ($this->php_bin && !is_file($this->php_bin . $phpexe)) {
+ $this->php_bin = '';
+ } else {
+ if (strpos($this->php_bin, ':') === 0) {
+ $this->php_bin = getcwd() . DIRECTORY_SEPARATOR . $this->php_bin;
+ }
+ }
+ if (!is_file($this->php_bin . $phpexe)) {
+ if (is_file('c:/php/cli/php.exe')) {
+ $this->php_bin = 'c"\\php\\cli';
+ } elseif (is_file('c:/php5/php.exe')) {
+ $this->php_bin = 'c:\\php5';
+ } elseif (is_file('c:/php4/cli/php.exe')) {
+ $this->php_bin = 'c:\\php4\\cli';
+ } else {
+ $this->validPHPBin = false;
+ }
+ }
+ } else {
+ $this->prefix = dirname(PHP_BINDIR);
+ $this->pear_conf = PEAR_CONFIG_SYSCONFDIR . '/pear.conf';
+ if (get_current_user() != 'root') {
+ $this->prefix = $this->safeGetenv('HOME') . '/pear';
+ $this->pear_conf = $this->safeGetenv('HOME') . '.pearrc';
+ }
+ $this->bin_dir = '$prefix/bin';
+ $this->php_dir = '$prefix/share/pear';
+ $this->temp_dir = '/tmp/pear/install';
+ $this->download_dir = '/tmp/pear/install';
+ $this->doc_dir = '$prefix/docs';
+ $this->www_dir = '$prefix/www';
+ $this->cfg_dir = '$prefix/cfg';
+ $this->data_dir = '$prefix/data';
+ $this->test_dir = '$prefix/tests';
+ // check if the user has installed PHP with PHP or GNU layout
+ if (@is_dir("$this->prefix/lib/php/.registry")) {
+ $this->php_dir = '$prefix/lib/php';
+ } elseif (@is_dir("$this->prefix/share/pear/lib/.registry")) {
+ $this->php_dir = '$prefix/share/pear/lib';
+ $this->doc_dir = '$prefix/share/pear/docs';
+ $this->data_dir = '$prefix/share/pear/data';
+ $this->test_dir = '$prefix/share/pear/tests';
+ } elseif (@is_dir("$this->prefix/share/php/.registry")) {
+ $this->php_dir = '$prefix/share/php';
+ }
+ }
+ }
+
+ function safeGetenv($var)
+ {
+ if (is_array($_ENV) && isset($_ENV[$var])) {
+ return $_ENV[$var];
+ }
+
+ return getenv($var);
+ }
+
+ function show($stuff)
+ {
+ print $stuff;
+ }
+
+ function locatePackagesToInstall()
+ {
+ $dp = @opendir(dirname(__FILE__) . '/go-pear-tarballs');
+ if (empty($dp)) {
+ return PEAR::raiseError("while locating packages to install: opendir('" .
+ dirname(__FILE__) . "/go-pear-tarballs') failed");
+ }
+
+ $potentials = array();
+ while (false !== ($entry = readdir($dp))) {
+ if ($entry{0} == '.' || !in_array(substr($entry, -4), array('.tar', '.tgz'))) {
+ continue;
+ }
+ $potentials[] = $entry;
+ }
+
+ closedir($dp);
+ $notfound = array();
+ foreach ($this->corePackages as $package) {
+ foreach ($potentials as $i => $candidate) {
+ if (preg_match('/^' . $package . '-' . _PEAR_COMMON_PACKAGE_VERSION_PREG
+ . '\.(tar|tgz)\\z/', $candidate)) {
+ $this->tarball[$package] = dirname(__FILE__) . '/go-pear-tarballs/' . $candidate;
+ unset($potentials[$i]);
+ continue 2;
+ }
+ }
+
+ $notfound[] = $package;
+ }
+
+ if (count($notfound)) {
+ return PEAR::raiseError("No tarballs found for core packages: " .
+ implode(', ', $notfound));
+ }
+
+ $this->tarball = array_merge($this->tarball, $potentials);
+ }
+
+ function setupTempStuff()
+ {
+ if (!($this->ptmp = System::mktemp(array('-d')))) {
+ $this->show("System's Tempdir failed, trying to use \$prefix/tmp ...");
+ $res = System::mkDir(array($this->prefix . '/tmp'));
+ if (!$res) {
+ return PEAR::raiseError('mkdir ' . $this->prefix . '/tmp ... failed');
+ }
+
+ $_temp = tempnam($this->prefix . '/tmp', 'gope');
+ System::rm(array('-rf', $_temp));
+ System::mkdir(array('-p','-m', '0700', $_temp));
+ $this->ptmp = $this->prefix . '/tmp';
+ $ok = @chdir($this->ptmp);
+
+ if (!$ok) { // This should not happen, really ;)
+ $this->bail('chdir ' . $this->ptmp . ' ... failed');
+ }
+
+ print "ok\n";
+
+ // Adjust TEMPDIR envvars
+ if (!isset($_ENV)) {
+ $_ENV = array();
+ };
+ $_ENV['TMPDIR'] = $_ENV['TEMP'] = $this->prefix . '/tmp';
+ }
+
+ return @chdir($this->ptmp);
+ }
+
+ /**
+ * Try to detect the kind of SAPI used by the
+ * the given php.exe.
+ * @author Pierrre-Alain Joye
+ */
+ function win32DetectPHPSAPI()
+ {
+ if ($this->php_bin != '') {
+ if (OS_WINDOWS) {
+ exec('"' . $this->php_bin . '\\php.exe" -v', $res);
+ } else {
+ exec('"' . $this->php_bin . '/php" -v', $res);
+ }
+
+ if (is_array($res)) {
+ if (isset($res[0]) && strpos($res[0],"(cli)")) {
+ return 'cli';
+ }
+
+ if (isset($res[0]) && strpos($res[0],"cgi")) {
+ return 'cgi';
+ }
+
+ if (isset($res[0]) && strpos($res[0],"cgi-fcgi")) {
+ return 'cgi';
+ }
+
+ return 'unknown';
+ }
+ }
+
+ return 'unknown';
+ }
+
+ function doInstall()
+ {
+ print "Beginning install...\n";
+ // finish php_bin config
+ if (OS_WINDOWS) {
+ $this->php_bin .= '\\php.exe';
+ } else {
+ $this->php_bin .= '/php';
+ }
+ $this->PEARConfig = &PEAR_Config::singleton($this->pear_conf, $this->pear_conf);
+ $this->PEARConfig->set('preferred_state', 'stable');
+ foreach ($this->config as $var) {
+ if ($var == 'pear_conf' || $var == 'prefix') {
+ continue;
+ }
+ $this->PEARConfig->set($var, $this->$var);
+ }
+
+ $this->PEARConfig->store();
+// $this->PEARConfig->set('verbose', 6);
+ print "Configuration written to $this->pear_conf...\n";
+ $this->registry = &$this->PEARConfig->getRegistry();
+ print "Initialized registry...\n";
+ $install = &PEAR_Command::factory('install', $this->PEARConfig);
+ print "Preparing to install...\n";
+ $options = array(
+ 'nodeps' => true,
+ 'force' => true,
+ 'upgrade' => true,
+ );
+ foreach ($this->tarball as $pkg => $src) {
+ print "installing $src...\n";
+ }
+ $install->run('install', $options, array_values($this->tarball));
+ }
+
+ function postProcessConfigVars()
+ {
+ foreach ($this->config as $n => $var) {
+ for ($m = 1; $m <= count($this->config); $m++) {
+ $var2 = $this->config[$m];
+ $this->$var = str_replace('$'.$var2, $this->$var2, $this->$var);
+ }
+ }
+
+ foreach ($this->config as $var) {
+ $dir = $this->$var;
+
+ if (!preg_match('/_dir\\z/', $var)) {
+ continue;
+ }
+
+ if (!@is_dir($dir)) {
+ if (!System::mkDir(array('-p', $dir))) {
+ $root = OS_WINDOWS ? 'administrator' : 'root';
+ return PEAR::raiseError("Unable to create {$this->configPrompt[$var]} $dir.
+Run this script as $root or pick another location.\n");
+ }
+ }
+ }
+ }
+
+ /**
+ * Get the php.ini file used with the current
+ * process or with the given php.exe
+ *
+ * Horrible hack, but well ;)
+ *
+ * Not used yet, will add the support later
+ * @author Pierre-Alain Joye <paj@pearfr.org>
+ */
+ function getPhpiniPath()
+ {
+ $pathIni = get_cfg_var('cfg_file_path');
+ if ($pathIni && is_file($pathIni)) {
+ return $pathIni;
+ }
+
+ // Oh well, we can keep this too :)
+ // I dunno if get_cfg_var() is safe on every OS
+ if (OS_WINDOWS) {
+ // on Windows, we can be pretty sure that there is a php.ini
+ // file somewhere
+ do {
+ $php_ini = PHP_CONFIG_FILE_PATH . DIRECTORY_SEPARATOR . 'php.ini';
+ if (@file_exists($php_ini)) {
+ break;
+ }
+ $php_ini = 'c:\winnt\php.ini';
+ if (@file_exists($php_ini)) {
+ break;
+ }
+ $php_ini = 'c:\windows\php.ini';
+ } while (false);
+ } else {
+ $php_ini = PHP_CONFIG_FILE_PATH . DIRECTORY_SEPARATOR . 'php.ini';
+ }
+
+ if (@is_file($php_ini)) {
+ return $php_ini;
+ }
+
+ // We re running in hackz&troubles :)
+ ob_implicit_flush(false);
+ ob_start();
+ phpinfo(INFO_GENERAL);
+ $strInfo = ob_get_contents();
+ ob_end_clean();
+ ob_implicit_flush(true);
+
+ if (php_sapi_name() != 'cli') {
+ $strInfo = strip_tags($strInfo,'<td>');
+ $arrayInfo = explode("</td>", $strInfo );
+ $cli = false;
+ } else {
+ $arrayInfo = explode("\n", $strInfo);
+ $cli = true;
+ }
+
+ foreach ($arrayInfo as $val) {
+ if (strpos($val,"php.ini")) {
+ if ($cli) {
+ list(,$pathIni) = explode('=>', $val);
+ } else {
+ $pathIni = strip_tags(trim($val));
+ }
+ $pathIni = trim($pathIni);
+ if (is_file($pathIni)) {
+ return $pathIni;
+ }
+ }
+ }
+
+ return false;
+ }
+}
+?>