--- powerpc-utils-python-1.2.1/scripts/amsvis/powerpcAMS/amsnet.py 2009-10-22 15:02:15.000000000 -0400 +++ powerpc-utils-python-1.2.1/scripts/amsvis/powerpcAMS/amsnet.py 2016-08-23 17:15:30.664728804 -0400 @@ -1,4 +1,4 @@ -"""Network client/server for transmitting pickled data. +"""Network client/server for transmitting json data. """ __author__ = "Robert Jennings rcj@linux.vnet.ibm.com" @@ -14,7 +14,7 @@ import sys import os import types import logging -import cPickle as pickle +import json from optparse import OptionParser from powerpcAMS.amsdata import * @@ -30,8 +30,22 @@ data_methods = (gather_all_data, gather_ # backwards compatibility is broken. cmdvers = 1.0000000 +def send_json_message(socket, message): + json_message = json.dumps(message) + socket.send("%d\n" % len(json_message)) + socket.sendall(json_message) + +def receive_json_message(socket): + len_str = '' + while True: + c = socket.recv(1) + if c == '\n': break + len_str += c + mesg_len = int(len_str) + return json.loads(socket.recv(mesg_len)) + def send_data_loop(port): - """Send pickled data to any client that connects to a given network port. + """Send json data to any client that connects to a given network port. Keyword arguments: port -- network port number to use for this server @@ -46,7 +60,6 @@ def send_data_loop(port): logging.error("Network error: (%d) " % errno + errstr) return 1 - sockfile = None conn = None try: @@ -54,7 +67,6 @@ def send_data_loop(port): sock.listen(1) (conn, addr) = sock.accept() logging.debug("Client connected from " + repr(addr)) - sockfile = conn.makefile('rwb',0) result = "success" data = None @@ -64,7 +76,7 @@ def send_data_loop(port): # request data version we can change what the server will # send in the future. try: - client_data = pickle.Unpickler(sockfile).load() + client_data = receive_json_message(conn) except: logging.debug("Unable to parse client request.") logging.info("Bad client request, ignoring.") @@ -93,7 +105,7 @@ def send_data_loop(port): if result is not "error": data_method = data_methods[client_data["command"]] - # Gather system data and send pickled objects to the client + # Gather system data and send json objects to the client data = data_method() if data is None: result = "error" @@ -101,19 +113,15 @@ def send_data_loop(port): logging.debug("Sending %d data objects to client." % len(data)) response = {"result":result, "data":data} - sockfile.writelines(pickle.dumps(response, -1)) + send_json_message(conn, response) # Clean up - sockfile.close() - sockfile = None conn.close() conn = None # Catch a keyboard interrupt by cleaning up the socket except KeyboardInterrupt: - if sockfile: - sockfile.close() if conn: conn.close() sock.close() @@ -122,8 +130,6 @@ def send_data_loop(port): # Catch a network error and clean up, return 1 to indicate an error except socket.error, msg: - if sockfile: - sockfile.close() if conn: conn.close() sock.close() @@ -133,8 +139,6 @@ def send_data_loop(port): # Give the user something slightly helpful for any other error except: - if sockfile: - sockfile.close() if conn: conn.close() sock.close() @@ -143,7 +147,7 @@ def send_data_loop(port): # Client def net_get_data(host="localhost", port=50000, cmd=cmd_GET_ALL_DATA): - """Get pickled data from a simple network server. + """Get json data from a simple network server. Keywork arguments: host -- server host name (default localhost) @@ -163,8 +167,6 @@ def net_get_data(host="localhost", port= logging.error("Network error: (%d) " % errno + errstr) return {"result":"error","data":"Client: Is the server still running?"} - sockfile = sock.makefile('rwb',0) # read/write, unbuffered - # By sending a request to the server, including a version for the data # request, we can change the data sent by the server in the future. if type(cmd) is types.IntType and cmd >= 0 and cmd <= cmd_MAX: @@ -177,15 +179,13 @@ def net_get_data(host="localhost", port= print repr(cmd) return {"result":"error","data":"Client: Bad request."} - sockfile.writelines(pickle.dumps(client_request, -1)) + send_json_message(sock, client_request) # Get server response - pickler = pickle.Unpickler(sockfile) try: - data = pickler.load() + data = receive_json_message(sock) except EOFError: pass - sockfile.close() sock.close() if type(data) is not types.DictType or "result" not in data: