<?
define('SOURCE_CODE',1) ;
define('USER_DATA',2) ;
define('TEMP_FILE',3) ;

function DISK(){ if (!is_object($GLOBALS['DISK'])) $GLOBALS['DISK']=new i_disk();return($GLOBALS['DISK']);}

class i_disk
{  var $arr_dirs=array() ;
   var $host_dir=_DIR_TO_ROOT.'/' ;
   var $block_size=4096 ; // минимальный размер блока в файловой системе

   // задаем типы директорий, по умолчанию все директрии хоста - SOURCE_CODE
   var $dirs_status=array('/public/'=>USER_DATA,
		                  '/docs/'  =>USER_DATA,
		                  '/storage/'  =>USER_DATA,
		                  '/capture/'  =>USER_DATA,
		                  '/files/' =>TEMP_FILE,
		                  '/temp/'  =>TEMP_FILE,
		                  '/tmp/'   =>TEMP_FILE,
		                  '/logs/'  =>TEMP_FILE,
		                  '/log/'  =>TEMP_FILE,
		                  '/class'  =>SOURCE_CODE, // без слеша на конце для разных версий
		                  '/engine'  =>SOURCE_CODE, // без слеша на конце для разных версий
		                  '/AddOns'  =>SOURCE_CODE, // без слеша на конце для разных версий
		                 ) ;

   var $dir_to_scan=array('/','/public/','/docs/','/temp/') ;

	// назначем глубину показа директорий, по умолчанию всем директориям глубина - 1
	var $levels_limit=array('/public/'  =>1,
							'/temp/'    =>1
							) ;


	//
   function update_DB_dir_size_info($to_data=0)
   { $this->arr_dirs=array() ;
      $t1=fixed_time() ;

      // получаем дерево каталога
      echo 'Получаем данные на дату: '.date('d.m.Y',(($to_data)? $to_data:time())).'<br>' ;

      $tree_dir=$this->get_dir_size_info($this->host_dir,$to_data) ;// damp_array($tree_dir,1,-1) ;
      // преобразуем в одномерный массив
      $this->convert_tree_to_array($this->host_dir,$tree_dir) ; //damp_array($this->arr_dirs) ;
      // сортируем имена директорий в алфавитном порядке
      ksort($this->arr_dirs) ;
	  echo 'Обработано директорий: '._sizeof($this->arr_dirs).'<br>' ;
	  //print_2x_arr($this->arr_dirs) ;

      // обновляем данные в базе на заданное число
      if ($to_data>time()) $to_data=time() ;
      $use_data=($to_data)? $to_data:time() ;
	  //echo '$use_data: '.date('d.m.Y H:i:s',$use_data).'<br>' ;



      $now=getdate($use_data) ;
      $db_data=mktime(0,0,0,$now['mon'],$now['mday'],$now['year']);
	  //echo '$db_data: '.date('d.m.Y H:i:s',$db_data).'<br>' ;
	  execSQL_update('delete from obj_site_disk where c_data='.$db_data,0) ;
      foreach($this->arr_dirs as $dir_name=>$info)
      { $sql='insert ignore into obj_site_disk(clss,c_data,obj_name,status,size,cnt)
	                         values(280,'.$db_data.',"'. $dir_name .'",'.$info['status'].','.$info['size'].','.$info['count'].')
	                         on duplicate key update status='.$info['status'].',size='.$info['size'].', cnt='.$info['count'].',r_data='.time() ;
       execSQL_update($sql);
	   //echo $sql.'<br>' ;
      }
      $t2=fixed_time() ;
      echo 'Время расчета: '.round($t2-$t1,2).' сек <br>' ;
    }

    function convert_tree_to_array($dir_name,$tree_dir,$cur_level=0,$max_level=1,$status=1)
     {   $host_dir_name=hide_server_dir($dir_name) ;
         if (isset($this->levels_limit[$host_dir_name])) $max_level=$this->levels_limit[$host_dir_name] ;
         if (isset($this->dirs_status[$host_dir_name]))  $status=$this->dirs_status[$host_dir_name] ;
         //echo '$host_dir_name='.$host_dir_name.', level='.$cur_level.' max_level='.$max_level.'<br>' ;
         if ($max_level and $cur_level>$max_level) return ;

         if (_sizeof($tree_dir)) foreach($tree_dir as $sub_dir_name=>$sub_dir_info)
             if ($sub_dir_name!='.') $this->convert_tree_to_array($sub_dir_name,$sub_dir_info,$cur_level+1,$max_level,$status) ;

         $host_dir_name=hide_server_dir($dir_name) ;
         $this->arr_dirs[$host_dir_name]['size']=$tree_dir['.']['size'] ;
         $this->arr_dirs[$host_dir_name]['count']=$tree_dir['.']['count'] ;
         $this->arr_dirs[$host_dir_name]['status']=($host_dir_name=='/')? 0:$status ;

     }


