python pijp subproces i/o over socket

Ik weet dat er vergelijkbare vragen zijn, maar ik heb problemen met dit concrete voorbeeld en heb geen goed antwoord gevonden. Ik probeer een externe backupserver op te zetten voor dar, langs deze lijnen . Ik heb een aparte vraag gevraagd over het doen van dit door netcat met subproces aan te roepen.Popen, maar ik zou de voorkeur geven aan het instellen van de sockets en doe alle leidingen met python indien mogelijk. Er zullen verschillende optredens worden overgedragen, dus ik kan niet alleen alle invoer eerst lezen en vervolgens doorgeven.

Het probleem is dat de server de gegevens niet lijkt te lezen.

Op dit moment heb ik de volgende code:

from socket import socket, AF_INET, SOCK_STREAM
import sys
import SocketServer
import subprocess

class DarHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        print('entering handler')
        data = self.request.recv(1024).strip()
        print('got: ' + data)
        if data == 'xform':
            s = socket(AF_INET, SOCK_STREAM)
            s.bind(('',0))
            myaddr, myport = s.getsockname()
            print('bound new socket to {0}:{1}'.format(myaddr, myport))
            self.request.send(str(myport))
            s.listen(1)
            conn, remoteaddr = s.accept()
            print('accepted connection from {0}:{1}'.format(*remoteaddr))
            xform_input = conn.makefile('rb',0)
            proc = subprocess.Popen(
                ['/usr/bin/dar_xform', '-s', '10k', '-', 'archives/sockbackup',],
                 stdin=xform_input
            )
            return_code = proc.wait()
            print('dar_xform returned {0}'.format(return_code))
            conn.close()
            self.request.send(str(return_code))
        else:
            self.request.send('bad request')
        print('send result, exiting handler')

server_address = ('localhost', 18010)
def server():
    server = SocketServer.TCPServer(server_address, DarHandler)
    print('listening')
    server.serve_forever()

def client():
    sock = socket(AF_INET, SOCK_STREAM)
    print('connecting to server')
    sock.connect(('localhost', 18010))
    print('connected, sending request')
    sock.send('xform')
    print('waiting for response')
    port = sock.recv(1024)
    print('got: ' + port)
    s = socket(AF_INET, SOCK_STREAM)
    s.connect(('localhost', int(port)))
    print('connected to dar_xform port')
    dar_output = s.makefile('wb',0)
    return_code = subprocess.call(
          ['/usr/bin/dar', '-B', 'config/test.dcf', '-c', '-',], 
          stdout=dar_output
    )
    print('dar returned {0}'.format(return_code))
    s.close()
    result = sock.recv(1024)
    print('received: ' + result)
    sock.close()
    print('socket closed, exiting')

if __name__ == "__main__":
    if sys.argv[1].startswith('serv'):
        server()
    else:
        client()

Ik krijg de volgende uitvoer van de serverzijde wanneer ik de client start:

listening
entering handler
got: xform
bound new socket to 0.0.0.0:41658
accepted connection from 127.0.0.1:42440

Dan zit het daar gewoon. Ondertussen wordt dar uitgevoerd op de client en wacht de client op een reactie van de server:

connecting to server
connected, sending request
waiting for response
got: 41300
connected to dar_xform port


 --------------------------------------------
 53 inode(s) saved
 with 0 hard link(s) recorded
 0 inode(s) changed at the moment of the backup
 0 inode(s) not saved (no inode/file change)
 0 inode(s) failed to save (filesystem error)
 1 inode(s) ignored (excluded by filters)
 0 inode(s) recorded as deleted from reference backup
 --------------------------------------------
 Total number of inodes considered: 54
 --------------------------------------------
 EA saved for 0 inode(s)
 --------------------------------------------
dar returned 0
1

1 antwoord

Het lijkt erop dat de opdracht dar_xform op de server niet werkt ...

Probeer een volledig pad naar de dar_xform -opdracht naar subproces. Open (...) en kijk of er nog steeds een probleem is. Wat je hebt beschreven lijkt verdacht veel op een PATH -probleem, vooral omdat het werkt bij de shell-prompt.

0
toegevoegd
Dit is waarschijnlijk een dwaze vraag, maar weet je zeker dat dar_xform zich in /usr/bin bevindt?
toegevoegd de auteur larsks, de bron
Ik ben blij dat je het hebt laten werken.
toegevoegd de auteur larsks, de bron
Goede gedachte, maar het lukt nog steeds niet. Ik heb de vraag bewerkt om ze op te nemen.
toegevoegd de auteur Aryeh Leib Taurog, de bron
Ja. Het directe probleem was een ontbrekende komma, die ik opving door shell = Waar aan Popen toe te voegen. Ik zag dat het '/ usr/bin/dar_xform-s' zocht dat het kreeg door de twee strings samen te voegen. 13 paar ogen misten die. Ik heb de vraag bijgewerkt.
toegevoegd de auteur Aryeh Leib Taurog, de bron
Ik accepteer je antwoord omdat je de fout correct hebt gediagnosticeerd. De rest van de vraag is eigenlijk identiek aan mijn andere vraag over dit onderwerp .
toegevoegd de auteur Aryeh Leib Taurog, de bron