2000-07-24 08:05:51 +00:00
|
|
|
<?php
|
|
|
|
//
|
|
|
|
// +----------------------------------------------------------------------+
|
|
|
|
// | PHP version 4.0 |
|
|
|
|
// +----------------------------------------------------------------------+
|
2001-01-10 01:01:59 +00:00
|
|
|
// | Copyright (c) 1997-2001 The PHP Group |
|
2000-07-24 08:05:51 +00:00
|
|
|
// +----------------------------------------------------------------------+
|
|
|
|
// | This source file is subject to version 2.02 of the PHP license, |
|
|
|
|
// | that is bundled with this package in the file LICENSE, and is |
|
|
|
|
// | available at through the world-wide-web at |
|
|
|
|
// | http://www.php.net/license/2_02.txt. |
|
|
|
|
// | If you did not receive a copy of the PHP license and are unable to |
|
|
|
|
// | obtain it through the world-wide-web, please send a note to |
|
|
|
|
// | license@php.net so we can mail you a copy immediately. |
|
|
|
|
// +----------------------------------------------------------------------+
|
|
|
|
// | Authors: Stig Bakken <ssb@fast.no> |
|
2001-07-18 17:29:09 +00:00
|
|
|
// | Tomas V.V.Cox <cox@idecnet.com> |
|
2001-07-19 11:15:48 +00:00
|
|
|
// | |
|
2000-07-24 08:05:51 +00:00
|
|
|
// +----------------------------------------------------------------------+
|
|
|
|
//
|
2001-07-18 17:29:09 +00:00
|
|
|
// $Id$
|
2000-07-24 08:05:51 +00:00
|
|
|
|
2001-10-07 20:16:41 +00:00
|
|
|
require_once 'PEAR/Common.php';
|
2000-07-24 08:05:51 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Administration class used to install PEAR packages and maintain the
|
2001-04-17 01:17:59 +00:00
|
|
|
* installed package database.
|
2000-07-24 08:05:51 +00:00
|
|
|
*
|
2001-07-18 17:29:09 +00:00
|
|
|
* TODO:
|
2001-10-07 20:16:41 +00:00
|
|
|
* - finish and test Windows support
|
|
|
|
* - kill FIXME's
|
2001-07-18 17:29:09 +00:00
|
|
|
*
|
2000-07-24 08:05:51 +00:00
|
|
|
* @since PHP 4.0.2
|
|
|
|
* @author Stig Bakken <ssb@fast.no>
|
|
|
|
*/
|
2001-04-22 01:09:14 +00:00
|
|
|
class PEAR_Installer extends PEAR_Common
|
2001-01-08 02:45:30 +00:00
|
|
|
{
|
2000-07-24 08:05:51 +00:00
|
|
|
// {{{ properties
|
|
|
|
|
|
|
|
/** name of the package directory, for example Foo-1.0 */
|
|
|
|
var $pkgdir;
|
|
|
|
|
|
|
|
/** directory where PHP code files go */
|
2001-04-17 01:17:59 +00:00
|
|
|
var $phpdir;
|
2000-07-24 08:05:51 +00:00
|
|
|
|
|
|
|
/** directory where PHP extension files go */
|
2001-04-17 01:17:59 +00:00
|
|
|
var $extdir;
|
2000-07-24 08:05:51 +00:00
|
|
|
|
|
|
|
/** directory where documentation goes */
|
2001-04-17 01:17:59 +00:00
|
|
|
var $docdir;
|
|
|
|
|
2000-07-24 08:05:51 +00:00
|
|
|
/** directory where the package wants to put files, relative
|
|
|
|
* to one of the three previous dirs
|
|
|
|
*/
|
|
|
|
var $destdir = '';
|
|
|
|
|
2001-05-15 14:15:09 +00:00
|
|
|
/** debug level (integer) */
|
|
|
|
var $debug = 1;
|
2000-07-24 08:05:51 +00:00
|
|
|
|
|
|
|
/** temporary directory */
|
|
|
|
var $tmpdir;
|
|
|
|
|
|
|
|
// }}}
|
|
|
|
|
|
|
|
// {{{ constructor
|
|
|
|
|
2001-04-17 01:17:59 +00:00
|
|
|
function PEAR_Installer($phpdir = PEAR_INSTALL_DIR,
|
|
|
|
$extdir = PEAR_EXTENSION_DIR,
|
|
|
|
$docdir = '')
|
|
|
|
{
|
2001-05-15 14:03:04 +00:00
|
|
|
$this->PEAR();
|
2001-04-17 01:17:59 +00:00
|
|
|
$this->phpdir = $phpdir;
|
|
|
|
$this->extdir = $extdir;
|
|
|
|
$this->docdir = $docdir;
|
|
|
|
$this->statedir = "/var/lib/php"; // XXX FIXME Windows
|
2000-07-24 08:05:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// }}}
|
|
|
|
// {{{ destructor
|
|
|
|
|
2001-05-15 14:03:04 +00:00
|
|
|
function _PEAR_Installer()
|
|
|
|
{
|
2001-07-18 17:29:09 +00:00
|
|
|
chdir($this->pwd);
|
2001-05-15 14:03:04 +00:00
|
|
|
$this->_PEAR_Common();
|
2000-07-24 08:05:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// }}}
|
|
|
|
// {{{ install()
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Installs the files within the package file specified.
|
|
|
|
*
|
|
|
|
* @param $pkgfile path to the package file
|
|
|
|
*
|
|
|
|
* @return bool true if successful, false if not
|
|
|
|
*/
|
2001-07-18 17:29:09 +00:00
|
|
|
|
2001-05-15 14:03:04 +00:00
|
|
|
function install($pkgfile)
|
2001-07-18 17:29:09 +00:00
|
|
|
{
|
|
|
|
// XXX FIXME Add here code to manage packages database
|
|
|
|
//$this->loadPackageList("$this->statedir/packages.lst");
|
|
|
|
$this->pwd = getcwd();
|
|
|
|
$need_download = false;
|
|
|
|
if (preg_match('#^(http|ftp)://#', $pkgfile)) {
|
|
|
|
$need_download = true;
|
|
|
|
} elseif (!@is_file($pkgfile)) {
|
2001-07-19 11:15:48 +00:00
|
|
|
return $this->raiseError("Could not open the package file: $pkgfile");
|
2001-07-18 17:29:09 +00:00
|
|
|
}
|
2001-10-08 06:12:13 +00:00
|
|
|
|
2001-07-18 17:29:09 +00:00
|
|
|
// Download package -----------------------------------------------
|
|
|
|
if ($need_download) {
|
|
|
|
$file = basename($pkgfile);
|
2001-10-08 06:12:13 +00:00
|
|
|
if (PEAR::isError($downloaddir = $this->mkTempDir())) {
|
|
|
|
return $downloaddir;
|
2001-07-18 17:29:09 +00:00
|
|
|
}
|
2001-10-08 06:12:13 +00:00
|
|
|
$this->log(2, '+ tmp dir created at ' . $downloaddir);
|
|
|
|
$downloadfile = $downloaddir . DIRECTORY_SEPARATOR . $file;
|
2001-07-18 17:29:09 +00:00
|
|
|
$this->log(1, "downloading $pkgfile ...");
|
|
|
|
if (!$fp = @fopen($pkgfile, 'r')) {
|
|
|
|
return $this->raiseError("$pkgfile: failed to download ($php_errormsg)");
|
|
|
|
}
|
|
|
|
if (!$wp = @fopen($downloadfile, 'w')) {
|
|
|
|
return $this->raiseError("$downloadfile: write failed ($php_errormsg)");
|
|
|
|
}
|
|
|
|
$bytes = 0;
|
|
|
|
while ($data = @fread($fp, 16384)) {
|
|
|
|
$bytes += strlen($data);
|
|
|
|
if (!@fwrite($wp, $data)) {
|
|
|
|
return $this->raiseError("$downloadfile: write failed ($php_errormsg)");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$pkgfile = $downloadfile;
|
|
|
|
fclose($fp);
|
|
|
|
fclose($wp);
|
|
|
|
$this->log(1, '...done: ' . number_format($bytes, 0, '', ',') . ' bytes');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Decompress pack in tmp dir -------------------------------------
|
2001-07-18 23:13:56 +00:00
|
|
|
|
|
|
|
// To allow relative package file calls
|
|
|
|
if (!chdir(dirname($pkgfile))) {
|
|
|
|
return $this->raiseError('Unable to chdir to pakage directory');
|
|
|
|
}
|
|
|
|
$pkgfile = getcwd() . DIRECTORY_SEPARATOR . basename($pkgfile);
|
|
|
|
|
2001-10-08 06:12:13 +00:00
|
|
|
if (PEAR::isError($tmpdir = $this->mkTempDir())) {
|
|
|
|
return $tmpdir;
|
2001-07-18 17:29:09 +00:00
|
|
|
}
|
2001-10-08 06:12:13 +00:00
|
|
|
$this->log(2, '+ tmp dir created at ' . $tmpdir);
|
2001-10-07 20:16:41 +00:00
|
|
|
|
|
|
|
$tar = new Archive_Tar($pkgfile, true);
|
2001-10-08 06:12:13 +00:00
|
|
|
if (!$tar->extract($tmpdir)) {
|
2001-10-07 20:16:41 +00:00
|
|
|
return $this->raiseError("Unable to unpack $pkgfile");
|
2001-07-18 23:13:56 +00:00
|
|
|
}
|
2001-10-07 20:16:41 +00:00
|
|
|
$file = basename($pkgfile);
|
|
|
|
// Assume the decompressed dir name
|
|
|
|
if (($pos = strrpos($file, '.')) === false) {
|
|
|
|
return $this->raiseError('package doesn\'t follow the package name convention');
|
2001-07-18 23:13:56 +00:00
|
|
|
}
|
2001-10-07 20:16:41 +00:00
|
|
|
$pkgdir = substr($file, 0, $pos);
|
2001-10-08 06:12:13 +00:00
|
|
|
$descfile = $tmpdir . DIRECTORY_SEPARATOR . $pkgdir . DIRECTORY_SEPARATOR . 'package.xml';
|
2001-10-07 20:16:41 +00:00
|
|
|
|
|
|
|
if (!is_file($descfile)) {
|
2001-07-18 17:29:09 +00:00
|
|
|
return $this->raiseError("No package.xml file after extracting the archive.");
|
|
|
|
}
|
|
|
|
|
|
|
|
// Parse xml file -----------------------------------------------
|
|
|
|
$pkginfo = $this->infoFromDescriptionFile($descfile);
|
|
|
|
if (PEAR::isError($pkginfo)) {
|
|
|
|
return $pkginfo;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Copy files to dest dir ---------------------------------------
|
|
|
|
if (!is_dir($this->phpdir)) {
|
|
|
|
return $this->raiseError("No script destination directory found\n",
|
|
|
|
null, PEAR_ERROR_DIE);
|
|
|
|
}
|
2001-07-18 23:13:56 +00:00
|
|
|
$tmp_path = dirname($descfile);
|
2001-07-18 17:29:09 +00:00
|
|
|
foreach ($pkginfo['filelist'] as $fname => $atts) {
|
2001-08-01 13:24:55 +00:00
|
|
|
$dest_dir = $this->phpdir . DIRECTORY_SEPARATOR;
|
2001-08-27 21:25:16 +00:00
|
|
|
if (isset($atts['BASEINSTALLDIR'])) {
|
|
|
|
$dest_dir .= $atts['BASEINSTALLDIR'] . DIRECTORY_SEPARATOR;
|
2001-08-01 13:24:55 +00:00
|
|
|
}
|
|
|
|
if (dirname($fname) != '.') {
|
|
|
|
$dest_dir .= dirname($fname) . DIRECTORY_SEPARATOR;
|
|
|
|
}
|
2001-07-18 23:13:56 +00:00
|
|
|
$fname = $tmp_path . DIRECTORY_SEPARATOR . $fname;
|
2001-08-01 13:24:55 +00:00
|
|
|
$this->_installFile($fname, $dest_dir, $atts);
|
2001-07-18 17:29:09 +00:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2001-08-27 21:25:16 +00:00
|
|
|
// }}}
|
|
|
|
|
|
|
|
// {{{ _installFile()
|
|
|
|
|
2001-08-01 13:24:55 +00:00
|
|
|
function _installFile($file, $dest_dir, $atts)
|
2001-07-18 17:29:09 +00:00
|
|
|
{
|
2001-08-27 21:25:16 +00:00
|
|
|
$type = strtolower($atts['ROLE']);
|
2001-07-18 17:29:09 +00:00
|
|
|
switch ($type) {
|
2001-10-09 02:56:33 +00:00
|
|
|
case 'test':
|
2001-07-18 17:29:09 +00:00
|
|
|
// don't install test files for now
|
|
|
|
$this->log(2, "+ Test file $file won't be installed yet");
|
|
|
|
return true;
|
|
|
|
break;
|
|
|
|
case 'doc':
|
|
|
|
case 'php':
|
|
|
|
default:
|
2001-08-01 13:24:55 +00:00
|
|
|
$dest_file = $dest_dir . basename($file);
|
2001-07-18 17:29:09 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!@is_dir($dest_dir)) {
|
|
|
|
if (!$this->mkDirHier($dest_dir)) {
|
|
|
|
$this->log(0, "failed to mkdir $dest_dir");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
$this->log(2, "+ created dir $dest_dir");
|
|
|
|
}
|
2001-08-19 12:30:24 +00:00
|
|
|
$orig_perms = fileperms($file);
|
2001-07-18 17:29:09 +00:00
|
|
|
if (!@copy($file, $dest_file)) {
|
|
|
|
$this->log(0, "failed to copy $file to $dest_file");
|
|
|
|
return false;
|
|
|
|
}
|
2001-08-19 12:30:24 +00:00
|
|
|
chmod($dest_file, $orig_perms);
|
2001-07-18 17:29:09 +00:00
|
|
|
$this->log(2, "+ copy $file to $dest_file");
|
|
|
|
// FIXME Update Package database here
|
|
|
|
//$this->updatePackageListFrom("$d/$file");
|
|
|
|
$this->log(1, "installed file $dest_file");
|
|
|
|
return true;
|
|
|
|
}
|
2000-07-24 08:05:51 +00:00
|
|
|
// }}}
|
|
|
|
}
|
2001-07-19 11:15:48 +00:00
|
|
|
?>
|