	function get_dir_size_info($dir,$to_data=0)
	 { $size=0 ; $count=0 ;
	   $list_files=scandir($dir) ;
	   foreach($list_files as $file_name) if ($file_name!='.' and $file_name!='..')
	   { if (is_dir($dir.$file_name))
	     { $dir_name=$dir.$file_name.'/' ;
	       $res[$dir_name]=$this->get_dir_size_info($dir_name,$to_data) ;
	       $size+=$res[$dir_name]['.']['size'] ;
	       $count+=$res[$dir_name]['.']['count'] ;
	     }
	     else
	     { if (!$to_data)
	       { $size+=$this->get_file_on_disk_size($dir.$file_name) ;
	         $count++ ;
	       }
	       else
	       { $cdata=filectime($dir.$file_name) ;
	         if ($cdata<$to_data) {$size+=$this->get_file_on_disk_size($dir.$file_name) ; $count++ ;}
	       }
	     }
	   }
	   $res['.']=array('size'=>$size,'count'=>$count) ;
	   return $res ;
	 }

	function get_file_on_disk_size($fdir)
	{   $size=filesize($fdir) ;
		$real_size=ceil($size/$this->block_size)*$this->block_size ;
		return($real_size) ;
	}

	function human_filesize($bytes, $decimals = 2) {
	  $sz = 'BKMGTP';
	  $factor = floor((strlen($bytes) - 1) / 3);
	  return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
	}


  // получение массива с консилидированными данными по файлам в директории (рекурсивно)
  // $dir - путь к директории относительно корня хоста
  // для сканирования корня хоста ничего не передавать
  // для сканирования /public передать /public/
  function exec_du_size($dir='',$file_mask='')
  {  $temp_fname='du_result_size_'.time().'.txt' ;
	 if (file_exists(_TEMP_DIR.'/'.$temp_fname)) unlink(_TEMP_DIR.$temp_fname) ;
	 //$arg_dir=($dir)? _DIR_TO_ROOT.$dir:_DIR_TO_ROOT.'/' ;
	 $arg_dir=($dir!='')? _DIR_TO_ROOT.$dir:_DIR_TO_ROOT.'/' ;
	 //$arg_file_mask=($file_mask)? ' -X="'.$file_mask.'"':'' ;
	 //$arg_file_mask=($file_mask)? ' -X="'.$file_mask.'"':'' ;
	 $arg_file_mask='' ;

	 //find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$
	 $cmd='du '.$arg_dir.' '.$arg_file_mask.' -d 2 > '._TEMP_DIR.$temp_fname ;
	 //$cmd='find '.$arg_dir.' -type f -name "'.$arg_file_mask.'" -exec du -ch {} + | grep total$ > '._TEMP_DIR.$temp_fname ;
	 //echo $cmd ;
	 exec($cmd)   ;
	 $cont=file_get_contents(_TEMP_DIR.'/'.$temp_fname) ;
	 unlink(_TEMP_DIR.'/'.$temp_fname) ;
	 return($cont) ;
  }

 function exec_du_count($dir='/',$file_mask='')
 {  $temp_fname='du_result_cnt_'.time().'.txt' ;
    if (file_exists(_TEMP_DIR.'/'.$temp_fname)) unlink(_TEMP_DIR.$temp_fname) ;
    //$cmd='du -a "'._DIR_TO_ROOT.'/" | cut -d/ -f5 | sort | uniq -c | sort -nr > '._TEMP_DIR.'/'.$temp_fname ;
	//$arg_dir=($dir)? _DIR_TO_ROOT.$dir:_DIR_TO_ROOT.'/' ;
	$arg_dir=($dir!='/')? _DIR_TO_ROOT.$dir:_DIR_TO_ROOT ;
	$arg_file_mask=($file_mask)? '-name "'.$file_mask.'"':'' ;
    $cmd='find '.$arg_dir.' -type f '.$arg_file_mask.' | sed \'s%/[^/]*$%%\' | sort | uniq -c > '._TEMP_DIR.$temp_fname ;
    //echo $cmd.'<br>' ;
    exec($cmd)   ;
    $cont=file_get_contents(_TEMP_DIR.'/'.$temp_fname) ;
	unlink(_TEMP_DIR.'/'.$temp_fname) ;
    return($cont) ;
 }

