-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdatastore.py
61 lines (49 loc) · 2.14 KB
/
datastore.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env python2
import sys
import struct
from collections import defaultdict
from scapy.all import sniff, sendp, hexdump, get_if_list, get_if_hwaddr, bind_layers, split_layers
from scapy.all import Packet
from scapy.all import IP, UDP, Raw, Ether
from scapy.fields import *
from headers import *
iface = get_if()
memory = defaultdict(lambda: defaultdict(int))
def send_reply(pkt):
pkt[IP].dst = pkt[IP].src
pkt[IP].src = DATASTORE_IP
pkt[Ether].dst = pkt[Ether].src
pkt[Ether].src = DATASTORE_MAC
sendp(pkt, iface=iface, verbose=False)
def handle_pkt(pkt):
proto = pkt[IP].proto
if proto == PROTO_STORE_REQUEST:
# Apply store request
mem_namespace = pkt[ProgramExecutionMetadata].mem_namespace
store_request_metadata = pkt[StoreRequestMetadata]
memory[mem_namespace][store_request_metadata.address] = store_request_metadata.value
print("Store: mem[{}][{}] <- {}".format(mem_namespace, store_request_metadata.address,
store_request_metadata.value))
send_reply(pkt)
elif proto == PROTO_LOAD_REQUEST:
# Apply load request
mem_namespace = pkt[ProgramExecutionMetadata].mem_namespace
load_request_metadata = pkt[LoadRequestMetadata]
value = memory[mem_namespace][load_request_metadata.address]
print("Load: mem[{}][{}] -> {}".format(mem_namespace, load_request_metadata.address, value))
# Replace load request header with load response header
program_packet = pkt[ProgramExecutionMetadata]
pkt[IP].remove_payload()
pkt /= LoadResponseMetadata(value=value, register=load_request_metadata.register,
execution_node=load_request_metadata.execution_node) / program_packet
pkt[IP].proto = PROTO_LOAD_RESPONSE
send_reply(pkt)
else:
print("Received packet with unexpected protocol: {}".format(proto))
sys.stdout.flush()
def main():
print("sniffing on {}".format(iface))
sys.stdout.flush()
sniff(filter="dst host {}".format(DATASTORE_IP), iface=iface, prn=handle_pkt)
if __name__ == '__main__':
main()