Рубрики
Блог Новости

Как отучить драйвер ККТ АТОЛ (ДТО 10) от UEM в Linux

TL;DR: Добавьте файл ~/.atol/drivers10/uem.env для отключения проверки службы.

О чем речь

ККТ – Контрольно-Кассовая Техника, умное название для кассы.

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

ДТО – драйвер торгового оборудования. По сути это динамическая библиотека, которую можно встроить в свой программный продукт и взаимодействовать с ККТ их производства.

Что случилось

В конце 2025 года изменилось налоговое законодательство, и с 1 января 2026 года используется ставка НДС 22%. Для поддержки этих изменений АТОЛ выпустили новую версию драйвера 10.10.8.0 от 09.12.2025. В списке изменений, кроме всего прочего, есть такой пункт: «Добавлена интеграция драйвера со службой UEM, теперь работа данной службы для драйвера обязательна».

Наши приключения начинаются именно тут, так как никакой документации на эту службу нет. Служба после установки не запускается, а драйвер без нее не работает. А если ваш программный продукт использует Docker, то вообще непонятно, где должна быть служба запущена: внутри или снаружи.

Что за служба

Официальная документация ограничивается только таким описанием:

Агент АТОЛ UEM – программный компонент, являющийся частью сервиса АТОЛ UEM. Он обеспечивает подключение к этому сервису и проведение дистанционных сервисных операций, включая диагностику, обновление и настройку параметров Устройств, а также централизованное управление ими из единого интерфейса. При этом Агент взаимодействует со всеми устройствами кассового узла, позволяя осуществлять комплексное управление их конфигурацией и состоянием.

Получается, что ради слежки за вами компания АТОЛ сделала так, что компьютер, который использует драйвер, должен быть обязательно подключен к интернету. Без интернета служба не запустится и драйвер работать не будет. Но человек, который не в теме может возразить, что кассы же сейчас «онлайн»? Всё так, но им разрешено быть офлайн до 30 дней, накапливать данные, а затем отправлять все документы разом.

И ладно, хорошо, я хочу, чтобы за мной следили и работа в оффлайне – это не мой случай. Но служба просто не запускается.

Почему не работает

Тут решение нашел не я. Скорее всего первым в самом конце декабря был Дмитрий Бачило на YouTube: https://youtu.be/5t0QBE24h58.

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

Конфиг находится тут: /etc/uem/agent/config.yml. Для восстановления работоспособности службы нужно заменить параметры:

  • uemconfig.uem_host с mqtts://plt.atol.ru на mqtts://plt-002.atol.ru
  • uemconfig.uem_port с 8883 на 1883
  • uemconfig.uem_reg_host с https://entry-plt.atol.ru на https://entry-plt-002.atol.ru

После внесенных изменений служба начинает работать, а следовательно и драйвер.

Как использовать драйвер в контейнере

У компании Бизнес Проект есть продукт, который работает с ККТ. Он написан на Python и работает в Docker-контейнере. До последнего обновления работало так: 

  • в образе находилась библиотека linux-x64/libfptr10.so из дистрибутива, который можно загрузить на https://fs.atol.ru/, папка «Программное обеспечение» / «ДТО» / «10.х»
  • также из дистрибутива в образе нужен модуль wrappers/python/libfptr10.py
  • ККТ подключен к Docker-хосту, на него ничего ставить не нужно
  • Контейнер запускается с параметром --device /dev/serial/by-id/usb-ATOL_Group_ATOL_USB_device_12345678-if00:/dev/ttyACM1, что прокидывает tty-устройство в него
  • Код внутри упрощенно выглядит так:
from libfptr10 import IFptr
fptr = IFptr()
fptr.setSingleSetting(
    IFptr.LIBFPTR_SETTING_PORT,
    str(IFptr.LIBFPTR_PORT_COM),
)
fptr.setSingleSetting(
    IFptr.LIBFPTR_SETTING_COM_FILE,
    '/dev/ttyACM1',
)
fptr.setSingleSetting(
    IFptr.LIBFPTR_SETTING_OFD_CHANNEL,
    str(IFptr.LIBFPTR_OFD_CHANNEL_PROTO),
)
fptr.applySingleSettings()
fptr.open()