 function exec_filestat($arr_dirs,$file_mask='')
 {  $temp_fname='filestat_'.time().'.txt' ;   $cont=null ;
    if (file_exists(_TEMP_DIR.'/'.$temp_fname)) unlink(_TEMP_DIR.$temp_fname) ;
	$arr_subdirs=array() ;  //print_r($arr_dirs) ;
	if (_sizeof($arr_dirs)) foreach($arr_dirs as $dir)
	{   //$abs_dir=($dir!='/')? _DIR_TO_ROOT.$dir:_DIR_TO_ROOT ;
		$abs_dir=_DIR_TO_ROOT.$dir ;
		$list_subdir=get_dir_list($abs_dir) ;
		$arr_subdirs[]=$abs_dir ;
		$arr_subdirs=array_merge($arr_subdirs,$list_subdir) ;

	}
	 if (_sizeof($arr_subdirs))
	 { $arg_dirs=implode(' ',$arr_subdirs) ;
	   //damp_array($arr_subdirs) ;
	   //$arg_file_mask=($file_mask)? '-name "'.$file_mask.'"':'' ;
	   $cmd=_DIR_TO_MODULES.'/engine/filestat '.$arg_dirs.' > '._TEMP_DIR.$temp_fname ; //echo $cmd.'<br>' ;
	   exec($cmd)   ;
	   $cont=file_get_contents(_TEMP_DIR.'/'.$temp_fname) ;
	   unlink(_TEMP_DIR.'/'.$temp_fname) ;
	 }
    return($cont) ;
 }



 // возвращает самый старый файл в директории (рекурсивно)
 function exec_find_old_file($dir='/',$file_mask='')
 {  $temp_fname='du_result_find_'.time().'.txt' ;
    if (file_exists(_TEMP_DIR.'/'.$temp_fname)) unlink(_TEMP_DIR.$temp_fname) ;
	$arg_dir=($dir!='/')? _DIR_TO_ROOT.$dir:_DIR_TO_ROOT ;
	$arg_file_mask=($file_mask)? '-name "'.$file_mask.'"':'' ;
    $cmd='find '.$arg_dir.' -type f '.$arg_file_mask.' -exec stat -c "%Y %n" {} \; | sort -n | head -1 | cut -d\' \' -f2 > '._TEMP_DIR.$temp_fname ;
    exec($cmd)   ;
    $cont=file_get_contents(_TEMP_DIR.'/'.$temp_fname) ;
	unlink(_TEMP_DIR.'/'.$temp_fname) ;
	return(trim($cont)) ;
 }

// возвращает самый молодой файл в директории (рекурсивно)
 function exec_find_young_file($dir='/',$file_mask='')
 {  $temp_fname='du_result_find_'.time().'.txt' ;
    if (file_exists(_TEMP_DIR.'/'.$temp_fname)) unlink(_TEMP_DIR.$temp_fname) ;
	$arg_dir=($dir!='/')? _DIR_TO_ROOT.$dir:_DIR_TO_ROOT ;
	$arg_file_mask=($file_mask)? '-name "'.$file_mask.'"':'' ;
    $cmd='find '.$arg_dir.' -type f '.$arg_file_mask.' -exec stat -c "%Y %n" {} \; | sort -nr | head -1 | cut -d\' \' -f2 > '._TEMP_DIR.$temp_fname ;
    exec($cmd)   ;
    $cont=file_get_contents(_TEMP_DIR.'/'.$temp_fname) ;
	unlink(_TEMP_DIR.'/'.$temp_fname) ;
    return(trim($cont)) ;
 }

  function get_dir_rec_by_id($id)
  { $res=array() ;
  	if ($id) $res=execSQL_van('select * from obj_site_disk_du where pkey='.$id) ;
    return($res) ;

  }

