Безумный конвертер и сага о простом сокете на баше

Mar 15, 2012 11:28

Реальность.
Поставщик для нашего интернет магазина выгружает нам список в закрытом формате 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 выдаёт на этот порт информацию и убивает его.
Previous post Next post
Up