<?php
/*
package::i.tools
tiny installer
php-packages v1.0 - www.ipunkt.biz
(c) 2002 - www.ipunkt.biz (rok)
*/
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
class phi_package
{
var $package_files;
var $files;
var $is_phx = false;
function phi_package($file = '') {
if ( defined("PHX_STREAM") ) $this->is_phx = true;
if ( !$this->is_phx ) {
if ( $file == '') $this->package_files = $this->_getPHIPackages();
else {
if ( is_array($file) ) $this->package_files = $file;
else $this->package_files = array($file);
}
if ( empty($this->package_files) ) die('no package files found');
}
}
function extract() {
if ( !$this->is_phx ) {
foreach ( $this->package_files as $package_file ) {
$fp = fopen($package_file, 'rb');
if ( $fp ) $package_string = fread($fp, filesize($package_file));
fclose($fp);
$this->files[] = unserialize($package_string);
}
} else {
$this->files[] = unserialize(PHX_STREAM);
}
if ( $this->_decodeFiles() )
if ($this->writeFiles() ) {
$this->_do();
$this->_cleanup();
return true;
}
else return false;
else
return false;
}
function writeFiles() {
$p = 0;
foreach ( $this->files as $file ) {
for ($f=0; $f < $this->_getFileCountForPackage($p); $f++) {
if ( $file[$f]['path'] != '' ) $this->_mkdir($file[$f]['path']);
$path_to_file = ($file[$f]['path'] == '') ? $file[$f]['file'] : $file[$f]['path'].$file[$f]['file'];
$fp = fopen($path_to_file, 'wb');
if ( $fp ) fwrite($fp, $file[$f]['string'], $file[$f]['size']);
else return false;
fclose($fp);
}
$p++;
}
return true;
}
function _mkdir($path) {
if ( !is_dir($path) ) {
if ( !is_dir(dirname($path)) ) $this->_mkdir(dirname($path));
mkdir( $path, 0755);
}
}
function _getPHIPackages($ext = ".phi") {
$dir = @opendir( dirname(__FILE__) );
$phi_files = array();
while ( false !== ( $file = @readdir($dir) ) ) {
if ( strstr($file, $ext) ) $phi_files[] = $file;
}
@closedir($dir);
return $phi_files;
}
function _decodeFiles() {
for ($p=0; $p < count($this->files); $p++) {
for ($f=0; $f < $this->_getFileCountForPackage($p); $f++) {
$this->files[$p][$f]['string'] = base64_decode( $this->files[$p][$f]['string'] );
if ( $this->files[$p]['package']['config']['compress'] == 'gzip' ) {
if ( !function_exists("gzuncompress") || !extension_loaded('zlib') ) die("FATAL ERROR: missing zlib");
set_time_limit(5);
$this->files[$p][$f]['string'] = gzuncompress( $this->files[$p][$f]['string'] );
if ( $this->files[$p][$f]['string'] === false ) die("FATAL ERROR: could not uncompress");
}
}
}
return true;
}
function _getFileCountForPackage($p) {
$keys = array_keys($this->files[$p]);
foreach( $keys as $k => $v)
if ( !is_numeric($v) ) unset($keys[$k]);
return count($keys);
}
function _do() {
$do_files = '';
for ($f=0; $f < count($this->files); $f++) {
if ( is_array($this->files[$f]['package']['config']['do']) ) {
foreach ( $this->files[$f]['package']['config']['do'] as $file ) {
$do_files[] = $file;
}
}
}
if ( is_array($do_files) ) {
echo '<body onload="javascript:';
$i = 0;
foreach( $do_files as $do_file ) {
echo 'f'.$i.'=window.open(\''.$do_file.'\', \'f'.$i.'\', \'\'); ';
$i++;
}
echo '">';
} else
echo '<body>';
}
function _cleanup() {
$do_cleanup = '';
for ($f=0; $f < count($this->files); $f++) {
if ( is_array($this->files[$f]['package']['config']['cleanup']) ) {
foreach ( $this->files[$f]['package']['config']['cleanup'] as $file ) {
if ( $file === 'package' ) $do_cleanup[] = ( $this->is_phx ) ? __FILE__ : $this->package_files[$f];
elseif ( $file === 'installer' ) $do_cleanup[] = __FILE__;
else $do_cleanup[] = $file;
}
}
}
if ( is_array($do_cleanup) ) {
foreach( $do_cleanup as $do_file ) {
unlink($do_file);
}
}
}
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>php-package-installer v1.0</title>
</head>
<?
$phi = new phi_package();
if ( $phi->extract() ) echo "well done";
else echo "error occured";
?>
</body>
</html>
|