Исправление Frontol xPOS в Ubuntu 12.04
Суть проблемы⌗
В POS-терминалах на базе Ubuntu 12.04, поставляемых компанией ATOL “под ключ”, присутствует проблема с ПО Frontol xPOS. Заключается она в том, что при попытке запуска прикладных компонентов с правами пользователя возникает ошибка прав доступа, несмотря на то, что БД создаётся в домашнем каталоге пользователя, и на этот каталог установлены корректные права чтения и записи.
Решение проблемы⌗
К сожалению, внятного ответа техническая поддержка ATOL по этому поводу не даёт. Привожу не самый лучший, но в то же время рабочий вариант решения данной проблемы. А именно: запуск прикладных компонентов от имени рута.
Изучаем содержимое каталога /opt/ATOL, в котором размещено ПО xPOS:
ls -ah /opt/ATOL
./ ../ FrontolxPOS/ LicenseManager/
Смотрим содержимое каталогов FrontolxPOS и LicenseManager:
ls -ah FrontolxPos
./ translations/ FxPOSExchange.sh* libQtSql.so.4
../ Configure* LayoutEditor* libQtXml.so.4
docs/ Configure.sh* LayoutEditor.sh* LicenseServer*
drivers/ DBManager* libCore.so LicenseServer.sh*
icons/ DBManager.sh* libQtCore.so.4 POS*
imageformats/ DiscountEditor* libQtGui.so.4 POS.sh*
license/ DiscountEditor.sh* libQtNetwork.so.4 uninstall*
sqldrivers/ FxPOSExchange* libQtScript.so.4 uninstall.dat\
ls -ah LicenseManager
./ icons/ libQtCore.so.4 libQtXml.so.4 uninstall*
../ imageformats/ libQtGui.so.4 LicenseManager* uninstall.dat
docs/ translations/ libQtNetwork.so.4 LicenseManager.sh*
Здесь нам интересны сценарии (с расширением .sh), которые запускают соответствующие бинарники. Они однотипные, для примера приведу здесь содержимое Configure.sh:
#!/bin/sh
appname=`basename "$0" | sed s,\.sh$,,`
dirname=`dirname "$0"`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname="$PWD/$dirname"
fi
LD_LIBRARY_PATH=$dirname:${LD_LIBRARY_PATH}
LD_LIBRARY_PATH=$dirname/drivers:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH
cd "$dirname"
"$dirname/$appname" "$@"
Для наших целей необходимо заменить последнюю строчку сценария на
sudo "$dirname/$appname" "$@"
Для того, чтобы не делать это вручную, можно использовать сценарий ( скачать):
#!/bin/bash
for file in $(find . -name '*.sh')
do
TEMP=$(mktemp)
cat $file | sed -e 's/\"\$dirname\/\$appname\" \"\$\@\"/#\"\$dirname\/\$appname\" \"\$\@\"/g'\
-e '$ a\sudo \"\$dirname\/\$appname\" \"\$\@\"' > ${TEMP}
mv $TEMP $file
done
exit 0
Скрипт поместить в /opt/ATOL и запустить от рута.
Далее, для того, чтобы предустановленный пользователь (user) смог запускать ПО от имени рута без ввода пароля, необходимо добавить с файл /etc/sudoers следующее:
# Блок для xPOS
user ALL = NOPASSWD: /opt/ATOL/FrontolxPOS/Configure
user ALL = NOPASSWD: /opt/ATOL/FrontolxPOS/DiscountEditor
user ALL = NOPASSWD: /opt/ATOL/FrontolxPOS/FxPOSExchange
user ALL = NOPASSWD: /opt/ATOL/FrontolxPOS/LayoutEditor
user ALL = NOPASSWD: /opt/ATOL/FrontolxPOS/LicenseServer
user ALL = NOPASSWD: /opt/ATOL/FrontolxPOS/POS
user ALL = NOPASSWD: /opt/ATOL/LicenseManager/LicenseManager
# Конец блока для xPOS
Итоги⌗
К сожалению, решение не идеально, так как сильно зависит от структуры xPOS, а также не сохраняется при обновлении.