— Немного о модуле 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:
Далее изображение, сжатое в Imager без обработки эффектом увеличения резкости:
И, наконец, изображение, сжатое в Imager с последующей обработкой эффектом увеличения резкости:
— Image::Magick и архитектура Pheix
В связи с переходом на Image::Magick мы переработали архитектуру Pheix в части вызова функции генерации каптчи. Ранее, если модулю Pheix требовалась каптча, то весь функционал, связанный с генерацией реализовывался в этом модуле. В итоге оказалось, что если рассматривать код всех модулей в целом, то присутствуют дублирующиеся участки – а это уже код с душком.
В результате мы перенесли функционал каптчи в ядро и переработали модули, пользующиеся этим функционалом. В среднем каждый модуль стал легче на 150 строк кода.
— Однако
В пакете ImageMagick, как в общем-то и любом ПО, присутствуют уязвимости. Одна из самых опасных уязвимостей описана на сайте проекта ImageTragick (перевод на Хабре - https://habrahabr.ru/post/282896/). Хотя об этой уязвимости известно с весны 2016 года, она стала поводом для взлома Facebook в январе 2017 – Facebook remote code execution.
|