<?php
/**
* СодеÑÐ¶Ð¸Ñ ÐºÐ»Ð°ÑÑ Linker
*
* @package energine
* @subpackage configurator
* @author Tigrenok
* @copyright ColoCall 2007
* @version $Id: Linker.class.php,v 1.12 2007/11/12 16:03:59 tigrenok Exp $
*/
require_once('Model.class.php');
/**
* Ð¡Ð¾Ð·Ð´Ð°ÐµÑ ÐºÐ¾Ð¿Ð¸Ð¸ (или Ñимлинки) Ñайлов
*
* @package energine
* @subpackage configurator
*/
class Linker extends Model {
/**
* ÐÑÑÑ Ðº ÑдÑÑ
*
*/
const PATH_CORE = '../core2a';
/**
* Ðазвание папки Ñо ÑдÑом
*
*/
const FOLDER_CORE = 'core';
/**
* ÐÑÑÑ Ðº модÑÐ»Ñ Ð²Ñвода
*
*/
const PATH_SITE = 'site';
/**
* ÐÑÑÑ Ðº модÑлÑм ÑдÑа
*
*/
const PATH_MODULES = 'modules';
/**
* СпиÑок обÑабаÑÑваемÑÑ
папок модÑлей
*
* @var array
* @access private
*/
private $deFoldersList = array(
'images',
'scripts',
'stylesheets',
'templates/content',
'templates/layout'
);
/**
* Флаг ÑиÑÑÐµÐ¼Ñ *nix = true, windows = false
*
* @var boolean
* @access private
*/
private $isNix;
/**
* ÐÑÑÑ Ð¾Ñ ÐºÐ¾ÑÐ½Ñ ÑеÑвеÑа
*
* @var string
* @access private
*/
private $serverRoot;
/**
* СпиÑок модÑлей
*
* @var array
* @access private
*/
private $modulesList;
/**
* СпиÑок ÑдалÑннÑÑ
пÑи оÑиÑÑке Ñайлов
*
* @var array
* @access private
*/
private $killedLog = array();
/**
* СпиÑок ÑкопиÑованнÑÑ
Ñайлов
*
* @var array
* @access private
*/
private $copyLog;
/**
* СпиÑок ÑкопиÑованнÑÑ
Ñайлов (или Ñимлинков Ð´Ð»Ñ *nix ÑиÑÑем)
*
* @var array
* @access private
*/
private $symLinkLog;
/**
* СÑÑÑкÑÑÑа папок Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ (или ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñимлинков Ð´Ð»Ñ *nix ÑиÑÑем)
*
* @var array
* @access private
*/
private $foldersList;
/**
* СÑÑÑкÑÑÑа Ñайлов Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ (или ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñимлинков Ð´Ð»Ñ *nix ÑиÑÑем)
*
* @var array
* @access private
*/
private $filesList;
/**
* ÐонÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа
*
* @return void
*/
public function __construct() {
$this->serverRoot = str_replace(SCRIPT_NAME,'',$_SERVER['SCRIPT_FILENAME']).'/';
$this->isNix = true;
if (isset($_SERVER["WINDIR"])) {
$this->isNix = false;
}
}
/**
* ÐапÑÑÐºÐ°ÐµÑ Ð¼Ð¾Ð´ÐµÐ»Ñ
*
* @return void
* @access public
*/
public function run() {
$this->getViewer()->addBlock('',Viewer::TPL_LINKER_SCRIPT);
$this->getViewer()->addBlock('ÐинкеÑ:',Viewer::TPL_HEADER);
$this->cleanDestinationFolders();
$this->getViewer()->addBlock(array('ÐажмиÑе, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ ÑпиÑок ÑдалÑннÑÑ
Ñайлов.'=>$this->killedLog),Viewer::TPL_LINKER_CONFIRM);
$this->createSymLinks();
$this->getViewer()->addBlock(array('ÐажмиÑе, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ ÑпиÑок ÑкопиÑованнÑÑ
Ñайлов.'=>$this->copyLog),Viewer::TPL_LINKER_CONFIRM);
$this->getViewer()->addBlock('УÑа! ÐÑоÑеÑÑ ÑÑÑановки ÑÑпеÑно завеÑÑÑн! :)',Viewer::TPL_FOOTER);
}
/**
* Ð¡Ð¾Ð·Ð´Ð°ÐµÑ ÑпиÑок модÑлей
*
* @param array СпиÑок иÑклÑÑений
* @return array СпиÑок модÑлей
* @access private
*/
private function geatherModulesList($exceptions=array()) {
$dir = $this->serverRoot.self::PATH_CORE.'/'.self::PATH_MODULES;
$modulesList = array();
if(!@($handle = opendir($dir))) {
throw new Exception('Ðевозможно оÑкÑÑÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ ('.$dir.')!');
}
while (false !== ($file = readdir($handle))) {
if (!preg_match('/^\./',$file) && !in_array($file,$exceptions)) {
$modulesList[] = $dir.'/'.$file;
}
}
closedir($handle);
return $modulesList;
}
/**
* СобиÑÐ°ÐµÑ Ð¿ÑÑи к папкам и Ñайлам, коÑоÑÑе нÑжно ÑкопиÑоваÑÑ (или ÑаÑÑÑавиÑÑ Ñимлинки Ð´Ð»Ñ *nix ÑиÑÑем)
*
* @param string ÐÑÑÑ Ðº папке, коÑоÑÑÑ ÑледÑÐµÑ Ð¾Ð±ÑабоÑаÑÑ.
* @param string ÐÑÑÑ Ðº папке, в коÑоÑÑÑ ÑледÑÐµÑ ÑкопиÑоваÑÑ Ð²Ñе из иÑÑ
одной.
* @param array СпиÑок иÑклÑÑений, имена папок и Ñайлов, коÑоÑÑе ÑледÑÐµÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑ
* @return void
* @access private
*/
private function geatherFileLinks($dir,$destdir,$exceptions=array()) {
if (!@($handle = opendir($dir))) {
throw new Exception('Ðевозможно оÑкÑÑÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ ('.$dir.')!');
}
while (false !== ($file = @readdir($handle))) {
if (!preg_match('/^\./',$file) && !in_array($file,$exceptions)) {
$curfile = $dir.'/'.$file;
if (is_dir($curfile)) {
$this->foldersList[$destdir.'/'.$file] = $curfile;
if (!$this->isNix) {
$this->geatherFileLinks($curfile,$destdir.'/'.$file,$exceptions);
}
} else {
$this->filesList[$destdir.'/'.$file] = $curfile;
}
}
}
@closedir($handle);
}
/**
* ÐÑиÑÐ°ÐµÑ Ð¿Ð°Ð¿ÐºÐ¸ ÑбоÑки
*
* @return void
* @access private
*/
private function cleanDestinationFolders() {
foreach ($this->deFoldersList as $value) {
$this->killFiles($this->serverRoot.$value,array('CVS'));
}
if (file_exists($this->serverRoot.self::FOLDER_CORE) && !$this->isNix) {
$this->killFiles($this->serverRoot.self::FOLDER_CORE);
}
}
/**
* Ð£Ð±Ð¸Ð²Ð°ÐµÑ ÑÐ°Ð¹Ð»Ñ Ð¸ папки
*
* @param string ÐÑÑÑ Ðº папке, коÑоÑÑÑ ÑледÑÐµÑ Ð¾ÑиÑÑиÑÑ
* @param array СпиÑок иÑклÑÑений, имена папок и Ñайлов, коÑоÑÑе ÑбиваÑÑ Ð½ÐµÐ»ÑзÑ
* @return void
* @access private
*/
private function killFiles($dir,$exceptions=array()) {
if(!@($handle = opendir($dir))) {
throw new Exception('Ðевозможно оÑкÑÑÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ ('.$dir.')!');
}
while (false !== ($file = readdir($handle))) {
if (!preg_match('/^\./',$file) && !in_array($file,$exceptions)) {
$curfile = $dir.'/'.$file;
if (is_dir($curfile) && !$this->isNix) {
$this->killFiles($curfile,$exceptions);
if(!@rmdir($curfile)) {
throw new Exception('Ðевозможно ÑдалиÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ ('.$curfile.')!');
}
} else {
if(!@unlink($curfile)) {
throw new Exception('Ðевозможно ÑдалиÑÑ Ñайл ('.$curfile.')!');
}
$this->killedLog[] = $dir.'/'.$file;
}
}
}
closedir($handle);
}
/**
* СоздаÑÑ ÐºÐ¾Ð¿Ð¸Ð¸ Ñайлов ÑдÑа, либо Ð´ÐµÐ»Ð°ÐµÑ Ñимлинки (Ð´Ð»Ñ *nix ÑиÑÑем)
*
* @return void
* @access private
*/
private function createSymLinks() {
if ($this->isNix) {
if(!file_exists($this->serverRoot.self::FOLDER_CORE) && !@symlink($this->serverRoot.self::PATH_CORE,$this->serverRoot.self::FOLDER_CORE)) {
throw new Exception('Ðевозможно ÑоздаÑÑ ÑимволиÑеÑкÑÑ ÑÑÑÐ»ÐºÑ ('.$this->serverRoot.self::PATH_CORE.' => '.$this->serverRoot.self::FOLDER_CORE.')!');
}
} else {
/* ÑÑÑ Ð²ÑзÑваеÑÑÑ ÑобиÑаÑÐµÐ»Ñ ÑÑÑлок Ð´Ð»Ñ ÑдÑа Ð´Ð»Ñ Ð²Ð¸Ð½Ð´Ð¾Ð²Ð¾Ð¹ плаÑÑоÑмÑ, в ÑникÑе ÑÑого не нÑжно - пÑоÑÑо Ñимлинка делаеÑÑÑ */
$this->geatherFileLinks($this->serverRoot.self::PATH_CORE,$this->serverRoot.self::FOLDER_CORE,array('CVS'));
if(!file_exists($this->serverRoot.self::FOLDER_CORE) && !@mkdir($this->serverRoot.self::FOLDER_CORE)) {
throw new Exception('Ðевозможно ÑоздаÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ ('.$this->serverRoot.self::PATH_CORE.')!');
}
}
$modulesPathes = $this->geatherModulesList(array('CVS'));
array_push($modulesPathes,$this->serverRoot.self::PATH_SITE);
foreach ($modulesPathes as $value) {
foreach ($this->deFoldersList as $subvalue) {
$this->geatherFileLinks($value.'/'.$subvalue, $this->serverRoot.$subvalue, array('CVS'));
}
}
if ($this->isNix) {
$this->symLinkFiles();
}
else {
$this->copyFiles();
}
}
/**
* ÐопиÑÑÐµÑ Ñайло.
*
* @return void
* @access private
*/
private function copyFiles() {
foreach (array_keys($this->foldersList) as $destdir) {
if (!file_exists($destdir)) {
$this->copyLog[] = $destdir;
if (!@mkdir($destdir)) {
throw new Exception('Ðевозможно ÑоздаÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ ('.$destdir.')!');
}
}
}
foreach ($this->filesList as $destfile => $sourfile) {
$this->copyLog[] = $sourfile.' => '.$destfile;
if (!@copy($sourfile,$destfile)) {
throw new Exception('Ðевозможно ÑкопиÑоваÑÑ Ñайл ('.$sourfile.' => '.$destfile.')!');
}
}
}
/**
* СимлинкÑÐµÑ Ñайло. :)
*
* @return void
* @access private
*/
private function symLinkFiles() {
foreach ($this->foldersList as $destdir => $sourdir) {
$sourdir = realpath($sourdir);
$this->copyLog[] = $sourdir.' => '.$destdir;
if (!@symlink($sourdir,$destdir)) {
throw new Exception('Ðевозможно ÑоздаÑÑ ÑимволиÑеÑкÑÑ ÑÑÑÐ»ÐºÑ Ð´Ð¸ÑекÑоÑии ('.$sourdir.' => '.$destdir.')!');
}
}
foreach ($this->filesList as $destfile => $sourfile) {
$sourfile = realpath($sourfile);
$this->copyLog[] = $sourfile.' => '.$destfile;
if (!@symlink($sourfile,$destfile)) {
throw new Exception('Ðевозможно ÑоздаÑÑ ÑимволиÑеÑкÑÑ ÑÑÑÐ»ÐºÑ Ñайла ('.$sourfile.' => '.$destfile.')!');
}
}
}
}