  // получение массива с консилидированными данными по файлам в директории (рекурсивно)
  // $dir - путь к директории относительно корня хоста
  // для сканирования корня хоста ничего не передавать
  // для сканирования /public передать /public
  function exec_du_stats($dir="",$file_mask='',$options=array())
  {   // удаляем последний слеш у имени директории
  	  $arr=explode('/',$dir) ;
      unset($arr[_sizeof($arr)-1]) ;
      $dir=implode('/',$arr)  ;

      $cont=$this->exec_du_size($dir,$file_mask) ;
      $arr_dirs=array() ;
      $arr_size=explode("\n",$cont) ;
      //damp_array($arr_size,1,-1) ;
      if (_sizeof($arr_size)) foreach($arr_size as $line)  if ($line)
       { list($str_size,$abs_dir)=explode("\t",$line) ;
         if (strpos($str_size,'K')) $size=(int)$str_size*1024 ;
         else if (strpos($str_size,'M')) $size=(int)$str_size*1024*1024 ;
         else if (strpos($str_size,'G')) $size=(int)$str_size*1024*1024*1024 ;
         else $size=(int)$str_size*1024 ; // по умолчанию размер в килобайтах
	     $rel_dir=hide_server_dir($abs_dir) ;
         //$dir_name=($site_dir!=$dir)?  $site_dir.'/':$site_dir ;
         //$dir_name=($rel_dir!='/')?  $site_dir.'/':'/' ;
	     if ($rel_dir!='/') $rel_dir.='/' ;
         $arr_dirs[$rel_dir]['abs_dir']=$abs_dir ;
         $arr_dirs[$rel_dir]['size']=$size ;
         $arr_dirs[$rel_dir]['count']=0 ;
       }

     //damp_array($arr_dirs) ;

	     $cont=$this->exec_du_count($dir,$file_mask) ;
	     $arr_count=explode("\n",$cont) ;
	     //damp_array($arr_count,1,-1) ;
	     $res_cnt=array() ;

	     if (_sizeof($arr_count)) foreach($arr_count as $line)  if (trim($line))
	     { list($count,$site_dir)=explode(" ",trim(str_replace(_DIR_TO_ROOT,'',$line))) ;
		   //$site_dir=str_replace('//','/',$site_dir) ;
		   //$site_dir=str_replace($dir,'',$site_dir) ;
	       $count=(int)$count   ;
	  	   $arr_path=explode('/',$site_dir) ;
	  	   $res_cnt['/']+=$count;
	  	   if (isset($arr_path[1])) $res_cnt['/'.$arr_path[1]]+=$count ;
	  	   if (isset($arr_path[1])) $res_cnt['/'.$arr_path[1]]+=$count ;
	  	   if (isset($arr_path[2])) $res_cnt['/'.$arr_path[1].'/'.$arr_path[2]]+=$count ;

	  	   if (isset($arr_dirs['/'])) $arr_dirs['/']['count']+=$count ;
	  	   $arr2=array() ;
	  	   // будем ссуировать кол-во файлов идя по пути файла
	  	   foreach($arr_path as $id=>$value)
	       { $arr2[]=$value ;
	         $root_path=implode('/',$arr2).'/' ;
	         //echo '$root_path='.$root_path.'<br>' ;
	       	 if (isset($arr_dirs[$root_path])) $arr_dirs[$root_path]['count']+=$count ;
	       }
	  	   //if (isset($arr_path[1]))   $arr_dirs['/'.$arr_path[1].'/']['count']+=$count ;
	  	   //if (isset($arr_path[2]))   $arr_dirs['/'.$arr_path[1].'/'.$arr_path[2].'/']['count']+=$count ;
	     }

	     if ($options['get_older_file_time'])
	     { $fname=DISK()->exec_find_old_file($dir,$file_mask) ;
		   if (file_exists($fname)) $arr_dirs[$dir.'/']['older_file_data']=filemtime(trim($fname)) ; ;
	     }

	     if ($options['get_younger_file_time'])
	     { $fname=DISK()->exec_find_young_file($dir,$file_mask) ;
		   if (file_exists($fname)) $arr_dirs[$dir.'/']['younger_file_data']=filemtime(trim($fname)) ; ;
	     }

	    /* долго выполняется
   	    if ($options['get_older_file_time']) foreach($arr_dirs as $dir_name=>$dir_info)
		   { $fname=DISK()->exec_find_old_file($dir_name,$file_mask) ;
		  if (file_exists($fname)) $arr_dirs[$dir_name]['older_file_data']=filemtime(trim($fname)) ; ;
		   }

		   if ($options['get_younger_file_time']) foreach($arr_dirs as $dir_name=>$dir_info)
		   { $fname=DISK()->exec_find_young_file($dir_name,$file_mask) ;
		  if (file_exists($fname)) $arr_dirs[$dir_name]['younger_file_data']=filemtime(trim($fname)) ; ;
		   }
	    */

	  return($arr_dirs) ;
  }

  function scan_dirs()
  { $t1=fixed_time() ;

	$res_filestat=array() ;
	$cont=$this->exec_filestat($this->dir_to_scan) ;  $arr_dirs=array() ;
	if ($cont!=null) $res_filestat=json_decode($cont)  ; //damp_array($res_filestat) ;
	if (!$res_filestat->errors and _sizeof($res_filestat->content)) foreach($res_filestat->content as $dir_info)
	{
		$arr_dirs[hide_server_dir($dir_info->path)]=array('abs_dir'=>$dir_info->path,
														  'size'=>$dir_info->size,
														  'count'=>$dir_info->file_count,
														  'oldest_file'=>($dir_info->file_count)? hide_server_dir($dir_info->oldest_file_path):'',
														  'oldest_time'=>($dir_info->file_count)? hide_server_dir($dir_info->oldest_file_time):0,
														  'newest_file'=>($dir_info->file_count)? hide_server_dir($dir_info->newest_file_path):'',
														  'newest_time'=>($dir_info->file_count)? hide_server_dir($dir_info->newest_file_time):0,
														) ;
	}


	if (!_sizeof($arr_dirs))
	{  echo 'Нет данным по директориям сервера<br>' ;
	   return(array('error'=>'Нет данным по директориям сервера')) ;
	}
	//$arr_dirs=$this->exec_du_stats($dir) ;
	//damp_array($arr_dirs) ;
   //print_2x_arr($arr_dirs) ;
   // 282 - список известных директорий и их текущие размеры
   // 280 - зафиксированные изменения по датам. На каждое число фиксируется размер и число файлов только если были изменения
   $recs=execSQL('select * from obj_site_disk_du where clss=282 order by obj_name',array('debug'=>0)) ;
   $res_status=array('Прочитано директорий'=>_sizeof($arr_dirs),'Обновлено директорий'=>0,'Добавлено директорий'=>0) ;
   foreach($recs as $rec)
   { $dir_name=$rec['obj_name'] ;
     // определяем тип директории по шаблону
     $status=0 ; $ss=0 ;
	 if (_sizeof($this->dirs_status)) foreach($this->dirs_status as $template=>$status) if (strpos($dir_name,$template)!==false) $ss=$status ;
	 if ($ss) $status=$ss ;

	 // если каталог из БД есть в $arr_dirs - проверяем изменения
	 if (isset($arr_dirs[$dir_name]))
     { $dir_info=$arr_dirs[$dir_name] ;
	   $size=$dir_info['size'] ;
	   $cnt=($dir_info['count'])? $dir_info['count']:0 ;
	   $arr_changes=array() ;
	   if ($rec['size']!=$size) $arr_changes['Размер']=(($size-$rec['size'])>0)? '+'.($size-$rec['size']):'-'.($size-$rec['size']) ;
	   if ($rec['cnt']!=$cnt)   $arr_changes['Кол-во']=(($cnt-$rec['cnt'])>0)? '+'.($cnt-$rec['cnt']):'-'.($cnt-$rec['cnt']) ;
	   if ($rec['status']!=$status) $arr_changes['Тип']=$rec['status'].' => '.$status ;
	   if ($rec['oldest_file']!=$dir_info['oldest_file'] or $rec['oldest_time']!=$dir_info['oldest_time']) $arr_changes['Старейший файл']=($dir_info['oldest_file'])? $dir_info['oldest_file'].' / '.date('d.m.Y H:i',$dir_info['oldest_time']):'-' ; ;
	   if ($rec['newest_file']!=$dir_info['newest_file'] or $rec['newest_time']!=$dir_info['newest_time']) $arr_changes['Новейший файл']=($dir_info['newest_file'])?  $dir_info['newest_file'].' / '.date('d.m.Y H:i',$dir_info['newest_time']):'-' ; ;

	   //if (!$cnt)

	   // если размер в базе отличается от текущего размера
	   if (_sizeof($arr_changes))
       {  echo 'Обновляем данные по текущему размеру директории <strong>'.$dir_name.'</strong> ' ; damp_array($arr_changes,1,-1) ;
	      $this->fixed_dir_size($rec['pkey'],array('enabled'=>1,
			                                       'size'=>$size,
			                                       'cnt'=>$cnt,
			                                       'status'=>$status,
			                                       'oldest_file'=>$dir_info['oldest_file'],
			                                       'oldest_time'=>$dir_info['oldest_time'],
			                                       'newest_file'=>$dir_info['newest_file'],
			                                       'newest_time'=>$dir_info['newest_time']
	                                               ) ) ;
	      $res_status['Обновлено директорий']++ ;
       }
	   // удаляем обработанный каталог из списка, чтобы остались только каталоги на диске, отсутствующие в БД
	   unset($arr_dirs[$dir_name]) ;
     }
	 else if ($rec['size'] or $rec['cnt']) // каталога из базы нет на диске - каталог удален
	 { echo 'Обновляем данные по директории директории <strong>'.$dir_name.'</strong> - директория удалена<br>' ;
	   $this->fixed_dir_size($rec['pkey'],array('enabled'=>0,'size'=>0,'cnt'=>0)) ;
	   $res_status['Удалено директорий']++ ;
	 }

   }

   if (_sizeof($arr_dirs)) foreach($arr_dirs as $dir_name=>$dir_info)
   { $size=$dir_info['size'] ;
   	 $cnt=$dir_info['count'] ;
   	 $arr=explode('/',$dir_name);
   	 $level=_sizeof($arr)-2 ; // учет первого и последнего слеша
	 $status=0 ; $ss=0 ;
	 if (_sizeof($this->dirs_status)) foreach($this->dirs_status as $template=>$status) if (strpos($dir_name,$template)!==false) $ss=$status ;
	 if ($ss) $status=$ss ;
	 echo 'Добавляем в базу директорию <strong>'.$dir_name.'</strong>: +'.$size.' / +'.$cnt.'<br>' ;
	 $this->fixed_dir_size(0,array('obj_name'=>$dir_name,'size'=>$size,'cnt'=>$cnt,'status'=>$status,'level'=>$level)) ;
	 $res_status['Добавлено']++ ;
   }



	$res_status['Время выполнения']=round(fixed_time($t1),3).' сек' ;
    return($res_status) ;
  }

