1) fixed "main function": mechanism for running this script as a stand-alone program...
authoritraviv <[email protected]>
Wed, 10 Aug 2016 12:12:58 +0000 (15:12 +0300)
committeritraviv <[email protected]>
Wed, 10 Aug 2016 12:12:58 +0000 (15:12 +0300)
2) added closure of sockets and context explicitly (counting  on python garbage-collector caused errors)

3) added support for 'remote shutdown' feature. now the server can be shut-down using 'shut_down' method as RPC from client

scripts/automation/trex_control_plane/stl/services/scapy_server/scapy_zmq_server.py

index f494d1d..659a7f6 100755 (executable)
@@ -36,6 +36,8 @@ class Scapy_wrapper:
                     req_id = req['id']\r
                 raise InvalidRequest(req_id)\r
             req_id = req['id']\r
+            if (req['method']=='shut_down'):\r
+                return 'shut_down',[],req_id\r
             if not (self.scapy_master.supported_methods(req['method'])):\r
                 raise MethodNotFound(req_id)\r
             scapy_method = eval("self.scapy_master."+req['method'])\r
@@ -94,14 +96,24 @@ class Scapy_wrapper:
         finally:\r
             return response\r
 \r
+#arg1 is port number for the server to listen to\r
+def main(arg1=4507):\r
+    s = Scapy_server(arg1)\r
+    s.activate()\r
+\r
+if __name__=='__main__':\r
+    if len(sys.argv)>1:\r
+        parser = ArgumentParser(description=' Runs Scapy Server ')\r
+        parser.add_argument('-s','--scapy-port',type=int, default = 4507, dest='scapy_port',\r
+                            help='Select port to which Scapy Server will listen to.\n default is 4507\n',action='store')\r
+        args = parser.parse_args()\r
+        port = args.scapy_port\r
+        sys.exit(main(port))\r
+    else:\r
+        sys.exit(main())\r
 \r
 \r
-parser = ArgumentParser(description=' Runs Scapy Server ')\r
-parser.add_argument('-s','--scapy-port',type=int, default = 4507, dest='scapy_port',\r
-                    help='Select port to which Scapy Server will listen to.\n default is 4507\n',action='store')\r
-args = parser.parse_args()\r
 \r
-port = args.scapy_port\r
 \r
 class Scapy_server():\r
     def __init__(self, port=4507):\r
@@ -120,7 +132,11 @@ class Scapy_server():
                 message = self.socket.recv()\r
                 try:\r
                     method,params,req_id = self.scapy_wrapper.parse_req_msg(message)\r
-                    result = self.scapy_wrapper.execute(method,params)\r
+                    if (method == 'shut_down'):\r
+                        print 'Shut down by remote user'\r
+                        result = 'Server shut down command received - server has shut down'\r
+                    else:\r
+                        result = self.scapy_wrapper.execute(method,params)\r
                     response = self.scapy_wrapper.create_success_response(result,req_id)\r
                 except Exception as e:\r
                     exception_details = self.scapy_wrapper.get_exception()\r
@@ -129,20 +145,16 @@ class Scapy_server():
                     json_response = json.dumps(response)\r
                 #  Send reply back to client\r
                     self.socket.send(json_response)\r
+                    if (method =='shut_down'):\r
+                        break\r
+\r
         except KeyboardInterrupt:\r
                 print('Terminated By Ctrl+C')\r
 \r
+        finally:\r
+            self.socket.close()\r
+            self.context.destroy()\r
+\r
 \r
-#s = Scapy_server(port)\r
-#s.activate()\r
 \r
-#arg1 is port number for the server to listen to\r
-def main(arg1=4507):\r
-    s = Scapy_server(arg1)\r
-    s.activate()\r
 \r
-if __name__=='__main__':\r
-    if len(sys.argv)>1:\r
-        sys.exit(main(int(sys.argv[2])))\r
-    else:\r
-        sys.exit(main())\r