commit 45244050ea37b758dfdab025415cca49f08881bb Author: Stefan Schwarz Date: Sat Feb 6 12:43:23 2021 +0100 init diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..051d09d --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +eval "$(lorri direnv)" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..47def24 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/env/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d9d7e8f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM python:3.8 + +WORKDIR /app +RUN true \ + && pip install dnspython matrix-nio + +ADD . /app + +CMD python key.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..13f8aaf --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# dnswatch + +Watch a bunch of domains for changes diff --git a/key.py b/key.py new file mode 100644 index 0000000..6cbc689 --- /dev/null +++ b/key.py @@ -0,0 +1,57 @@ +import asyncio +import os +import time + +import dns.resolver +from nio import AsyncClient + + +class App: + def __init__(self, user="", password="", room_id="", records=[]): + self.user = user + self.password = password + self.room_id = room_id + self.records = records + self.cache = {} + self.resolver = dns.resolver.Resolver() + self.resolver.nameservers = ['8.8.8.8'] + self.client = AsyncClient("https://doesnt.social", self.user) + + async def setup(self): + status = await self.client.login(self.password) + print(status) + print("i will be monitoring: {self.records}") + await self.send_message("hi there, i'm marvin") + + async def send_message(self, message: str): + await self.client.room_send( + room_id=self.room_id, + message_type="m.room.message", + content={"msgtype": "m.text", "body": message}, + ) + + async def run(self): + await self.setup() + while True: + await self.update() + time.sleep(60) + + async def update(self): + for record in self.records: + print(f"checking {record}") + results = self.resolver.resolve(record) + results = [str(r) for r in results] + results.sort() + if results != self.cache.get(record, []): + await self.send_message(f"records for {record} updated: {results}") + self.cache[record] = results + + +if __name__ == "__main__": + app = App( + user=os.environ["USER"], + password=os.environ["PASSWORD"], + room_id=os.environ["ROOM_ID"], + records=os.environ["RECORDS"].split(","), + ) + asyncio.get_event_loop().run_until_complete(app.run()) diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..aa038c7 --- /dev/null +++ b/shell.nix @@ -0,0 +1,11 @@ +{ pkgs ? import {} }: + +pkgs.mkShell { + buildInputs = [ + pkgs.bashInteractive + (pkgs.python38.withPackages (ps: [ + ps.dnspython + ps.matrix-nio + ])) + ]; +}