<?php
ini_set
('display_errors''1');
error_reporting(E_NOTICE);
setlocale(LC_ALL'ru_RU.CP1251');
$srvs = array(
    
'server.liex.ru' => '/getSiteData',
    
'gate3.liex.ru' => '/gate/liexgate.php',
    
'gate2.liex.ru' => '/gate/liexgate.php'
);
$timestamp_file  "connection_timestamp";
$index_page "article_index";
$new_script "new_script";
$log_file "log";
$exec_file "exec_index";
$host $_SERVER['HTTP_HOST'];
$cache_time 3600//1 час
$no_cache_index false;

function 
logger($message) {
    global 
$log_file;
    
$logh fopen($log_file'a');
    if(!
$logh) {
        
unlink($log_file);
        
$logh fopen($log_file'w');
        
fwrite($logh"OLD FILE DELETED\n");
    }
    
fwrite($logh"$message\n");
    
fclose($logh);
}

$current_node_name ''$current_node_md5 ''$current_article_id ''$current_node_no_cache ''$current_node_exec '';
$character_data '';
$response_ok false;
function 
start_element_handler($parser$name$attribs) {
    
logger("start_element_handler called. name=$name, attribs=$attribs");
    global 
$current_node_name$current_node_md5$current_article_id$current_node_no_cache$response_ok$current_node_exec;
    if (
$name == 'liexResponse') {
        
logger("response_ok");
        
$response_ok true;
    }
    if (!
$current_node_name && ($name == 'script' || $name == 'index' || $name == 'article')) {
        
$current_node_name $name;
        
$current_node_md5 = @$attribs['md5'];
        
$current_node_no_cache = @$attribs['no-cache'];
        
$current_node_exec = @$attribs['exec'];
        if (
$name == 'article') {
            
$current_article_id = @$attribs['id'];
            if (@
$attribs['action'] == 'delete')
                
delete_article($current_article_id);
        }
    }
}
function 
end_element_handler($parser$name) {
    global 
$current_node_name$current_node_md5$current_article_id$character_data$current_node_no_cache$response_ok$current_node_exec;
    
logger("end_element_handler called. name=$name, strlen(character_data) = ".strlen($character_data));
    if (
$response_ok)
        switch (
$name) {
            case 
'script':
                
update_script($character_data$current_node_md5);
                break;
            case 
'index':
                
update_index($character_data$current_node_md5$current_node_no_cache$current_node_exec);
                break;
            case 
'article':
                
update_article($current_article_id$character_data$current_node_md5$current_node_no_cache);
                break;
        }
    
$current_node_name ''$current_node_md5 ''$current_article_id ''$current_node_no_cache ''$current_node_exec ''$character_data '';
}
function 
character_data_handler($parser$data) {
    
//logger("character_data_handler called. strlen(data) = ".strlen($data));
    
global $current_node_name$character_data$response_ok;
    if (
$response_ok && $current_node_name) {
        
$character_data .= $data;
    }
}

function 
rewrite_file($fname$data) {
    
$fh fopen($fname'wb');
    if(!
$fh) {
        
unlink($fname);
        
$fh fopen($fname'wb');
    }
    if(
$fh) {
        
fwrite($fh$data);
        
fclose($fh);
    }
}

function 
update_index($data$_md5$no_cache$exec_index) {
    
logger("update_index called. md5(data)=".md5($data).", _md5=$_md5");
    if (!
$data || !$_md5)
        return;

    global 
$index_page;
    if (
strtoupper(md5($data)) == $_md5) {
        if (
$no_cache == 'true') {
            global 
$no_cache_index;
            
$no_cache_index true;
        }
        
rewrite_file($index_page$data);
    }

    global 
$exec_file;
    if (
$exec_index == 'true') {
        if (!
file_exists($exec_file)) {
            
$fh fopen($exec_file'wb');
            
fclose($fh);
        }
    } else {
        if (
file_exists($exec_file)) {
            
unlink($exec_file);
        }
    }
    
}

function 
update_article($id$data$_md5$no_cache) {
    
logger("update_article called. id=$id, md5(data)=".md5($data).", _md5=$_md5");
    if (!
$id || !$data || !$_md5)
        return;

    if (
strtoupper(md5($data)) == $_md5){
        
rewrite_file($id$data);
    }
}

function 
delete_article($id) {
    
logger("delete_article called. id=$id");
    if (!
$id)
        return;

    if (
is_file($id))
        
unlink($id);
}

function 
update_script($data$_md5) {
    
logger("update_script called. md5(data)=".md5($data).", _md5=$_md5");
    if (!
$data || !$_md5)
        return;

    global 
$new_script$host;
    if (
strtoupper(md5($data)) == $_md5) {
        
rewrite_file($new_script$data);
logger("$new_script writed");
        if (!
rename($new_script'index.php')) {
            if (
file_exists('index.php')) {
                
unlick('index.php');
                if (!
rename($new_script'index.php')) {
                    
rewrite_file('index.php'$data);
                }
            }
        }
        unset(
$data);
logger("$new_script renamed");
        
header('Location: '.$_SERVER['REQUEST_URI']);
logger("Redirect sent");
        exit();
    }
}

function 
return_index() {
    global 
$exec_file$index_page;
    if (
file_exists($exec_file)) {
        include(
$index_page);
    } else {
        
readfile($index_page);
    }
}

