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 но тогда самого бота будет выгоднее переписать. В общем кому интересно можете покопать)]]>
Спасибо, я для себя парочку идей почерпнул. Такой камент просится в отдельный топик.]]>