Есть ли готовые реализации jabber бота который работает на локальной тачке, выполняет команды шелла и отдаёт результаты? Просто иногда надо зайти на домашнюю тачку в серой сети с сотового. По идее это реализуется впн-ом, но под яву я клиентов не видел, зато джабберов сколько угодно. В некотором роде jabber-сервер выполняет роль vpn-сервера. Пока наваял вот такое (переделанный bot.py из examples), но реализация конечно хромает. + хочется авторизации, цветного вывода и т.п.
#!/usr/bin/python
# -*- coding: koi8-r -*-
import os
import sys
import xmpp
import time
import fcntl
############################ bot logic start #####################################
def messageCB(conn,mess):
text=mess.getBody()
user=mess.getFrom()
user.lang='en'
reply=''
err_count=0
shell_in.write(text+"\n")
shell_in.flush()
while err_count < 10:
time.sleep(0.1)
try:
text=os.read(shell_out.fileno(),1024)
except OSError: # no data available, non-blocking read
text=''
if not text:
err_count+=1
else:
err_count=0
reply+=text
print '======> ', reply
if reply: conn.send(xmpp.Message(mess.getFrom(),reply))
############################# bot logic stop #####################################
def StepOn(conn):
try:
conn.Process(1)
except KeyboardInterrupt: return 0
return 1
def GoOn(conn):
while StepOn(conn): pass
if len(sys.argv)<3:
print "Usage: bot.py username@server.net password"
else:
jid=xmpp.JID(sys.argv[1])
user,server,password=jid.getNode(),jid.getDomain(),sys.argv[2]
conn=xmpp.Client(server)#,debug=[])
conres=conn.connect()
if not conres:
print "Unable to connect to server %s!"%server
sys.exit(1)
if conres<>'tls':
print "Warning: unable to estabilish secure connection - TLS failed!"
authres=conn.auth(user,password)
if not authres:
print "Unable to authorize on %s - check login/password."%server
sys.exit(1)
if authres<>'sasl':
print "Warning: unable to perform SASL auth os %s. Old authentication method used!"%server
conn.RegisterHandler('message',messageCB)
conn.sendInitPresence()
print "Bot started."
shell_in,shell_out=os.popen4("LANG=C /bin/bash")
# get the file's current flag settings
fl = fcntl.fcntl(shell_out.fileno(), fcntl.F_GETFL)
# update the file's flags to put the file into non-blocking mode.
fcntl.fcntl(shell_out.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK)
GoOn(conn)
PS: здесь реализована сессионность, то есть команды выполняются последовательно в 1 шелле