Формулировка проблемы. Текущие просмотрщики Synergy корректно отображают файлы наиболее часто используемых форматов, таких как txt, odt/doc/docx, ods/xls/xlsx, pps/ppt/pptx, pdf, png/jpg, mp3 и т.п. Необходима возможность корректного отображения более редких и специфичных форматов, например: msg, msh, dwg и т.п.
Решение. Общим решением является реализация утилиты, которая будет позволять подключать и запускать произвольные конверторы файлов.
Во-первых, выделим требования к утилите.
Вызов конвертора описывается из конфигурационного файла с параметрами:
расширение исходного файла, для которого необходима конвертация;
путь до исполняемого файла-конвертора;
расширение файла, получаемого в результате конвертации;
идентификатор внешнего модуля;
таймаут выполнения операции.
Итоговое расширение должно быть одним из pdf / htd / png / tiff / mp3 / mp4.
На одно расширение необходимо использовать только 1 конвертор.
Конвертация должна осуществляться при загрузке файла либо сохранении новой версии файла в Synergy (а не при его непосредственном открытии).
Утилита не должна выполняться дольше заданного времени (при наличии настроенного таймаута).
Конечным результатом должен быть сконвертированный файл
out
выбранного расширения, который
используется для генерации его отображения.
Утилита может быть применена ко всем расширениям, включая уже поддерживаемые Synergy.
Во-вторых, опишем форматы конфигурации.
Формат конфигурационного файла:
standalone/configuration/ai/converter.json
{ "dwg": { "path": "/opt/dwgconverter/bin/dwgconv.sh", "outFormat": "pdf", "moduleID": "6b13459e-aa3c-4a5a-94db-bb64f328e30c", "timeout": 10, "timeoutSinceChange": 2 }, "msg": { "path": "/opt/msgconverter/bin/msgconv.sh", "outFormat": "htd", "moduleID": "6b13459e-aa3c-4a5a-94db-bb64f328e30c", "timeout": 10, "timeoutSinceChange": 2 } }
path
- путь до исполняемого файла-конвертора;
outFormat
- расширение файла, получаемого в
результате конвертации;
moduleID
- идентификатор внешнего модуля
(используется для авторизации пользователя вне сессии);
timeout
- максимальное время выполнения
утилиты (в секундах);
timeoutSinceChange
- максимальное время с
последнего изменения (в секундах).
Формат передачи параметров исполняемому файлу-конвертору:
util path/input.txt uuid token
где:
path/input.txt
- путь до исходного файла;
uuid
- идентификатор исходного файла;
token
- ключ для авторизации пользователя вне
сессии, полученный из метода API
rest/api/person/generate_auth_key
.
Каждый параметр отделен от предыдущего пробелом. Соблюдение порядка следования параметров обязательно.
Для авторизации по Basic HTTP используются закодированные в Base64 логин и пароль, разделенные знаком "двоеточие". Подробнее про авторизацию по ключам написано в руководстве по интеграции.
В-третьих, опишем общий алгоритм действий, необходимых для корректной конвертации файлов.
Конфигурационный файл настроен таким образом, что для расширения
dwg
должен вызываться конвертор
dwgconv.sh
.
Пользователь загружает файл somefile.dwg
в
папку хранилища.
Считав с конфигурационного файла параметры и передав необходимые параметры, запускается утилита.
На каждый вызов утилиты создается своя папка в файловой системе,
куда в кладется результирующий файл out.pdf
.
После окончания конвертации файл out.pdf
копируется в отдельную ноду хранилища.
При следующем открытии файла подгружается его сконвертированная версия соответствующим просмотрщиком Synergy.
При конвертации возможна запись нескольких вспомогательных файлов,
из которых и будет составлен итоговый out.pdf
. И
если выполнение записи одного такого файла займет больше, чем
указанное в таймауте timeoutSinceChange
время, то
процессу должен отправиться sigterm (сигнал о прерывании).
Кроме того, если выполнение утилиты в целом займет больше, чем
указанное в таймауте timeout
время, то процессу
должен отправиться sigterm (сигнал о прерывании).