Всё работало хорошо, но после обновления драйвер вызов fptr.open() заканчивался ошибкой с кодом 11 и описанием «Для работы с драйвером необходимо запустить службу UEMA».

Как починить

Еще раз отмечу, что у меня не было цели отключить службу из-за того, что она выполняет какую-то слежку или типа того. Я всего лишь хотел заставить работать драйвер внутри Docker-контейнера, как работала предыдущая версия драйвера. Но как это сделать?

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

Алгоритм инициализации драйвера упрощенно выглядит так:

  • проверяем наличие файла ~/.atol/drivers10/uem.env
  • если он есть, тогда ничего не делаем
  • если его нет, тогда выполняем systemctl is-active uem-agent
  • если systemctl ответил, что служба не запущена, тогда возвращаем ошибку

Без этих знаний у меня не было шансов запустить службу на хосте, а драйвер в контейнере. То есть отучить драйвер от службы мы можем двумя способами:

  • создать пустой файл ~/.atol/drivers10/uem.env
  • создать shell-скрипт systemctl с одной строчкой кода echo active

На этом всё, драйвер замечательно работает без этой службы.

Заключение

Хорошо, что получилось починить работу драйвера своими силами, но со стороны компании АТОЛ придумывать своим клиентам такие квесты, я считаю, не очень красиво. Нужно было просто добавить документацию, так как если вы делаете библиотеку для встраивания в другие программные продукты, то программист должен понимать что это и как оно работает.

Рубрики
Блог Настройка

Настройка IKEv2 с EAP-MSCHAPv2 на RouterOS

Не буду описывать причины для настройки IKEv2, просто достаточно знания, что протокол хорош и поддержан сегодня во всех основных операционных системах. Ну и RouterOS тоже поддерживает. В справке MikroTik опубликована подробная инструкция по настройке, но результат рабочий не для всех клиентов. На устройствах Apple все работало, а на Windows и Android никак не хотело устанавливаться соединение. Windows-клиент писал «Неприемлемые учётные данные проверки подлинности IKE». Собственно об этом я и хочу рассказать.

Инструкция от MikroTik хорошая, но после ее выполнения есть проблема в цепочке сертификатов. Некоторые решают ее добавлением R3 в список доверенных системы, но это плохой способ. Нам нужно добиться того, чтобы сервер отправлял клиенту всю цепочку сертификации. Если в случае SSTP достаточно просто добавить промежуточный сертификат в систему и он сам подхватится:

/tool/fetch https://letsencrypt.org/certs/lets-encrypt-r3.pem
/certificate/import file-name=lets-encrypt-r3.pem name=lets-encrypt-r3

То чтобы исправить IKEv2 нужно явно указать его:

/ip/ipsec/identity/set [find peer=ike2] certificate=letsencrypt-autogen_2023-05-20T17:06:31Z,lets-encrypt-r3

То есть в поле certificate нужно указать два сертификата через запятую. После этих изменений работает на всех ОС.

Рубрики
Новости

Запуск скрипта в MikroTik по будням (обновление)

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

  • поддерживаются разные страны;
  • не нужна выгрузка открытых данных России.

Код и документация на GitHub.

Свежий сгенерированный файл для разных стран:


holidays_ru.txt (59216 Загрузок )


holidays_ua.txt (38833 Загрузки )


holidays_by.txt (38397 Загрузок )


holidays_lv.txt (38286 Загрузок )

Рубрики
Новости

Зеркала старых сайтов

Поднял зеркала, а точнее архивные копии, двух старых сайтов:

  1. Сайт газеты Про Лесной: пролесной.рф. Недоступен с 13.04.2021. Новый адрес: prolesnoy.archive.lesnoy.info.
  2. Сайт городских игр 7zone: sevenzone.ru. Недоступен с 12.10.2021. Новый адрес: 7zone.lesnoy.info.
