diff --git a/__main__.py b/__main__.py deleted file mode 100644 index 91f5bf74..00000000 --- a/__main__.py +++ /dev/null @@ -1,183 +0,0 @@ -"""The Katzian Monorepo Pulumi Stack""" - -import pulumi -from pulumi import Output -import pulumi_tailscale as tailscale -import pulumi_cloudflare as cloudflare -from typing import Optional -import collections -import json -import jsonpickle - -tailnet = tailscale.get_devices() - -zones_ = {"inskip": "inskip.me"} - -record_dict = collections.OrderedDict( - { - "inskip": { - "gmail": [ - { - "recordType": "caa", - "flags": 0, - "tag": "iodef", - "value": "mailto:acme@inskip.me", - }, - {"recordType": "caa", "flags": 0, "tag": "issuewild", "value": ";"}, - { - "recordType": "caa", - "flags": 0, - "tag": "issue", - "value": "letsencrypt.org", - }, - {"recordType": "mx", "priority": 1, "value": "aspmx.l.google.com"}, - {"recordType": "mx", "priority": 5, "value": "alt1.aspmx.l.google.com"}, - {"recordType": "mx", "priority": 5, "value": "alt2.aspmx.l.google.com"}, - { - "recordType": "mx", - "priority": 10, - "value": "alt3.aspmx.l.google.com", - }, - { - "recordType": "mx", - "priority": 10, - "value": "alt4.aspmx.l.google.com", - }, - { - "recordType": "mx", - "priority": 15, - "value": "6uyykkzhqi4zgogxiicbuamoqrxajwo5werga4byh77b2iyx3wma.mx-verification.google.com", - }, - { - "recordType": "txt", - "domain": "@", - "value": "v=spf1 include:_spf.google.com ~all", - }, - { - "recordType": "txt", - "domain": "google._domainkey", - "value": "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkxag/EmXQ89XQmLrBDPpPtZ7EtEJT0hgvWf/+AFiOfBOm902tq9NbTTvRJ2dLeBLPaV+hNvq2Alc7UfkKUDlLTWQjeuiC6aOnRKQQg3LZ2W25U3AlIj0jd2IPiUhg9JGV4c66XiqQ5ylTBniShfUUyeAXxbPhYFBCkBg62LZcO/tFpFsdKWtZzLjgac5vTJID+M4F8duHpkA/ZCNNUEmtt7RNQB/LLI1Gr5yR4GdQl9z7NmwtOTo9pghbZuvljr8phYjdDrwZeFTMKQnvR1l2Eh/dZ8I0C4nP5Bk4QEfmLq666P1HzOxwT6iCU6Tc+P/pkWbrx0HJh39E1aKGyLJMQIDAQAB", - }, - { - "recordType": "txt", - "domain": "_dmarc", - "value": "v=DMARC1; p=none; rua=mailto:dmarc-reports@inskip.me", - }, - ], - }, - } -) - -class DnsRecord: - def __init__(self, **data): - self.recordType = data["recordType"].upper() if "recordType" in data else None - self.zone = zones[data["zone"]] if "zone" in data else zones["inskip"] - self.recorded = None - self.priority = data["priority"] if "priority" in data else None - self.flags = data["flags"] if "flags" in data else None - self.value = data["value"] - self.domain = data["domain"] if "domain" in data else "@" - self.ttl = data["ttl"] if "ttl" in data else 3600 - self.tag = data["tag"] if "tag" in data else None - self.data = data - - def record(self): - self.name = f'{self.recordType}-{self.data["zone"] if "zone" in self.data else "inskip"}-{self.domain if self.domain != None else "@"}-{self.priority if self.priority != None else "na"}-{hash(self.value)}' - if self.recordType == "CAA": - self.recorded = cloudflare.Record( - self.name, - zone_id=self.zone.id, - type=self.recordType, - ttl=self.ttl, - name=self.domain, - data={ - "flags": self.flags, - "tag": self.tag, - "value": self.value, - }, - ) - else: - self.recorded = cloudflare.Record( - self.name, - zone_id=self.zone.id, - type=self.recordType, - priority=self.priority, - value=self.value, - ttl=self.ttl, - name=self.domain, - ) - - -class ARecord(DnsRecord): - def __init__(self, **data): - super().__init__(**data) - self.recordType = "A" - self.priority = None - self.record() - - -class AAAARecord(DnsRecord): - def __init__(self, **data): - super().__init__(**data) - self.recordType = "AAAA" - self.priority = None - self.record() - - -class MXRecord(DnsRecord): - def __init__(self, **data): - super().__init__(**data) - self.recordType = "MX" - self.record() - - -class TXTRecord(DnsRecord): - def __init__(self, **data): - super().__init__(**data) - self.recordType = "TXT" - self.priority = None - self.record() - - -class CAARecord(DnsRecord): - def __init__(self, **data): - super().__init__(**data) - self.recordType = "CAA" - self.record() - - -def ConstructorToType(type): - return { - "a": ARecord, - "aaaa": AAAARecord, - "mx": MXRecord, - "txt": TXTRecord, - "caa": CAARecord, - }[type.lower()] - - -zones = { - alias: cloudflare.Zone(alias, jump_start=False, zone=value, plan="free") - for alias, value in zones_.items() -} - -tailscale_devices_ = tailscale.get_devices() - -tailscale_devices = { - device.name: device.addresses for device in tailscale_devices_.devices -} - -records = {**{ - i: ConstructorToType(content["recordType"])(**content) - for i, content in enumerate(record_dict["inskip"]["gmail"]) -}, **{ - f"tailscale-{name.split('.')[0]}": { - recordType: ConstructorToType(recordType)( - value=addresses[i], domain=name.split(".")[0], zone="inskip" - ) - for i, recordType in enumerate(["A", "AAAA"]) - } - for name, addresses in tailscale_devices.items() -}} - -pulumi.info(jsonpickle.encode(records, indent=2)) diff --git a/shells/repo.nix b/shells/repo.nix index 2eedba3c..4c1d8ee9 100644 --- a/shells/repo.nix +++ b/shells/repo.nix @@ -7,25 +7,11 @@ with pkgs; let repo = import ../outputs.nix { inherit inputs; }; inherit (std) set list; - python = "python39"; - mergeEnvs = envs: - pkgs.mkShell (list.foldl' - (a: v: { - buildInputs = a.buildInputs ++ v.buildInputs; - nativeBuildInputs = a.nativeBuildInputs ++ v.nativeBuildInputs; - }) - (pkgs.mkShell { }) - envs); - requirements = builtins.readFile ../requirements.txt; - mach-nix-wrapper = import inputs.mach-nix { inherit pkgs python; }; - pythonShell = mach-nix-wrapper.mkPythonShell { inherit requirements; }; repoShell = mkShell { nativeBuildInputs = [ go # Required for pulumi pulumi-bin # Infrastructure as code - python39Packages.pulumi # Pulumi for Python! - pulumiPackages.pulumi-language-python # Python! deadnix # dead-code scanner alejandra # code formatter statix # anti-pattern finder @@ -35,4 +21,4 @@ with pkgs; let '')) repo.darwinConfigurations); }; -in mergeEnvs [ repoShell pythonShell ] +in repoShell