yolo
This commit is contained in:
parent
f91da7a47c
commit
d8b52dcb44
12 changed files with 278 additions and 119 deletions
|
|
@ -7,18 +7,6 @@ import time
|
|||
import zmq
|
||||
import json
|
||||
from enum import Enum
|
||||
|
||||
NO_MSG = {"msg": None}
|
||||
INIT_MSG = {"msg": "init"}
|
||||
ACK_MSG = {"msg": "ack"}
|
||||
PING_MSG = {"msg": "ping"}
|
||||
PONG_MSG = {"msg": "pong"}
|
||||
|
||||
class NetworkState(Enum):
|
||||
DISCONNECTED = auto()
|
||||
CONNECTED = auto()
|
||||
PING = auto()
|
||||
SENDING = auto()
|
||||
|
||||
def convert_to_strings(obj):
|
||||
if isinstance(obj, dict):
|
||||
|
|
@ -38,87 +26,57 @@ class NetworkThread(threading.Thread):
|
|||
self.context = zmq.Context()
|
||||
|
||||
def run(self):
|
||||
print("thread started")
|
||||
self.connect()
|
||||
msg = self.send_msg_and_expect()
|
||||
|
||||
while True:
|
||||
timer = time.monotonic()
|
||||
a = None
|
||||
if not a:
|
||||
try:
|
||||
a = self.q.get(block=False)
|
||||
except Empty:
|
||||
pass
|
||||
if a:
|
||||
self.send_msg_and_ack(a)
|
||||
timer = time.monotonic()
|
||||
if timer - time.monotonic() < -5:
|
||||
self.send_msg_and_ack({"msg": "ping"})
|
||||
|
||||
def disconnect(self):
|
||||
self.socket.setsockopt(zmq.LINGER,0)
|
||||
self.socket.close()
|
||||
print("disconnected")
|
||||
|
||||
def reconnect(self):
|
||||
self.disconnect()
|
||||
time.sleep(1)
|
||||
self.connect()
|
||||
|
||||
def connect(self):
|
||||
self.socket = self.context.socket(zmq.PAIR)
|
||||
self.socket.connect("tcp://127.0.0.1:12345")
|
||||
self.send_msg_and_ack({"msg": "ping"})
|
||||
print("successfully connected")
|
||||
|
||||
def send_msg_and_expect(this, msg, expect, timeout=5, retries=3):
|
||||
while retries:
|
||||
def send_msg_and_ack(self, msg):
|
||||
while True:
|
||||
a = convert_to_strings(msg)
|
||||
self.socket.send(str.encode(json.dumps(a)))
|
||||
if (client.poll(REQUEST_TIMEOUT) & zmq.POLLIN) != 0:
|
||||
if (self.socket.poll(5) & zmq.POLLIN) != 0:
|
||||
msg = self.socket.recv()
|
||||
try:
|
||||
if msg:
|
||||
result = json.loads(msg)
|
||||
if result["msg"] in expect:
|
||||
if result["msg"] == "ack":
|
||||
return result
|
||||
else:
|
||||
print("got unexpected message {result}")
|
||||
|
||||
except json.JSONDecodeError:
|
||||
print(f"malformed message received {msg}")
|
||||
retries -= 1
|
||||
print("no ack received, reconnecting...")
|
||||
self.reconnect()
|
||||
return NO_MSG
|
||||
|
||||
"""
|
||||
def networking(q):
|
||||
print("starting thread")
|
||||
|
||||
state = NetworkState.DISCONNECTED
|
||||
a = None
|
||||
while state == NetworkState.DISCONNECTED:
|
||||
socket = context.socket(zmq.PAIR)
|
||||
socket.connect("tcp://127.0.0.1:12345")
|
||||
msg = get_msg(socket)
|
||||
if msg["msg"] == "init":
|
||||
send_msg(ACK_MSG, socket)
|
||||
state = NetworkState.CONNECTED
|
||||
|
||||
|
||||
|
||||
|
||||
timer = time.monotonic()
|
||||
while state != NetworkState.DISCONNECTED:
|
||||
if state == NetworkState.CONNECTED and timer - time.monotonic() >= 5:
|
||||
timer = time.monotonic()
|
||||
send_msg(PING_MSG,socket)
|
||||
msg = get_msg(socket)
|
||||
if msg["msg"] != "pong":
|
||||
state = NetworkState.
|
||||
|
||||
msg = get_msg(socket)
|
||||
if msg['msg'] == "ping":
|
||||
send_msg(PONG_MSG, socket)
|
||||
timer = time.monotonic()
|
||||
|
||||
if not a:
|
||||
try:
|
||||
a = q.get(block=False)
|
||||
except Empty:
|
||||
pass
|
||||
if a:
|
||||
send_msg(a, socket)
|
||||
msg = get_msg(socket)
|
||||
if msg["msg"] == "ack":
|
||||
timer = time.monotonic()
|
||||
a = None
|
||||
self.q.task_done()
|
||||
else:
|
||||
connected = False
|
||||
"""
|
||||
class LittleSnitchBridge:
|
||||
def __init__(self):
|
||||
self.q = Queue()
|
||||
|
|
@ -127,11 +85,9 @@ class LittleSnitchBridge:
|
|||
|
||||
def request(self, flow):
|
||||
self.q.put({'msg': 'request', 'flow': flow.get_state()})
|
||||
self.q.join()
|
||||
|
||||
def response(self, flow):
|
||||
self.q.put({'msg': 'response', 'flow': flow.get_state()})
|
||||
self.q.join()
|
||||
|
||||
addons = [
|
||||
LittleSnitchBridge()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue