Как то пришла мне мысль рулить серваком по аське и решено было написать небольшого бота на Perl.
Нам понадобиться модуль Net::OSCAR, описанте можно найти тут, собственно этого и хватит для простого бота.
Либы можно поставить из портов
cd /usr/ports/net-im/p5-Net-OSCAR/ make install clean cd /usr/ports/sysutils/p5-Sys-Gamin/ make install clean
Вот собственно код с не большими коментами. #!/usr/bin/perl use Net::OSCAR; use Sys::Gamin; #модуль следящйи за изменением в файле $MYADMIN = 123456789; #ICQ номер человека который может выполнять комады $UIN = 123456789; # номер бота $PASSWORD = "123456"; #пароль %functions = ( "cmd" => \&icq_bot_cmd, ); $oscar = Net::OSCAR -> new(); $oscar -> set_callback_im_in(\&message_callback); $oscar -> signon($UIN, $PASSWORD) or die("Login failed\n"); #авторизация $guard = Sys::Gamin -> new(); $guard -> monitor('/var/log/openvpn.log'); #файлы за изменение которых будем следить $guard -> monitor('/var/log/auth.log'); #цикл в нем мы следим за файлом $quit = 0; while(!$quit) { if($guard->pending){ $event=$guard->next_event; if($event->filename eq '/var/log/auth.log'){ my $last = `tail -1 /var/log/auth.log`; if($last =~ / error:|Accepted /){ $oscar -> send_im($MYADMIN, $last); } } if($event->filename eq '/var/log/openvpn.log'){ my $last = `tail -1 /var/log/openvpn.log`; if($last =~ / Peer Connection Initiated with /){ $oscar -> send_im($MYADMIN, $last); } } } $oscar->do_one_loop(); } sub message_callback { local ($client, $uin, $msg) = @_; $msg =~ s/\x00+(.)/${1}/g; #вырезаем нули из полученного сообщения #в полученных сообщениях от R&Q почему то перед каждым #символом шел нулевой байт, не знаю с чем это связано open(APPFH,">> in_msg.log"); #записываем полученые сообщения в лог фаил print (APPFH $uin,":",$msg,":",`date`); close(APPFH); if(($cmd,$params) = $msg =~ /^\!([^\ ]+) (.+)$/){ #парсим команду и параметры (!cmd uptime) #!cmd вызов функции cmd на выполнение команды uptime $result = exists($functions{$cmd}) ? $functions{$cmd}($params) : ""; } } sub icq_bot_cmd { if ($uin eq $MYADMIN){ local $result=`$params`; $client->send_im($uin, "$result"); } else { $client->send_im($uin,"Permission denied"); } }
В крации что делает бот.
Бот следить за изменением в логфайлах (ssh и openvpn) и сообщает нам если кто то подключился.
Так же можно выполнять консольные команды.
Я думаю тут есть где разгуляться фантазии и прикрутить кучу разных фичь.