server: starting/stopping clients works.
authorAdriana Draghici <adriana008@gmail.com>
Fri, 5 Mar 2010 08:49:58 +0000 (10:49 +0200)
committerAdriana Draghici <adriana008@gmail.com>
Fri, 5 Mar 2010 08:49:58 +0000 (10:49 +0200)
bt_comm/server/Client.py
bt_comm/server/Server_NO_DAEMON.py
scripts/start-clients/BitTorrentClientRun.py

index 939d6f2..11a2560 100644 (file)
@@ -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()
index 8375649..2b33020 100644 (file)
@@ -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()      
index bb96196..56f494c 100644 (file)
@@ -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())