diff --git a/amonit/check/matrix.py b/amonit/check/matrix.py new file mode 100644 index 0000000000000000000000000000000000000000..289f6149aaf2f1425ef67f24ce275e9e52da034a --- /dev/null +++ b/amonit/check/matrix.py @@ -0,0 +1,45 @@ +import os +import json + +from amonit import util +from matrix_client import client as matrix_client +from matrix_client import room as matrix_room + + +def send_then_receive(context, account_from, account_to, roomid): + """ Send a message using Matrix, then check that it is received. + This is useful either on a single server or across homeservers to + check that federation work properly. + + The canary is first sent, then looked for in the next execution. + """ + result = {"up": False, "message": ""} + if "canary" in context: + canary = context["canary"] + try: + client_from = matrix_client.MatrixHttpApi( + account_from["hs"], token=account_from["token"] + ) + filter = json.dumps( + {"room":{"rooms":[roomid]}}) + if "next_batch" in context: + since = context["next_batch"] + sync = client_from.sync(since=since, filter=filter) + else: + sync = client_from.sync(filter=filter) + result["next_batch"] = sync["next_batch"] + events = sync["rooms"]["join"][roomid]["timeline"]["events"] + for event in events: + if event["content"].get("body", "") == canary: + result["up"] = True + except Exception as error: + result = {"up": False, "message": str(error)} + # Then drop a new canary + canary = os.urandom(8).hex() + client_to = matrix_client.MatrixHttpApi( + account_to["hs"], token=account_to["token"] + ) + client_to.send_message(roomid, canary) + result["canary"] = canary + return result +