Обсчет данных ip accounting по заданному ip
Возникла задача разбирать логи ip accounting'а с целью определить, какой пользователь куда тратит свой трафик. Для этой цели написал простой перловый скрипт, который разбирает строчки данных ip accounting'а, ищет строчки, относящиеся к заданному ip и выводит 2 списка: общий список адресов исходящего и входящего трафика, и список 5-ти самых активных адресов. Возможно, кому-то пригодится. Лежит тут: http://cebka.pp.ru/stuff/ipacct_counter.pl. Пример использования:
# cat /data/log/ipacct/2010-05-25/2010-05-25-00 | perl ipacct_by_dest.pl <ip>
OpenID и wordpress
Плагин для работы openid аутентификации в wordpress работает достаточно странно: он требует для парсинга XRDS xml парсер, но то, как он пытается его загрузить, довольно ужасно:
if (!extension_loaded($name)) {
foreach ($params['libname'] as $libname) {
if (@dl($libname)) {
$classname = $params['classname'];
}
}
} else {
То есть, при отсутствии заданного расширения, он пытается его dlopen'уть, но при этом игнорируя любые ошибки. В итоге ошибка dl становится фатальной, но нигде не отображается. Опытным путем выяснилось, что для работы плагина необходимо расширение dom.so (textproc/php5-dom). Сейчас openid авторизация тут должна работать.
Старые статьи
После долгих мучений удалось-таки восстановить данные с scsi винта после смерти контроллера. За это должен сказать отдельное "спасибо" Антону Южанинову. Так как большая часть моих старых статей либо устарела, либо не нравится мне самому совершенно, то я решил выложить обратно только некоторые. Первой статью про настройку exim'а. Единственная проблема, что я более нигде не использую exim, предпочтя ему postfix, так как последний поддерживает некоторые очень нужные вещи, типа XCLIENT и milter. И если XCLIENT достаточно просто добавить в код exim'а, что я, возможно, сделаю в ближайшее время, то поддержка milter - это очень сложно решаемая задача.
Autotools
При написании приложений, которые необходимо портировать хотя бы между разными версиями unix, рано или поздно приходится прибегать к auto-кошмару. Однако, если бы из всех разрозненных руководств и самих утилит собрать нечто похожее на мануал, то все было бы намного проще. Итак, вкратце:
Исходные файлы:
configure.ac (можно генерить autoscan'ом)
Makefile.am
Остальное генерируется само.
Утилиты:
autoscan - создает базовый вид configure.ac
autoheader - создает config.h.in на основе configure.ac
aclocal - объединяет макросы, существующие в системе, в файл aclocal.m4
automake - создает файл Makefile.in на базе Makefile.am и configure.ac. Полезные опции: -a (создавать все недостаточные файлы), --foreign (не ругаться на отсутствие гнутой документации и прочей байды)
autoconf - создает configure скрипт, которым далее можно пользоваться
Форматы файлов:
Makefile.am - похож немного на формат обычного make. Для plain конфигураций достаточно простого синтаксиса NAME [?|+]= VALUE
bin_PROGRAMS = some-cli
some_cli_SOURCES = some.c server.c
if GNOME_GUI
bin_PROGRAMS += some-gnome
endif
some_gnome_SOURCES = some.c server.c gnome-some.c
some_gnome_CFLAGS = @DEPS_CFLAGS@
some_gnome_LDADD = @DEPS_LIBS@
Символы @@ подменяются скриптом configure на значения соответствующих configure переменных - происходит это на этапе конфигурации Makefile.in в конечный Makefile.
GNOME_GUI специально передается из autoconf в automake - об этом далее. Переменные, в принципе, достаточно очевидные.
configure.ac - набор специализированных m4 макросов, которые после обработки препроцессором превращаются в исполняемый shell скрипт. Вкратце об m4 - синтаксис примерно такой: MACRO (param, param...) при этом есть специальный синтаксис - подстановки. Если param окружить квадратными скобками, то выполняются следующие подстановки:
[value value value] - передает список значений, как один параметр
[shell code] - выполняет соответствующи shell код, при этом все переменные, определенные внутри квадратных скобок могут использоваться и далее
[M4_MACRO (param...) M4_MACRO(param...)] - выполняет один или несколько макросов для вычисления параметра
Полезные макросы и конструкции autoconf:
- проверка --enable параметра и установка его по умолчанию
AC_ARG_ENABLE([gnome-gui],
[ --enable-gnome-gui Turn on gnome gui],
[case "${enableval}" in
yes) gnomegui=true ;;
no) gnomegui=false ;;
*) AC_MSG_ERROR([bad value ${enableval} for --enable-gnome-gui]) ;;
esac],[gnomegui=true])
Общий вид: AC_ARG_ENABLE(name, help, action_if_set, action_if_unset)
из-за эскейпа этот макрос делается не очень читаемым, так как используется шелл-код внутри макроса.
- для передачи переменной для automake (см. выше) используется такая конструкция, которая дефайнит переменную GNOME_GUI, если была указана опция --enable-gnome-gui:
AM_CONDITIONAL([GNOME_GUI], [test x$gnomegui = xtrue])
- для записи некоторых параметров в файл config.h при указании опции можно пользоваться таким синтаксисом:
AC_ARG_WITH([icn-ip],
[AS_HELP_STRING([--with-ip],
[specify ip to use])],
[with_icn_ip=${withval}],
[with_icn_ip=127.0.0.1])
AC_DEFINE_UNQUOTED([ICN_IP], ["$with_icn_ip"], ["Ip address of server to connect"]
Первый макрос похож на макрос для проверки enable, второй опеределяет соответствующий #define в config.h. Если в квадратных скобках указывать значение без кавычек, то и в config.h оно будет без кавычек (для числовых значений, например).
- шапка файла
m4_include([version.m4])
AC_INIT([ICNet], VERSION_NUMBER)
AM_INIT_AUTOMAKE([no-installinfo no-installman])
AC_CONFIG_HEADER([config.h])
version.m4 содержит одну строку - m4_define([VERSION_NUMBER], [1.0])
Остальное можно взять из того, что нагенерил autoscan
- использование pkg-config
AS_IF([test x$gnomegui = xtrue],
[PKG_CHECK_MODULES(DEPS, gtk+-2.0 libbonoboui-2.0)
AC_SUBST(DEPS_CFLAGS)
AC_SUBST(DEPS_LIBS)
]
)
AS_IF проверяет установленную ранее переменную и если условие выполняется, выполняет проверку библиотек gnome - gtk+-2.0 и libbonoboui-2.0 используя pkg-config. Результаты записываются в переменные DEPS_CFLAGS и DEPS_LIBS, которые мы будем заменять в Makefile.in (там они экранируются символами @DEPS_CFLAGS@).
- проверка библиотеки .so
AC_CHECK_LIB([event], [event_loop])
1-й параметр - имя библиотеки, 2-й - проверка наличия определенного символа в этой библиотеке
- проверка хедеров
AC_CHECK_HEADERS([endian.h arpa/inet.h netinet/in.h stdlib.h string.h sys/socket.h syslog.h unistd.h])
- проверка функций
AC_CHECK_FUNCS([bzero memset socket strerror strtol strtoul])
Порядок запуска autotools
Makefile.am ->
autoscan ->
cp configure.scan configure.ac ->
(edit configure.ac) ->
aclocal ->
autoheader ->
automake ->
autoconf
./configure
make...
First post
Решил вести свои заметки в таком стиле, чтобы в будущем упростить их поиск и извлечение информации.