Objetivo: Mostrar datos del servidor en wxPython GUI en el clientetail-f iniciar sesión en el servidor, los datos de proceso, a continuación, sirven para el cliente a través de retorcidos
Newcomer en Twisted. Tengo una GUI de wxPython ejecutándose en un cliente de Windows 7, y tengo un programa ejecutándose en un servidor de Ubuntu que produce un registro. Mi intento actual es rastrear el registro, canalizar la salida a un servidor trenzado, y luego entregar al cliente cualquier dato que cumpla con mis condiciones regex. Ya tengo un túnel abierto, así que no necesito complicar las cosas con SSH. Obtuve el siguiente bloque de código en ejecución, pero solo sirve la primera línea en la entrada. Sé que necesito seguir revisando la entrada de una nueva línea y luego escribirla en el transporte, pero no estoy seguro de cómo hacerlo sin romper la conexión.
No he podido encontrar suficiente información para parchar una solución completa. También he intentado varios otros métodos usando sockets y archivos IO, pero creo que Twisted parece ser una buena herramienta para este problema. ¿Estoy en el camino correcto? Cualquier recomendación apreciada. Gracias
#! /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()
Para responder a la primera observación, también he tratado de simplemente leer el registro desde Python, el programa se cuelga. El código es el siguiente:
#! /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()
¿Ha considerado leer el registro desde dentro de python, en lugar de conectar el resultado de 'tail'? – Velociraptors
He intentado resolver esto también usando un generador, el programa se cuelga. Me parece que el transporte y el generador están esperando que el otro termine. Código mostrado arriba. ¿Hay una mejor manera de hacer esto que usar un generador? – jsucsy