Реальность.
Поставщик для нашего интернет магазина выгружает нам список в закрытом формате xls.
Этот файл выгружается программой 1С, используя старую библиотеку, и не выставляет теги кодировки внутри, как заявлено в API, поэтому все приложения, апроче Microsoft Office открывают его с "кракозябрами". Неправильно отображают кодировку.
Все запросы к поставщику сменить формат выгрузки обламываются. Уходить от него нельзя по политическим мотивам. Реалии бизнеса. Надо делать workaround.
Задача.
Предоставить синхронный пул для конвертирования подобных файлов в читабельный csv для последующего импорта другими системами.
Решение.
На сервере устанавливают
- OpenOffice HeadLess
- OpenOffice-pyuno.
- Xvfb для создания фейк фреймбуффера, которым будет пользоваться OOHL.
- /opt/Server-OO/DocumentConverter.py
- xinet.d
- новый сервис в /etc/services (strem-oo-conv = TCP/8105)
На xinet.d создаём службу:
Создаём башскрипт:
Пишутся инитскрипты для импровизированных серверов OpenOffice HeadLess и Xvfb:
В самих скриптах учитывается порядок запуска. А утилита chkconfig это зафиксирует в системе:
- chkconfig --level 2345 server-oo on
- chkconfig --level 2345 Xvfb on
Запускаем сервисы и тестируем:
- cat F13032012.xls | nc 172.17.9.7 8105 > F13032012.csv
Комментарии.
Сами сервисы (OpenOfficeHeadLess, Xvfb, xinetd) довольно тривиальны.
Нетривиален скрипт на баше.
Мы получаем данные, и чтобы не закрыть поток, продолжаем конструкцией cat > $INFILE | tee &
Таким образом, сокет не закроется и у нас будет время на внутренние операции перекодирования и конвертации кодировок.
В конце сокет надо закрыть.
Для этого процес опрашивает информацию о себе по PID, узнаёт свои открытые соединения, выбирает порт клиента, узнаёт, какой из cat выдаёт на этот порт информацию и убивает его.