Поиск по этому блогу

пятница, 18 ноября 2011 г.

MySQL: тригеры и вызов внешних приложений

Синтаксис создания триггера:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
  • trigger_name — название триггера;
  • trigger_time — Время срабатывания триггера. BEFORE — перед событием. AFTER — после события;
  • trigger_event — событие:
    • insert — событие возбуждается операторами insert, data load, replace;
    • update — событие возбуждается оператором update;
    • delete — событие возбуждается операторами delete, replace;
  • tbl_name — название таблицы;
  • trigger_stmt — выражение, которое выполняется при активации триггера.
Операторы DROP TABLE и TRUNCATE не активируют выполнение триггера.

DELIMITER $$
CREATE TRIGGER tg1 AFTER INSERT ON `your_table`
FOR EACH ROW
BEGIN
\! echo "php algun_script_php.php" >> /log/yourlog.txt
END $$
DELIMITER;
Выполнение внешнего скрипта через sys_eval UDF:
  1. Создаём хранимую процедуру:
    DELIMITER $$
    CREATE PROCEDURE udfwrapper_sp
    (p1   DOUBLE,
    p2   DOUBLE,
    p3 BIGINT)
    BEGIN
    DECLARE cmd CHAR(255);
    DECLARE result CHAR(255);
    SET cmd = CONCAT('C:/xampp/php/php.exe -f "C:/xampp/htdocs/phpFile.php" ', p1, ' ', p2, ' ', p3);
    SET result = sys_eval(cmd);
    END$$;
  2. Создаём тригер:
    CREATE TRIGGER udfwrapper_trigger AFTER INSERT ON sometable
    FOR EACH ROW
    CALL udfwrapper_sp(NEW.Column1, NEW.Column2, NEW.Column3);


вторник, 15 ноября 2011 г.

PHP - выводить все ошибки и предупреждения

error_reporting(E_ALL^E_STRICT);
ini_set('display_errors','On');

Perl & GeoIP

Простенькая такая себенапоминалка о Perl и GeoIP:
# aptitude install libgeo-ip-perl
$ perl -e 'use Geo::IP; my $gi = Geo::IP->open("/usr/share/GeoIP/GeoIP.dat", GEOIP_STANDARD); print $gi->country_code_by_addr("212.90.160.40"), "\n";'
UA
$ perl -e 'use Geo::IP; my $gi = Geo::IP->open("/usr/share/GeoIP/GeoIP.dat", GEOIP_STANDARD); print $gi->country_code_by_addr("193.34.140.1"), "\n";'
UA
$ perl -e 'use Geo::IP; my $gi = Geo::IP->open("/usr/share/GeoIP/GeoIP.dat", GEOIP_STANDARD); print $gi->country_code_by_addr("8.8.8.8"), "\n";'
US
$ perl -e 'use Geo::IP; my $gi = Geo::IP->open("/usr/share/GeoIP/GeoIP.dat", GEOIP_STANDARD); print $gi->country_code_by_addr("8.8.4.4"), "\n";'
US

Генерация хеша для /etc/shadow в Debian

Прочитал статью, решил проверить и с некоторым удивлением заметил, что у меня на одном из серверов хеш начинался с $1. Вооружившись новыми знаниями решил перестроить хеш в /etc/shadow вручную.
Первое, что стало любопытно, а какие форматы для хеша поддерживает mkpasswd в Debian Lenny и какие в Debian Squeeze:
lenny$ mkpasswd -m help
Available methods:
des standard 56 bit DES-based crypt(3)
md5 MD5
sha-256 SHA-256
sha-512 SHA-512

squeeze$ mkpasswd -m help
Доступные методы:
des standard 56 bit DES-based crypt(3)
md5 MD5
sha-256 SHA-256
sha-512 SHA-512
Вполне ожидаемый результат.
Осталось сгенерировать пароль. Глянул в статью, попробовал, и получил неожиданный результат:
$ mkpasswd -m sha-512 --salt=KlLePXXM
Испорченная длина salt: 8 байт(а) при ожидаемой 16.
но для 16 байтной "соли" всё прошло гладко:
$ mkpasswd -m sha-512 --salt=eruighergmbreger
Пароль: 
$6$eruighergmbreger$chkaHXfrafLH4Quq1bCLj1krzDAKORTiA0.pg5.0EdWUZyeHuuMrAdryXkaM6wlTL3NRVDlyS7489YiCvGn/A/
Дальше всё очень просто, берём этот хеш и подставляем его в /etc/shadow вместо существующего. Пробуем подлогиниться и не получаем никакого отлупа. Довольные идём пить кофе :)