似たような質問があることは知っていますが、この具体的な例に問題があり、良い答えが見つかりません。これらの行に沿って、dar のリモート バックアップ サーバーをセットアップしようとしています。subprocess.Popenでnetcatを呼び出すことでこれを行うことについて別の質問をしましたが、可能であればソケットをセットアップし、すべてのパイピングをPythonで行うことをお勧めします。いくつかのギグが転送されるため、最初にすべての入力を読み取ってから渡すことはできません。
問題は、サーバーがデータを読み取っていないように見えることです。
現時点では、次のコードがあります。
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()
クライアントを実行すると、サーバー側から次の出力が得られます。
聞いている ハンドラーに入る 得た:xform 新しいソケットを 0.0.0.0:41658 にバインド 127.0.0.1:42440 からの接続を受け入れました
それからそれはただそこに座っています。その間、クライアントでdar
実行され、クライアントはサーバーからの応答を待ってスタックします。
サーバーにつなげる 接続、リクエストの送信 応答待ち 得た: 41300 dar_xform ポートに接続 -------------------------------------------- 53 個の inode が保存されました 0 個のハード リンクが記録されている バックアップ時に 0 個の inode が変更されました 0 個の inode が保存されていません (inode/ファイルの変更なし) 0 個の inode を保存できませんでした (ファイルシステム エラー) 1 個の inode が無視されました (フィルターによって除外されました) 参照バックアップから削除されたと記録された 0 個の inode -------------------------------------------- 考慮される inode の総数: 54 -------------------------------------------- EA は 0 inode 用に保存されました -------------------------------------------- dar は 0 を返しました