Как то пришла мне мысль рулить серваком по аське и решено было написать небольшого бота на 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) и сообщает нам если кто то подключился.
Так же можно выполнять консольные команды.
Я думаю тут есть где разгуляться фантазии и прикрутить кучу разных фичь.