  // фиксация хронологиии директории
  function fixed_dir_size($dir_id,$data=array())
  {  ob_start() ;
  	 if ($dir_id) update_rec_in_table('obj_site_disk_du',$data,'pkey='.$dir_id) ; // текущее значение всегда храним вместе с именем директории
	 else
	 {  $data['parent']=1 ;
	 	$data['clss']=282 ;
	 	$dir_id=adding_rec_to_table('obj_site_disk_du',$data) ;
	 }
	 if ($dir_id)
	 {
	     $cur_day=strtotime(date('d.m.Y')) ;
	     // удаляем старые данные за текущий день, если уже имели место
	     execSQL_update('delete from obj_site_disk_du where parent='.$dir_id.' and c_data='.$cur_day) ;
	     // сохраняем данные за текущий день для последующего построения графика
		 unset($data['obj_name'],$data['status'],$data['enabled'],$data['level']) ; // избыточные данные
		 $data['parent']=$dir_id ;
		 $data['c_data']=$cur_day ;
		 $data['clss']=280 ;
	     adding_rec_to_table('obj_site_disk_du',$data) ; // хронология
	 }
	 $text=ob_get_clean() ;
	 if (!$dir_id) LOGS()->reg_log('i_disk.fixed_dir_size','Не удалось создать запись (282) для директории<br>'.$text) ;
  }

  function move_old_mo_photo_to_new_dir($dir,$file_mask,$count=100)
  {  $temp_fname='ls_result_list_'.time().'.txt' ;    $result=array() ;
  	 if (file_exists(_TEMP_DIR.'/'.$temp_fname)) unlink(_TEMP_DIR.$temp_fname) ;
  	 $arg_dir=($dir)? _DIR_TO_ROOT.$dir:_DIR_TO_ROOT.'/' ;
  	 $arg_file_mask=($file_mask)? '*'.$file_mask:'' ;

  	 $cmd='ls '.$arg_dir.'/'.$arg_file_mask.' -rt | head -n '.$count.' > '._TEMP_DIR.$temp_fname ;
  	 exec($cmd)   ;
  	 $cont=file_get_contents(_TEMP_DIR.'/'.$temp_fname) ;

  	 $arr=explode("\n",$cont) ;
  	 if (_sizeof($arr)) foreach($arr as $fname) if ($fname and file_exists($fname))
     {  list($mo_id,$file_type)=explode('_',basename($fname))  ;
        // внимание! для получаения файлов подписей должна быть использована своя функция ESMO()->get_mo_DTW_img_dir_by_id($this->rec_mo['pkey'],'dir') ;
        $file_dir_to=ESMO()->get_mo_img_dir_by_id($mo_id,'relative',$file_mask,array('check_directory'=>1,'no_check_exist_file'=>1)) ;
        $res=rename($fname,_DIR_TO_ROOT.$file_dir_to) ;
        if ($res) { echo  basename($fname).' - <span class="green">OK</span><br>' ; $result['success']++ ; }
        else      { echo  basename($fname).' - <span class="red">ERROR</span><br>' ; $result['error']++ ; }

     }
     return($result) ;
  }