Рубрики
Настройка

Запуск скрипта в MikroTik по будням

Возникла необходимость запускать скрипт в маршрутизаторе MikroTik только по будням. Мало того, что нет простого способа узнать сегодняшний день недели, так еще есть праздники. Поэтому решил прописать все выходные дни в явном виде. Скрипт запуска получился таким:

# получаем сегодняшнюю дату
:local date [/system clock get date]
# читаем файл holidays.txt и приводим его к массиву
:local hdays [:toarray [/file get [/file find name=holidays.txt] contents]]
# проверяем, есть ли сегодняшняя дата в массиве
:local isWork ([:typeof [:find $hdays $date -1]] = "nil")
:if ($isWork) do={
    # здесь запускаемый код
}

Файл holidays.txt содержит в себе список дат выходных дней, разделенных запятыми. Дата должна быть в формате МММ/ДД/ГГГГ в нижнем регистре. Файл не может превышать 4096 байт.
Файл сгенерировал из производственного календаря с Портала открытых данных. На портале он в виде файла CSV.

Мой файл holidays_ru.txt (59216 Загрузок ) .
Скрипт для генерации gen_holidays.py (43159 Загрузок ) .

UPD(28.05.2022): обновил скрипт.

Рубрики
Настройка

Получение сертификата Let’s Encrypt на nginx в режиме прокси

С некоторого времени использую сертификаты Let’s Encrypt для HTTPS. Когда HTTPS соединения от клиентов обрабатывает сам веб-сервер, где расположены файлы, как получить сертификат не вызывает вопросов. Но если соединения обрабатывает прокси-сервер nginx, то нужно указать папку, которая будет обрабатываться локально. Вот пример конфига, когда HTTP соединения не используются и перенаправляются на HTTPS версию:

server {
  listen 80;
  server_name example.com;
  location /.well-known/ {
    root /var/www/example.com;
  }
  location / {
    return 301 https://$host$request_uri;
  }
}

Если HTTP версия используется, то вместо return 301 нужно оставить proxy_pass.

Рубрики
Настройка

Время FTP в OpenMediaVault

В OpenMediaVault при листинге файлов по FTP можно столкнуться с проблемой, что время у файлов отображается в UTC. У ProFTPD есть отдельный how to на эту тему. На отображение даты может влиять опция TimesGMT, но она у OpenMediaVault выставлена в off. Значит ProFTPD не может получить системную временную зону, поэтому нужно в дополнительных опциях указать SetEnv TZ {зона}. Как-то так:

Скриншот настройки FTP
Скриншот настройки FTP

После применения настроек время у файлов будет отображаться в нужной зоне.

Рубрики
Новости

Луковые зеркала

Мой блог и сайт группы [F.R.O.S.T.] теперь имеют зеркала в анонимной сети Tor:
http://poofegruzqmggbqc.onion/
http://rufrost2kkgbmr4y.onion/

Рубрики
Блог

Кириллица для FTP-Proxy

Ранее я писал про FTP-Proxy. Работает хорошо, но есть у него одна досадная проблема: он толком не работает с кириллицей. Корень проблемы в том, что этот прокси не знает команд из RFC 2389. Поэтому я сделал маленький патчик, который решает эту проблему. Скачать патч поддержки RFC 2389 для ftp-proxy (312565 Загрузок ) .

Рубрики
Блог Новости

Новый альбом [F.R.O.S.T.] — Море Забытых

[F.R.O.S.T.] - Море Забытых (2015)У группы [F.R.O.S.T.], в которой я играю, 11 декабря вышел новый альбом «Море Забытых«. Он готовился два года. В прошлом году был выпущен сингл «По слогам» и снят клип на нее. Сейчас снимаем новый клип на песню «Полшага в неизбежность». Новый клип, как и предыдущий, снимает нам Прохор Коробейников. Послушать можно на Яндекс.Музыке, а скачать по ссылкам на официальном сайте. Поддержать деньгами можно также на Яндекс.Музыке.