This module is used for interprocess communication (IPC) for processes in difference namespaces. I designed and wrote this module because existing IPC libraries are not suitable for inter-namespaces communication.
Currently, I have implemented a JSON-RPC interface.
sudo pip install procslinkimportosfromprocslinkimportRPCPeerclassMyAPI(object):
defhello(self, name):
s="Hello, %s!"%nameprint(s)
returnsrpc_server=RPCPeer()
print("Server's nl_pid is %s."%rpc_server.nl_pid)
rpc_server.register_functions_in_object(MyAPI())
rpc_server.run_server_forever()fromprocslinkimportRPCPeer# server_nl_pid is server's nl_pidrpc_client=RPCPeer()
rpc_client.talk_to(server_nl_pid).hello("Rayson Zhu")# suppose data is a raw Netlink message bytesnetlink_message=NetlinkMessage.from_bytes(data)
procslink_message=ProcslinkMessage.from_bytes(netlink_message.payload)
jsonrpc_request=JSONRPCRequest.from_bytes(procslink_message.payload)jsonrpc_response=JSONRPCResponse(id=123, result=True)
procslink_header=ProcslinkMessageHeader(
payload_type=ProcslinkMessageHeader.PAYLOAD_TYPE_JSONRPC2_RESPONSE)
procslink_message=ProcslinkMessage(procslink_header,
jsonrpc_response.to_bytes()))
netlink_header=NetlinkMessageHeader(nlmsg_pid=sender_nl_pid)
netlink_message=NetlinkMessage(netlink_header,
procslink_message.to_bytes())
data=netlink_message.to_bytes()Messages are delivered over Netlink(7). Before reading this document, you should read the above link first.
ProcsLink uses the following message format:
+-----------------------+
| nlmsghdr |
+-----------------------+
| procslinkhdr |
+-----------------------+
| JSON-RPC message |
+-----------------------+
Where
nlmsghdris the raw Netlink header.procslinkhdris our own defined header for extension (because we may run different protocolsother than JSON-RPC in the future),JSON-RPC messageis the JSON-RPC request/response body encoded in UTF-8. JSON-RPC 2.0 is used.
Following is the defination of struct procslinkhdr:
/* connectorhdr (8 bytes) */structprocslinkhdr {
uint16_tversion; /* version number, default: 1 */uint16_tflag; /* reserved */uint32_tlength; /* message length including this header */uint16_tpayload_type; /* payload_type message type ID */uint16_treserved; /* reserved */uint32_tseq; /* sequence number */uint64_ttimestamp; /* when this message is sent */
};- python-future: to be compatible with both Python 2 and 3
+ procslink
- __init__.py
- common.py
- jsonrpc.py
- netlink.py
- procslink.py
Where
__init__.pydefines the JSON-RPC server/client:RPCPeer.common.pydefines the base class for message headers and messages.netlink.pydefinesNetlinkMessageHeaderandNetlinkMessage, which are abstraction for Netlink header and whole netlink meesages.procslink.pydefines message data structures for the Procslink message layer.jsonrpc.pydefines models for JSON-RPC 2.0 request object, response object, and error object, etc.