Мониторинг ключей защиты HASP




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

86 Comments

  1. coder1cv8

    Конечно пока всё не совсем так как задумывалось, в частности, не могу найти причину самопроизвольного сворачивания окна 1С при формировании отчета…

    Reply
  2. coder1cv8

    Отчет сделан на базе Aladdin Monitor-а, кто пользовался этой утилитой наверняка заметил очень ограниченный функционал, ни скопировать, ни отсортировать соединения там нельзя…

    Reply
  3. akkvamarin

    чёто валиться, не могу сформировать 🙁

    Форма.ФормаОтчета(62)}: Индекс находится за границами массива

    НовСтр[н]=Массив[н];

    Reply
  4. coder1cv8

    (3) Перезалил. Сейчас валится не будет, но это косяк получения соединений. Попробуй в параметрах поставить «Таймаут»: 2000-3000 мс

    Reply
  5. akkvamarin

    (4) Ура! Заработало! 🙂

    Reply
  6. coder1cv8

    (5) С параметром?… У меня просто без таймаутов отрабатывает, поэтому я его и нулевым по-умолчанию оставил…

    Reply
  7. Safronov_S

    у меня не формируется. Ошибка: «Не может быть выполнено»

    Reply
  8. coder1cv8

    (7) хм… странная какая-то ошибка… Это сама 1С говорит или винда? А платформа какая?

    Reply
  9. PowerBoy

    Не смог добиться стабильной работы. Из 5 ключей дает информацию максимум по трем, причем каждый раз это разные ключи. Иногда выдает ошибку, что файл Aksmonitor.exe не найден. Изменение параметра не помогает.

    Reply
  10. coder1cv8

    (9) Мне, к сожалению, больше негде потестировать… У меня работает стабильно. Можешь скриншот в личку скинуть, как у тебя дерево серверов/ключей выглядит, которое в Aksmonitor-е слева?…

    Reply
  11. akkvamarin

    (6) нет, без него, в параметры не лазию. Вот иногда только выскакивает следующее:

    {Форма.ФормаОтчета(70)}: Ошибка при вызове метода контекста (УдалитьФайлы): Ошибка удаления файлов

    УдалитьФайлы(ВременныйКаталог);

    по причине:

    Ошибка удаления файлов

    Ругается на доступ к файлу ‘C:Documents and Settingsбла…бла…блаaksmon.exe’.

    А так потом через некоторое время или повторно запускаеш — работает

    Reply
  12. coder1cv8

    (11) Попробуем исправить. По ошибке (9) так же работаю…

    Reply
  13. AXoxol

    та же ошибка что и в (11)

    Reply
  14. coder1cv8

    Исправил ошибки, файл перезалил. Проверяйте (9) и (11).

    Reply
  15. akkvamarin

    Теперь ошибки описанной в 11 посте больше не было. Два плюса автору за оперативность !

    Reply
  16. PowerBoy

    Заработало! И таймаут для 5 ключей надо ставить 5000. +

    Reply
  17. coder1cv8

    (16) многовато… (

    Reply
  18. coder1cv8

    Больше ошибок нет? Пора выпускать не бета релиз? )

    Reply
  19. z-alexey

    {Форма.ФормаОтчета(67)}: Ошибка при вызове метода контекста (УдалитьФайлы): Ошибка удаления файлов

    УдалитьФайлы(ВременныйКаталог);

    по причине:

    Ошибка удаления файлов

    по причине:

    Ошибка доступа к файлу ‘d:Temp371ccc0d-164c-48a4-afb4-89be506bb27aaksmon.exe’

    Хотя вижу как Монитор стартует и находит два ключа. Таймаут ставил 2000, 3000, 5000.

    Два сетевых ключа по 20 каждый

    Reply
  20. z-alexey

    О, а теперь работает 🙂

    Reply
  21. Safronov_S

    у меня так и не работает

    Перед выводом окна макета выпадает окно предупреждения:

    Заголовок: AutoIt Error

    Тело: Line -1:

    Error: Unable to execute the external program.

    Reply
  22. coder1cv8

    (19) Странно… Принудительно закрываю вроде )

    Добавил проверку на существование процесса и TASKKILL. Проверь сейчас, пожалуйста.

    Reply
  23. coder1cv8

    (21) Виста, очевидно? )

    Reply
  24. z-alexey

    (22) Нее, она нормально сама и тогда закрывалась. Просто в момент когда она открывается я же успеваю посмотреть, что она два сервера с ключами нашла :))

    Кстати, сейчас с первой попытки вывела без ошибок.

    Reply
  25. Safronov_S

    (23) да нет , XP

    Reply
  26. Safronov_S

    Если ставить Таймаут тогда система ругается, что не найден файл GetInfo.exe

    Reply
  27. coder1cv8

    +(23) В Висте надо наверное отключать UAC…

    (24) Где ты успеваешь посмотреть? ) Окно aksmon-a запускается не с

    Reply
  28. coder1cv8

    (26) Чудеса да и только! А путь на который ругается?… А! Может быть ограничены права на запись exe в темповый каталог?… )

    Reply
  29. Safronov_S

    Путь такой : C:Documents and Settings»тут мою юзер»Local SettingsTemp

    Права есть, проверил.

    Reply
  30. coder1cv8

    (29) Ну может антивирус режет или ещё чего?… Получается что exe-шники, нужные для работы отчета, по какой-то причине не записываются…

    Reply
  31. Safronov_S

    (30) все файлики в темп кладутся, видимо система не может подсосать именно параметр таймаута. Ругается ведь именно только в случае указания таймаута. Так в имени и приписывает. «бла бла бла … проверьте правильность имени …GetInfo.exe 5000». Если даже запускать вручную файл GetInfo.exe то выскакивает та же ошибка, что и в случае (21)

    Reply
  32. coder1cv8

    (31) Попробуй сейчас. Обновил файл.

    Reply
  33. z-alexey

    (27) Нет, не скрытым запускается 🙂

    Вот даже видео заснял процесса: http://slil.ru/27361377

    Reply
  34. coder1cv8

    (33) Вот жешь, зараза! ) Так быть не должно…

    А какая операционка у тебя?…

    Reply
  35. PVG_73

    жаль, что через ЕХЕ Аладина…. он у меня вообще не запускаетси… что-то плохо ему на моей машине…

    А вообще сие — есть жесть…. теперь приходится задумываться прежде чем запустить какой-нить отчет в 1С…. 🙁

    Reply
  36. coder1cv8

    (35) По-другому никак, к сожалению (

    А задуматься никогда не помешает! )

    Reply
  37. PVG_73

    Задумываться то никогда не помешает… это точно… 🙂

    Жаль что 1С ужЁ может стать банальным рассадником вирусов…. 🙁

    Reply
  38. coder1cv8

    (37) exe-шник в обработку и в семерке можно было запихнуть, правда не штатно…

    Reply
  39. z-alexey

    (35) Операционка ХР сп3, русская 🙂

    Reply
  40. Safronov_S

    (32) теперь уже другая ошибка.

    Заголовок окна: Error

    Тело: Ошибка запуска: путь до файликаaskmon.exe Построение отчета не возможно!

    Reply
  41. coder1cv8

    (40) Вот! Замечательно. Почему-то у тебя не запускается aksmon, посмотри есть ли там файлик (не закрывая сообщение), попробуй запустить через Пуск > Выполнить

    Reply
  42. coder1cv8

    +(41) И скачай последнюю версию. Я исправил кое-что…

    Reply
  43. Safronov_S

    (42) ура запустилось 🙂

    всё замечательно работает.

    Только у меня возник такой вопрос. Обработка показывает ключи на доп.лицензии. А как можно отследить ключи, которые идут к конфигурации?

    Reply
  44. coder1cv8

    (43) Ну наконец-то! ) Спасибо огромное за тестирование!!!

    Да, только сетевые ключи. Насчет локальных не знаю…

    Reply
  45. mc_syma_v@mail.ru

    У меня все работает. Единственная проблема была с фаерволом. Так что у кого не работает — проверте настройки. Еще такой вопрос. Никак не вытащить информацию не только о клиенте, но и о пользователе? Было бы не лишним.

    Reply
  46. coder1cv8

    О каком пользователе? Виндовом?… )

    Это просто более удобное представление информации, которую предоставляет Aladdin Monitor, что то ещё туда добавить я могу разве что из других источников…

    Reply
  47. coder1cv8

    (46) к (45)

    Reply
  48. mc_syma_v@mail.ru

    (46) Я понял принцип работы. Просто может есть какая нить версия aksmon, которая позволяет выцепить имя пользователя.

    (43) Прога видит только сетевые ключи, 2 локальных у меня не нашел.

    Reply
  49. СергейКа

    У меня тоже запускается монитор не скрытно 🙂 WinXP SP3

    1. Кроме того GetInfo как-то таймаут некорректно обрабатывает. Сколько ни ставь, «висит» минут 10. А если не ставить вообще, то Out.txt пустой.

    2. Идея с сохранением в темп и временно не очень понравилась. Если askmon еще не отработал (без таймаута), то временная папка не удаляется, так как занята процессом. При запуске отчёта второй раз — создается новая папка, но запуститься процесс не может, так как первый еще работает. А если даже и завершился, то файл Out.txt еще в предыдущей папке.

    ИМХО лучше перед запуском проверять/создавать «C:Program FilesAladdinMonitor» и перезапускать GetInfo с очисткой файла-отчёта.

    3. Аладдиновский монитор кстати, прекрасно показывает мой локальный ключ (кроме сетевых). Но при условии что стоит лиценз-менеджер. Может его тоже подключать при каком-то условии ? 🙂

    4. Пользователя 1С не сложно получить из кластера серверов, так как ай-пи известен из монитора.

    5. А за идею + адназначна 🙂

    Reply
  50. ArtemK

    Однозначно плюс. У меня все работает отлично, правда заставка запуска монитора аладдина тоже появляется.

    Reply
  51. coder1cv8

    (50) Заставка должна отображаться.

    (49) Значит какая-то недароботка в движке AutoIt, на XP SP2 основное окно скрывается как и задумано )

    1. Вообще не понятно, у меня без таймаута сам скрипт мгновенно отрабатывает (3 сетевых ключа), распаковка больше времени занимает )

    2. Тоже не понятно… Сам скрипт GetInfo сначала принудительно закрывает окно aksmon-a, а потом еще дополнительно проверяет существование процесса по PID-у и высылает TASKKILL, при необходимости. И только после этого (!), передает управление 1С. Как при этом aksmon может остаться висеть, для меня загадка… )

    3. Не стоит возни, ИМХО 🙂

    4. Я все-таки не понимаю, про какого пользователя идет речь? Пользователя 1С? А из какой базы кластера его получать? А где взять права? А как вообще узнать где сервер 1С? А если база файловая?… И ещё много-много вопросов…

    5. Спасибо! 🙂

    ЗЫ: Я понимаю, что такой подход с «выдергиванием» инфы скриптом на AutoIt-e, потенциальный источник глюков, но разработчики из Aladdina, к сожалению, не предусмотрели никаких средств интеграции (типа COM-сервера 🙂 ). Да и к тому же, у кого-то этот отчет все же работает стабильно, например у меня! 🙂

    Reply
  52. СергейКа

    (51). 1. :))) 10 сетевых по 100 пользователей и 4 по 50 и н-дцать одинарных

    2. Вот жешь, может закрывается потому что слишком долго обрабатывается?

    3. Может быть.

    4. Вопросов много, согласен. Но это в принципе можно решить. При необходимости и наличии времени. Согласен с тем что необязательно этого делать в данной версии.

    Reply
  53. coder1cv8

    (52) А-а-а… У тебя вон оказывается какой тяжелый случай с ключами! ))) Тогда да, трудно рассчитывать что этот отчет будет нормально работать с таким количеством… )

    Reply
  54. СергейКа

    В 1С вроде обещали подвезти по 500 польз. и заказать в аладдине по 1000, но пока увы. Отчёт как раз норм, а вот со скриптом тяжело :)))

    Reply
  55. sergey_garin

    У меня висит и ничего не показывает, хотя окно алладина мелькало

    Reply
  56. coder1cv8

    (55) Скинь (в личку) скриншот окна aksmon-а.

    Reply
  57. z-alexey

    (52) ООот жесть у тебя.. больше 1200 юзеров 🙂

    Reply
  58. coder1cv8

    (57) Да уж… Если решат откиздить программиста, фик отобьешься! ))))

    Reply
  59. СергейКа

    (57) Ха. Реально юзеров около 1000, некоторые по нескольку сеансов открывают 🙂 И это только в центральном офисе, а так — более 5000 :)))

    (58) Дык и нас целый отдел, около 30-ти 😉

    Reply
  60. z-alexey

    (59) Так один комп ест одну лицензию, независимо от от количества сеансов. Ну в редких случаех он может поломиться на другой сервак за ключиком.

    Интересно послушать историю про ваше внедрение. Чего учитываете, какие нагрузки, что за конфа. Ждем в статьях, мне бы было интересно почитать.

    Reply
  61. СергейКа

    (60) … И независимо от того что базы могут быть открыты разные ? 🙂

    До статей еще не дорос 🙂

    Вообще секторов несколько, я отвечаю только за ЗУП, так что всех проблем всё равно не знаю 🙂

    Reply
  62. coder1cv8

    (60)(61) Еще зависшие лицензии бывают, например при аварийном завершении работы… Я этот отчет и сделал что бы можно было легко посмотреть у каких клиентов по несколько лицензий занято…

    Reply
  63. z-alexey

    (60) Да. Незавимисо от баз. У нас по 3 базы на компе открывают и все ок.

    Вот проблемы с зависшими лицензиями бывают — это да.

    Reply
  64. munster

    (62) А как избавиться от зависших лицензий? есть пара компов которые постоянно берут по две лицензии, причем один из них в отчете появляется под старым именем (поле «клиент»), компьютер был поменян на новый, имя ему было присвоено другое, а ip указан преждний. Как это исправить?

    Reply
  65. coder1cv8

    (64) К сожалению никак… Разве что перегрузкой менеджера лицензий?… Но тогда и все остальные пользователи вылетят. Обычно к зависанию лицензий приводит не корректное завершение работы клиентского приложения… Зависшая лицензия сама отвалится, но через таймаут который установлен внутри 1С (как я понимаю) и на который разработчик повлиять не в силах…

    Reply
  66. MaxS

    программа каждый раз создаёт временную папку, пишет туда exe-шник и запускает его… а каждый раз фаервол ругается на новое приложение из уникальной папки которое хочет выйти в сеть…

    может быть можно сделать просто поиск а не установлен ли алладин монитор в системе если да, то его и запускать.

    Reply
  67. Serj1C

    (66) Эта часть кода открыта, можно поправить самостоятельно за пару минут.

    Reply
  68. Serj1C

    Вообще сделано очень просто и удобно, и даже через СКД )))

    Reply
  69. Alex_1066

    выставили таймаут — «Сформировать»-запускается Hasp моонитор от Алладина-свернулась 1С-ожидаем… Итог -сформировалась только шапка отчёта…. 🙁 Я так понимаю, что на любой клиентской машине можно запускать?

    Reply
  70. coder1cv8

    (69) Да запускать можно на любой… Просто сам монитор от Алладина никаких интерфейсов для программной работы не предоставляет, поэтому все сделано несколько не стандартными способами. У кого-то работает, у кого-то нет… Гарантировать я ничего не могу, к сожалению (

    Reply
  71. adapter

    у меня тоже ключей много. 3 по 100. не так много, как у Сергейки, но тоже монитор аладина не работает, только виснет. Пробовал и на том компе где стоит один из ключей и на отдельном, просто в сети (так в аладиновском форуме спец советовал). Может ли кто еще идей подсказать?

    Reply
  72. 8c1.ru

    Есть соединения с таймаутом 0 (зависшие лицензии на сервере), но при отборе «Таймаут Равно «0»» их не показывает 🙁

    Reply
  73. Re:аниматор

    сконвертированная версия с 8.1 в 8.2 не работает вообще

    Reply
  74. alekseineputin

    (73)(74) Нормально все работает. Запускаю с машинки, где стоит ЛМ

    Reply
  75. art2

    спасибо полезная штука

    Reply
  76. oiter

    Вещь классная, часто пользуюсь ей на работе. Только есть одно НО. У меня несколько серверов лицензий, все они прописаны в файл Nethasp.ini в свойство NH_SERVER_ADDR. Но монитор ключей почему то видит только один из серверов. Но зато показывает, какой сервер (БД) забрала лицензию. Не подскажете, как сделать, чтобы было видно все ключи?

    Reply
  77. ivan07

    Идея интересная конечно, все работает, но пользуюсь стандартным монитором от алладина, мне хватает. спасибо

    Reply
  78. PVG_73

    Спасибо, за обработку! Жаль только что у самого алладина — оччень куцый функционал….

    Reply
  79. izz

    я пользовалась до этого стандартным монитром от алладина, но обработка оказалась удобной, так как не надо больше ставить Алладин Монитор на компьютер тому, кто сам хочем смотреть, сколько лицензий занято и свободно! Спасибо!

    Reply
  80. fisherboy

    Добрый день.

    После запуска отчета с таймаутом 3000 формируется пустой отчет с шапкой.

    В файле out.txt есть только 1 строка — первая из Aladin monitor (хотя на данный момент используется 41 лицензия из 50).

    Строка имеет вид: server07.ru;192.168.2.104;client02;HASP4;50;41;

    И при этом в файле out.txt заполнено 6 полей. А судя по коду должно быть 7.

    ОС — Win 2003.

    Можно ли это как-то решить? Очень хочется, чтобы заработало.

    Заранее спасибо.

    Reply
  81. sumixam

    под 8.2 будет работать обычное приложение будет работать, и как дела с программными лицензиями

    спасибо

    Reply
  82. nadjav

    Отчет выходит пустой на 8.2.

    Reply
  83. mdSerg

    Не работает, если есть HL

    Нашел решение: надо зайти в монитор и в настройках отключить HL

    После этого начинает работать.

    За обработку спасибо — помогает проанализировать кем съедаются лицензии.

    У меня обнаружилась проблема — некоторые компьютеры съедают лицензии с разных серверов лицензий. Т.е. если запущено на одном компе несколько сеансов, то может быть съедена не одна лицензия, а несколько, т.к. для разных сеансов используюся разные HASP сервера

    Reply
  84. JuliettT

    а на файловой будет работать?

    Reply
  85. tormozit

    Почему отчет только на клиенте работает? Если запустить GetInfoForHASP.exe из рабочего процесса (на сервере), то он бесконечно выполняется. Видимо способ вытаскивания данных завязан на окно, которое в этом случае как то по-другому работает.

    Reply
  86. vpaoli

    для Windows х-64 не работает экзешник … м.б. выложите для х-64 ?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *