Archive for December, 2008
tail -f с фильтром
Очень удобно смотреть некоторые логи с помощью tail -f logfile — на экране показывается в real time все попадающее в лог файл. Но когда в файл записывается ну слишком много всего и вывод совершенно невозможно читать.
Хочется иметь возможность фильтровать вывод, но так же получать его на экран в режиме реального времени. Как оказалось — это очень просто:
root@mail:/var/log# tail -f mail.log|grep “connect from”
Dec 23 12:09:35 mail postfix/smtpd[1940]: connect from unknown[A.B.C.D]
Dec 23 12:09:36 mail postfix/smtpd[1938]: disconnect from unknown[A.B.C.D]
Dec 23 12:09:36 mail postfix/smtpd[2522]: connect from host[A.B.C.D]
Dec 23 12:09:36 mail postfix/smtpd[1955]: disconnect from unknown[A.B.C.D]
Dec 23 12:09:37 mail postfix/smtpd[2513]: connect from host[A.B.C.D]
Dec 23 12:09:37 mail postfix/smtpd[2502]: connect from unknown[A.B.C.D]
Dec 23 12:09:37 mail postfix/smtpd[1432]: disconnect from host[A.B.C.D]
Dec 23 12:09:38 mail postfix/smtpd[1367]: disconnect from unknown[A.B.C.D]
Dec 23 12:09:38 mail postfix/smtpd[1977]: disconnect from unknown[A.B.C.D]
Dec 23 12:09:38 mail postfix/smtpd[1940]: disconnect from unknown[A.B.C.D]
Dec 23 12:09:39 mail postfix/smtpd[2455]: disconnect from unknown[A.B.C.D]
Dec 23 12:09:39 mail postfix/smtpd[2471]: disconnect from unknown[A.B.C.D]
Но иногда хочется ставить не один фильтр, а несколько. Но, как выясняется, несколько грепов подряд — не работает. Решение так же существует и оно очень простое — у всех грепов, кроме последнего добавляется параметр — –line-buffered:
root@mail:/var/log# tail -f mail.log|grep –line-buffered “connect from”|grep -v “disconnect”
Dec 23 12:13:04 mail postfix/smtpd[1941]: connect from host[A.B.C.D]
Dec 23 12:13:04 mail postfix/smtpd[2455]: connect from host[A.B.C.D]
Dec 23 12:13:05 mail postfix/smtpd[1955]: connect from unknown[A.B.C.D]
Dec 23 12:13:06 mail postfix/smtpd[1980]: connect from host[A.B.C.D]
Dec 23 12:13:06 mail postfix/smtpd[1940]: connect from unknown[A.B.C.D]
Dec 23 12:13:07 mail postfix/smtpd[1978]: connect from host[A.B.C.D]
Dec 23 12:13:07 mail postfix/smtpd[2502]: connect from unknown[A.B.C.D]
Dec 23 12:13:09 mail postfix/smtpd[2513]: connect from unknown[A.B.C.D]
Dec 23 12:13:11 mail postfix/smtpd[1432]: connect from host[A.B.C.D]
PS найдено на форуме убунту.
Perl процедура для обновления wiki страниц trac-а
Я очень люблю и много пользуюсь системой trac. У меня появилась необходимость обновлять вики страницы трака из внешних программ. Я написал крохотную процедуру на perl, чтобы это делать (и впервые воспользовался pod для ведения документации =):
-
#! /usr/bin/perl
-
-
use strict;
-
use warnings;
-
use DBI;
-
-
=head2 Структура таблицы wiki в траке
-
-
CREATE TABLE wiki (
-
name text,
-
version integer,
-
time integer,
-
author text,
-
ipnr text,
-
text text,
-
comment text,
-
readonly integer,
-
UNIQUE (name,version)
-
);
-
-
=cut
-
-
=head2 sub write_wiki_trac
-
Процедуре передаются параметры:
-
-
file - файл с базой данных trac
-
name - название страницы
-
author - кто будет автором редакции страницы
-
text - текст, который будет размещен на странице
-
-
Процедура создает страницу, если страницы с таким именем нет.
-
Время создания страницы выставляется текущее время.
-
Процедура записывает новую редакцию страницы, если text не соответствует последней радакчии.
-
Если текст полностью идентичен последней редакции, то процедура ничего не изменяет в базе.
-
-
=cut
-
-
-
sub write_wiki_trac {
-
my ($file, $name, $author, $text) = @_;
-
-
my $dbh = DBI->connect("dbi:SQLite:dbname=$file","","", { RaiseError => 1, PrintError => 0 }) or die "Failed to connect to SQLite filesystem digest cache database at $file: " . DBI->errstr;
-
-
$dbh->{unicode} = 1;
-
-
# Нахожу последнюю версию страницы
-
my $sth = $dbh->prepare("SELECT * FROM wiki WHERE name='$name' ORDER BY version DESC LIMIT 1");
-
-
$sth->execute();
-
-
my $result = $sth->fetchrow_hashref;
-
-
# Несколько дурацких строк ниже, чтобы избавится от warning "Use of uninitialized value in concatenation"
-
my $text_db;
-
if ( $result->{text} ) {
-
$text_db = $result->{text};
-
} else {
-
$text_db = "";
-
}
-
-
# Записываем только если текст отличается от того, который сейчас в бд
-
if ( $text_db ne $text ) {
-
-
my $version;
-
-
unless ( $result->{version} ) {
-
$version = 1;
-
} else {
-
$version = $result->{version}+1;
-
}
-
-
$sth = $dbh->prepare("INSERT INTO wiki (name, version, time, author, text, ipnr, readonly, comment) VALUES ('$name', '$version', $time, '$author', '$text', '127.0.0.1', 0, '')");
-
$sth->execute();
-
}
-
-
return 1;
-
}
-
-
-
# проверка работы процедуры:
-
my $file = "/var/trac/test/db/trac.db";
-
&write_wiki_trac($file, "SandBox", "tester", "New page content");
Обновление chess.bessarabov.ru
Небольшое обновление моего проекта chess.bessarabov.ru:
- Появилось список, в котором отображаются ходы (кстати, при подведении мышки к последнему ходу в списке, ход будет показан на доске)
- Появилась форма обратной связи — теперь можно писать мне из нее, а не только по email
- В заголовке страницы теперь пишется информация о том, чей сейчас ход — это удобно, когда кроме шахмат открыто еще несколько вкладок, теперь очень легко понять, пошел ли противник

Форма обратной связи на delicious.com
У сайта delicious.com есть форма обратной связи. Форма вполне обычная, но меня очень порадовала идея, где сохранять информацию о пользователей|, который отписал нечто на этой форме: сохранять в подписе письма:
Original Message Follows:
--------------------------------------
Username: bessarabov
Email: ivan@bessarabov.ru
Message:
Here was my message, whitch I don't wan't to show on public.
--
Originating IP address: 83.167.111.59
Browser Info: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080827 Iceweasel/2.0.0.17 (Debian-2.0.0.17-0etch1)