  function move_old_scan_to_new_dir($count=100)
  { //$recs_scan=execSQL('select * from obj_site_scan where clss=218 and not obj_name like "%.jpg%" and (temp!=1 or temp is null) ',2) ;
	//  if (_sizeof($recs_scan)) foreach($recs_scan as $rec_scan)
	//  	execSQL_update('update obj_site_scan set obj_name="'.$rec_scan['obj_name'].'scan_'.$rec_scan['pkey'].'.jpg" where pkey='.$rec_scan['pkey']) ;
  	 $recs_scan=execSQL('select * from obj_site_scan where clss=218 and not obj_name like "/docs/scan/20%" and (temp!=1 or temp is null) limit '.$count) ;
     $result=array() ;
     if (_sizeof($recs_scan)) foreach($recs_scan as $rec_scan)
     { $data=array() ;
       // если файл не найден, помечаем что файл удален
	   $from=_DIR_TO_ROOT.$rec_scan['obj_name'] ;
       if (!file_exists($from))
       { $data['temp']=1 ;
	     $result['not_found']++ ;
       }
       else
       {   $doc_dir=date('Y_m',$rec_scan['c_data']) ;
           $to=_DIR_TO_ROOT.DOCS()->storage_scan.$doc_dir.'/'.basename($rec_scan['obj_name']) ;
	       $this->check_dir($to) ;
	       $res=rename($from,$to) ;
	       if ($res) { echo  basename($from).' - <span class="green">OK</span><br>' ; $result['success']++ ; $data['obj_name']=DOCS()->storage_scan.$doc_dir.'/'.basename($rec_scan['obj_name']) ; $data['temp']=0 ; }
	       else      { echo  basename($from).' - <span class="red">ERROR</span><br>' ; $result['error']++ ; }
       }
       if (_sizeof($data)) update_rec_in_table('obj_site_scan',$data,'pkey='.$rec_scan['pkey']) ;

     }
     return($result) ;
  }

  function move_old_docs_to_new_dir($count=100)
  { //$recs_scan=execSQL('select * from obj_site_scan where clss=218 and not obj_name like "%.jpg%" and (temp!=1 or temp is null) ',2) ;
	//  if (_sizeof($recs_scan)) foreach($recs_scan as $rec_scan)
	//  	execSQL_update('update obj_site_scan set obj_name="'.$rec_scan['obj_name'].'scan_'.$rec_scan['pkey'].'.jpg" where pkey='.$rec_scan['pkey']) ;
	 $recs_docs=execSQL('select * from obj_site_docs where clss=215 and report_code!="" and doc_name!="" and (doc_dir="" or doc_dir is null) and (temp!=1 or temp is null) order by pkey desc limit '.$count) ;
  	 $result=array() ;
     if (_sizeof($recs_docs)) foreach($recs_docs as $rec)
     { $data=array() ;
       // если файл не найден, помечаем что файл удален
	   $from=_DIR_TO_ROOT.'/docs/'.$rec['doc_name'] ;
       if (!file_exists($from))
       { $data['temp']=1 ;
	     $result['not_found']++ ;
       }
       else
       {   $report_code=$rec['report_code'] ;
           $arr=explode('/',$report_code) ;
           if ($arr['0']=='doc') $report_code=$arr[1].'_'.$arr[0].'_'.$arr[2] ;
	       // защита пути перенесена в  get_doc_dir
	       $doc_dir=DOCS()->get_doc_dir($report_code,$rec['c_data']) ;
           DISK()->check_dir(_DIR_TO_ROOT.DOCS()->storage_pdf.$doc_dir) ;

	       //echo $doc_dir.'<br>' ;
       	   $to=_DIR_TO_ROOT.DOCS()->storage_pdf.$doc_dir.$rec['doc_name'] ;
           //echo $to.'<br>' ;
	       $res=rename($from,$to) ;
	       if ($res) { echo  basename($from).' - <span class="green">OK</span><br>' ; $result['success']++ ; $data['doc_dir']=$doc_dir ; $data['temp']=0 ; }
	       else      { echo  basename($from).' - <span class="red">ERROR</span><br>' ; $result['error']++ ; }
       }
       if (_sizeof($data)) update_rec_in_table('obj_site_docs',$data,'pkey='.$rec['pkey']) ;

     }
     return($result) ;
  }

