Лаборатория веб-дизайна «АПОФЕОЗЪ»
Лаборатория веб-дизайна «АПОФЕОЗЪ»

Переход от Imager к Image::Magick

—  Немного о модуле Imager

В некоторых модулях Pheix мы вынуждены выполнять обработку изображений. Обработка в смысле – генерация изображений (например, каптча), изменение размеров, увеличение резкости и т.п. Исторически – еще со времен ранних версий alphaCMS – для этих целей использовался известный в сообществе Perl программистов модуль Imager.

Следует отметить, что Imager, в принципе справляется со всеми вышеперечисленными задачами, иначе бы он не «жил» в нашей системе столь долго. Однако с ним была связана традиционная проблема – модуль не поставляется с дистрибутивом Perl и, в связи с этим, почти всегда отсутствует на хостинге. Только однажды мы столкнулись с предустановленным Imager– на удивление у хостера «Мастерхост».

Тем не менее, на всех без исключения хостинг-площадках (hostmonster, bluehost, r01, nichost и т.д.) Imager устанавливался «локально» из исходников и в скриптах Pheix прописывался соответствующий путь use lib 'home/foobar/PERL/lib'.

Установка Imager занимала несколько команд:

$ wget http://search.cpan.org/CPAN/authors/id/T/TO/TONYC/Imager-1.005.tar.gz
$ tar –xzf Imager-1.005.tar.gz
$ cd Imager-1.005
$ perl Makefile.PL INSTALL_BASE=$HOME/PERL
$ make
$ make install

После описанной выше процедуры установки Imager успешно работал при подключении каталога ~/PERL через use lib в скриптах.

И все бы ничего, но около недели назад хостер nichost решил провести технические работы на своих серверах. Так совпало, что именно на одном из этих серверов находились 5 проектов, управляемых Pheix.

 

—  Письмо счастья

Как обычно информация о технических работах всплыла, когда проекты уже «лежали». Хостер накануне уведомил своих клиентов следующим письмом:

Уважаемый клиент!

Уведомляем Вас, что в ночь с 25 на 26 января 2017 года с 00:00 до 08:00 часов по московскому времени на площадке хостинга RU-CENTER будут проводиться технические работы. На это время намечен перенос данных веб-сервера услуги хостинга на более производительный сервер на базе операционной системы Ubuntu 16.04.

Во время проведения технических работ возможна приостановка функционирования веб-сервера хостинга на срок от 15 минут до 2 часов (в зависимости от объема данных, хранящихся на Вашем виртуальном сервере).

В случае возникновения вопросов обращайтесь, пожалуйста, в службу технической поддержки хостинга: support@nic.ru

Приносим извинения за возможные неудобства.

Конечно, клиенты пропустили письмо «мимо глаз», а потом дружно стали теребить нас – мол, все сломалось.

Беглое исследование ситуации показало, что на сервере новая ОС (см. письмо) и, конечно, Imager, собранный под предыдущую ОС, работать отказывается. Даже не то, что отказывается, а Ubuntu вовсе не понимает структуру каталогов ~/PERL, которая была создана при установке Imager под FreeBSD (под «фрюхой» при установке создается каталог i386-freebsd, успешно интерпретируемый при подключении модулей, для Ubuntu этот каталог вообще ничего не значит). В итоге старое-доброе сообщение «Can't locate Imager.pm in @INC».

Начинаем ставить Imager заново, и тут оказывается, что в системе нет (sic!) компилятора gcc. Ну скорее всего он, конечно есть, но простым пользователям недоступен (хотя м.б. всё еще более плачевно и его действительно нет?!).

Мы в некотором ступоре. На письма техподдержка не отвечает (еще раз отметим, что рассказ о хостере nichost, это тот, что РуЦентр), дозвониться невозможно – телефон постоянно занят.

Объясняем клиентам, что хостер «м*дак» и пока ситуация сводится к советам: либо меняйте хостера, либо ждите апдейт Pheix.

 

—  Перемен требуют наши сердца

Конечно, история про отсутствие gcc прямо скажем странная, но все-таки, как говорится, из жизни. Поэтому мы сразу стали искать альтернативу Imager, чтобы выпустить быстрый апдейт. Искать-то далеко не пришлось – Image::Magick давно известен. Сам пакет ImageMagick для обработки изображений из консоли поставляется в составе почти всех уважаемых себя ОС (мы говорим про unix-like). Поэтому perl модуль Image::Magick «тянется» за пакетом в качестве зависимости, и хотя он и не входит в дистрибутив perl, то присутствует во многих системах «из коробки».

Проверяем наличие на сервере nichost – да, есть. Собираем короткий бриф и решаем выпустить апдейт на Image::Magick.

 

— Что нам нужно от Image::Magick

Как уже было сказано выше от модуля обработки изображений нам требуется: генерация изображений, изменение размеров и увеличение резкости. Отметим, что Image::Magick отлично документирован – https://www.imagemagick.org/script/perl-magick.php. Короткий «перекур» с маном и мы начинаем кодирование, первоначально составляем список функций Image::Magick, которые нам потребуются:

Draw Отрисовать изображение
Ping Получить информацию об изображении
Read Прочитать изображение (открыть)
Swirl Дисторшн изображения типа swirl(эффект вихрь, водоворот)
Scale Масштабировать изображение
Write Записать изображение (сохранить)

 

— Генерация изображений

Мы говорим о каптче. Что требуется – сгенерировать изображение с некоторым числом, при этом число желательно повернуть, сделать на нем легкий дисторшн. Особенность в том, что число требуется отрисовать некоторым ttf шрифтом. Вот простой код генерации каптчи с помощью Image::Magic:

 

— Масштабирование изображений

Масштабирование выполняется с помощью функции Scale(). Пример исходного кода:

 

— Изменение резкости

В Imager после масштабирования приходилось увеличивать резкость, т.к. картинка после обработки теряла в качестве. В Image::Magick эта проблема оказалась неактуальной – качество после сжатия приемлемое. Приведем примеры (исходное изображение).

Итак, первым идет изображение, сжатое в Image::Magick: Картинка, сжатая Image::Magick

Далее изображение, сжатое в Imager без обработки эффектом увеличения резкости: Картинка, сжатая Imager

И, наконец, изображение, сжатое в Imager с последующей обработкой эффектом увеличения резкости: Картинка, сжатая Imager (эффект резкости)

 

— Image::Magick и архитектура Pheix

В связи с переходом на Image::Magick мы переработали архитектуру Pheix в части вызова функции генерации каптчи. Ранее, если модулю Pheix требовалась каптча, то весь функционал, связанный с генерацией реализовывался в этом модуле. В итоге оказалось, что если рассматривать код всех модулей в целом, то присутствуют дублирующиеся участки – а это уже код с душком.

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

 

— Однако

В пакете ImageMagick, как в общем-то и любом ПО, присутствуют уязвимости.  Одна из самых опасных уязвимостей описана на сайте проекта ImageTragick (перевод на Хабре - https://habrahabr.ru/post/282896/). Хотя об этой уязвимости известно с весны 2016 года, она стала поводом для взлома Facebook в январе 2017 – Facebook remote code execution.

 

 



Резюме - Портфолио - Поддержка сайта - Хостинг - Домены - Контактная информация - Ap-Client 3.0 - Партнеры
Сайт запущен: 17, январь 2002. Права зарегестрированы: АПОФЕОЗЪ laboratories.
Концепция и дизайн: КNarkhov. Последнее обновление: 19, Апрель 2024