PageRenderTime 28ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/install-pear.php

#
PHP | 306 lines | 270 code | 21 blank | 15 comment | 75 complexity | 1e5c9b1d2be2bc982f4e71247d9c16b5 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, BSD-2-Clause, LGPL-2.1
  1. <?php
  2. while (@ob_end_flush());
  3. /* $Id$ */
  4. error_reporting(1803);
  5. if (ini_get('date.timezone') === '' && function_exists('date_default_timezone_set')) {
  6. date_default_timezone_set('UTC');
  7. }
  8. $pear_dir = dirname(__FILE__);
  9. ini_set('include_path', '');
  10. if (function_exists('mb_internal_encoding')) {
  11. mb_internal_encoding('ASCII');
  12. }
  13. set_time_limit(0);
  14. include_once 'PEAR.php';
  15. include_once 'PEAR/Installer.php';
  16. include_once 'PEAR/Registry.php';
  17. include_once 'PEAR/PackageFile.php';
  18. include_once 'PEAR/Downloader/Package.php';
  19. include_once 'PEAR/Frontend.php';
  20. $a = true;
  21. if (!PEAR::loadExtension('xml')) {
  22. $a = false;
  23. echo "[PEAR] xml extension is required\n";
  24. }
  25. if (!PEAR::loadExtension('pcre')) {
  26. $a = false;
  27. echo "[PEAR] pcre extension is required\n";
  28. }
  29. if (!$a) {
  30. return -1;
  31. }
  32. $force = false;
  33. $install_files = array();
  34. array_shift($argv);
  35. $debug = false;
  36. for ($i = 0; $i < sizeof($argv); $i++) {
  37. $arg = $argv[$i];
  38. $bn = basename($arg);
  39. if (preg_match('/package-(.*)\.xml$/', $bn, $matches) ||
  40. preg_match('/([A-Za-z0-9_:]+)-.*\.(tar|tgz)$/', $bn, $matches)) {
  41. $install_files[$matches[1]] = $arg;
  42. } elseif ($arg == '-a') {
  43. $cache_dir = $argv[$i+1];
  44. $i++;
  45. } elseif ($arg == '--force') {
  46. $force = true;
  47. } elseif ($arg == '-dp') {
  48. $prefix = $argv[$i+1];
  49. $i++;
  50. } elseif ($arg == '-ds') {
  51. $suffix = $argv[$i+1];
  52. $i++;
  53. } elseif ($arg == '-d') {
  54. $with_dir = $argv[$i+1];
  55. $i++;
  56. } elseif ($arg == '-b') {
  57. $bin_dir = $argv[$i+1];
  58. $i++;
  59. } elseif ($arg == '-c') {
  60. $cfg_dir = $argv[$i+1];
  61. $i++;
  62. } elseif ($arg == '-w') {
  63. $www_dir = $argv[$i+1];
  64. $i++;
  65. } elseif ($arg == '-p') {
  66. $php_bin = $argv[$i+1];
  67. $i++;
  68. } elseif ($arg == '-o') {
  69. $download_dir = $argv[$i+1];
  70. $i++;
  71. } elseif ($arg == '-t') {
  72. $temp_dir = $argv[$i+1];
  73. $i++;
  74. } elseif ($arg == '-D') {
  75. $doc_dir = $argv[$i+1];
  76. $i++;
  77. } elseif ($arg == '--debug') {
  78. $debug = 1;
  79. } elseif ($arg == '--extremedebug') {
  80. $debug = 2;
  81. }
  82. }
  83. $config = PEAR_Config::singleton();
  84. if (PEAR::isError($config)) {
  85. $locs = PEAR_Config::getDefaultConfigFiles();
  86. die("ERROR: One of $locs[user] or $locs[system] is corrupt, please remove them and try again");
  87. }
  88. // make sure we use only default values
  89. $config_layers = $config->getLayers();
  90. foreach ($config_layers as $layer) {
  91. if ($layer == 'default') continue;
  92. $config->removeLayer($layer);
  93. }
  94. $keys = $config->getKeys();
  95. if ($debug) {
  96. $config->set('verbose', 5, 'default');
  97. } else {
  98. $config->set('verbose', 0, 'default');
  99. }
  100. // PEAR executables
  101. if (!empty($bin_dir)) {
  102. $config->set('bin_dir', $bin_dir, 'default');
  103. }
  104. // Cache files
  105. if (!empty($cache_dir)) {
  106. $config->set('cache_dir', $cache_dir, 'default');
  107. }
  108. // Config files
  109. if (!empty($cfg_dir)) {
  110. $config->set('cfg_dir', $cfg_dir, 'default');
  111. }
  112. // Web files
  113. if (!empty($www_dir)) {
  114. $config->set('www_dir', $www_dir, 'default');
  115. }
  116. // Downloaded files
  117. if (!empty($download_dir)) {
  118. $config->set('download_dir', $download_dir, 'default');
  119. }
  120. // Temporary files
  121. if (!empty($temp_dir)) {
  122. $config->set('temp_dir', $temp_dir, 'default');
  123. }
  124. // Documentation files
  125. if (!empty($doc_dir)) {
  126. $config->set('doc_dir', $doc_dir, 'default');
  127. }
  128. // User supplied a dir prefix
  129. if (!empty($with_dir)) {
  130. $ds = DIRECTORY_SEPARATOR;
  131. $config->set('php_dir', $with_dir, 'default');
  132. if (empty($doc_dir)) {
  133. $config->set('doc_dir', $with_dir . $ds . 'doc', 'default');
  134. }
  135. $config->set('data_dir', $with_dir . $ds . 'data', 'default');
  136. $config->set('test_dir', $with_dir . $ds . 'test', 'default');
  137. if (empty($www_dir)) {
  138. $config->set('www_dir', $with_dir . $ds . 'htdocs', 'default');
  139. }
  140. if (empty($cfg_dir)) {
  141. $config->set('cfg_dir', $with_dir . $ds . 'cfg', 'default');
  142. }
  143. if (!is_writable($config->get('cache_dir'))) {
  144. include_once 'System.php';
  145. $cdir = System::mktemp(array('-d', 'pear'));
  146. if (PEAR::isError($cdir)) {
  147. $ui->outputData("[PEAR] cannot make new temporary directory: " . $cdir);
  148. die(1);
  149. }
  150. $oldcachedir = $config->get('cache_dir');
  151. $config->set('cache_dir', $cdir);
  152. }
  153. }
  154. // PHP executable
  155. if (!empty($php_bin)) {
  156. $config->set('php_bin', $php_bin);
  157. }
  158. // PHP prefix
  159. if (isset($prefix)) {
  160. if ($prefix != 'a') {
  161. if ($prefix[0] == 'a') {
  162. $prefix = substr($prefix, 1);
  163. }
  164. $config->set('php_prefix', $prefix, 'system');
  165. }
  166. }
  167. // PHP suffix
  168. if (isset($suffix)) {
  169. if ($suffix != 'a') {
  170. if ($suffix[0] == 'a') {
  171. $suffix = substr($suffix, 1);
  172. }
  173. $config->set('php_suffix', $suffix, 'system');
  174. }
  175. }
  176. /* Print PEAR Conf (useful for debuging do NOT REMOVE) */
  177. if ($debug) {
  178. sort($keys);
  179. foreach ($keys as $key) {
  180. echo $key . ' ' .
  181. $config->getPrompt($key) . ": " . $config->get($key, null, 'default') . "\n";
  182. }
  183. if ($debug == 2) { // extreme debugging
  184. exit;
  185. }
  186. }
  187. // end print
  188. $php_dir = $config->get('php_dir');
  189. $options = array();
  190. $options['upgrade'] = true;
  191. $install_root = getenv('INSTALL_ROOT');
  192. if (!empty($install_root)) {
  193. $options['packagingroot'] = $install_root;
  194. $reg = &new PEAR_Registry($options['packagingroot']);
  195. } else {
  196. $reg = $config->getRegistry('default');
  197. }
  198. $ui = PEAR_Frontend::singleton('PEAR_Frontend_CLI');
  199. if (PEAR::isError($ui)) {
  200. die($ui->getMessage());
  201. }
  202. $installer = new PEAR_Installer($ui);
  203. $pkg = new PEAR_PackageFile($config, $debug);
  204. foreach ($install_files as $package => $instfile) {
  205. $info = $pkg->fromAnyFile($instfile, PEAR_VALIDATE_INSTALLING);
  206. if (PEAR::isError($info)) {
  207. if (is_array($info->getUserInfo())) {
  208. foreach ($info->getUserInfo() as $err) {
  209. $ui->outputData(sprintf("[PEAR] %s: %s", $package, $err['message']));
  210. }
  211. }
  212. $ui->outputData(sprintf("[PEAR] %s: %s", $package, $info->getMessage()));
  213. continue;
  214. }
  215. $new_ver = $info->getVersion();
  216. $downloaderpackage = new PEAR_Downloader_Package($installer);
  217. $err = $downloaderpackage->initialize($instfile);
  218. if (PEAR::isError($err)) {
  219. $ui->outputData(sprintf("[PEAR] %s: %s", $package, $err->getMessage()));
  220. continue;
  221. }
  222. if ($reg->packageExists($package)) {
  223. $old_ver = $reg->packageInfo($package, 'version');
  224. if (version_compare($new_ver, $old_ver, 'gt')) {
  225. $installer->setOptions($options);
  226. $dp = array($downloaderpackage);
  227. $installer->setDownloadedPackages($dp);
  228. $err = $installer->install($downloaderpackage, $options);
  229. if (PEAR::isError($err)) {
  230. $ui->outputData(sprintf("[PEAR] %s: %s", $package, $err->getMessage()));
  231. continue;
  232. }
  233. $ui->outputData(sprintf("[PEAR] %-15s- upgraded: %s", $package, $new_ver));
  234. } else {
  235. if ($force) {
  236. $options['force'] = true;
  237. $installer->setOptions($options);
  238. $dp = array($downloaderpackage);
  239. $installer->setDownloadedPackages($dp);
  240. $err = $installer->install($downloaderpackage, $options);
  241. if (PEAR::isError($err)) {
  242. $ui->outputData(sprintf("[PEAR] %s: %s", $package, $err->getMessage()));
  243. continue;
  244. }
  245. $ui->outputData(sprintf("[PEAR] %-15s- installed: %s", $package, $new_ver));
  246. } else {
  247. $ui->outputData(sprintf("[PEAR] %-15s- already installed: %s", $package, $old_ver));
  248. }
  249. }
  250. } else {
  251. $options['nodeps'] = true;
  252. $installer->setOptions($options);
  253. $dp = array($downloaderpackage);
  254. $installer->setDownloadedPackages($dp);
  255. $err = $installer->install($downloaderpackage, $options);
  256. if (PEAR::isError($err)) {
  257. $ui->outputData(sprintf("[PEAR] %s: %s", $package, $err->getMessage()));
  258. continue;
  259. }
  260. $ui->outputData(sprintf("[PEAR] %-15s- installed: %s", $package, $new_ver));
  261. }
  262. if ($package == 'PEAR') {
  263. if (is_file($ufile = $config->getConfFile('user'))) {
  264. $ui->outputData('Warning! a PEAR user config file already exists from ' .
  265. 'a previous PEAR installation at ' .
  266. "'$ufile'. You may probably want to remove it.");
  267. }
  268. $config->set('verbose', 1, 'default');
  269. if (isset($oldcachedir)) {
  270. $config->set('cache_dir', $oldcachedir);
  271. }
  272. $data = array();
  273. foreach ($config->getKeys() as $key) {
  274. $data[$key] = $config->get($key);
  275. }
  276. $cnf_file = $config->getConfFile('system');
  277. if (!empty($install_root)) {
  278. $cnf_file = $install_root . DIRECTORY_SEPARATOR . $cnf_file;
  279. }
  280. $config->writeConfigFile($cnf_file, 'system', $data);
  281. $ui->outputData('Wrote PEAR system config file at: ' . $cnf_file);
  282. $ui->outputData('You may want to add: ' . $config->get('php_dir') . ' to your php.ini include_path');
  283. }
  284. }
  285. ?>