From 259a94a9b7b31db3bcec01d895c68fd7f8003ba3 Mon Sep 17 00:00:00 2001 From: Adriana Draghici Date: Fri, 5 Mar 2010 10:49:58 +0200 Subject: [PATCH] server: starting/stopping clients works. --- bt_comm/server/Client.py | 138 +++++++------- bt_comm/server/Server_NO_DAEMON.py | 182 ++++++++++--------- scripts/start-clients/BitTorrentClientRun.py | 21 ++- 3 files changed, 185 insertions(+), 156 deletions(-) diff --git a/bt_comm/server/Client.py b/bt_comm/server/Client.py index 939d6f2..11a2560 100644 --- a/bt_comm/server/Client.py +++ b/bt_comm/server/Client.py @@ -5,81 +5,83 @@ MSGLEN = 1024 HOST = "127.0.0.1" PORT = 10005 class MySocket: - def __init__(self, sock=None): - if sock is None: - self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - else: - self.sock = sock + def __init__(self, sock=None): + if sock is None: + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + else: + self.sock = sock - def connect(self, host, port): - self.sock.connect((host, port)) - print "connected to %s %s"%(host, port) + def connect(self, host, port): + self.sock.connect((host, port)) + print "connected to %s %s"%(host, port) - def send_msg(self, msg): - totalsent = 0 - while totalsent < len(msg): - sent = self.sock.send(msg[totalsent:]) - if sent == 0: - raise RuntimeError, "socket connection broken" - totalsent = totalsent + sent - - def send_command(self, msg_type, config_data): - self.send_msg(msg_type) - response = self.recv_msg() - if response == ACK_MSG: - print "aici" - - self.send_dict(config_data) - print "am trimis" - response = self.recv_msg() - - return response + def send_msg(self, msg): + totalsent = 0 + while totalsent < len(msg): + sent = self.sock.send(msg[totalsent:]) + if sent == 0: + raise RuntimeError, "socket connection broken" + totalsent = totalsent + sent - def recv_msg(self): - msg = '' - chunk = self.sock.recv(MSGLEN) - if chunk == '': - raise RuntimeError, "socket connection broken" - msg = msg + chunk - print msg - return msg + def send_command(self, msg_type, config_data): + self.send_msg(msg_type) + print "am trimis ", msg_type + response = self.recv_msg() + if response == ACK_MSG: + self.send_dict(config_data) + print "am trimis" + response = self.recv_msg() - # send a pickled dictionary - def send_dict(self, data): - dumped_data = pickle.dumps(data) - self.send_msg(dumped_data) + return response -if __name__ == "__main__": + def recv_msg(self): + msg = '' + chunk = self.sock.recv(MSGLEN) + if chunk == '': + raise RuntimeError, "socket connection broken" + msg = msg + chunk + print "am primit ", msg + return msg + + # send a pickled dictionary + def send_dict(self, data): + dumped_data = pickle.dumps(data) + self.send_msg(dumped_data) + +# basic test that starts and stops a BT Client +def test_all_commands(): + s = MySocket() + s.connect(HOST, PORT) + start_data = {CLIENT: TRANSMISSION, PORT:10150, + TORRENT: "/home/adriana/p2p/p2p-meta/scrubs.torrent", + DL_DIR: "/home/adriana/p2p/p2p-dld/transmission", + LOG_DIR: "/home/adriana/p2p/p2p-log/transmission", + OUT_FILE: "scrubs.out", + LOG_FILE: "transmission-scrubs.log", - s = MySocket() - s.connect(HOST, PORT) - # test 1 - #s.send_msg("hello") - # test 2 - #dd = {'a':1, 'b':2} - #s.send_dict(dd) - #s.recv_msg() + } + response = s.send_command(START_MSG, start_data) + print response + pid = (response.split(" "))[1] + print pid + #pid = 8065 + s = MySocket() + s.connect(HOST, PORT) - # test config - """config_data = [{CLIENT:"tribler", FILE:"Tribler/Tools/cmdline.py", - RUN_TYPE:"script", - INTERPRETER:"python", PREFIX:"PYTHONPATH=.",SUFFIX:"", - UP_LIMIT_OPTION:"",DL_LIMIT_OPTION:"", PORT_OPTION:"-p", - LOG_DIR_OPTION:"-l",DL_DIR_OPTION:"-d"}] -""" + response = s.send_command(STOP_MSG, pid) + print response - start_data = {CLIENT: TRANSMISSION, PORT:10150, - TORRENT: "/home/adriana/p2p/p2p-meta/scrubs.torrent", - DL_DIR: "/home/adriana/p2p/p2p-dld/transmission", - LOG_DIR: "/home/adriana/p2p/p2p-log/transmission", - OUT_FILE: "scrubs.out", - LOG_FILE: "transmission-scrubs.log", +def test_send_recv(): + # test 1 - } - response = s.send_command(START_MSG, start_data) + s.send_msg("hello") + # test 2 + dd = {'a':1, 'b':2} + s.send_dict(dd) + s.recv_msg() + + +if __name__ == "__main__": - - print response - pid = (response.split())[1] - print "pid = ", pid - response = s.send_command(STOP_MSG, response) + + test_all_commands() diff --git a/bt_comm/server/Server_NO_DAEMON.py b/bt_comm/server/Server_NO_DAEMON.py index 8375649..2b33020 100644 --- a/bt_comm/server/Server_NO_DAEMON.py +++ b/bt_comm/server/Server_NO_DAEMON.py @@ -2,6 +2,7 @@ import sys, os, socket import pickle +import signal from daemon import Daemon from Util import * from BitTorrentClientRun import * @@ -20,106 +21,115 @@ WAITING_STATUS_DATA = 5 def recv_pickled_data(clientsock): -# while chunk: -# chunk = clientsock.recv(BUFFER_SIZE) -# data += chunk - data = clientsock.recv(BUFFER_SIZE) - - dd = pickle.loads(data) - return dd + # while chunk: + # chunk = clientsock.recv(BUFFER_SIZE) + # data += chunk + data = clientsock.recv(BUFFER_SIZE) + dd = pickle.loads(data) + return dd #TODO def start_bt_client(bt_client_data): - if bt_client_data[CLIENT] == TRANSMISSION: - btcr = BitTorrentClientRun("/usr/bin/transmissioncli", - "$base_path --download-dir $download_dir --port $port $torrent_file > $output_dir/$output_file", - "TR_DEBUG=2 $base_path/cli/transmissioncli --download-dir $download_dir --port $port $torrent_file 2> $log_dir/$log_file > $output_dir/$output_file") - btcr.config_run(bt_client_data[DL_DIR], bt_client_data[LOG_DIR], - bt_client_data[OUT_FILE], bt_client_data[LOG_DIR], - bt_client_data[LOG_FILE], bt_client_data[PORT], - bt_client_data[TORRENT]) - - btcr.start() - pid = btcr.run_client(btcr.simple_run_command) - return pid - - return -1 - """Simple test - - btcr = BitTorrentClientRun("/usr/bin/transmissioncli", - "$base_path --download-dir $download_dir --port $port $torrent_file > $output_dir/$output_file", - "TR_DEBUG=2 $base_path/cli/transmissioncli --download-dir $download_dir --port $port $torrent_file 2> $log_dir/$log_file > $output_dir/$output_file") + if bt_client_data[CLIENT] == TRANSMISSION: + """btcr = BitTorrentClientRun("/usr/bin/transmissioncli", + "$base_path --port $port $torrent_file $download_dir> $output_dir/$output_file", + "TR_DEBUG=2 $base_path/cli/transmissioncli --port $port $torrent_file $download_dir 2> $log_dir/$log_file > $output_dir/$output_file")""" - btcr.config_run("/home/adriana/p2p/p2p-dld/transmission", - "/home/adriana/p2p/p2p-log/transmission", - "scrubs.out", "/home/adriana/p2p/", - "transmission-scrubs.log", 10150, - "/home/adriana/p2p/p2p-meta/scrubs.torrent") + btcr = BitTorrentClientRun("/usr/bin/transmissioncli", + "$base_path --port $port $torrent_file $download_dir", + "TR_DEBUG=2 $base_path/cli/transmissioncli --port $port $torrent_file $download_dir 2> $log_dir/$log_file > $output_dir/$output_file") - btcr.start() - btcr.run_client(btcr.simple_run_command) - """ + btcr.config_run(bt_client_data[DL_DIR], bt_client_data[LOG_DIR], + bt_client_data[OUT_FILE], bt_client_data[LOG_DIR], + bt_client_data[LOG_FILE], bt_client_data[PORT], + bt_client_data[TORRENT]) + + btcr.start() + pid = btcr.run_client(btcr.simple_run_command) + #stop_bt_client(pid) + return pid + return -1 + """Simple test + + btcr = BitTorrentClientRun("/usr/bin/transmissioncli", + "$base_path --download-dir $download_dir --port $port $torrent_file > $output_dir/$output_file", + "TR_DEBUG=2 $base_path/cli/transmissioncli --download-dir $download_dir --port $port $torrent_file 2> $log_dir/$log_file > $output_dir/$output_file") + + btcr.config_run("/home/adriana/p2p/p2p-dld/transmission", + "/home/adriana/p2p/p2p-log/transmission", + "scrubs.out", "/home/adriana/p2p/", + "transmission-scrubs.log", 10150, + "/home/adriana/p2p/p2p-meta/scrubs.torrent") + + btcr.start() + btcr.run_client(btcr.simple_run_command) + """ def stop_bt_client(pid): - os.kill(pid, signal.SIGKILL) # kill generates zombies + print "la kill pid=", pid + + os.kill(int(pid), signal.SIGKILL) # kill generates zombies os.wait() print "killed ", pid def doServer(): - serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - print HOST - print PORT - serversocket.bind((HOST, PORT)); - serversocket.listen(10) #max 10 requests - - while(1): - print "inainte de accept" - (clientsock, address) = serversocket.accept(); - print "aici" - if clientsock not in states: - states[clientsock] = WAITING_MSG_TYPE; - - if states[clientsock] == WAITING_MSG_TYPE: - print states[clientsock] - msg = clientsock.recv(BUFFER_SIZE) - - msg_types = { - START_MSG: WAITING_START_DATA, - STOP_MSG: WAITING_STOP_DATA, - STATUS_MSG: WAITING_STATUS_DATA - } - if msg not in msg_types: - clientsock.send(ERROR_MSG +"wrong message type " + msg) - else: - states[clientsock] = msg_types[msg] - clientsock.send(ACK_MSG) - #else: - print states[clientsock] - - if states[clientsock] == WAITING_START_DATA: - bt_client_data = recv_pickled_data(clientsock) - client_pid = start_bt_client(bt_client_data) - clientsock.send(ACK_MSG +" "+ str(client_pid)) - - elif states[clientsock] == WAITING_STOP_DATA: - client_pid = recv_pickled_data(clientsock) - stop_bt_client(client_pid) - clientsock.send(ACK_MSG) - - elif states[clientsock] == WAITING_STATUS_DATA: - config = recv_pickled_data(clientsock) - clientsock.send(ACK_MSG) - - states[clientsock] = WAITING_MSG_TYPE - - # clientsock.recv(BUFFER_SIZE) - # recv_pickled_data(clientsock) - - clientsock.close() + serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + print HOST + print PORT + serversocket.bind((HOST, PORT)); + serversocket.listen(10) #max 10 requests + clientsocks = [] + while(1): + print >> sys.stderr, "inainte de accept" + (clientsock, address) = serversocket.accept(); + print >>sys.stderr, "aici" + if clientsock not in states: + states[clientsock] = WAITING_MSG_TYPE; + + if states[clientsock] == WAITING_MSG_TYPE: + print states[clientsock] + msg = clientsock.recv(BUFFER_SIZE) + print >>sys.stderr, "Server: Received:\n", msg + print >>sys.stderr, "******** END MESSAGE ********" + msg_types = { + START_MSG: WAITING_START_DATA, + STOP_MSG: WAITING_STOP_DATA, + STATUS_MSG: WAITING_STATUS_DATA + } + if msg not in msg_types: + clientsock.send(ERROR_MSG +"wrong message type " + msg) + else: + states[clientsock] = msg_types[msg] + clientsock.send(ACK_MSG) + #else: + print states[clientsock] + + if states[clientsock] == WAITING_START_DATA: + bt_client_data = recv_pickled_data(clientsock) + client_pid = start_bt_client(bt_client_data) + clientsock.send(ACK_MSG +" "+ str(client_pid)) + + elif states[clientsock] == WAITING_STOP_DATA: + print >>sys.stderr,"la WAITING_STOP_DATA" + client_pid = recv_pickled_data(clientsock) + stop_bt_client(client_pid) + clientsock.send(ACK_MSG) + + elif states[clientsock] == WAITING_STATUS_DATA: + config = recv_pickled_data(clientsock) + clientsock.send(ACK_MSG) + + states[clientsock] = WAITING_MSG_TYPE + + # clientsock.recv(BUFFER_SIZE) + # recv_pickled_data(clientsock) + clientsock.close() + #clientsocks.append(clientsock) + #for i in range(0, len(clientsocks)): + # clientsocks[i].close() if __name__ == "__main__": doServer() diff --git a/scripts/start-clients/BitTorrentClientRun.py b/scripts/start-clients/BitTorrentClientRun.py index bb96196..56f494c 100644 --- a/scripts/start-clients/BitTorrentClientRun.py +++ b/scripts/start-clients/BitTorrentClientRun.py @@ -6,7 +6,10 @@ """ import sys +import os import os.path +import subprocess +import shlex from string import Template DEBUG = False @@ -53,13 +56,24 @@ class BitTorrentClientRun: print self.simple_run_command print self.logging_run_command - + + def run_client(self, command): + # os.system(command) + #split command + args = shlex.split(command) + print args + p=subprocess.Popen(args, shell=False, stdout=subprocess.PIPE) #does not create sh process + pid = p.pid + print "pid =", pid + return pid + + # todo citit din stdout si pun in output_dir/output_file. le voi primi ca ragumente la functia de run_client + #output, errors = p.communicate() def main(): """ Test case - """ btcr = BitTorrentClientRun("/home/p2p/p2p-clients/transmission", "$base_path/cli/transmissioncli --download-dir $download_dir --port $port $torrent_file > $output_dir/$output_file", @@ -67,6 +81,9 @@ def main(): btcr.config_run("/home/p2p/p2p-dld/transmission", "/home/p2p/p2p-log/transmission", "transmission-fedora.out", "/home/p2p/p2p-log/transmission", "transmission-fedora.log", 10150, "/home/p2p/p2p-meta/fedora.torrent") btcr.start() + + """ + if __name__ == "__main__": sys.exit(main()) -- 2.20.1