Платёжный терминал — обновление RedSystem до 1.0.9

Posted: 2014-11-09 in IT, Software
Метки:

Два года назад я уже писал о том, как настроить платёжный терминал на базе Linux Fedora и ПО RedSystem (http://www.ps-redsystem.ru/):
https://aminux.wordpress.com/2012/10/27/linux/
С того момента вышло уже несколько новых версий федоры, сменилось несколько версий самой ред-систем, да и в скучную рутину пора внести некое разнообразие.

Два года плотной эксплуатации показали следующее:

  1. терминал на линуксе с киоскнутым браузером поверх голого Х-сервера — МЕГА-вещь. Именно так и надо делать. Его не смогли сломать ни монтажники, которые его ставили, ни электрики, частенько ребутавшие его по питанию, ни граблерукие пользователи. Вот такого: http://www.youtube.com/watch?v=z4-_AX-t-ag на вашем платёжном терминале быть не должно.
  2. SSL на сертификатах со взаимной валидацией клиента и сервера рулит и педалит, без проблем работая за НАТом, и не требуя для безопасного соединения хитрожопых конфигураций сети и отдельно настраиваемых VPN-ок.
  3. Девайсы на COM-портах с проприетарными протоколами — несомненное проприетарное зло, но встроенная тулза для детекта redtdetect позволяют один раз при установке с этим злом успешно справиться.
  4. Серверная часть пока что всё ещё на винде (линукс-версию активно пишут) — работает, но лучше лишний раз не трогать.
  5. Firebird в качестве БД — треш и угар. Бэкапить надо с особым вниманием, раз в сутки — полным бэкапом, причём лучше всеми способами, какие придумаете, не забывая про утилиту nbackup. Сами платежи весят довольно мало, и если история платежей во внутренней базе не столь критична (она продублирована в биллингах и куче сторонних логов), то вот потерять настройки терминалов чревато большим геморроем.

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

Как вы помните, два года назад я использовал Fedora 16 в варианте установки «Gnome-minimal», опираясь на рекомендации поставщика. Естественно, в системе после этого осталась куча софта от этого самого гнома, менеджер графического входа в систему и прочий ненужный хлам, впустую занимающий место на диске и увеличивающий длительность и размеры закачиваемых обновлений :D. Несмотря на то, что наши системы не были затронуты такими пакостными уязвимостями, как HeartBleed и Shell-Shock, я решил, что настало время сделать глобальное обновление.
К сожалению, моя идея наскоком обновить 16-ю федору сразу до 20-й с помощью команды yum --releasever=20 distro-sync успехом не увенчалась — резкое обновление системы со сменой кучи ключевых компонентов обломилось на сложном клубке зависимостей.
Поэтому я решил это переставить с нуля, развернув конфиги терминала из бэкапов, заодно чтобы оценить на будущее сложность такой работы и подготовить сценарии более быстрого развертывания. Я также решил поставить систему в варианте «Минимальная установка» + «базовые пакеты администрирования», без каких-либо графических оболочек. Потом разворачиваем скрипты ред-систем из бэкапа, запускаем, и смотрим, на что оно ругается. Я решил поставить действительно гораздо более компактную сборку графической системы, чем обычно бывает.
У меня получилась следующая последовательность действий:

  • Ставим Fedora-20 в самом минимальном варианте, выбрав только средства администрирования. Никаких гномов, циннамонов, lxde, либре-оффисов и прочего — на терминале это всё лишнее.
  • Сносим ненужное:
    yum remove ModemManager* NetworkManager* firewalld rpcstatd sendmail rpcbind nfs-lock

    NFS там не используется, почту ему слать не надо, конфиг файервола и сети у нас будет свой и очень примитивный, а ModemManager может доставить немало головной боли, пытаясь обнаружить модем и посылая модемные команды в термопринтер и купюроприёмник. Я первый раз на этом споткнулся, и долго ломал голову, почему периферия не виделась. Оказалось — COM-порты были заняты этим самым ModemManager-ом. Проверить, какая программа заняла ком-порты, можно так:

    # lsof | grep ttyS
    redtshell  392          root    6u      CHR       4,64       0t0       1121 /dev/ttyS0
    redtshell  392          root    7u      CHR       4,66       0t0       1125 /dev/ttyS2
    redtshell  392  496     root    6u      CHR       4,64       0t0       1121 /dev/ttyS0
    redtshell  392  496     root    7u      CHR       4,66       0t0       1125 /dev/ttyS2
    ...

    В выводе команды `lsof | grep ttyS` должны быть только процессы redtshell, у меня их набралось 100 строчек ( если | wc -l не врёт :D).

  • Качаем rpm-ку гуглохрома, и ставим нужное:
    yum install google-chrome-stable_current_i386.rpm
    yum install iptables-services iptables-utils links
    yum install ntpdate pciutils usbutils htop minicom
    yum install xterm xinput xinput_calibrator
    yum install xorg-x11-server xorg-x11-server-Xorg xorg-x11-xinit xorg-x11-apps xorg-x11-utils
    yum install xorg-x11-drv-intel xorg-x11-drv-keyboard xorg-x11-drv-mouse
    yum install xorg-x11-drv-modesetting xorg-x11-drv-vesa xorg-x11-drv-fbdev
    yum install xorg-x11-drv-wacom xorg-x11-drv-evdev xorg-x11-drv-dummy

    Немного по используемым пакетам. Хром — как рекомендованный браузер для ред-систем, базовые диагностические утилиты для тачскринта, периферии, ком-портов и ред-систем, Базовый набор X-сервера, чтобы он вообще запустился. Не забываем о драйверах — у меня там встроенная видяха Intel, ставим. Без драйверов xorg-x11-drv-keyboard и xorg-x11-drv-mouse терминал у вас запустится, но ввод с клавиатуры, мыши и тачскрина работать не будет. Будете ставить чисто информационное табло, без сенсорного экрана — можно не ставить =). Нам же без него неудобно. Пакеты xterm, xinput и xinput_calibrator нужны для того, чтобы заработали старые скрипты, калибрующие тачскрин. Пакеты *modesetting, *drv, *vesa, *fbdev, *evdev — обязательны.
    Насчет пакетов xorg-x11-drv-wacom и xorg-x11-drv-dummy не уверен — ставил по интуиции =)
    Возможно, часть из этих пакетов можно и не ставить, но у меня в такой конфигурации всё заработало. Проверю в следующий раз =)
    Потом разворачиваем из бэкапа старые скрипты. Поскольку на новой системе я разворачивал уже новую версию RedSystem (1.0.9), то кое-что пришлось поправить.

  • /etc/rc.d/rc.local:
    #!/bin/sh
    /root/term1.sh &
  • /root/term1.sh
    #!/bin/sh
    
    # RedSystem
    
    echo "   ======= Terminal start, running server ======= "
    pkill redtshell
    cd /home/terminal/RedSystem/redtshell/
    ./redtshell &
    
    for i in {0..9};
    do
        echo "Apply setterm to [tty$i]"
        # В Fedora-20 новая версия setterm не требует опцию -powersave off к ttyS
        setterm -blink off -blank 0 -powerdown 0 >> /dev/tty$i;
    done;
    unset i;
    
    echo "   ======= Terminal start, running term2 ======= "
    su - terminal -c "/home/terminal/term2.sh"
  • /home/terminal/term2.sh
    #!/bin/sh
    
    dt=`date "+%Y-%m-%d"`;
    LOG="/home/terminal/boot_$dt.log";
    
    # RedSystem
    
    startx | tee -a $LOG
    
    echo "   ======= Terminal shutdown, reboot after 10 seconds ======= " | tee -a $LOG
    sleep 10
    
    print " --- AUTO REBOOT --- !!!11 " | tee -a $LOG
    /usr/sbin/reboot | tee -a $LOG
    
  • /home/terminal/.xserverrc
    #! /bin/sh
    
    # RedSystem
    
    exec X :0 -nocursor -nolisten tcp
  • /home/terminal/.xinitrc
    #!/bin/sh
    
    # RedSystem
    
    echo "======= Running xinitrc ======="
    
    echo "   ----- Clear chrome profile -----"
    cd /home/terminal/RedSystem/chrome/
    rm -r userdata
    cp -r userdatabackup userdata
    
    echo "   ----- xrandr tuning -----"
    # ## Запуск без параметров - в логе будет список режимов
    xrandr
    # ## Разрешение экрана терминала. Важно!
    xrandr --output VGA-0 --mode 1024x768
    
    echo "   ----- Calibrate touch-screen , xinput -----"
    # ## Эти параметры калибровки индивидуальны для каждого тачскрина !!
    # ## На новом терминале сгенерируйте их заново с помощью xinput --list и xinput_calibrator --device 
    xinput set-int-prop "MASTouch TouchSystems MASTouch USB Touchscreen" "Evdev Axis Calibration" 32 20 1069 409 1244
    
    echo "   ----- xset tuning -----"
    xset -dpms
    xset s off
    
    echo "   ----- Start chrome as kiosk -----"
    /usr/bin/google-chrome --kiosk  http://127.0.0.1:88/redtshell --user-data-dir=userdata
    
    # ## Если потребуется откалибровать новый тачскрин - закомментить гугло-хром,
    # ## раскомментить xterm, заблочить авто-ребут в term2.sh, воспользоваться
    # ## xinput --list и xinput_calibrator --device , поправить xinput set-int-prop
    # xterm
    

    Этот набор скриптов мне нравится гораздо больше, чем те, что идут с системой. У меня на терминале нет GDM, и мне нет нужды использовать обёртки к нему. Что очень порадовало — настройки калибровки тачскрина применились без проблема, перекалибровка не потребовалась. Оно просто приняло настройки и заработало.
    В новой версии ПО 1.0.9 также изменены названия классов периферийного оборудования, поэтому может потребоваться заново запустить на терминале скрипт /home/terminal/RedSystem/redtshell/redtdetect_sh.sh
    Опрос всех четырёх RS232-портов на куче скоростей — дело небыстрое, протоколы свзяи с принтером чеков и баблососом — проприетарные и недобрые, поэтому бэкап важнейшего конфига тоже обязательно надо иметь для каждого терминала:

  • /home/terminal/RedSystem/redtshell/redtshell.ini
    Network.Class OPENSSL
    Network.PrivateKeyFile terminalkey.pem
    Network.CertificateFile terminalcert.pem
    Network.CertificateAuthorityFile cacert.pem
    Network.ReadTimeout 10
    Network.Medium.Class SOCKET
    Network.Medium.ServerName pay-terminals.your-domain.local
    Network.Medium.ServerName2 A.B.C.D
    Network.Medium.ServerPort 17443
    Printer.Class ESCPOS
    Printer.Port.Name /dev/ttyS0
    Printer.Port.BaudRate 115200
    Printer.Port.ByteSize 8
    Printer.Port.StopBits OneStopBit
    Printer.Port.Parity NoParity
    BillValidator.Class CASHCODE
    BillValidator.Port.Name /dev/ttyS2
    BillValidator.Port.BaudRate 9600
    BillValidator.Port.ByteSize 8
    BillValidator.Port.Parity NoParity
    BillValidator.Port.StopBits OneStopBit

    ESCPOS — это так теперь называются принтеры CUSTOM в новой версии. Купюроприёмник новая версия у меня почему-то не задетектила, поэтому я взял записи про BillValidator* из старого конфига — всё заработало. Если что — звоните им в поддержку, или тем, у кого купили терминал — там подскажут, какие параметры нужны для работы с периферией по COM-портам. Там работают хорошие люди =)

    Ну и теперь немного дополнительных улучшательств, родившихся в процессе эксплуатации.
    Скрипт для еженедельного рестарта и автоматической прочистки логов/кэшей/прочего мусора:

  • /root/clear_restart.sh
    #!/bin/sh
    
    # RedSystem
    
    echo "   ======= Terminal clear and reload ======= "
    
    pkill redtshell
    sleep 15
    pkill -9 redtshell
    sleep 5
    
    find /home/terminal -name "\!raudus-exception*.txt" -delete
    find /home/terminal -name ".serverauth.*" -delete
    find /home/terminal/RedSystem/redtshell -name "*.log" -delete
    
    sync
    
    sleep 5
    
    /usr/sbin/reboot

    Скрипт для бэкапа:

  • /root/backup.sh
    #!/bin/bash
    
    date=`date "+%Y_%m_%d"`;             # current date
    days_store='30';                     # Number of backups (N last days)
    dir_open=/Backups/                   # directory for store backups
    tgz_bin='tar --acls -p --xattrs --label="PayTerm1" --gzip -cf ';           # Tar/GZip binary + options
    
    echo "=== BackUp script for PayTerm1 === [$date]  ";
    mkdir $dir_open/$date
    sync
    
    echo 'Make open archives ...';
    cd $dir_open/$date
    $tgz_bin PT1_home.tgz /home/terminal /home/backuper /root
    $tgz_bin PT1_etc.tgz /etc/sysconfig/iptables* /var/spool/cron /etc/ssh /etc/rc.d/rc.local
    cd $dir_open/$date && sha256sum * > _PT1.sha256
    
    sync
    
    cd /
    
    echo 'Delete old backups ...';
    find $dir_open/ -mtime +$days_store -delete     # store backups for N last days
    
    echo "=== BackUp script complete ===== [$date]";
    sync;
    
    sleep 5;
    cp /Backups/backup.log $dir_open/$date
  • Записи в кроне для рута:
    15      0       *       *       *       /root/backup.sh > /Backups/backup.log
    0       *       *       *       *       /usr/sbin/ntpdate -u ntp.your-domain.local
    8       3       *       *       1       /root/clear_restart.sh

    Само собой, не забыть восстановить в /home/terminal/RedSystem/redtshell/ файлы *.crt, *.pem, *.p12 — это криптографичесике SSL-ключи, без них сервер вас не примет.

    Что касается сервера — то там обновление делается перезаписью файлов поверх тупо копированием, кроме файлов базы данных (*.fdb*), ini-шек и ключей. Естественно, делать это надо при остановленных службах и имея в наличии как минимум бэкапы БД и ключей, а лучше — и всего каталога с системой. Скажу честно — виндовс-версия системы в процессе обновления крешнула мне базу раза два или три :D. Возможно, оно меня боится, и не хочет со мной дружить :D, а может, я просто поторопился при обновлении, невнимательно проверив в списке процессов, что службы корректно выгрузились. Или ещё одна из ста возможных причин.

    Стоит отметить, что в штатном режиме я ни разу не наблюдал каких-либо проблем с системой и её базой. Но если у вас в процессе работы кончилось место, выпал бэкапный скрипт или утилита nbackup, винда упала в синий экран или просто поставила обновление, вы сами обновили систему, не дождавшись полного завершения процессов или случилась ещё какая-нибудь нештатная фигня — база файерберда почти наверняка навернётся.
    Симптомы при этом — службы запускаются, зайти в веб-морду управления можно, но некотрые функции не работают, наример, не читается история платежей или настройки терминалов. Решение тут — восстановить БД файербёрда из бэкапа, который у вас просто обязан быть, если уж вы взялись за обновление. Это важно.

    Конечно, Firebid был неплох для своего времени, но в 2014 году есть куда более внятные БД — как локально применяемый SQLite, так и более мощные системы типа MySQL или PostgreSQL.

    В новой версии ПО RedSystem обещают наконец-то выпустить серверную часть под линукс (также не исключен запуск и под FreeBSD), а также отказаться от этого гребаного FireBird в пользу гораздо более надёжного MySQL. Как только выйдет и застабилизируется — я напишу сюда статейку и про обновление серверной части. Возможно, новая версия даже будет развёрнута как OpenVZ-контейнер со всеми вытекающими преимуществами.

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

    Можно ли тут ещё что-то улучшить ? Конечно, можно!
    В будущих версиях не исключён перенос локального порта веб-сервера с 88-го на более высокие номера (>1024). В этом случае сам процесс redtshell можно будет запускать не от рута, а сразу от пользователя terminal или вообще от отдельного пользователя, изолировав таким образом процесс работы с принтером и купюроприемником от процесса отображения интерфейса. Можно подумать о наложении дополнительных ограничений на пользователя средствами SELinux. Контекста user_u для отображения интерфейса, запуска Х-сервера с хромом и коннекта на 88-й порт должно быть точно достаточно, насчет работы с COM-портами и коннекта на TCP-порт 17443 — не знаю. Это планы для третьей статьи про платёжный терминал.
    Можно подумать о получении совсем уж минимизированной инсталляции только под эту задачу, при этом способной штатными средствами обновляться из стандартных репозиториев Федоры. Если у кого найдется желание — можно попробовать развернуть подобный терминал на базе TinyCore (я её использую для некоторых типов ВМ). Там очень своеобразная установка софта и сохранение настроек (она больше похоже на линукс-подобную фирмварь, чем на ОС общего назначения), зато и размер системы исчисляется десятками мегабайт. Правда, SELinux-а в TinyCore нет, не влез он туда.

    P.S. После одного из обновлений изменились названия видеовыходов. Симптомы — всё работает, но экран работает в 1280х1024. В моём случае VGA1 стал называться VGA-0. Меняет название интерфейса в параметре —output для xrandr, ребутимся, всё становится красиво.

    Пример лога загрузки, сгенерированного term2.sh:
    ~ cat /home/terminal/boot_2014-11-09.log
    Booting term2.sh
    ======= Running xinitrc =======
    ----- Clear chrome profile -----
    ----- Calibrate touch-screen , xinput -----
    ----- xrandr tuning -----
    Screen 0: minimum 320 x 200, current 1280 x 1024, maximum 4096 x 4096
    VGA-0 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 338mm x 270mm
    1280x1024 60.02*+ 75.02
    1152x864 75.00
    1024x768 75.08 75.03 60.00
    832x624 74.55
    800x600 75.00 60.32
    640x480 75.00 60.00
    720x400 70.08
    ----- xset tuning -----
    ----- Start chrome as kiosk -----

    P.S.S. В 2018 году сайт производителя сдох. Но дистриб остался у добрых людей:

    https://rutracker.org/forum/viewtopic.php?t=5763828

    Магнитка (150.6 MB) : 🧲 8FA4CA1101261E3F712B3697FA9910203250B10E
    magnet:?xt=urn:btih:8FA4CA1101261E3F712B3697FA9910203250B10E&tr=http%3A%2F%2Fbt2.t-ru.org%2Fann%3Fmagnet

  • - комментарии
    1. […] P.S. Продолжение через два года: https://aminux.wordpress.com/2014/11/09/pay-terminal/ […]

      Если обновление системы сломало тачскрин (калибровку):
      https://aminux.wordpress.com/2017/12/26/libinput-vs-evdev-touchscreen-calibration-matrix/