A ver, me explicaré bien. Tengo montado un servidor web, que se comunica con varios pcs de una red mediante mensajes xmlrpc, estos mensajes los recibe un pc que interpreta estas ordenes con python, hace la tarea que se manda y devuelve el resultado al servidor web. Con ordenes en las que no hay que dejar un proceso abierto funciona muy bien, pero cuando tengo que dejar un proceso abierto, como es el caso de la captura, es cuando falla, porque el servidor tiene que recibir la respuesta para seguir funcionando.
En estos casos hago el
popen y después mando al servidor web un mensaje diciendo que la tarea se ha iniciado, para desbloquearlo. El problema viene a la hora de cerrar el proceso al cabo de un tiempo.
Las peticiones del servidor web se reciben aquí, también se mandan las respuestas
Código PHP:
def captura(self, accion, usuario):
"""
Hace una captura de trafico
self es la parámetro de la orden
"""
if accion == 'Iniciar':
nombre = str(usuario)
comando = 'tcpdump -i eth0 -w /.../%s.txt &' %(nombre)
salida, salidaerr = commonfunc.captura(comando)
return salida, salidaerr
else:
salida, salidaerr, ficheroxml = commonfunc.captura2(usuario)
return salida, salidaerr, ficheroxml
Las funciones (commonfunc) son estas
Código PHP:
def captura(comando):
#CAPTURA está inicializado a cero
global CAPTURA
salida = []
salidaerr = []
try:
if CAPTURA == 0:
sp = subprocess
CAPTURA = subprocess.Popen(comando, stdout=sp.PIPE, stderr=sp.PIPE, shell=True)
resultado = str('Captura Iniciada')
else:
resultado = str('Hay una captura iniciada')
salida.append(resultado)
except Exception, why:
salidaerr = [str(Exception), str(why)]
return salida, salidaerr
def captura2(nombre):
global CAPTURA
salida = []
salidaerr = []
ficheroxml = []
try:
if CAPTURA != 0:
CAPTURA.kill()
CAPTURA = 0
nombre = str(nombre)
#codificar el fichero de la captura para mandarlo con xmlrpc
fichero = '/.../%s.txt' %(nombre)
fich = open(fichero,'r')
ficheroxml.append(base64.b64encode(fich.read()))
fich.close()
resultado = str('Captura Finalizada')
else:
resultado = str('No hay captura iniciada')
salida.append(resultado)
except Exception, why:
salidaerr = [str(Exception), str(why)]
return salida, salidaerr, ficheroxml
Espero que así quede más claro y podáis ayudarme.
Saludos y gracias