Tail -f log на сервере, обработать данные, затем передать клиенту через twisted

Цель: показать данные с сервера в графическом интерфейсе wxPython на клиенте

Новичок в Twisted. У меня есть графический интерфейс wxPython, запущенный на клиенте Windows 7, и есть программа, запущенная на сервере Ubuntu, которая создает журнал. В настоящее время я пытаюсь выполнить хвост -f журнала, передать вывод на сервер Twisted, а затем передать клиенту все данные, удовлетворяющие моим условиям regex. У меня уже открыт туннель, поэтому мне не нужно усложнять ситуацию с SSH. Я запустил следующий блок кода, но он обслуживает только первую строку во входных данных. Я знаю, что мне нужно продолжать проверять ввод на наличие новой строки и затем записывать ее на транспорт, но я не уверен, как это сделать без разрыва соединения.

Я не смог найти достаточно информации, чтобы собрать воедино полное решение. Я также пробовал различные другие методы, используя сокеты и файловый IO, но я думаю, что Twisted кажется хорошим инструментом для решения этой проблемы. Нахожусь ли я на правильном пути? Любые рекомендации будут приняты с благодарностью. Спасибо

#! /usr/bin/python

import optparse, os, sys

from twisted.internet.protocol import ServerFactory, Protocol

def parse_args():
    usage = """usage: %prog [options]
"""

    parser = optparse.OptionParser(usage)

    help = "The port to listen on. Default to a random available port."
    parser.add_option('--port', type='int', help=help)

    help = "The interface to listen on. Default is localhost."
    parser.add_option('--iface', help=help, default='localhost')

    options =parser.parse_args()

    return options#, log_file

class LogProtocol(Protocol):
    def connectionMade(self):
        for line in self.factory.log:
            self.transport.write(line)

class LogFactory(ServerFactory):
    protocol = LogProtocol

    def __init__(self,log):
        self.log = log

def main():
    log = sys.stdin.readline()
    options, log_file = parse_args()

    factory = LogFactory(log)

    from twisted.internet import reactor

    port = reactor.listenTCP(options.port or 0, factory,
                             interface=options.iface)

    print 'Serving %s on %s.' % (log_file, port.getHost())

    reactor.run()


if __name__ == '__main__':
    main()

Чтобы ответить на первый комментарий, я также попытался просто прочитать лог из Python, программа зависла. Code follows:

#! /usr/bin/python

import optparse, os, sys, time
from twisted.internet.protocol import ServerFactory, Protocol

def parse_args():
    usage = """ usage: %prog [options]"""

    parser = optparse.OptionParser(usage)

    help = "The port to listen on. Default to a random available port"
    parser.add_option('--port', type='int', help=help, dest="port")

    help = "The logfile to tail and write"
    parser.add_option('--file', help=help, default='log/testgen01.log',dest="logfile")

    options = parser.parse_args()
    return options

class LogProtocol(Protocol):
    def connectionMade(self):
        for line in self.follow():
            self.transport.write(line)
        self.transport.loseConnection()

    def follow(self):
        while True:
            line = self.factory.log.readline()
            if not line:
                time.sleep(0.1)
                continue
            yield line

class LogFactory(ServerFactory):
    protocol = LogProtocol

    def __init__(self,log):
        self.log = log

def main():
    options, log_file = parse_args()
    log = open(options.logfile)
    factory = LogFactory(log)

    from twisted.internet import reactor

    port = reactor.listenTCP(options.port or 0, factory)    #,interface=options.iface)

    print 'Serving %s on %s.' % (options.logfile, port.getHost())

    reactor.run()


if __name__ == '__main__':
    main()
9
задан jsucsy 16 November 2011 в 21:46
поделиться