четверг, 5 апреля 2012 г.

Скрипт обновления форм статистики

Задача:  Мониторить появление новых или обновленных форм статистики, и если таковые находились, сообщать об этом пользователям.

Решение:

Небольшой скрипт на php, который парсит страницу с обновлениями, сравнивает формы с имеющимися, и с учетом потребности пользователей, рассылает сообщения о появлении обновленной формы, и ссылку на установку этой формы.

//Источник
> $html3 = file_get_contents('http://www.kalugastat.ru/statrep/DocLib2/Forms/Main.aspx');
//Регулярный выражение, которые вытаскивают со страницы, название формы, ссылку на скачивание, и дату публикации.
preg_match_all('/(?<NOBR>)[\d]{2}[\.][\d]{2}[\.][\d]{4}[\s]*[\d]*[\:][\d]*(?=<\/NOBR>)/', $html3, $date);
preg_match_all('/(?<=vb2\">)[^<]*(?=<\/TD><TD)/', $html3, $name);
preg_match_all('/(?<=\sUrl=\"\/statrep\/DocLib2\/)[\w,\d,\-,\_]*(?=.rar\"\s)/', $html3, $outlink);
//Объединение всех полученных данных в один массив
$url4[0] = $outlink[0]; //files
$url4[1] = $date[0]; //dates
$url4[2] = $name[0]; //names

//Массив пользователей, и форм пользователей.
$massform=Array("0"=> array("0" => "user1@domain.ru", "1" => array( "0" => "5-З")),
                "1"=> array("0" => " user2@domain.ru ", "1" =>  array( "0"=> "1-ТС (вывоз)", "1"=> "цены производителей")),
                "2"=> array("0" => " user3@domain.ru ", "1" => array( "0"=> "1-Инвест", "1"=> "П-2","2"=>"инвестиц", "3"=>"Форма 11", "4"=> "ИАП")),
                "3"=> array("0" => " user4@domain.ru ", "1" => array( "0"=> "1-РП", "1"=>"3-информ", "2"=>"П-3","3"=>"П-6")),
                "4"=> array("0" => " user5@domain.ru ", "1" => array( "0"=> "1-ТЭП","1"=>"автотранспорт", "2"=>"11-ТЭР","3"=>"4-ТЭР", "4"=> "24-Энергетика")),
                "5"=> array("0" => " user6@domain.ru ", "1" => array( "0"=> "2-ТП", "1"=>"4-ОС","2"=> "7-Травматизм")),
                "6"=> array("0" => " user7@domain.ru ", "1"=>array("0"=>"1-цены приобретения", "1"=>"65-автотранспорт","2"=>"Баланс производственной мощнос$
                            "4"=>"П-4", "5"=>"1-натура", "6"=>"1-предприятие","7"=>"1-Т (условия труда)", "8"=>"1-ДАП","9"=>"57-Т","10"=>"П1"))
                );
//Проход по массиву полученных данных
for($ik=0; $ik<22; $ik++)
{
$urlreport = "http://www.kalugastat.ru/statrep/DocLib2/".$url4[0][$ik].".rar";
$path = "/var/www/statupd/".$url4[0][$ik].".xml";
//Проверка, если форма уже существует, то пропускать, если нет, то идем дальше
if(!file_exists($path)) {
//Проход по массиву пользователей
for($j=0; $j<count($massform); $j++)
  {
$str = implode(",",$massform[$j][1]);
//Если в пользовательских формах есть совпадение с формой, найденной на сайте, то скачиваем форму, распаковываем, копируем в нужное место.
if(strpos($str,substr($url4[2][$ik],0,10)))
{
exec("echo 'Новая форма ".$url4[2][$ik]." от ".$url4[1][$ik]." для ".$massform[$j][0]."' | sendxmpp -s 'Statistacs update' alexey@ermolino");
exec("wget -N -O /var/www/statupd/".$url4[0][$ik].".rar $urlreport  > /dev/null 2>&1");
exec("unrar x /var/www/statupd/".$url4[0][$ik].".rar /var/www/statupd  > /dev/null 2>&1");
exec("rm /var/www/statupd/".$url4[0][$ik].".rar");
exec("cp /var/www/statupd/".$url4[0][$ik].".xml /home/router/share/files/statupd/".$url4[0][$ik].".xml");
//Отсылаем сообщение пользователю, о том что нашлась обновленная форма, и даем ему ссылку на установку этой формы.
exec("echo 'Обновите форму статистики ".$url4[2][$ik]." от ".$url4[1][$ik].". Установить - http://192.168.1.2/statbat.php?f=".$url4[0][$ik].".xml' $
        }
  }
}
}?> 
Скрипт установки формы - это простой скрипт, который формирует bat файл, запуская который пользователь устанавливает себе новую форму.


<?
//Устанавливаем header, для того, чтобы файл сохранялся, а не выводился на экран
header("Content-Disposition: attachment; filename=statbat.cmd");
$f = $_GET['f'];
?>
copy "\\192.168.1.2\!share\files\statupd\<?=$f?>" "%PROGRAMFILES%\NIPIstatinform\Формы статотчетности\Data\<?=$f?>";
?>