  function  move_old_mo_photo()
  {  $result['auth']=$this->move_old_mo_photo_to_new_dir('/public/mo_photo','auth.jpg',100) ;
	 $result['alco']=$this->move_old_mo_photo_to_new_dir('/public/mo_photo','alco.jpg',100) ;
	 $result['DTW']=$this->move_old_mo_photo_to_new_dir('/public/mo_photo','DTW.png',100) ;
	 $result['scan']=$this->move_old_scan_to_new_dir(100) ;
	 $result['docs']=$this->move_old_docs_to_new_dir(100) ;
	 return($result) ;
  }

  function check_dir($dir,$options=array())
  {  $dir_rel=hide_server_dir($dir)  ;
	 $arr=explode('/',$dir_rel) ;
     unset($arr[_sizeof($arr)-1]) ; // так как путь заканчивается слешем
     unset($arr[0]) ; // так как путь начинается со слеша
	 $check_dir=_DIR_TO_ROOT.'/' ;
	 $result=true ;
     if (_sizeof($arr)) foreach($arr as $subdir) if ($subdir)
     {  $check_dir.=$subdir.'/' ;
     	if (!is_dir($check_dir))
        {   if ($options['debug']) echo 'Отсутствует директория <strong>'.$check_dir.'</strong><br>';
        	if (!@mkdir($check_dir))
	           { LOGS()->reg_log('create_dir','Не удалось создать директорию '.hide_server_dir($check_dir)) ;
	             $result=false ;
		         if ($options['debug']) echo 'Ошибка создания директории <strong>'.$check_dir.'</strong><br>';
	             break ;
	           }
	           else
	           { LOGS()->reg_log('DISK','Cоздана директория '.hide_server_dir($check_dir).'/') ;
		         if ($options['debug']) echo 'Создана директория <strong>'.$check_dir.'</strong><br>';
	           }
	    }
     }
     return($result) ;

  }


 function convert_to_new_format()
 {  execSQL_update('delete from obj_site_disk where clss=282 or clss=0',1) ;
 return ;
	$check=execSQL('select * from obj_site_disk ',2,1) ;
	$check=execSQL_value('select count(pkey) from obj_site_disk where clss=282',2,1) ;
	if (!$check)
	{   ob_start() ;
		$recs=execSQL('select distinct(obj_name),status from obj_site_disk where clss=280 and parent=1',2,1) ;
		if (_sizeof($recs)) foreach($recs as $rec)
		{ $id=adding_rec_to_table('obj_site_disk',array('parent'=>1,'clss'=>282,'obj_name'=>$rec['obj_name'],'status'=>$rec['status'])) ;
		  execSQL_update('update obj_site_disk set parent='.$id.',obj_name=NULL,status=NULL where obj_name="'.$rec['obj_name'].'" and clss=280',2) ;
		}

		$recs=execSQL('select pkey,obj_name,status from obj_site_disk where clss=282',2,1) ;
		// надо удалить из таблицы значения, когда размер не изменялся
		foreach($recs as $rec_dir)
		{ $recs_stats=execSQL_row('select pkey,size from obj_site_disk where clss=280 and parent='.$rec_dir['pkey'].' order by pkey',2) ;
		  $prev_size=-1 ;

		  if (_sizeof($recs_stats)) foreach($recs_stats as $id=>$size)
		  {  $size=(int)$size ;
			 $prev_size=(int)$prev_size ;
			 if (($prev_size>=0 and $size==$prev_size) or $size==0) execSQL_update('delete from obj_site_disk where pkey='.$id,2,1) ;
			 $prev_size=$size ;
		  }
		  //break ;
		}



		$text=ob_get_clean() ;
		echo $text ;
		LOGS()->reg_log('convert_iDisk_to_new_format',$text) ;
	} else echo 'Уже новый формат' ;

 }




}

?>
