admin_tools.php 5.95 KB
<?php
/*
*	
*	файл для выполнения различных вспомогательных задач
*	типа периодического кэширования редкоизменяемых таблиц
*	
*/

class admin_tools{
	private $error = false;
	private $act = 'index';
	private $JsHttpRequest = false;
	private $result = array();
	
	public function __construct(){
	global $MAIN_PAGE;
		define('M_PATH',MAIN_SOURCE_PATH.'/modules/'.$MAIN_PAGE -> dirname() );
		define('M_URL',MAIN_SOURCE_URL.'/modules/'.$MAIN_PAGE -> dirname() );
		$this -> act = !empty($_REQUEST['act']) ? $_REQUEST['act'] : $this -> act;
		include_once(M_PATH.'/inc/class.snippets.php');
		include_once(MAIN_SOURCE_PATH.'/inc/class.html.php');
	}
	
	public function get(){
		
		$func = $this -> act;
		if ( !method_exists($this ,$func) ){
			sys_error(ERROR_404);
		}
		
		return $this -> $func();
	}
	
	private function ajax_main(){
		$p = new snippetsQuery('p');
		
		echo '<?xml version="1.0" encoding="UTF-8"?><body><title>Редактировать страницу</title><content><![CDATA[Тут что-то выводим]]></content></body>';
		exit();
	}	
	
	private function ajax_snippet_edit(){
		sys_block_disable();
		$p = new snippetsQuery('p');
		
		$p -> where_func($_GET['f_func']);
	  $p -> where_module($_GET['m_path']);
		$p -> get('*');
		$row = $p ->  row();
		
		$t = new PHPTAL();
		$t -> setSnippet('admin','ajax_edit_fast_snippet');// M_PATH.'/tmpl/control_snippets/edit_short.html' );
		$t -> row = $row ;
			
		$e = html_control::editor('codemirror');
		$e -> set_name('desc');
		$e -> set_attr('cols',10);
		$t -> editor = $e -> show();
		echo '<?xml version="1.0" encoding="UTF-8"?><body><title>Редактировать шаблон</title><content><![CDATA['.$t -> execute().']]></content></body>';
		exit();
	}	
	
	private function ajax_snippet_save(){
		sys_block_disable();
		$p = snippets::load_id($_POST['id']);
		//var_dump($_POST);
		//$p -> set_debug(1);
		//foreach( $_POST['form'] as $k=>$v ){
		//  $p -> set($k,$v);
		//}
		$p -> set('snippet',$_POST['snippet']);
		
    $id = $p -> update();
		exit();
	}
		
	private function make_md5($path){
		$path = !empty($path) ? $path : MAIN_PATH.$_GET['path'];
		$this -> inc_make_md5($path);
		exit();
	}	

	private function inc_make_md5($path){
		//echo $path .'<br/>';
		if ($handle = opendir($path)) {
			self::inc_insert_dir($path);
			$rows = array();
			while (false !== ($file = readdir($handle))) {
				$row = array();
				
				if ( is_dir ($path.$file) ){
					if ( $file=='.' ||  $file=='..' ){
						continue;
					}
					echo $path.$file.'<br/>';
					$this -> inc_make_md5($path.$file.'/');

					continue;
				}else{
					echo $path.$file.'<br/>';
					$row['is_dir'] = 0;
					$row['hash'] = md5_file( $path.$file );
					
				}
				$row['file'] = $path.$file;
				
				$row['time'] = MAIN_TIME;
				self::inc_insert_dir($path.$file,$row);
			}
			self::inc_insert_dir($path, array('time'=>MAIN_TIME,'is_dir'=>1) );
			closedir($handle);
		}

	}	
		
		
	static function inc_insert_dir($path,$row=array() ){
	global $MAIN_DB;
		
			$path = str_replace(MAIN_PATH,'',$path);
			
			$row['file'] = $path;
			$sql_set = array();
			foreach( $row as $k=>$v ){
				$sql_set[]='`'.$k.'` = "'.$v.'"';
			}
			$sql_set = implode(',',$sql_set);
			
			$sql = "SELECT COUNT(*) FROM ".$MAIN_DB -> prefix("system_md5")." WHERE file='$path'";
			list($count)= $MAIN_DB -> fetch_array( $MAIN_DB -> query($sql) );
			if ( $count>0 ){
				$sql = "UPDATE ".$MAIN_DB -> prefix("system_md5")." SET ".$sql_set." WHERE file='$path'";
			}else{
				$sql = "INSERT INTO ".$MAIN_DB -> prefix("system_md5")." SET ".$sql_set." ";
			}
			$MAIN_DB -> query($sql);
	}

		/***************
		*
		*	запускаем проверку целосности системы
		*	запускать нужно через крон.
		*	отчёты о изменениях отправляются администратору на мыло
		*	
		*************/
	private function check_md5(){
		//set_time_limit(3000);
		$p = !empty($_GET['path']) ?  MAIN_PATH.$_GET['path'] : MAIN_PATH;
		
		$this -> inc_scan_md5($p);
		
			//	пишите письма	
			var_dump($this->result);
		
		echo 'end';
		exit();
	}
	
	
		//	сканируем каталог path и все подкаталоги на наличие изменений в файлах
	private function inc_scan_md5($path=MAIN_PATH){
		echo $path.'<br/>';
		if ($handle = opendir($path)) {
			echo '1';
			$rows = array();
			while (false !== ($file = readdir($handle))) {
				$row = array();
				
				if ( is_dir ($path.$file) ){
					if ( $file=='.' ||  $file=='..' ){
						continue;
					}
					echo $path.$file.'<br/>';
					$this -> inc_scan_md5($path.$file.'/');
					continue;
				}
				echo $path.$file.'<br/>';
				$row['is_dir'] = 0;
				$row['hash'] = md5_file( $path.$file );
				$row['file'] = $path.$file;
				$row['time'] = MAIN_TIME;
				$row['path'] = $path;
				$r = self::inc_check_dir($path.$file,$row);
				if ( !empty($r) ){
					$this->result[]= $r;
				}
			}
			closedir($handle);
		}
		
	}
		
		
	static function inc_check_dir($path,$row=array()){
	global $MAIN_DB;
		$path = str_replace(MAIN_PATH,'',$path);
		$result = array();
		 $sql = "SELECT * FROM ".$MAIN_DB -> prefix("system_md5")." WHERE file='$path' ";
		
		$data = $MAIN_DB -> fetch_array( $MAIN_DB -> query($sql) );
		if ( !$data ){
			$sql = "SELECT exseption FROM ".$MAIN_DB -> prefix("system_md5")." WHERE file='".$row['path']."' ";
			list($exs) = $MAIN_DB -> fetch_array( $MAIN_DB -> query($sql) );
			if ( $exs ){
				return false;
			}
			//self::inc_insert_dir($path,$row);
			//	найден новый файл
			return 'Найден новый объект "'.$path.'"';
		}
		if ( $row['hash']!=$data['hash'] && $data['exseption']!=1 ){
			//$sql = "UPDATE  ".$MAIN_DB -> prefix("system_md5")." SET hash='".$row['hash']."' WHERE file='$path' ";
			//$MAIN_DB -> query($sql);
			return 'Объект "'.$path.'" изменился';
		}
		return false;
	}
	


}

?>