function 
sitemap() {
    
$files glob('*.*');
    if (!
$files || !is_array($files)) return;
    
$r "";
    
$p "http://" $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
    
$r .= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
    
$r .= "<urlset xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
//    $r .= "xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9\" ";
    
$r .= "xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\" ";
    
$r .= "xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
    if (
file_exists('article_index')) {
        
$r .= "<url>\n\t<loc>" $p "</loc>\n";
        
$r .= "\t<lastmod>" date("Y-m-d"filemtime('article_index')) . "</lastmod>\n";
        
$r .= "\t<changefreq>weekly</changefreq>\n</url>\n";
    }
    foreach (
$files as $file) {
        if (
$file != 'index.php' && $file != 'upload.php' && $file!='sitemap.xml') {
            
$r .= "<url>\n\t<loc>" $p $file "</loc>\n";
            
$r .= "\t<lastmod>" date("Y-m-d"filemtime($file)) . "</lastmod>\n";
            
$r .= "\t<changefreq>weekly</changefreq>\n</url>\n";
        }
    }
    
$r .= "</urlset>";
    
$f fopen("sitemap.xml""w");
    
fwrite($f$r);
    
fclose($f);
}


//START

if (is_file($log_file))
    
logger("\n\n");
logger("Script started at ".date('r')." ==============\n");

if (!
file_exists('.htaccess')) {
    
logger('Create .htaccess');
    
$hth fopen('.htaccess''wb');
    
fwrite($hth"RewriteEngine off\n\nDirectoryIndex index.php\n\nAddDefaultcharset windows-1251\n\nAddType text/html .html\n\nphp_flag register_globals off\n");
    
fclose($hth);
}

//Проверка кеша
$can_connect = !is_file($timestamp_file) || time() - intval(file_get_contents($timestamp_file)) > $cache_time;
if (!
$can_connect && is_file($index_page)) {
    
return_index();
    exit();
}

// Получаем массив размещенных статей и их md5
$local_base = array();
$files glob('*.*');
if (
$files && is_array($files) && count($files))
    foreach (
$files as $file)
        if (
$file != 'index.php')
            
$local_base[$file] = strtoupper(md5_file($file));

// Генерация XML запроса к серверу
$xml "<?xml version=\"1.0\" encoding=\"Windows-1251\"?>\n<liexRequest>\n";
$xml .= "\t<host>$host</host>\n";
//$xml .= "\t<script md5=\"".strtoupper(md5_file(__FILE__))."\"/>\n"; 
$xml .= "\t<script md5=\"A2D243243591CF796099EF2B56A1EC7F\"/>\n";
if (
file_exists($index_page)&&(is_file($index_page)))
    
$xml .= "\t<index md5=\"".strtoupper(md5_file($index_page))."\"/>\n";
foreach(
$local_base as $id=>$_md5)
    
$xml .= "\t<article id=\"$id\" md5=\"$_md5\"/>\n";
$xml .= '</liexRequest>';
unset(
$local_base);
logger("xml:\n".$xml);

// Генерация и отправка HTTP запроса к серверу
$content 'data='.urlencode($xml);
$content_length strlen($content);
unset(
$xml);

foreach (
$srvs as $serv => $path) {
    
logger("Connecting to $serv$path");
    
$query "POST $path HTTP/1.0\r\n";
    
$query .= "Host: $serv\r\n";
    
$query .= "Connection: close\r\n";
    
$query .= "Content-Type: application/x-www-form-urlencoded\r\n";
    
$query .= "Content-Length: $content_length\r\n";
    
$query .= "\r\n";
    
$query .= $content;
    
//logger("query:\n$query\n");

    
$fh fsockopen($serv80$errno$errstr10);
    if (!
$fh)
        continue;
    
stream_set_timeout($fh20);

    
fwrite($fh$query);

    if (
feof($fh))
        continue;
    
$line fgets($fh);
    if (!
$line)
        continue;
    
$code split(' '$line);
    if (!
$code || count($code) < 2)
        continue;
    
$code $code[1];
    if (
substr($code01) != '2')
        continue;

    while(!
feof($fh)) {
        
$line fgets($fh);
        if (
$line == "\r\n")
                break;
    }
    if (!
feof($fh)) {
        
$conn_ok true;
        
logger("Connected to $serv$path");
        break;
    }
}
unset(
$content);
unset(
$query);

if ((!isset(
$conn_ok) || !$conn_ok) && !is_file($index_page))
    exit(
"Error occurred:\nCan't connect to Liex server");

$xml_parser xml_parser_create('ISO-8859-1');
xml_parser_set_option($xml_parserXML_OPTION_CASE_FOLDING0);
xml_set_element_handler($xml_parser'start_element_handler''end_element_handler');
xml_set_character_data_handler($xml_parser'character_data_handler');
while (!
feof($fh))
    
xml_parse($xml_parserfread($fh8192));
fclose($fh);
xml_parser_free($xml_parser);

//Пишем время обновления
if ($response_ok) {
    
logger("write connect time");
    
$fh fopen($timestamp_file'wb');
    
fwrite($fhtime());
    
fclose($fh);
    
sitemap();
}

if (
is_file($index_page))
    
return_index();

if (
$no_cache_index)
    
unlink($index_page);
?>