LINUX.ORG.RU

vpn over jabber


0

0

Есть ли готовые реализации 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 шелле

Сабж просто ппц :-) назвал бы тогда rshell via jabber, а то выглядит "Как ездить трактором через голубинную почту" :)

Deleted
()

А как ты вставил исходник в "рамку"?

anonymous
()

ага. thanx всем. теперь гадаю -- лучше взять готовый в котором фиг разберусь или допилить свой =)

LowLevel
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.