<?php
include_once("c_setting.php");

class c_page_cab_setting_update extends c_page_cab_setting
{
  public $h1='Обновления ПО' ;
  public $disabled_button_to_superreader=1 ;

  function second_menu_config()
    { $this->second_menu['/cab/setting/update/']=array('title'=>'Обновление','class'=>'fa fa-user-md') ;
      $this->second_menu['/cab/setting/moduls/']=array('title'=>'Конфигурация','class'=>'fa fa-user-md') ;
      $this->second_menu['/cab/locals/']=array('title'=>'Локализация','class'=>'fa fa-user-md') ;
      $this->second_menu['/cab/setting/terminal_update/']=array('title'=>'Обновление терминалов','class'=>'fa fa-user-md') ;
      if ($GLOBALS['_SETTING']['modules']['kt']) $this->second_menu['/cab/setting/terminal_update_KT/']=array('title'=>'Обновление терминалов КТ','class'=>'fa fa-user-md') ;
      $this->second_menu['/cab/setting/diagnostik/']=array('title'=>'Диагностика ЭСМО','class'=>'fa fa-user-md') ;
      $this->second_menu['/cab/setting/update/old_versions/']=array('title'=>'Совместимость версий','class'=>'fa fa-user-md') ;
      $this->second_menu['/cab/setting/update/erase_versions/']=array('title'=>'Контроль версий','class'=>'fa fa-user-md') ;
      $this->second_menu['/cab/setting/update/check_systems/']=array('title'=>'Проверки','class'=>'fa fa-user-md') ;
    }


