Файл: setuper.php
Строк: 555
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>PHP Setuper</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"/>
<meta name="Description" content="PHP Setuper. Copyright (c) Sergey Stepanov AKA Xintrea, 2005."/>
</head>
<body bgcolor="#FFFFFF" text="#101010" topmargin="10" leftmargin="10" rightmargin="10">
<BR>
<center>
<table WIDTH=450 BORDER=1 CELLPADDING=5 CELLSPACING=5>
<tr><td bgcolor=#5080FF align=center>
<B>PHP Setuper v.1.18</B>
</td></tr>
<tr><td>
<?php
global $HTTP_POST_VARS, $HTTP_GET_VARS;
if(isset($HTTP_GET_VARS)) RegisterGlobalVariables($HTTP_GET_VARS);
if(isset($HTTP_POST_VARS)) RegisterGlobalVariables($HTTP_POST_VARS);
if(isset($_GET)) RegisterGlobalVariables($_GET);
if(isset($_POST)) RegisterGlobalVariables($_POST);
$doc_name="setuper.php";
if(isset($setupstart) and isset($packagename) and isset($packagefile) and isset($packageurl))
{
if($setupstart==1)createsetup($doc_name,$packagename,$packagefile,$packageurl);
}
else printconfirm($doc_name);
function printconfirm($doc_name)
{
print '<BR>
Программа PHP Setuper сейчас создаст файл инсталляции.
Программа запомнит все файлы и дерево подкаталогов,
аккуратно сложит эти данные в один php-скрипт.<BR>
<BR>
Сгенерированный инсталляционный файл
можно запустить в другом месте, и все каталоги с файлами
будут распакованы так, как будто были извлечены из архива.<BR>
<BR>
Процесс упаковки может занять продолжительное время,
до нескольких минут.<BR>
<BR>
<BR>
<center>';
print '<form name="confirm" action="'.$doc_name.'?&setupstart=1" method="post">
<center>
<table width=85% border=0 CELLPADDING=5 CELLSPACING=5>
<tr><td valign="top">Название пакета</td>
<td valign="top">
<input type="text" size="32" name="packagename" value="Super Script by Author" class="inp"><BR><BR>
</td></tr>
<tr><td valign="top"><NOBR>Имя создаваемого</NOBR> файла</td>
<td valign="top">
<input type="text" size="32" name="packagefile" value="setup.php" class="inp"><BR><BR>
</td></tr>
<tr><td valign="top"><NOBR>Url первой страницы</NOBR></td>
<td valign="top">
<input type="text" size="32" name="packageurl" value="index.html" class="inp"><BR><BR>
</td></tr>
</table>
<BR>
<input type="submit" name="confirmbutton" value="Создать" class="btn">
</center>
</form>';
print '</center>';
}
function createsetup($doc_name,$packagename,$packagefile,$packageurl)
{
$startpath=realpath("./");
$log="";
$uk=@fopen($packagefile,"wt");
if($uk===false)
{
echo 'Ошибка! Права на каталог, в котором находится файл <b>setuper.php</b>,
не позволяют данному скрипту создать файл <b>setup.php</b><br/><br/>.
Установите нужные права на каталог <b>'.dirname(__FILE__).'</b>,
и снова в браузере запустите <b>setuper.php</b><br/><br/>';
return;
}
// Запись начала кода инсталляции
fputs($uk,setupcode_begin());
// Оформление данных как комментария
fputs($uk,"n<!--nn");
// Запись параметров пакета
fputs($uk,"[package]n");
fputs($uk,"name=".$packagename."n");
fputs($uk,"firsturl=".$packageurl."n");
fputs($uk,"setupfile=".$packagefile."nn");
// Запись дерева каталогов
fputs($uk,"[dirtree]n");
// Загрузка дерева каталогов и сразу вспоминание текущего каталога т.к.
// текущий каталог был изменен в функции get_dir_tree()
$filesindir= get_dir_tree(".");
chdir($startpath);
$log=$log."Saving directory tree...n";
for($i=0;$i<count($filesindir);$i++)
{
$log=$log.$filesindir[$i]."n";
$permit=substr(sprintf('%o', fileperms($filesindir[$i])), -4);
fputs($uk,"dir=".$permit." ".$filesindir[$i]."n");
}
echo "<BR>n";
fputs($uk,"n");
// Чтение списка файлов и сразу вспоминание текущего каталога т.к.
// текущий каталог изменяется в функции get_file_list()
$filesindir= get_file_list(".");
chdir($startpath);
// Сохранение файлов и их содержимого
$log=$log."nnSaving all finding files...n";
for($i=0;$i<count($filesindir);$i++)
{
$fname=$filesindir[$i];
// $fname=preg_replace("/^./(.*?)/","\1",$fname);
// Файлы генерации установки добавлять ненужно
if(strcmp($fname,"./".$packagefile)==0 or strcmp($fname,"./".$doc_name)==0)
continue;
$log=$log.$fname."n";
// $data=base64_encode(fread(fopen($fname, "rb"), filesize($fname)));
$data=base64_encode(gzdeflate(fread(fopen($fname, "rb"), filesize($fname))));
fputs($uk,"[filedata]n");
$permit=substr(sprintf('%o', fileperms($fname)), -4);
fputs($uk,"file=".$permit." ".$fname."n");
fputs($uk,"data=".$data."nn");
}
// Оформление данных как комментария
fputs($uk,"-->n");
// Запись конца кода инсталляции
fputs($uk,setupcode_end());
fclose($uk);
echo 'Генерация инсталляционного файла '.$packagefile.'<BR>';
echo '<center>
<form name="result" action="'.$doc_name.'" method="post"><BR>
<textarea name="text" cols="50" rows="10" class="inp">'.$log.'</textarea><BR><BR>
</form>
</center>';
echo 'Файл <B>'.$packagefile.'</B> сгенерирован.<br/><br/>
Он находится в том же каталоге, что и <B>'.$doc_name.'</B>.<br/>
<br/>
<br/>
<center>Спасибо, что воспользовались программой <nobr>PHP Setuper!</nobr><br/>
</center>';
}
function get_file_list($dir) {
$arrfiles = array();
if (is_dir($dir)) {
if ($handle = opendir($dir)) {
chdir($dir);
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
if (is_dir($file)) {
$arr = get_file_list($file);
foreach ($arr as $value) {
$arrfiles[] = $dir."/".$value;
}
} else {
$arrfiles[] = $dir."/".$file;
}
}
}
chdir("../");
}
closedir($handle);
}
return $arrfiles;
}
function get_dir_tree($dir)
{
$arrfiles = array();
if (is_dir($dir))
{
if ($handle = opendir($dir))
{
chdir($dir);
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != "..")
{
if (is_dir($file))
{
$arr = get_dir_tree($file);
$arrfiles[] = $dir."/".$file;
foreach ($arr as $value)
{
$arrfiles[] = $dir."/".$value;
}
}
}
}
chdir("../");
}
closedir($handle);
}
return $arrfiles;
}
function RegisterGlobalVariables($HTTP_VARS) {
if (isset($HTTP_VARS)) {
if (count($HTTP_VARS) > 0) {
if (get_magic_quotes_runtime() || get_magic_quotes_gpc()) {
for (reset($HTTP_VARS); current($HTTP_VARS); next($HTTP_VARS)) {
$var_name = key($HTTP_VARS);
$GLOBALS[$var_name] = stripslashes($HTTP_VARS[$var_name]);
}
}
else {
for (reset($HTTP_VARS); current($HTTP_VARS); next($HTTP_VARS)) {
$var_name = key($HTTP_VARS);
$GLOBALS[$var_name] = $HTTP_VARS[$var_name];
}
}
}
}
}
///////////////////////////////////////////////////////////////////////////////
// Код для инсталляции. Первая часть.
///////////////////////////////////////////////////////////////////////////////
function setupcode_begin()
{
$code='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>PHP Setuper</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body bgcolor="#FFFFFF" text="#101010" topmargin="10" leftmargin="10" rightmargin="10">
<BR>
<center>
<table WIDTH=450 BORDER=1 CELLPADDING=5 CELLSPACING=5>
<tr><td bgcolor=#5080FF align=center>
<B>PHP Setuper v.1.18 (Setup module)</B>
</td></tr>
<tr><td>
<?php
global $HTTP_POST_VARS, $HTTP_GET_VARS;
if(isset($HTTP_GET_VARS)) RegisterGlobalVariables($HTTP_GET_VARS);
if(isset($HTTP_POST_VARS)) RegisterGlobalVariables($HTTP_POST_VARS);
if(isset($_GET)) RegisterGlobalVariables($_GET);
if(isset($_POST)) RegisterGlobalVariables($_POST);
$doc_name=basename(__FILE__);
if(isset($setupstart))
{
if($setupstart==1)startsetup($doc_name);
}
else printconfirm($doc_name);
function printconfirm($doc_name)
{
print "<BR>
<center>
Установка <B>".getoneparam($doc_name,"package","name")."</B>.<BR>
</center>
<BR>
Сейчас будут созданы все необходимые файлы,
входящие в пакет <FONT COLOR=#757575>".getoneparam($doc_name,"package","name").".</FONT>
Для начала распаковки нажмите кнопку "Установить".<BR>
<BR>
<BR>";
print "<center>
<form name=confirm action=".$doc_name."?&setupstart=1 method=post>
<center>
<input type=submit name=confirmbutton value=Установить class=btn>
</center>
</form>
</center>";
print "<BR>
Процесс распаковки может занять продолжительное время,
до нескольких минут.<BR>
<BR>
<BR>";
}
function startsetup($doc_name)
{
$log="";
$is_error=false;
$log=$log."Create directory tree...n";
// Получение дерева директорий
$dirtree=getsavetree($doc_name);
if($dirtree===false)
$is_error=true;
// Создание дерева директорий
for($i=0;$i<count($dirtree);$i++)
{
$line=preparestring($dirtree[$i]);
$mode=substr($line,0,4);
$dirname=substr($line,5,strlen($line)-5);
$log=$log.$dirname."n";
// Создание каталога
// $result=@mkdir($dirname,octdec($mode));
$result=@mkdir($dirname, 0777);
if(!$result)
{
$log=$log."Каталог ".$dirname." не создан.nВозможно, этот каталог уже существует, или на каталог ".dirname(__FILE__)." заданы неправильные праваnn";
$is_error=true;
}
}
$log=$log."nCreate all files...n";
$result=findandcreatefile($doc_name);
$log.= $result["log"];
$is_error=$result["err"];
$log.="nSet permit to directories...n";
$log.=setpermittodir($dirtree);
echo "Распаковка файлов и директорий <BR>";
echo "<center>
<form name=result action=".$doc_name." method=post><BR>
<textarea name=text cols=50 rows=10 class=inp>".$log."</textarea><BR><BR>
</form>
</center>";
if(!$is_error)
{
echo "Пакет <B>".getoneparam($doc_name,"package","name")."</B> установлен.
Пожалуйста, не забудьте удалить файл инсталляции <B>".$doc_name."</B>.<BR>
<BR>";
// <input type=button name=confirmbutton value=Готово class=btn onClick="javascript:window.location.href=".getoneparam($doc_name,"package","firsturl")."">
echo "<center>
<BR>
<a href=".getoneparam($doc_name,"package","firsturl").">Перейти на первую страницу</br>установленного пакета</a><BR>
<BR>
<BR>
</center>";
}
else
echo "<b>При установке возникли ошибки.</b> Пакет не установлен. Проанализируйте вышеприведенный лог, и устраните ошибки.<br/><br/>";
echo "<center>Спасибо, что воспользовались программой <nobr>PHP Setuper!</nobr><BR>
</center>";
}
function getoneparam($doc_name,$rasdelname,$valname)
{
$uk=fopen($doc_name,"rt");
// Поиск начала данных
$findflag=0;
while(!feof($uk))
{
$line=fgets($uk,1000000);
if(strcmp(preparestring($line),"<!--")==0)
{
$findflag=1;
break;
}
}
// Если начало данных не найдено, печатается ошибка
if($findflag==0)
{
echo "Error! Start signature not found.";
fclose($uk);
return;
}
// Поиск названия секции
$findflag=0;
while(!feof($uk))
{
$line=fgets($uk,1000000);
if(strcmp(preparestring($line),"[".$rasdelname."]")==0)
{
$findflag=1;
break;
}
}
// Если название секции не найдено, печатается ошибка
if($findflag==0)
{
echo "Error! Section ".$rasdelname." not found.";
fclose($uk);
return;
}
// Поиск названия параметра
$findflag=0;
while(!feof($uk))
{
$line=fgets($uk,1000000);
$tmpline=substr(preparestring($line),0,strlen($valname)+1);
// echo $tmpline."<BR>n";
if(strcmp($tmpline,$valname."=")==0)
{
$findflag=1;
break;
}
}
// Если название параметра не найдено, печатается ошибка
if($findflag==0)
{
echo "Error! Parameter ".$valname." in section ".$rasdelname." not found.";
fclose($uk);
return;
}
$line=substr($line,strlen($valname)+1,strlen($line)-strlen($valname));
fclose($uk);
return $line;
}
function getsavetree($doc_name)
{
$uk=@fopen($doc_name,"rt");
if($uk===false)
{
echo "Error! Can not open file ".basename(__FILE__)." for reading. May be web-server disable reading contents from PHP-script";
return false;
}
// Поиск начала данных
$findflag=0;
while(!feof($uk))
{
$line=fgets($uk,1000000);
if(strcmp(preparestring($line),"<!--")==0)
{
$findflag=1;
break;
}
}
// Если начало данных не найдено, печатается ошибка
if($findflag==0)
{
echo "Error! Start signature not found.";
fclose($uk);
return false;
}
// Поиск названия секции
$findflag=0;
while(!feof($uk))
{
$line=fgets($uk,1000000);
if(strcmp(preparestring($line),"[dirtree]")==0)
{
$findflag=1;
break;
}
}
// Если название секции не найдено, печатается ошибка
if($findflag==0)
{
echo "Error! Section [dirtree] not found.";
fclose($uk);
return false;
}
// Поиск всех элементов dir
$valname="dir";
$i=-1;
while(!feof($uk))
{
$line=fgets($uk,1000000);
$tmpline=substr(preparestring($line),0,strlen($valname)+1);
// echo $tmpline."<BR>n";
if(strcmp($tmpline,$valname."=")==0)
{
$i=$i+1;
$dirtree[$i]=substr(preparestring($line),strlen($valname)+1,strlen($line)-strlen($valname)-1);
}
// После секции dirtree обязательно должна следовать секция filedata
// Если она найдена, поиск элементов прекращается
if(strcmp(preparestring($line),"[filedata]")==0)break;
}
if($i<0)
{
echo "Error! Section [dirtree] is empty";
fclose($uk);
return false;
}
fclose($uk);
return $dirtree;
}
function findandcreatefile($doc_name)
{
$uk=fopen($doc_name,"rt");
// Поиск начала данных
$findflag=0;
while(!feof($uk))
{
$line=fgets($uk,1000000);
if(strcmp(preparestring($line),"<!--")==0)
{
$findflag=1;
break;
}
}
// Если начало данных не найдено, печатается ошибка
if($findflag==0)
{
fclose($uk);
$result=array();
$result["log"]="Error! Start signature not found.";
$result["err"]=true;
return $result;
}
// Последовательно ищутся все разделы [file] до конца данных
$log="";
while(!feof($uk))
{
$line=fgets($uk,1000000);
// Если считана строка [filedata] то две следующие
// обязательно будут file и data
if(strcmp(preparestring($line),"[filedata]")==0)
{
$linefile=preparestring(fgets($uk,1000000));
$linedata=fgets($uk,1000000);
$valname="file";
$line=substr($linefile,strlen($valname)+1,strlen($linefile)-strlen($valname)-1);
$mode=substr($line,0,4);
$filename=substr($line,5,strlen($line)-5);
// $log=$log."Mode ".$mode." File name ".$filename."n";
$log=$log.$mode." ".$filename."n";
$valname="data";
$line=substr($linedata,strlen($valname)+1,strlen($linedata)-strlen($valname)-1);
// $data=base64_decode($line);
$data=gzinflate(base64_decode($line));
// Создание файла
$uk2=@fopen($filename,"wb");
if($uk2===false)
{
$result=array();
$result["log"]=$log."Ошибка. Невозможно создать файл ".$filename."nВозможно, на каталог ".dirname(__FILE__)." или ".dirname($filename)." установлены неправильные права.n";
$result["err"]=true;
return $result;
}
else
{
fwrite($uk2,$data);
fclose($uk2);
// Установка UNIX-прав на файл
$result=@chmod($filename,octdec($mode));
if(!$result)
{
$result=array();
$result["log"]=$log."Ошибка установки прав на файл ".$filename."nВозможно, на сервере включен режим SAFE MODE.nn";
$result["err"]=true;
return $result;
}
}
}
}
fclose($uk);
$result=array();
$result["log"]=$log;
$result["err"]=false;
return $result;
}
// Установка запомненных прав на директории
function setpermittodir($dirtree)
{
$log="";
// Генерируется массив имен директорий, упорядоченный по вложенности
// И выясняется максимальная вложенность директорий
$max_slash_count=0;
$indent_dir_tree=array();
for($i=0;$i<count($dirtree);$i++)
{
$line=preparestring($dirtree[$i]);
$mode=substr($line,0,4);
$dirname=substr($line,5,strlen($line)-5);
$slash_count=0;
if(strpos($dirname, "/")!==false)
$slash_count=substr_count($dirname, "/");
if(strpos($dirname, chr(92))!==false)
$slash_count=substr_count($dirname, chr(92));
if($slash_count > $max_slash_count) $max_slash_count=$slash_count;
$indent_dir_tree[$slash_count][$dirname]=$mode;
}
// Права на директории выставляются с самых "дальних"
for($i=$max_slash_count; $i>=0 ;$i--)
{
if(array_key_exists($i, $indent_dir_tree))
{
$directories=$indent_dir_tree[$i];
foreach($directories as $dir=>$mode)
{
$result=@chmod($dir, octdec($mode));
$log.=$mode." ".$dir."n";
}
}
}
return $log;
}
function preparestring($s)
{
$s=str_replace(chr(13),"",$s);
$s=str_replace(chr(10),"",$s);
return trim($s);
}
function RegisterGlobalVariables($HTTP_VARS) {
if (isset($HTTP_VARS)) {
if (count($HTTP_VARS) > 0) {
if (get_magic_quotes_runtime() || get_magic_quotes_gpc()) {
for (reset($HTTP_VARS); current($HTTP_VARS); next($HTTP_VARS)) {
$var_name = key($HTTP_VARS);
$GLOBALS[$var_name] = stripslashes($HTTP_VARS[$var_name]);
// echo $var_name." = ".$HTTP_VARS[$var_name]."<BR>";
}
}
else {
for (reset($HTTP_VARS); current($HTTP_VARS); next($HTTP_VARS)) {
$var_name = key($HTTP_VARS);
$GLOBALS[$var_name] = $HTTP_VARS[$var_name];
// echo $var_name." = ".$HTTP_VARS[$var_name]."<BR>";
}
}
}
}
}
function setuperdata()
{
/*
';
return $code;
}
///////////////////////////////////////////////////////////////////////////////
// Код для инсталляции. Вторая часть.
///////////////////////////////////////////////////////////////////////////////
function setupcode_end()
{
$code='
*/
}
?>
<BR>
<center><font size=-2 color="#505050">
PHP Setuper<BR>Copyright Xintrea, 2005<BR>
<a href="http://webhamster.ru">http://webhamster.ru</a>
</font></center>
</td></tr></table>
</body>
</html>
';
return $code;
}
?>
<BR>
<center><font size=-2 color="#505050">
Copyright Xintrea, 2005<BR>
<a href="http://webhamster.ru">http://webhamster.ru</a>
</font></center>
</td></tr></table>
</body>
</html>