Ключевые слова:icq, plugin, (найти похожие документы)
From: Сергей Копшаев <claric@mail.ru.>
Date: Mon, 20 Sep 2004 18:21:07 +0000 (UTC)
Subject: Передача уведомлений используя Miranda
Оригинал: http://www.vadim.org.ua/index.php?cmd=article5
Задача.
-------
У меня стоит Miranda IM 0.3.3 (http://www.miranda-im.org/)
и есть к ней плагин NotifyAnithing
(http://miranda-im.org/download/details.php?action=viewfile&id=431)
Этот плагин слушает порт и отображает приходящие на него сообщения в popup окне.
Есть Linux роутер с которого я хочу получать системные сообщения.
Реализация.
Клиент
Miranda IM 0.3.3 с плагином NotifyAnithing.
Уберите checkbox "Only Listen to Localhost
Задайте порт, который NotifyAnithing будет слушать.
С клиентом все.
Сервер
Используем стандартную систему syslog
Кроме того, что syslogd пишет события в различные файлы типа /var/log/messages,
передает на удаленные сервера логов и посылает почту указанным товарищам,
syslogd может "бросать" сообщения в named pipe. Вот этой то возможностью передачи
в named pipe мы и воспользуемся.
1. Создам named pipe с помощью утитлиты mkfifo:
mkfifo /dev/mylogpipe
2. В файле конфигурации /etc/syslog.conf добавляем строчку:
authpriv.* |/dev/mylogpipe
Тем самым мы указываем сто все сообщения касающиеся пользовательских логинов
направлять в named pipe /dev/mylogpipe. По всем вопросам о том какие события и
как их записывать смотрите man syslog.conf.
3. Половина дела сделана, мы направили интересующие нас логи в named pipe.
Осталось сделать демона, который бы все это читал, парсил и передавал
нашему клиенту интересующие нас сообщения.
4. Вот простой скрипт на perl.
1. #!/usr/bin/perl
2. use IO::Socket;
3. if (!defined($child_pid = fork())) {
4. die "cannot fork: $!";
5. } elsif ($child_pid) { exit;}
6. else { # I'm the child
7. }
8. open (FILEHANDLE, "/dev/mylogpipe");
9. while ()
10. {
11. $toim=readline(FILEHANDLE);
12. if ($toim=~/sshd|ftp|attack|error|NOQUEUE/)
13. {
14. my $sock = new IO::Socket::INET (
15. PeerAddr => '192.1.1.2',
16. PeerPort => '5555',
17. Proto => 'udp',
18. );
19. chomp($toim);
20. print $sock "!$toim";
21. close($sock);
22. }
23. }
24. close(FILEHANDLE);
25. Описание скрипта.
Строки 3-7 Это мы становимся независимым процессом, чтобы оторваться от консоли.
Строки 8-9 открываем и читаем в цикле наш named pipe.
Строки 11-12 типа парсим что нам смотреть, ибо если не фильтровать сообшения с
загруженного роутера, то popup будут выглядеть в миранде очень забавно.
Строки 14-18 создаем сокет где указываем на какой хост отправлять сообщения.
Строка 20 отправляем сообщение.
Строка 21 закрываем сокет и ждем нового совпадения с нашими фильтрами.
Все ребята сидим и наблюдаем ситуацию