 function block_main()
 { $this->page_title() ;  //damp_array($_POST,1,-1) ;
    //damp_array($GLOBALS['_SETTING']['dist'],1,-1) ;
    //echo '_ENGINE_VERS='._ENGINE_VERS.'<br>' ;
    //echo '_CLASS_VERS='._CLASS_VERS.'<br>' ;
   if (!$this->cmd_exec_result['no_default_panel'])
   { ?><table class="setting_update"><tr>
        <td><?$this->update_from_zip() ;?></td>
        <td><?$this->panel_vers_class_select() ;?></td>
        <td><div class="sky-form no_box_shadow"><?
                $this->panel_check_db() ;
                $this->panel_check_setting() ;
                $this->panel_export_setting() ;
             ?></div>
        </td>
      </tr>
       <tr><td><?$this->update_from_git()?></td>
           <td colspan="2" rowspan="2" style="padding:0 20px;"><?$this->upload_from_git()?></td>
       </tr>
      <tr><td><?$this->panel_var_info()?></td></tr>

       </table>




      <style type="text/css">
        table.setting_update{width:100%;table-layout:fixed;}
        table.setting_update > tbody > tr > td{vertical-align:top;border-left:1px dashed #aaaaaa;padding:0 15px 0 15px;}
        table.setting_update > tbody > tr > td:first-child{border-left:none;padding-left:0;}
      </style>
    <?
   }
 }

 function panel_var_info()
     {
       ?><br><strong>Настройки PHP, определяющие загрузку файлов</strong>
            <table class="basic fz_small">
                <tr><td class="left">Загрузка файлов разрешена</td><td><?echo ini_get('file_uploads')?></td></tr>
                <tr><td class="left">Максимальный размер файла, загружаемого через POST</td><td><?echo ini_get('post_max_size')?></td></tr>
                <tr><td class="left">Максимальный размер закачиваемого файла</td><td><?echo ini_get('upload_max_filesize')?></td></tr>
            </table><?
     }

function panel_file_upload()
   {
       include(_DIR_EXT.'/upload_files/panel_upload_files.php')  ;
       panel_upload_files(array('text'=>'Перетяните и отпустите сюда<br>архив с обновлением',
           'upload_url'=>'/services/aspmo_setting/upload_update/',
           'file_filter'=>'zip',
           //'style_panel'=>'margin:0;',
           'SendFormOnUploadSuccess'=>0,
           'view_debug_panel'=>0,
           'style_panel'=>'width:400px;margin:10px auto;',
           'onUploadSuccessFunction'=>'onUploadSuccessFunction',
       )) ;
       ?><script type="text/javascript">
           function  onUploadSuccessFunction(data)
           {
               data.cmd='aspmo_setting/upload_from_file_exec' ;
               send_ajax_request(data);
           }
         </script><?
   }

function update_from_zip()
 { set_time_limit(0) ;
   ?>
     <h2>Загрузка обновлений с архива</h2>
     <?$this->panel_file_upload() ;?>
     <div class="alert">Внимание! Версия загружаемого обновления не должна совпадать с текущей версией ЭСМО</div>
   <?
 }

 function update_from_git()
   {   if (!$GLOBALS['LS_update_git_server_url'] or !$GLOBALS['LS_update_git_branch']) return ;
       ?><h2>Загрузка обновлений с репозитария ЭСМО</h2>
         <table class="basic fz_small">
             <tr><td class="left">Адрес репозитария</td><td class="left"><?echo $GLOBALS['LS_update_git_server_url']?></td></tr>
             <tr><td class="left">Название ветки</td><td class="left"><?echo $GLOBALS['LS_update_git_branch']?></td></tr>
         </table><br>
          <form class="sky-form no_box_shadow"><button class="button v1" cmd="check_update_from_git">Проверить наличие обновлений</button></form>
         <div class="clear"></div>
       <br>
       <?

   }


   function upload_from_git()
   {   if (!_sizeof($this->arhive_info)) return ;
       ?><form class="sky-form no_box_shadow">
          <h2>Пакеты ПО ЭСМО, доступные для установки на сервер:</h2>
         <table class="basic fz_small"><tr><th>Название пакета</th><th>Размер</th><th>Дата сборки</th><th>Содержимое пакета</th><th>Релиз</th><th>Выбор</th></tr>
            <?foreach($this->arhive_info as $rec)
            {   $name=str_replace('esmo-full-','esmo-full_v.',$rec['fname']) ;
                $name=str_replace(array('esmo-','.zip'),'',$name) ;
                $vers=$this->explode_vers($name) ;
                ?><tr><td class="left"><?echo $rec['fname']?></td>
                   <td class="right"><?echo show_size($rec['size'])?></td>
                   <td><?echo $rec['data']?></td>
                   <td><?echo strtoupper($vers['system'])?></td>
                   <td class="left"><?echo $vers['relis'].' от '.$vers['data']?></td>
                   <td><input type="checkbox" name="file_to_upload[]" value="<?echo $rec['fname']?>"></td>
               </tr><?}?>
         </table><br>

         <button class="button v2" cmd="aspmo_setting/upload_from_git_exec">Скачать выбранные пакеты</button>
         </form>

       <?

   }



 var $arhive_info=array() ;

 function CMD_check_update_from_git()
 {
   $arr=parse_url($GLOBALS['LS_update_git_server_url']) ;
   $result=IO()->doPut_v2($arr['scheme'].'://',$arr['host'],$arr['path'].$GLOBALS['LS_update_git_branch'].'/','','',
           array('basic_login'=>$GLOBALS['LS_update_git_login'],
                 'basic_pass'=>$GLOBALS['LS_update_git_password'])) ;
   //damp_array($result,1,-1) ;
   if ($result['status']==200)
   {   $recs=pc_link_extractor($result['content']) ;
       //damp_array($recs) ;
       $this->arhive_info=array() ;
       if (_sizeof($recs)) foreach($recs as $arr) if (preg_match_all('/(.+?)\.work\.zip/is',$arr[0],$matches,PREG_SET_ORDER))
       { preg_match_all('/<span(.+?)>(.+?)<\/span>/is',$arr[1],$arr_info,PREG_SET_ORDER);
         $this->arhive_info[]=array('fname'=>$arr_info[0][2],'size'=>$arr_info[1][2],'data'=>$arr_info[2][0]) ;
       }
       //print_2x_arr($this->arhive_info) ;
       echo 'Получены данные по актуальным пакетам с репозитария<br>' ;
   }
   else
   {   ?><div>Ошибка при выполнении запроса</div><?
       if ($result['status']==401) echo '<div style="color:red;font-size:18px;margin:10px 0;">Запрет доступа</div>Проверьте логин и пароль для доступа к репозитарию. <a href="/cab/setting/config/">Перейти в настройки</a>' ;
       elseif ($result['status']==404) echo '<div style="color:red;font-size:18px;margin:10px 0;">Репозитарий не найден</div>Проверьте URL и наименование ветки репозитария. <a href="/cab/setting/config/">Перейти в настройки</a>' ;
       elseif ($result['status']==0) echo '<div style="color:red;font-size:18px;margin:10px 0;">Сервер репозитария не отвечает</div>Проверьте сетевую доступность или URL репозитария. <a href="/cab/setting/config/">Перейти в настройки</a>' ;
       else damp_array($result,1,-1) ;
   }


   //get_all
   //preg_match_all($pattern,$subject)
   //if (preg_match_all('/<a href="(.+?)"(.+?)><span class="name">(.+?)</span><span class="size">(.+?)</span><span class="data">(.+?)</span></a>/is',$cont,$matches,PREG_SET_ORDER))
   //echo $cont ;
 }

 function explode_vers($vers_name)
 { $arr=explode('_',$vers_name) ;
   $result['system']=$arr[0] ;
   $arr2=explode('.',$arr[1]) ;
   $result['branch']=$arr2[2] ;
   if ($arr2[3]) $result['branch'].='.'.$arr2[3] ;
   $arr3=str_split($arr2[1]) ;
   $result['data']=$arr3[6].$arr3[7].'.'.$arr3[4].$arr3[5].'.'.$arr3[0].$arr3[1].$arr3[2].$arr3[3] ;
   $result['relis']=substr($arr2[1],8,4) ;
   $result['class_vers']=substr_replace($arr[1],'',0,1) ;
   $result['relis_info']=($result['relis'])? $result['branch'].'.'.$result['relis'].' от '.$result['data']:$vers_name ;
   $result['relis_info_full']=strtoupper($result['system']).'/'.$result['branch'].' #'.$result['relis'].' от '.$result['data'] ;
   $result['dir']=$vers_name ;
   $result['is_local_vers']=strpos($result['relis_info'],'local')!==false ;
   //damp_array($result) ;
   return($result) ;
 }

 function get_list_class_dir($options=array())
 {  $dir_list=get_dir_list(_DIR_TO_ROOT.'/') ;
    $vers_class=array() ;
    if (_sizeof($dir_list)) foreach($dir_list as $dir_name=>$dir_path)
    {   if (mb_strpos($dir_name,'class')!==false)
        {   $vers=$this->explode_vers($dir_name) ;
            if (((!$options['include_current_version'] and $vers['class_vers']!=_CLASS_VERS) or $options['include_current_version']) and !$vers['is_local_vers']) $vers_class[$vers['relis']]=$vers ;
        }
    }
    krsort($vers_class) ;
    return($vers_class) ;
 }

 function get_list_engine_dir($options=array())
 { $dir_list=get_dir_list(_DIR_TO_ROOT.'/') ;
   $vers_class=array() ;
    if (_sizeof($dir_list)) foreach($dir_list as $dir_name=>$dir_path)
    {   if (mb_strpos($dir_name,'engine')!==false)
       {   $vers=$this->explode_vers($dir_name) ;
            $vers_class[$vers['relis']]=$vers ;
        }
       }
     krsort($vers_class) ;
    return($vers_class) ;
 }

 function get_list_locals_dir($options=array())
 {   $vers_local=array() ;
     $dir_list=get_dir_list(_DIR_TO_ROOT.'/') ;
     if (_sizeof($dir_list)) foreach($dir_list as $dir_name=>$dir_path) if (mb_strpos($dir_name,'local')!==false)
     {   $vers=$this->explode_vers($dir_name) ;
         if (((!$options['include_current_version'] and $vers['class_vers']!=_LOCAL_VERS) or $options['include_current_version'])) $vers_local[$vers['relis']]=$vers ;
     }
     if (_sizeof($vers_local)) krsort($vers_local) ;
     return($vers_local) ;
 }

 function panel_vers_class_select()
 { $vers_class=$this->get_list_class_dir() ;
   $vers_local=$this->get_list_locals_dir() ;
     //damp_array($vers_class,1,-1) ; echo '_CLASS_VERS='._CLASS_VERS.'<br>' ;echo '_CLASS_='._CLASS_.'<br>' ;echo _SERVER_ENGINE_VERS.'<br>' ;
     //damp_array($vers_local,1,-1) ; echo '_LOCAL_VERS='._LOCAL_VERS.'<br>' ;echo '_CLASS_LOCAL_='._CLASS_LOCAL_.'<br>' ;echo _SERVER_ENGINE_VERS.'<br>' ;
     $cur_version=$this->explode_vers(_CLASS_) ;
     $local_version=$this->explode_vers(_CLASS_LOCAL_) ;
   ?><h2>Версия скриптов ЭСМО</h2>
      <form class="sky-form no_box_shadow"><table class="vers_info" style="width:100%;">
            <tr><td>Текущая версия скриптов ЭСМО</td><td class="vers" style="width:300px;"><?echo $cur_version['relis_info']?></td></tr>
             <? if (_sizeof($vers_class)){?><tr><td>Изменить версию</td><td><label class="select"><select name="_CLASS_VERS" style="width:300px;"><option></option><?
             foreach($vers_class as $vers) {?><option value="<?echo $vers['class_vers']?>"><?echo $vers['relis_info']?></option><?}
             ?></select><i></i></label></td></tr><?}?>
        </table>
       <h2>Версия локальных скриптов</h2>
       <form class="sky-form no_box_shadow"><table class="vers_info" style="width:100%;">
            <tr><td>Текущая версия локальных скриптов</td><td class="vers" style="width:300px;"><?echo $local_version['relis_info']?></td></tr>
             <? if (_sizeof($vers_local)){?><tr><td>Изменить версию</td><td><label class="select"><select name="_LOCAL_VERS" style="width:300px;"><option></option><?
             foreach($vers_local as $vers) {?><option value="<?echo $vers['class_vers']?>"><?echo $vers['relis_info']?></option><?}
             ?></select><i></i></label></td></tr><?}?>
        </table>
        <button class="button v1" cmd="change_versions">Изменить версию</button>
     </form><div class="clear"></div> <?
 }

 function panel_check_setting()
 { ?><h2>Настройки ЭСМО</h2><?
   ?><button class="button v1" cmd="check_setting">Проверить базовые настройки</button><div class="clear"></div><br><?
 }

 function CMD_check_setting()
 { include(_DIR_TO_MODULES.'/engine/i_backgroup_process.php') ;
   $back_process=new i_backgroup_process('/services/aspmo_setting/check_setting/') ; // будет вызван  /ext/events/c_update_personal_status.php::c_update_personal_status->show()
   $back_process->panel_background_process() ;
 }

 function panel_check_db()
 {   ?><h2>База данных</h2><?
     ?><button class="button v1" cmd="check_setting">Проверить таблицы</button><div class="clear"></div><br><?
 }

    function CMD_change_versions()
        { // меняем версию patch для очень старых инсталяций
          $cont=file_get_contents(_DIR_TO_ROOT.'/ini/patch.php') ;
          if ($_POST['_CLASS_VERS']) $cont=preg_replace('/["\']_CLASS_VERS["\'],\'(.+?)\'/','\'_CLASS_VERS\',\''.$_POST['_CLASS_VERS'].'\'',$cont) ;
          if ($_POST['_ENGINE_VERS']) $cont=preg_replace('/["\']_ENGINE_VERS["\'],\'(.+?)\'/','\'_ENGINE_VERS\',\''.$_POST['_ENGINE_VERS'].'\'',$cont) ;
          $res=file_put_contents(_DIR_TO_ROOT.'/ini/patch.php',$cont) ;

          // новая схема
          if (file_exists($_SERVER['DOCUMENT_ROOT'].'/ini/spyc.php') and file_exists($_SERVER['DOCUMENT_ROOT'].'/ini/ini.yaml'))
          { include($_SERVER['DOCUMENT_ROOT'].'/ini/spyc.php');
            $_SETTING = Spyc::YAMLLoad($_SERVER['DOCUMENT_ROOT'].'/ini/ini.yaml');
            if ($_POST['_CLASS_VERS'])
                { $_SETTING['dist']['esmo_version']='class_v'.$_POST['_CLASS_VERS'] ;
                  $_SETTING['dist']['class_version']='class_v'.$_POST['_CLASS_VERS'] ;
                  $_SETTING['dist']['engine_version']='class_v'.$_POST['_CLASS_VERS'].'/system' ;
                }
            if ($_POST['_LOCAL_VERS'])
                { $_SETTING['dist']['local_version']='local_v'.$_POST['_LOCAL_VERS'] ;
                }

            $yaml = Spyc::YAMLDump($_SETTING,4,60);
            file_put_contents(_DIR_TO_ROOT.'/ini/ini.yaml',$yaml) ;
          }

          if ($res)
          { echo '<div class="green">Версия успешно изменена, страница будет перезагружена...</div>' ;
            ?><script type="text/javascript">setTimeout(function() {document.location="/cab/setting/update/";},2000);</script><?

          }
          else echo '<div class="alert">Не удалось внести изменения в файл конфигурации ('._DIR_TO_ROOT.'/ini/ini.yaml)</div>' ;
        }

        function panel_export_setting()
        {   ?><h2>Экспорт конфигурации</h2><?
            ?><button class="button v1" href="/services/esmo/config_xml/">Скачать конфигурацию ЭСМО</button><div class="clear"></div><br><?
        }


}



?>
