03 Апрель, 2015

Подменяем время на PHP

Возникают такие случаи когда во время разработки на PHP необходима возможность подмены времени. Можно конечно перевести часы в системе, но я бы так не рекомендовал делать ибо такое действие влечет за собой кучу проблем. А виртуальные сервера у некоторых хостеров могут и вовсе не грузиться после принудительной смены времени.

Так что самый безопасный способ это переопределение встроеных в PHP функций. Да, патчить и компилировать PHP мы не будем =)

Мы просто возьмем отсюда модуль PHP-TimeCop и установим его согласно приложенной инструкции.

После всех этих манипуляций нам остается только вызвать в начале скрипта вот такую функцию

$mytime = time()-86400;

timecop_freeze($mytime);

Таким образом мы зафиксировали в скрипте время ровно на сутки назад. Для удобства небольшой скрипт с этими двумя строчками можно подключать ко всем скриптам через директиву auto_prepend_file в .htaccess

11 Январь, 2015

Запускаем GUI-приложения в Docker

Предыстория такова - понадобился мне MySQL Workbench который в репозитории для Fedora Core 21 на момент написания статьи еще отсутствует. Сперва я попробовал накатить RPM-пакет от FC20, но он не смог установиться из-за неразрешенных зависимостей. Потом я взял в руки Docker и вот что получилось:

1) Создаем Dockerfile где описываем что мы хотим получить:

vim Dockerfile
FROM debian
RUN apt-get update
RUN apt-get install -qqy x11-apps mysql-workbench
ENV DISPLAY :0
CMD /usr/bin/mysql-workbench

2) Собираем наш контейнер с последним Debian и установленным MySQL-Workbench

docker build -t workbench - < Dockerfile

3) Объявляем для удобства переменную

XSOCK=/tmp/.X11-unix/X0

4) Запускаем контейнер и прокидываем в него сокет. Контейнер автоматически стартует MySQL-Workbench при запуске

docker run --privileged -v $XSOCK:$XSOCK workbench

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

MySQL Workbench running on Docker-container

23 Декабрь, 2014

Как зашифровать большие файлы?

В этом нам поможет утилита openssl.

Публикую 2 варианта т.к. первый опубликованный оказался с недостатком. Зашифровать большие файлы можно, но вот расшифровать можно только файлы размером менее 1.5 Gb. Такой вот неприятный сюрприз.

Вариант 1 (только для файлов менее 1.5Gb)

Для начала генерируем нашу пару ключей которая делится на приватную и публичную части. Публичной можно только шифровать файлы. Расшифровывать их надо с применением приватного ключа.

openssl req -x509 -nodes -newkey rsa:2048 -keyout private.pem -out public.pem

Шифруем наши файлики:

openssl smime -encrypt -aes256 -in file.tar.gz -binary -outform DEM -out file.tar.gz.ssl public.pem

Расшифровываем:

openssl smime -decrypt -in file.tar.gz.ssl -binary -inform DEM -inkey private.pem -out file.tar.gz

На целевой машине где файлы будут шифроваться есть смысл держать только публичный ключ. А закрытую часть ключа хранить в особо секретном месте =)

Вариант 2 (с явными ограничениями не столкнулся)

Генерируем текстовый ключ:

openssl rand -base64 32 -out key.txt

Шифруем файлы:

openssl enc -aes-256-cbc -salt -in file.tar.gz -out file.tar.gz.enc -pass file:./key.txt

Дешифруем файлы:

openssl enc -d -aes-256-cbc -in file.tar.gz.enc -out file.tar.gz -pass file:./key.txt

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

13 Сентябрь, 2014

Проверяем сайт на наличие битых ссылок

В этом деле нам поможет старый добрый wget:

wget --spider -o ~/site_ru.log -e robots=off -w 1 -r -p http://site.ru

Краткая расшифровка опций:

  • --spider, режим «паука», файлы при сканировании не сохраняются, сохраняются только заголовки ответа сервера

  • -o, указываем куда нам сохранять лог

  • -e robots=off, говорим что не хотим следовать правилам robots.txt (по умолчанию wget их учитывает)

  • -w, выставляем тайм-айт между запросами в 1 секунду (можно отключить если уверены в мощности хостинга)

  • -r, включаем рекурсивный обход сайта

  • -p, делаем все запросы для загрузки сайта включая подгрузку css,js и например изображений

Проверяем свой улов на наличие 404 ошибок - grep -B 2 '404' ~/site_ru.log

Кстати, сюда также попадут и ссылки у которых просто в теле адреса есть слово 404 (пример hamdeew.ru/page/bitriks-delaem-stranicu-404-pravilno)

Все бы хорошо, да этот метод не покажет нам битые ссылки на чужие ресурсы. А это довольно важно - например у вас могут подгружаться картинки с других ресурсов и т.д.

Я нашел решение которое работает не на 100 процентов и оно довольно кривое (из-за некотрых особенностей wget), но тем не менее мне оно помогло отыскать битые ссылки на картинки и найти одну 404.

mkdir ~/test/

cd ~/test/

Директорию создаем т.к. метод довольно грязный - создает кучу пустых директорий в процессе работы.

wget -r -l 1 -H -p -o ~/test/site_ru_out.log --spider -e robots=off http://site.ru/

И затем прогоняем получившийся у нас site_ru_out.log грепом как и в первом случае + еще один прогон для проверки ссылок на несуществующие ресурсы:

grep -B 2 'failed' ~/site_ru.log

Надеюсь что вам этот способ помог. Удачи!

08 Сентябрь, 2014

Закрыть доступ для .git глобально

Краткий совет как на сервере с ISPmanager глобально запретить отображать листинг директорий .git

  1. Открываем /etc/apache2/apache2.conf
  2. Находим начало секций с <Directory> и вписываем туда глобальное правило:

<Directory /var/www/\*/data/www/*/.git> order allow,deny deny from all </Directory>

  1. Рестартим Apache2 - service apache2 restart
Новые записи →Home← Старые записи