All2khoff
Продвинутый
- Сообщения
- 352
- Репутация
- 65
Добрый день уважаемые форумчане.
Опишу ситуацию и задачу которую я сам себе поставил.
Работаю в организации продающей алкоголь в нескольких торговых точках.
На каждой торговой точке стоит "сервер" УТМ на linux ubuntu, ключ используемый для подписи документов JaCarta.
Периодически возникает проблема с этим ключем, он выпадает в ошибку "Проблема RSA"(как только ключ отвалился алкоголь не продать) или перестает отправлять чеки(можно не отправлять 3 суток потом перестает продавать алкоголь), состояние ключа или статус чеков можно отследить на "сайте" генерируемый этим сервером и доступному по адресу http://ip-сервера:8080.
Решение в принципе простое, сервер перезагрузить и система начинает работать.
Собственно я накропал скрипт, отлавливающий со страницы статус ошибки или что чеки не отправлялись.
В скрипте я использую данные полученные из INI-файла UTM.ini
в нем идет набор данных для теста и авторизации на сервере
в файл лога данные пишутся только о выполненных попытках перезагрузки с причиной
В принципе работает, но хотелось бы избавиться от запуска IE.
код страницы с начала страницы до необходимых данных прикладываю
Вместо "продуктивный контур" появляется "Проблемы с RSA" а в поле "Отсутствуют неотправленные чеки" пишется "Чеки не отправлялись с %date%"
Моего скудного разума не хватает на "парсинг" сайта без открытия IE, буду благодарен за критику моей поделки и помощь в решении задачи.
Заранее спасибо.
Опишу ситуацию и задачу которую я сам себе поставил.
Работаю в организации продающей алкоголь в нескольких торговых точках.
На каждой торговой точке стоит "сервер" УТМ на linux ubuntu, ключ используемый для подписи документов JaCarta.
Периодически возникает проблема с этим ключем, он выпадает в ошибку "Проблема RSA"(как только ключ отвалился алкоголь не продать) или перестает отправлять чеки(можно не отправлять 3 суток потом перестает продавать алкоголь), состояние ключа или статус чеков можно отследить на "сайте" генерируемый этим сервером и доступному по адресу http://ip-сервера:8080.
Решение в принципе простое, сервер перезагрузить и система начинает работать.
Собственно я накропал скрипт, отлавливающий со страницы статус ошибки или что чеки не отправлялись.
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=..\..\..\Program Files (x86)\AutoIt3\Icons\MyAutoIt3_Green.ico
#AutoIt3Wrapper_Res_Description=Диагностика состояние RSA и проверка даты отправки чеков. Рекомендуется чтобы в ОС был установлен IE11.
#AutoIt3Wrapper_Res_Fileversion=0.6
#AutoIt3Wrapper_Res_Language=1049
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
#include <WinAPIEx.au3>
#include <Date.au3>
Global $hDesktop = DllCall("User32.dll", "int", "OpenDesktop", "str", "Default", "int", 0, "int", 0, "int", 0x100) ;переменная для определения не заблокирован ли компьютер
While 1 ;Начало бесконечного цикла провери серверов УТМ
_ieclose() ;Закрыть все процессы IE
Global $iputm = IniReadSection("UTM.ini", "UTM IP") ;Получить данные блока "UTM IP" из ini файла
Global $UTMlogin = IniReadSection("UTM.ini", "UTM login") ;Получить список логинов для УТМ
Global $UTMpassword = IniReadSection("UTM.ini", "UTM passwords") ;Получить список паролей УТМ
_utmtest() ;Основная функция првоерки серверов УТМ
Global $iputm = 0 ;Очистка переменных для обновления настроек в случае редактирования файла ini
Global $UTMlogin = 0
Global $UTMpassword = 0
WEnd
Func _utmtest() ;Проверка состояния сервера УТМ
For $j = 1 To $iputm[0][0] ;Проходим с первой до последней строки файла ini и выбираем оттуда нужные данные
Local $oIE, $sHtml, $sUrl ="http://192.168."&$iputm[$j][1]&":8080/" ;URL построенные на основе переменных из файла ini
$oIE = _IECreate($sUrl,0,0) ;Создаем скрытую страницу с выбранным адресом
_IELoadWait($oIE) ;Дожидаемся полной загрузки страницы
$sHtml = _IEBodyReadHTML($oIE) ;Возвращает код HTML-документа заключённый в тегах <body>
For $x = 3 to 30 ;Проходим по датам от 3 до 30 дней назад для поиска зависших чеков УТМ
$stempDate = _DateAdd( 'd',-$x, _NowCalcDate()) ;Переменная обозначения даты для поиска зависших чеков УТМ
$datetext = BinaryToString($stempDate) ;Перевести формата даты в текст для более удобной работы
$date = StringReplace($datetext, '/', '-') ;Изменение разделителей даты с "/" на "-"
If StringInStr($sHtml, "Чеки не отправлялись с "&$date) > 0 Or StringInStr($sHtml, "Чеки не отправлялись с "&$date) > 0 Then ;Ищем текст на странице
_plink($iputm[$j][1]) ;Данная функция выполняет перезагрузку сервера УТМ
_logcheck($iputm[$j][1],$iputm[$j][0],$date) ;Сохранить в лг данные о выполненой операции
Else
EndIf
Next
If StringInStr($sHtml, "Проблемы с RSA") > 0 Or StringInStr($sHtml, "Проблемы с RSA") > 0 Then ;Ищем текст на странице
_plink($iputm[$j][1]) ;Данная функция выполняет перезагрузку сервера УТМ
_logrsa($iputm[$j][1],$iputm[$j][0]) ;Сохранить в лг данные о выполненой операции
Else
EndIf
_IEQuit($oIE) ;Закрыть созданное окно IE
sleep(200)
_ieclose() ;Функция избыточного завершения IE если предыдущая команда не справилась
Next
EndFunc
Func _ieclose() ;Закрываем все процессы ИЕ
$ieprocess = ProcessList('iexplore.exe') ;Возвращает двумерный массив, содержащий список выполняемых процессов (имя и PID).
For $ie = 1 To $ieprocess[0][0] ;$ieprocess[0][0] - это количество процессов
If ProcessExists($ieprocess[$ie][1]) Then ProcessClose($ieprocess[$ie][1]) ;Если процесс существует, то закрываем его
Next
$ieprocess2 = ProcessList('iexplore.exe *32') ;Возвращает двумерный массив, содержащий список выполняемых процессов (имя и PID).
For $ie2 = 1 To $ieprocess2[0][0] ;$ieprocess2[0][0] - это количество процессов
If ProcessExists($ieprocess2[$ie2][1]) Then ProcessClose($ieprocess2[$ie2][1]);Если процесс существует, то закрываем его
Next
EndFunc
Func _plink($addres) ;Скрытая перезагрузка УТМ
$sshkeypid = Run(@ComSpec & " /c echo yes |plink.exe 192.168."& $addres , "", @SW_HIDE) ;Автоматическое добавление ключа ssh при его отсутсвтии в системе
sleep(4000)
ProcessClose($sshkeypid)
For $z = 1 To $UTMlogin[0][0]
For $y = 1 To $UTMpassword[0][0]
Opt("SendKeyDelay", 100)
$PPID = Run("plink.exe 192.168."& $addres, "", @SW_HIDE, $STDIN_CHILD)
Sleep(10000)
StdinWrite($PPID, $UTMlogin[$z][1]&@CRLF)
Sleep(5000)
StdinWrite($PPID, $UTMpassword[$y][1]&@CRLF)
Sleep(15000)
StdinWrite($PPID, "sudo reboot"&@CRLF)
Sleep(10000)
StdinWrite($PPID, $UTMpassword[$y][1]&@CRLF)
Sleep(10000)
ProcessClose($PPID)
Next
Next
EndFunc
Func _logcheck($iputm1,$iputm2,$date) ;Лог чеков
FileWrite ("UTMlogbad.txt", @YEAR&"-"&@MON&"-"&@MDAY&" "&@HOUR&":"&@MIN&":"&@SEC&@TAB&"192.168."&$iputm1&@TAB&$iputm2&@TAB&@TAB&@TAB&" Чеки не отправлялись с "&$date&", попытка перезагрузки выполнена"&@CRLF)
FileClose ("UTMlogbad.txt")
EndFunc
Func _logrsa($iputm1,$iputm2) ;Лог RSA
FileWrite ("UTMlogbad.txt", @YEAR&"-"&@MON&"-"&@MDAY&" "&@HOUR&":"&@MIN&":"&@SEC&@TAB&"192.168."&$iputm1&@TAB&$iputm2&@TAB&@TAB&@TAB&" Проблемы с RSA, попытка перезагрузки выполнена"&@CRLF)
FileClose ("UTMlogbad.txt")
EndFunc
В скрипте я использую данные полученные из INI-файла UTM.ini
в нем идет набор данных для теста и авторизации на сервере
Код:
[UTM IP]
Магазин 1 = 141.12
Магазин 2 = 142.12
.....
Магазин 42 = 195.12
[UTM login]
Логин для сервера утм1 = egais
логин для сервера утм2 = egais2
[UTM passwords]
пароль для утм1 = 123456
пароль для утм2 = 321654
пароль для утм3 = 123654
Код:
2018-04-12 00:02:03 192.168.142.12 Магазин 2 Чеки не отправлялись с 2018-04-09, попытка перезагрузки выполнена
2018-04-12 00:06:42 192.168.148.12 Магазин 8 Чеки не отправлялись с 2018-04-09, попытка перезагрузки выполнена
2018-04-12 09:55:48 192.168.152.12 Магазин 12 Проблемы с RSA, попытка перезагрузки выполнена
В принципе работает, но хотелось бы избавиться от запуска IE.
код страницы с начала страницы до необходимых данных прикладываю
Код:
<!DOCTYPE html>
<!-- saved from url=(0026)http://192.168.195.12:8080/ -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>УТМ</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="./УТМ_files/bootstrap.min.css" rel="stylesheet">
<link href="./УТМ_files/bootstrap-table.css" rel="stylesheet">
<link href="./УТМ_files/utm.css" rel="stylesheet">
<script src="./УТМ_files/jquery.min.js.Без названия"></script><style></style>
<script src="./УТМ_files/bootstrap.min.js.Без названия"></script>
<script src="./УТМ_files/bootstrap-table.js.Без названия"></script>
<script src="./УТМ_files/bootstrap-table-ru-RU.min.js.Без названия"></script>
<script src="./УТМ_files/utm.js.Без названия"></script>
</head>
<body>
<div class="container">
<h2 id="title-eagle"><img src="./УТМ_files/eagle.png" alt="Двуглавый орел"> Универсальный транспортный модуль</h2>
<div id="wrapper">
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="http://192.168.195.12:8080/#home">Главная</a></li>
<li><a data-toggle="tab" href="http://192.168.195.12:8080/#menu1">Сертификаты</a></li>
<li><a data-toggle="tab" href="http://192.168.195.12:8080/#menu2">XML схемы</a></li>
<li><a data-toggle="tab" href="http://192.168.195.12:8080/#menu3">История</a></li>
<li><a data-toggle="tab" href="http://192.168.195.12:8080/#menu4">Исходящие</a></li>
<li><a data-toggle="tab" href="http://192.168.195.12:8080/#menu5">Входящие</a></li>
</ul>
</div>
<div class="tab-content">
<div id="home" class="tab-pane fade in active">
<h4>Информация об установленном УТМ</h4>
<div class="info-line row"><div class="col-md-4 col-sm-4 col-lg-4"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>Версия ПО</div><div class="col-md-8 col-sm-8 col-lg-8">2.1.6</div></div>
<div class="info-line row"><div class="col-md-4 col-sm-4 col-lg-4"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span>Продуктивный контур</div><div class="col-md-8 col-sm-8 col-lg-8">RSA сертификат pki.fsrar.ru соответствует контуру</div></div>
<div class="info-line row"><div class="col-md-4 col-sm-4 col-lg-4"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span>Статус лицензии</div><div class="col-md-8 col-sm-8 col-lg-8">Лицензия на вид деятельности действует</div></div>
<div class="info-line row"><div class="col-md-4 col-sm-4 col-lg-4"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>Дата создания БД</div><div class="col-md-8 col-sm-8 col-lg-8">2017-11-17 10:01:02.507</div></div>
<div class="info-line row"><div class="col-md-4 col-sm-4 col-lg-4"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>Неотправленные чеки</div><div class="col-md-8 col-sm-8 col-lg-8">Отсутствуют неотправленные чеки</div></div>
<div class="info-line row"><div class="col-md-4 col-sm-4 col-lg-4"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span>Сертификат RSA</div><div class="col-md-8 col-sm-8 col-lg-8">Действителен с 2018-02-19 12:37:56 +1000 по 2018-12-10 23:14:58 +1000</div></div>
<div class="info-line row"><div class="col-md-4 col-sm-4 col-lg-4"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span>Сертификат ГОСТ</div><div class="col-md-8 col-sm-8 col-lg-8">Действителен с 2018-02-19 09:21:22 +1000 по 2019-05-19 09:21:22 +1000</div></div>
</div>
Вместо "продуктивный контур" появляется "Проблемы с RSA" а в поле "Отсутствуют неотправленные чеки" пишется "Чеки не отправлялись с %date%"
Моего скудного разума не хватает на "парсинг" сайта без открытия IE, буду благодарен за критику моей поделки и помощь в решении задачи.
Заранее спасибо.