http://mtaalamu.ru
XMPP-протокол довольно прост и понятен. Достаточно установить отладочную консоль в Pidgin или Psi — и детали общения клиента и сервера станут ясны. Но есть одно но: TLS-аутентификация. Вот она-то и не позволяет, например, с легкостью написать простое мобильное приложение для общения с тем-же Jabber-ботом. Есть, например, мобильный клиент MGtalk. Заглянул в исходный код — там ужас. Да и яндексовский мобильный клиент работает очень нестабильно: постоянно переустанавливает соединение и даже отправляет телефон в аут (внезапно экран гаснет и телефон выключается).]]>
Но писал действительно на bash, уж больно он мне нравится своей простотой и адекватностью]]>
Теория:
Для работы бот использует freetalk и sendxmpp, соответственно и первое и второе должно быть настроено на JID бота. freetalk запускается перед запуском бота.
Бот(inc) запускается с 2 параметрами: JID бота и JID администратора(того от кого будет принимать команды).
После запуска идет бесконечный цикл на чтение последней стройки из истории freetalk и пределение новая это строка или нет. Если строка новая то JID и содержание передаются на управление другому скрипту(out) который отрезает от содержания команду а все остальное использует как параметры(было нужно для создания заметок и управления торрентами). Собственно потом команда уходит в case и идет выборка действия, ответ отсылается пользователю по sendxmpp. Разделение на 2 скрипта было сделано для того что-бы можно было править список команд не перезапуская бот. В принципе ничто не мешает заставить бота отсылать присланное сообщение в консоль и возвращать результат.
Код:
inc
#!/bin/bash
bot=$1
admin=$2
str=`tail -n1 ~/.freetalk/history/$1/$2`
while [ true ];do
str1=`tail -n1 ~/.freetalk/history/$1/$2`
if [ "$str1" != "$str" ]; then
mes=${str1#*"] "}
echo $mes
./out $admin $mes
fi
str=$str1
done
out
#!/bin/bash
in=1
for a in "$@"; do
case $in in
1)admin=$a;;
2)mes=$a;;
*)par=$a;;
esac
let 'in+=1'
done
#Обработка команды
case "$mes" in
#Transmission
torrent_list)
echo ''>t
echo 'Активные torrent-сессии'>>t
echo '---'
transmission-remote localhost:4545 -l>>t
sendxmpp $admin -m t
;;
torrent_add)
#wget -O t $par
transmission-remote localhost:4545 --add $par
echo 'Торрент добавлен' | sendxmpp $admin
;;
torrent_choise)
transmission-remote localhost:4545 -t $par
;;
torrent_stop)
transmission-remote localhost:4545 -S
;;
torrent_start)
transmission-remote localhost:4545 -s
;;
torrent_on)
transmission-daemon
ps aux|grep [t]ransmission-daemon|sendxmpp $admin
;;
torrent_off)
killall transmission-daemon
ps aux|grep [t]ransmission-daemon|sendxmpp $admin
;;
#Диагностика
info_hdd)
echo ''> t
echo 'Состояние дисков' >> t
echo '---' >> t
df -h >> t
sendxmpp $admin -m t
;;
info_mem)
echo '' > t
echo '---' >> t
echo 'Состояние памяти' >> t
free -kt >> t
sendxmpp $admin -m t
;;
info_cpu)
echo 'oops'|sendxmpp $admin
;;
info_net)
echo '' > t
echo 'Состояние сети' >> t
echo '---' >> t
echo "IP: $(wget -O - -q icanhazip.com)" >> t
echo "Local IP: $(ifconfig eth0 |grep inet\ addr|cut -b21-33)" >> t
echo '--'>> t
echo 'Активные TCP соединения' >> t
netstat | grep Recv-Q >> t
netstat | grep tcp >> t
sendxmpp $admin -m t
;;
info_all)
echo '' > t
echo 'Информация о системе' >> t
echo '---' >> t
cat /proc/version >> t
echo "Uptime: $(uptime|cut -d' ' -f2)" >> t
echo '--' >> t
grep MemTotal /proc/meminfo >> t
grep MemFree /proc/meminfo >> t
grep SwapTotal /proc/meminfo >> t
grep SwapFree /proc/meminfo >> t
echo '--' >> t
grep platform /proc/cpuinfo >> t
grep cpu /proc/cpuinfo >> t
grep clock /proc/cpuinfo >> t
echo '--' >> t
df -h | grep Filesystem >> t
df -h | grep md1 >> t
df -h | grep sda4 >> t
sendxmpp $admin -m t
;;
#Заметки
note_new)
t=0
while [ $t != 1 ]; do
file=$((RANDOM%800+1))
for i in $(ls); do
if [ "$i" != "$file" ]
then
t=1
fi
done
done
echo "Заметка #$file:" >> notes/$file
echo '' >> notes/$file
echo "$par" >> notes/$file
echo "Заметка #$file создана"|sendxmpp $admin
;;
note_show)
sendxmpp $admin -m notes/$par
;;
note_list)
echo ''>t
echo 'Список заметок'>>t
echo '---'>>t
for i in $(ls notes/);do
echo "Заметка #$i">>t
echo "$(tail -n1 notes/$i|cut -b1-30)...">>t
echo ''>>t
done
sendxmpp $admin -m t
;;
note_del)
rm notes/$par
echo "Заметка $par удалена"|sendxmpp $admin
;;
help)
sendxmpp $admin -m help
;;
info)
sendxmpp $admin -m info
;;
*)
sendxmpp $admin -m help
;;
esac
Заключение:
Минусов как видите масса, например демонизировать можно только через screen, думал довести до ума, но не нашел чем можно заменить freetalk, если только мисать отдельный скрипт на ruby/perl но тогда самого бота будет выгоднее переписать. В общем кому интересно можете покопать)]]>
Спасибо, я для себя парочку идей почерпнул. Такой камент просится в отдельный топик.]]>