From d693f51f4ac7e9ace723ab47aaef847e7766c90c Mon Sep 17 00:00:00 2001 From: Kristian Krsnik Date: Sun, 23 Mar 2025 21:08:31 +0100 Subject: [PATCH] initial commit --- .envrc | 1 + .gitignore | 26 +++ README.md | 98 ++++++++++ flake.lock | 27 +++ flake.nix | 105 +++++++++++ log.txt | 323 +++++++++++++++++++++++++++++++++ nix/module.nix | 63 +++++++ pyproject.toml | 40 ++++ src/cloudns/__init__.py | 1 + src/cloudns/__main__.py | 3 + src/cloudns/cloudns.py | 110 +++++++++++ src/cloudns/logger/__init__.py | 3 + src/cloudns/logger/logger.py | 175 ++++++++++++++++++ src/cloudns/main.py | 123 +++++++++++++ src/cloudns/py.typed | 0 src/cloudns/types.py | 19 ++ tests/__main__.py | 5 + tests/test_imports.py | 2 + 18 files changed, 1124 insertions(+) create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 README.md create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 log.txt create mode 100644 nix/module.nix create mode 100644 pyproject.toml create mode 100644 src/cloudns/__init__.py create mode 100644 src/cloudns/__main__.py create mode 100644 src/cloudns/cloudns.py create mode 100644 src/cloudns/logger/__init__.py create mode 100644 src/cloudns/logger/logger.py create mode 100644 src/cloudns/main.py create mode 100644 src/cloudns/py.typed create mode 100644 src/cloudns/types.py create mode 100644 tests/__main__.py create mode 100644 tests/test_imports.py diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1e1cdb6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Python # +# Virtual Environment +/.venv/ + +# Cache +__pycache__/ + +# Build +/dist/ +*.egg-info/ +/build/ + +# Tools +/.pytest_cache/ +/.mypy_cache/ + +# Nix # +/result + +# Direnv # +/.direnv/ + +# Project specific files # +config.json +*.key +*.jsonl diff --git a/README.md b/README.md new file mode 100644 index 0000000..11bea46 --- /dev/null +++ b/README.md @@ -0,0 +1,98 @@ +# Cloudns - A Cloudflare Dynamic DNS Solution + +A DNS record updater for [Cloudflare's DNS](https://developers.cloudflare.com/api/resources/dns/) API. + +## How it works + +This script determines the the current IP address by querying the resolvers defined in the config file. +It then queries the subdomains' A records off of Cloudflare and compares their IP addresses to the current IP address. +Should the IP address of a subdomain's A record not match your current IP address it will be updated. The subdomain's A record will be created should it not already exist. + +## Notes + +Every invocation of the script causes at least 1 request to a resolver specified and 1 API call to Cloudflare per domain. +Updating a subdomain's A record is 1 API request per subdomain, even if they share the same domain. +Resolvers are queried in the order specified until one returns a valid IP address. +It is also possible to define a path to a file with the API key written in it. +This is good for environments where the config file has to be shared like in a nix project. + +## Usage + +First, get your User API Token from https://dash.cloudflare.com/profile/api-tokens. +The token need the following permissions: + +* **Edit DNS** + +```json +{ + "api": { + "API Key": { + "example.com": [ "@", "www", "sub1" ], + "example.org": [ "@", "www", "sub1", "sub2" ] + }, + "/path/to/a/file/containing/api_key": { + "example.at": [ "sub1" ], + "example.au": [ "sub1", "sub2" ] + } + }, + "resolvers": [ + "https://ifconfig.me/ip", + "https://me.gandi.net" + ], + "log_path": "./log.jsonl" +} +``` + +## Nix + +Add this to the modules. + +```nix +inputs = { + cloudns.url = "git+https://git.krsnik.at/Kristian/cloudns"; +}; + +outputs = { + self, + nixpkgs, + cloudns +}: { + ... + modules = [ + cloudns.nixosModules.default + { + cloudns.enable = true; + cloudns.timer = 300; + cloudns.settings = { + api = { + "/path/to/a/file/containing/api_key" = { + "example.com" = ["@" "www"]; + }; + }; + resolvers = [ + "https://ifconfig.me/ip" + "https://me.gandi.net" + ]; + log_path = "/path/to/log/file.jsonl"; + }; + } + ... + ]; + ... +} +``` + +Use `cloudns.nixosModules.default` for a NixOs module. + +`cloudns.timer` specifies a timer in seconds when the script should be repeated. + +## Features + +* Support for arbitrarily many domains and subdomains through a nested data structure. +* Small codebase +* Logging +* NixOS and home-manager modules + +## Limitations + +* Only IPv4 addresses are supported diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..62e0614 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1742422364, + "narHash": "sha256-mNqIplmEohk5jRkqYqG19GA8MbQ/D4gQSK0Mu4LvfRQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a84ebe20c6bc2ecbcfb000a50776219f48d134cc", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..471424b --- /dev/null +++ b/flake.nix @@ -0,0 +1,105 @@ +{ + description = "A Python Project Template."; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + }; + + outputs = { + self, + nixpkgs, + ... + } @ inputs: let + supportedSystems = ["x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin"]; + forAllSystems = nixpkgs.lib.genAttrs supportedSystems; + pkgs = forAllSystems (system: nixpkgs.legacyPackages.${system}.extend overlay); + + overlay = final: prev: rec { + python3Packages = prev.python3Packages.overrideScope (pfinal: pprev: { + packageNameToDrv = x: builtins.getAttr (cleanPythonPackageName x) final.python3Packages; + }); + + cleanPythonPackageName = x: let + cleanName = builtins.match "([a-z,A-Z,0-9,_,-]+).*" x; + in + if cleanName != null + then builtins.elemAt cleanName 0 + else builtins.warn "Could not determine package name from '${x}'" null; + }; + + pyproject = builtins.fromTOML (builtins.readFile ./pyproject.toml); + + buildDependencies = forAllSystems (system: builtins.map pkgs.${system}.python3Packages.packageNameToDrv pyproject.build-system.requires); + runtimeDependencies = forAllSystems (system: builtins.map pkgs.${system}.python3Packages.packageNameToDrv pyproject.project.dependencies); + optionalDependencies = forAllSystems (system: builtins.mapAttrs (name: value: builtins.map pkgs.${system}.python3Packages.packageNameToDrv value) pyproject.project.optional-dependencies); + in { + # `nix build` + packages = forAllSystems (system: let + buildProject = {skipCheck ? false}: + pkgs.${system}.python3Packages.buildPythonPackage { + pname = pyproject.project.name; + version = pyproject.project.version; + src = ./.; + + pyproject = true; + + build-system = buildDependencies.${system}; + + dependencies = runtimeDependencies.${system}; + + optional-dependencies = optionalDependencies.${system}; + + nativeCheckInputs = optionalDependencies.${system}.dev; + + checkPhase = let + dev = builtins.map (x: x.pname) optionalDependencies.${system}.dev; + in '' + ${ + if builtins.elem "pytest" dev && !skipCheck + then "pytest tests" + else "" + } + ${ + if builtins.elem "mypy" dev && !skipCheck + then "mypy src" + else "" + } + ${ + if builtins.elem "pylint" dev && !skipCheck + then "pylint src" + else "" + } + ''; + }; + in { + default = self.packages.${system}."${pyproject.project.name}"; + "${pyproject.project.name}" = buildProject {skipCheck = false;}; + quick = buildProject {skipCheck = true;}; + }); + + # `nix fmt` + formatter = forAllSystems (system: pkgs.${system}.alejandra); + + # `nix develop` + devShells = forAllSystems (system: rec { + default = venv; + + venv = pkgs.${system}.mkShell { + shellHook = '' + if [ ! -d .venv/ ]; then + echo "Creating Virtual Environment..." + ${pkgs.${system}.python3}/bin/python3 -m venv .venv + fi + + alias activate='source .venv/bin/activate' + + echo "Entering Virtual Environment..." + source .venv/bin/activate + ''; + }; + }); + + # NixOS Module + nixosModules.default = import ./nix/module.nix inputs; + }; +} diff --git a/log.txt b/log.txt new file mode 100644 index 0000000..4cdf94a --- /dev/null +++ b/log.txt @@ -0,0 +1,323 @@ +{"timestamp": "2025-03-23T19:02:40.820577+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:02:40.822624+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:02:41.049484+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:02:41.050064+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:02:41.051262+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:02:41.881375+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:02:41.884549+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "params": null, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:02:41.887896+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:02:42.886719+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:02:42.887731+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "params": {"name": "krezzlu.com"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:02:42.889305+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:02:43.615599+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:02:43.617942+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "params": {"type": "A"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":1,\"total_count\":1,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:02:43.618521+00:00", "level": "INFO", "message": "Could not find an A record for '@.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 89, "thread_name": "MainThread", "domain": "@.krezzlu.com"} +{"timestamp": "2025-03-23T19:02:43.618708+00:00", "level": "INFO", "message": "IP for 'mail.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "mail.krezzlu.com", "content": "46.226.105.234"} +{"timestamp": "2025-03-23T19:02:43.618862+00:00", "level": "INFO", "message": "Could not find an A record for 'sub1.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 89, "thread_name": "MainThread", "domain": "sub1.krezzlu.com"} +{"timestamp": "2025-03-23T19:04:16.981896+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:04:16.984037+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:17.179613+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:17.180233+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:04:17.181355+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:17.919486+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:17.923566+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "params": null, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:04:17.927387+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:18.860477+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:18.862809+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "params": {"name": "krezzlu.com"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:04:18.866480+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:20.043042+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:20.045451+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "params": {"type": "A"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":2,\"total_count\":2,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:04:20.045815+00:00", "level": "INFO", "message": "Could not find an A record for '@.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 89, "thread_name": "MainThread", "domain": "@.krezzlu.com"} +{"timestamp": "2025-03-23T19:04:20.045863+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "test.krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:04:20.045897+00:00", "level": "INFO", "message": "Could not find an A record for 'test2.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 89, "thread_name": "MainThread", "domain": "test2.krezzlu.com"} +{"timestamp": "2025-03-23T19:04:49.633806+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:04:49.635982+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:49.814682+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:49.815261+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:04:49.816445+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:50.563412+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:50.564998+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "params": null, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:04:50.567207+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:51.763802+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:51.766234+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "params": {"name": "krezzlu.com"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:04:51.770909+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:52.546914+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:04:52.549370+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "params": {"type": "A"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":2,\"total_count\":2,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:04:52.550261+00:00", "level": "INFO", "message": "Could not find an A record for 'krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 89, "thread_name": "MainThread", "domain": "krezzlu.com"} +{"timestamp": "2025-03-23T19:04:52.550439+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "test.krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:04:52.550580+00:00", "level": "INFO", "message": "Could not find an A record for 'test2.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 89, "thread_name": "MainThread", "domain": "test2.krezzlu.com"} +{"timestamp": "2025-03-23T19:05:13.627918+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:05:13.630369+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:13.811366+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:13.811970+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:05:13.813241+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:14.601694+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:14.602849+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "params": null, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:05:14.603893+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:15.562500+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:15.563871+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "params": {"name": "krezzlu.com"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:05:15.565340+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:16.193842+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:16.195095+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "params": {"type": "A"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":2,\"total_count\":2,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:05:16.195499+00:00", "level": "INFO", "message": "Could not find an A record for 'krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 89, "thread_name": "MainThread", "domain": "krezzlu.com"} +{"timestamp": "2025-03-23T19:05:16.195551+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "test.krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:05:16.195586+00:00", "level": "INFO", "message": "Could not find an A record for 'test2.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 89, "thread_name": "MainThread", "domain": "test2.krezzlu.com"} +{"timestamp": "2025-03-23T19:05:46.612498+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:05:46.614861+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:47.005076+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:47.005701+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:05:47.007556+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:47.903021+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:47.906260+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "params": null, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:05:47.909823+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:49.120720+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:49.123962+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "params": {"name": "krezzlu.com"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:05:49.128293+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:49.890004+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:05:49.893822+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "params": {"type": "A"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":2,\"total_count\":2,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:05:49.894975+00:00", "level": "INFO", "message": "Could not find an A record for 'krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 90, "thread_name": "MainThread", "domain": "krezzlu.com"} +{"timestamp": "2025-03-23T19:05:49.895226+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "full_domain": "test.krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:05:49.895402+00:00", "level": "INFO", "message": "Could not find an A record for 'test2.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 90, "thread_name": "MainThread", "domain": "test2.krezzlu.com"} +{"timestamp": "2025-03-23T19:06:53.096434+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:06:53.098582+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:06:53.276569+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:06:53.277182+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:06:53.278725+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:06:54.043122+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:06:54.044896+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "params": null, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:06:54.048379+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:06:54.933837+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:06:54.936439+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "params": {"name": "krezzlu.com"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:06:54.940001+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:06:55.685084+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:06:55.687921+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "params": {"type": "A"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:06:47.202817Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":3,\"total_count\":3,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:06:55.689161+00:00", "level": "INFO", "message": "IP for 'krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "full_domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:06:55.689356+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "full_domain": "test.krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:06:55.689507+00:00", "level": "INFO", "message": "Could not find an A record for 'test2.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 90, "thread_name": "MainThread", "domain": "test2.krezzlu.com"} +{"timestamp": "2025-03-23T19:09:24.888779+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:09:24.891150+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:09:25.381509+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:09:25.382106+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:09:25.383445+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:09:26.100370+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:09:26.103321+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "params": null, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:09:26.105513+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:09:27.105388+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:09:27.107861+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "params": {"name": "krezzlu.com"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:09:27.112752+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:09:27.966080+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:09:27.968532+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "params": {"type": "A"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:06:47.202817Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":3,\"total_count\":3,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:09:27.969191+00:00", "level": "INFO", "message": "IP for 'krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:09:27.969381+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "test.krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:09:27.969536+00:00", "level": "INFO", "message": "Could not find an A record for 'test2.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 89, "thread_name": "MainThread", "domain": "test2.krezzlu.com"} +{"timestamp": "2025-03-23T19:14:29.831093+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:14:29.833169+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:30.805727+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:30.806417+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:14:30.808623+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:31.533113+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:31.536076+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "params": null, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:14:31.537618+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:32.727340+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:32.730032+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "params": {"name": "krezzlu.com"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:14:32.734312+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:33.543017+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:33.545451+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "params": {"type": "A"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:06:47.202817Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":3,\"total_count\":3,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:14:33.546190+00:00", "level": "INFO", "message": "IP for 'krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:14:33.546375+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "test.krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:14:33.546557+00:00", "level": "INFO", "message": "Could not find an A record for 'test2.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 89, "thread_name": "MainThread", "domain": "test2.krezzlu.com"} +{"timestamp": "2025-03-23T19:14:33.546824+00:00", "level": "ERROR", "message": "too many values to unpack (expected 2)\nTraceback (most recent call last):\n File \"/home/kristian/Code/cloudflare-dyn-dns/src/my_project/main.py\", line 103, in run\n for full_domain, id in zones:\n ^^^^^^^^^^^^^^^\nValueError: too many values to unpack (expected 2)", "logger": "root", "module": "main", "function": "run", "line": 107, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:49.039303+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:14:49.041304+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:49.234224+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:49.234796+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:14:49.235849+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:50.036450+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:50.039416+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "params": null, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:14:50.042516+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:51.614299+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:51.617241+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "params": {"name": "krezzlu.com"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:14:51.620982+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:52.299902+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:14:52.302237+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "params": {"type": "A"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:06:47.202817Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":3,\"total_count\":3,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:14:52.302817+00:00", "level": "INFO", "message": "IP for 'krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:14:52.302939+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "test.krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:14:52.303024+00:00", "level": "INFO", "message": "Could not find an A record for 'test2.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 89, "thread_name": "MainThread", "domain": "test2.krezzlu.com"} +{"timestamp": "2025-03-23T19:14:52.303391+00:00", "level": "ERROR", "message": "too many values to unpack (expected 2)\nTraceback (most recent call last):\n File \"/home/kristian/Code/cloudflare-dyn-dns/src/my_project/main.py\", line 103, in run\n for full_domain, (zone_id, record_id) in zones:\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nValueError: too many values to unpack (expected 2)", "logger": "root", "module": "main", "function": "run", "line": 107, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:20.633329+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:15:20.635366+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:21.624602+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:21.625557+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:15:21.628046+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:22.415674+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:22.418525+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "params": null, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:15:22.422268+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:23.870930+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:23.872524+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "params": {"name": "krezzlu.com"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:15:23.876695+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:24.631074+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:24.632516+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "params": {"type": "A"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:06:47.202817Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":3,\"total_count\":3,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:15:24.632937+00:00", "level": "INFO", "message": "IP for 'krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:15:24.633009+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "test.krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:15:24.633048+00:00", "level": "INFO", "message": "Could not find an A record for 'test2.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 89, "thread_name": "MainThread", "domain": "test2.krezzlu.com"} +{"timestamp": "2025-03-23T19:15:24.633248+00:00", "level": "ERROR", "message": "too many values to unpack (expected 2)\nTraceback (most recent call last):\n File \"/home/kristian/Code/cloudflare-dyn-dns/src/my_project/main.py\", line 103, in run\n for full_domain, (zone_id, record_id) in zones.items():\n ^^^^^^^^^^^^^^^^^^^^\nValueError: too many values to unpack (expected 2)", "logger": "root", "module": "main", "function": "run", "line": 107, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:36.214768+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:15:36.216717+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:36.395863+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:36.396496+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:15:36.398105+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:37.144652+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:37.146419+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "params": null, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:15:37.147714+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:38.044378+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:38.045851+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "params": {"name": "krezzlu.com"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:15:38.050740+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:38.949324+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:15:38.951624+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "params": {"type": "A"}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:06:47.202817Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":3,\"total_count\":3,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:15:38.953120+00:00", "level": "INFO", "message": "IP for 'krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:15:38.953371+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 94, "thread_name": "MainThread", "full_domain": "test.krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:15:38.953561+00:00", "level": "INFO", "message": "Could not find an A record for 'test2.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 89, "thread_name": "MainThread", "domain": "test2.krezzlu.com"} +{"timestamp": "2025-03-23T19:33:03.193012+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:33:03.195438+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:03.378099+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:03.378762+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:33:03.380345+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:04.147763+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:04.150945+00:00", "level": "ERROR", "message": "name 'params' is not defined\nTraceback (most recent call last):\n File \"/home/kristian/Code/cloudflare-dyn-dns/src/my_project/main.py\", line 73, in run\n if not cloudns.api_key_is_valid(api_key):\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/kristian/Code/cloudflare-dyn-dns/src/my_project/cloudflare_dyn_dns.py\", line 75, in api_key_is_valid\n result = _cloudflare_api_request('GET', 'user/tokens/verify', api_key)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/kristian/Code/cloudflare-dyn-dns/src/my_project/cloudflare_dyn_dns.py\", line 60, in _cloudflare_api_request\n LOGGER.debug('Issued Cloudflare API request.', extra = { 'method': method, 'endpoint': endpoint, 'headers': headers, 'params': params, 'status_code': response.status_code, 'content': response.content })\n ^^^^^^\nNameError: name 'params' is not defined", "logger": "root", "module": "main", "function": "run", "line": 116, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:40.555055+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:33:40.556934+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:40.748454+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:40.749023+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:33:40.751353+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:41.522778+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:41.525800+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "kwargs": {}, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:33:41.528415+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:43.079317+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:43.080507+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "kwargs": {"params": {"name": "krezzlu.com"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:33:43.081788+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:43.866348+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:43.868605+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "kwargs": {"params": {"type": "A"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:06:47.202817Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":3,\"total_count\":3,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:33:43.869215+00:00", "level": "INFO", "message": "IP for 'krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "sub": "@", "domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:33:43.869417+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "sub": "test", "domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:33:43.869577+00:00", "level": "INFO", "message": "Could not find an A record for 'test2.krezzlu.com'. Will be created.", "logger": "root", "module": "main", "function": "run", "line": 90, "thread_name": "MainThread", "sub": "test2", "domain": "krezzlu.com"} +{"timestamp": "2025-03-23T19:33:43.869732+00:00", "level": "INFO", "message": "'A record for 'krezzlu.com' updated.", "logger": "root", "module": "main", "function": "run", "line": 113, "thread_name": "MainThread", "sub": "@", "domain": "krezzlu.com"} +{"timestamp": "2025-03-23T19:33:43.869877+00:00", "level": "INFO", "message": "'A record for 'test.krezzlu.com' updated.", "logger": "root", "module": "main", "function": "run", "line": 113, "thread_name": "MainThread", "sub": "test", "domain": "krezzlu.com"} +{"timestamp": "2025-03-23T19:33:43.872970+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:44.541855+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"POST /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:33:44.544528+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "POST", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "kwargs": {"json": {"type": "A", "name": "test2.krezzlu.com", "content": "62.178.168.183"}}, "status_code": 200, "content": "b'{\"result\":{\"id\":\"630573f07ad4c4bf587dd32dce40658a\",\"name\":\"test2.krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:33:44.430884Z\",\"modified_on\":\"2025-03-23T19:33:44.430884Z\"},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:33:44.545447+00:00", "level": "INFO", "message": "A record for 'test2.krezzlu.com' created.", "logger": "root", "module": "main", "function": "run", "line": 108, "thread_name": "MainThread", "sub": "test2", "domain": "krezzlu.com"} +{"timestamp": "2025-03-23T19:34:08.935710+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": ["--dry-run"]} +{"timestamp": "2025-03-23T19:34:08.937463+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:34:09.117317+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:34:09.117949+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:34:09.119004+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:34:09.827502+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:34:09.829698+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "kwargs": {}, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:34:09.832708+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:34:10.641901+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:34:10.644541+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "kwargs": {"params": {"name": "krezzlu.com"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:34:10.646096+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:34:11.507715+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:34:11.510408+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "kwargs": {"params": {"type": "A"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:06:47.202817Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"630573f07ad4c4bf587dd32dce40658a\",\"name\":\"test2.krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:33:44.430884Z\",\"modified_on\":\"2025-03-23T19:33:44.430884Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":4,\"total_count\":4,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:34:11.511967+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "sub": "test", "domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:34:11.512224+00:00", "level": "INFO", "message": "IP for 'krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "sub": "@", "domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:36:18.350062+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": ["--dry-run"]} +{"timestamp": "2025-03-23T19:36:18.351983+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:18.773750+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:18.774522+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:36:18.777175+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:19.487638+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:19.490733+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "kwargs": {}, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:36:19.492681+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:20.373479+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:20.375046+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "kwargs": {"params": {"name": "krezzlu.com"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:36:20.377818+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:21.286730+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:21.287762+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "kwargs": {"params": {"type": "A"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:06:47.202817Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"630573f07ad4c4bf587dd32dce40658a\",\"name\":\"test2.krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:33:44.430884Z\",\"modified_on\":\"2025-03-23T19:33:44.430884Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":4,\"total_count\":4,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:36:21.288317+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "sub": "test", "domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:36:21.288370+00:00", "level": "INFO", "message": "IP for 'krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "sub": "@", "domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:36:24.397524+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:36:24.399741+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:24.584900+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:24.585803+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:36:24.587641+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:25.329553+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:25.332482+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "kwargs": {}, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:36:25.335943+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:26.230673+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:26.233013+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "kwargs": {"params": {"name": "krezzlu.com"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:36:26.236659+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:26.849738+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:26.850999+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "kwargs": {"params": {"type": "A"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:06:47.202817Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"630573f07ad4c4bf587dd32dce40658a\",\"name\":\"test2.krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:33:44.430884Z\",\"modified_on\":\"2025-03-23T19:33:44.430884Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":4,\"total_count\":4,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:36:26.851421+00:00", "level": "INFO", "message": "IP for 'krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "sub": "@", "domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:36:26.851470+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "sub": "test", "domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:36:26.852735+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:27.480774+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"POST /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records HTTP/1.1\" 400 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:36:27.482966+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "POST", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "kwargs": {"json": {"content": "62.178.168.183"}}, "status_code": 400, "content": "b'{\"result\":null,\"success\":false,\"errors\":[{\"code\":9000,\"message\":\"DNS name is invalid.\"}],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:36:27.483191+00:00", "level": "ERROR", "message": "", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 63, "thread_name": "MainThread", "status_code": 400, "content": "b'{\"result\":null,\"success\":false,\"errors\":[{\"code\":9000,\"message\":\"DNS name is invalid.\"}],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:36:27.483322+00:00", "level": "ERROR", "message": "b'{\"result\":null,\"success\":false,\"errors\":[{\"code\":9000,\"message\":\"DNS name is invalid.\"}],\"messages\":[]}'\nTraceback (most recent call last):\n File \"/home/kristian/Code/cloudflare-dyn-dns/src/my_project/main.py\", line 112, in run\n cloudns.update_A_record(api_key, zone_id, record_id, current_ip)\n File \"/home/kristian/Code/cloudflare-dyn-dns/src/my_project/cloudflare_dyn_dns.py\", line 104, in update_A_record\n _cloudflare_api_request(\n File \"/home/kristian/Code/cloudflare-dyn-dns/src/my_project/cloudflare_dyn_dns.py\", line 64, in _cloudflare_api_request\n raise Exception(response.content)\nException: b'{\"result\":null,\"success\":false,\"errors\":[{\"code\":9000,\"message\":\"DNS name is invalid.\"}],\"messages\":[]}'", "logger": "root", "module": "main", "function": "run", "line": 116, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:43.330410+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:37:43.332434+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:43.540059+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:43.540771+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:37:43.541853+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:44.310987+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:44.317923+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "kwargs": {}, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:37:44.320779+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:45.310813+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:45.313365+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "kwargs": {"params": {"name": "krezzlu.com"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:37:45.316438+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:46.146942+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:46.148235+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "kwargs": {"params": {"type": "A"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:06:47.202817Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"630573f07ad4c4bf587dd32dce40658a\",\"name\":\"test2.krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:33:44.430884Z\",\"modified_on\":\"2025-03-23T19:33:44.430884Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":4,\"total_count\":4,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:37:46.148655+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "sub": "test", "domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:37:46.148704+00:00", "level": "INFO", "message": "IP for 'krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "sub": "@", "domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:37:46.148759+00:00", "level": "ERROR", "message": "name 'dns_record_id' is not defined\nTraceback (most recent call last):\n File \"/home/kristian/Code/cloudflare-dyn-dns/src/my_project/main.py\", line 112, in run\n cloudns.update_A_record(api_key, zone_id, record_id, current_ip)\n File \"/home/kristian/Code/cloudflare-dyn-dns/src/my_project/cloudflare_dyn_dns.py\", line 106, in update_A_record\n f'/zones/{zone_id}/dns_records/{dns_record_id}',\n ^^^^^^^^^^^^^\nNameError: name 'dns_record_id' is not defined. Did you mean: 'record_id'?", "logger": "root", "module": "main", "function": "run", "line": 116, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:53.024963+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:37:53.027782+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:53.214828+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:53.215433+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:37:53.216552+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:53.958200+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:53.961222+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "kwargs": {}, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:37:53.964445+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:54.800554+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:54.803082+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "kwargs": {"params": {"name": "krezzlu.com"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:37:54.805488+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:55.391762+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:55.394507+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "kwargs": {"params": {"type": "A"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:06:47.202817Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"630573f07ad4c4bf587dd32dce40658a\",\"name\":\"test2.krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:33:44.430884Z\",\"modified_on\":\"2025-03-23T19:33:44.430884Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"1.1.1.1\",\"proxiable\":false,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:03:26.528913Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":4,\"total_count\":4,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:37:55.395224+00:00", "level": "INFO", "message": "IP for 'test.krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "sub": "test", "domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:37:55.395347+00:00", "level": "INFO", "message": "IP for 'krezzlu.com' does not match current IP. Will be updated.", "logger": "root", "module": "main", "function": "run", "line": 95, "thread_name": "MainThread", "sub": "@", "domain": "krezzlu.com", "content": "1.1.1.1"} +{"timestamp": "2025-03-23T19:37:55.398712+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:56.031018+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"PATCH /client/v4//zones/e51e081fa6710843d7e605479cdd0567/dns_records/e2823b6fa044667bb91abe72490c6ac4 HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:56.033331+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "PATCH", "endpoint": "/zones/e51e081fa6710843d7e605479cdd0567/dns_records/e2823b6fa044667bb91abe72490c6ac4", "headers": null, "kwargs": {"json": {"content": "62.178.168.183"}}, "status_code": 200, "content": "b'{\"result\":{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:37:55.913022Z\"},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:37:56.033951+00:00", "level": "INFO", "message": "'A record for 'test.krezzlu.com' updated.", "logger": "root", "module": "main", "function": "run", "line": 113, "thread_name": "MainThread", "sub": "test", "domain": "krezzlu.com"} +{"timestamp": "2025-03-23T19:37:56.037170+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:56.724580+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"PATCH /client/v4//zones/e51e081fa6710843d7e605479cdd0567/dns_records/c224324c0fdd8b615b63e602e87f8cbc HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:37:56.726666+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "PATCH", "endpoint": "/zones/e51e081fa6710843d7e605479cdd0567/dns_records/c224324c0fdd8b615b63e602e87f8cbc", "headers": null, "kwargs": {"json": {"content": "62.178.168.183"}}, "status_code": 200, "content": "b'{\"result\":{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:37:56.612888Z\"},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:37:56.726973+00:00", "level": "INFO", "message": "'A record for 'krezzlu.com' updated.", "logger": "root", "module": "main", "function": "run", "line": 113, "thread_name": "MainThread", "sub": "@", "domain": "krezzlu.com"} +{"timestamp": "2025-03-23T19:39:03.376395+00:00", "level": "DEBUG", "message": "Started program.", "logger": "root", "module": "main", "function": "run", "line": 67, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:39:03.379027+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:39:03.588173+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:39:03.588728+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "root", "module": "cloudflare_dyn_dns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:39:03.589704+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:39:04.277155+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:39:04.278743+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "kwargs": {}, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:39:04.279965+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:39:05.221869+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:39:05.222923+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "kwargs": {"params": {"name": "krezzlu.com"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:39:05.224357+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:39:05.993221+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:39:05.995897+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "root", "module": "cloudflare_dyn_dns", "function": "_cloudflare_api_request", "line": 60, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "kwargs": {"params": {"type": "A"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:37:56.612888Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"630573f07ad4c4bf587dd32dce40658a\",\"name\":\"test2.krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:33:44.430884Z\",\"modified_on\":\"2025-03-23T19:33:44.430884Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:37:55.913022Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":4,\"total_count\":4,\"total_pages\":1}}'"} +{"timestamp": "2025-03-23T19:51:23.276319+00:00", "level": "DEBUG", "message": "Started program.", "logger": "cloudns", "module": "main", "function": "run", "line": 69, "thread_name": "MainThread", "argv": []} +{"timestamp": "2025-03-23T19:51:23.278996+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): ifconfig.me:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:51:23.489697+00:00", "level": "DEBUG", "message": "https://ifconfig.me:443 \"GET /ip HTTP/1.1\" 200 14", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:51:23.490363+00:00", "level": "DEBUG", "message": "[OK][https://ifconfig.me/ip] Current IP: '62.178.168.183'", "logger": "cloudns", "module": "cloudns", "function": "get_current_ip", "line": 42, "thread_name": "MainThread", "resolver": "https://ifconfig.me/ip", "current_ip": "62.178.168.183"} +{"timestamp": "2025-03-23T19:51:23.491785+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:51:24.440365+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/user/tokens/verify HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:51:24.442405+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "cloudns", "module": "cloudns", "function": "_cloudflare_api_request", "line": 61, "thread_name": "MainThread", "method": "GET", "endpoint": "user/tokens/verify", "headers": null, "kwargs": {}, "status_code": 200, "content": "b'{\"result\":{\"id\":\"b22074c94e38ad609caa8ed3fe28563e\",\"status\":\"active\"},\"success\":true,\"errors\":[],\"messages\":[{\"code\":10000,\"message\":\"This API Token is valid and active\",\"type\":null}]}'"} +{"timestamp": "2025-03-23T19:51:24.443584+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:51:25.511251+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones?name=krezzlu.com HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:51:25.513618+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "cloudns", "module": "cloudns", "function": "_cloudflare_api_request", "line": 61, "thread_name": "MainThread", "method": "GET", "endpoint": "zones", "headers": null, "kwargs": {"params": {"name": "krezzlu.com"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"e51e081fa6710843d7e605479cdd0567\",\"name\":\"krezzlu.com\",\"status\":\"active\",\"paused\":false,\"type\":\"full\",\"development_mode\":0,\"name_servers\":[\"clarissa.ns.cloudflare.com\",\"moura.ns.cloudflare.com\"],\"original_name_servers\":[\"ns-2-c.gandi.net\",\"ns-215-b.gandi.net\",\"ns-36-a.gandi.net\"],\"original_registrar\":\"hosting concepts b.v. d\\\\/b\\\\/a re (id: 1647)\",\"original_dnshost\":null,\"modified_on\":\"2025-03-23T15:40:10.835121Z\",\"created_on\":\"2025-03-23T15:30:18.867211Z\",\"activated_on\":\"2025-03-23T15:40:10.835121Z\",\"meta\":{\"step\":2,\"custom_certificate_quota\":0,\"page_rule_quota\":3,\"phishing_detected\":false},\"owner\":{\"id\":null,\"type\":\"user\",\"email\":null},\"account\":{\"id\":\"bdf6111f96b9a6f7fe2f9a4475f792d2\",\"name\":\"Kristian@krsnik.at\\'s Account\"},\"tenant\":{\"id\":null,\"name\":null},\"tenant_unit\":{\"id\":null},\"permissions\":[\"#dns_records:edit\",\"#dns_records:read\",\"#zone:read\"],\"plan\":{\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\",\"price\":0,\"currency\":\"USD\",\"frequency\":\"\",\"is_subscribed\":false,\"can_subscribe\":false,\"legacy_id\":\"free\",\"legacy_discount\":false,\"externally_managed\":false}}],\"result_info\":{\"page\":1,\"per_page\":20,\"total_pages\":1,\"count\":1,\"total_count\":1},\"success\":true,\"errors\":[],\"messages\":[]}'"} +{"timestamp": "2025-03-23T19:51:25.517328+00:00", "level": "DEBUG", "message": "Starting new HTTPS connection (1): api.cloudflare.com:443", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_new_conn", "line": 1049, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:51:26.420577+00:00", "level": "DEBUG", "message": "https://api.cloudflare.com:443 \"GET /client/v4/zones/e51e081fa6710843d7e605479cdd0567/dns_records?type=A HTTP/1.1\" 200 None", "logger": "urllib3.connectionpool", "module": "connectionpool", "function": "_make_request", "line": 544, "thread_name": "MainThread"} +{"timestamp": "2025-03-23T19:51:26.422985+00:00", "level": "DEBUG", "message": "Issued Cloudflare API request.", "logger": "cloudns", "module": "cloudns", "function": "_cloudflare_api_request", "line": 61, "thread_name": "MainThread", "method": "GET", "endpoint": "zones/e51e081fa6710843d7e605479cdd0567/dns_records", "headers": null, "kwargs": {"params": {"type": "A"}}, "status_code": 200, "content": "b'{\"result\":[{\"id\":\"c224324c0fdd8b615b63e602e87f8cbc\",\"name\":\"krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:06:47.202817Z\",\"modified_on\":\"2025-03-23T19:37:56.612888Z\"},{\"id\":\"23545739cd359530d6b893feda71187a\",\"name\":\"mail.krezzlu.com\",\"type\":\"A\",\"content\":\"46.226.105.234\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T15:30:22.811109Z\",\"modified_on\":\"2025-03-23T15:50:15.099369Z\"},{\"id\":\"630573f07ad4c4bf587dd32dce40658a\",\"name\":\"test2.krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:33:44.430884Z\",\"modified_on\":\"2025-03-23T19:33:44.430884Z\"},{\"id\":\"e2823b6fa044667bb91abe72490c6ac4\",\"name\":\"test.krezzlu.com\",\"type\":\"A\",\"content\":\"62.178.168.183\",\"proxiable\":true,\"proxied\":false,\"ttl\":1,\"settings\":{},\"meta\":{},\"comment\":null,\"tags\":[],\"created_on\":\"2025-03-23T19:03:26.528913Z\",\"modified_on\":\"2025-03-23T19:37:55.913022Z\"}],\"success\":true,\"errors\":[],\"messages\":[],\"result_info\":{\"page\":1,\"per_page\":100,\"count\":4,\"total_count\":4,\"total_pages\":1}}'"} diff --git a/nix/module.nix b/nix/module.nix new file mode 100644 index 0000000..bd54334 --- /dev/null +++ b/nix/module.nix @@ -0,0 +1,63 @@ +inputs: { + config, + lib, + pkgs, + ... +}: let + cfg = config.cloudns; + package = inputs.self.packages.${pkgs.stdenv.hostPlatform.system}.default; + inherit (lib) mkIf mkEnableOption mkOption types; + + format = pkgs.formats.json {}; + configFile = format.generate "config.json" cfg.settings; +in { + options.cloudns = { + enable = mkEnableOption "cloudns"; + + timer = lib.mkOption { + type = types.nullOr types.int; + default = null; + description = lib.mdDoc '' + The time interval in seconds the script should be repeated. + ''; + }; + + settings = mkOption { + type = with types; let + valueType = nullOr (oneOf [ + # TODO: restrict type to actual config file structure + bool + int + float + str + path + (attrsOf valueType) + (listOf valueType) + ]); + in + valueType; + default = throw "Please specify cloudns.settings"; + }; + }; + + config = mkIf cfg.enable { + environment.systemPackages = [package]; + + systemd.services.cloudns = mkIf (cfg.timer != null) { + script = "${package}/bin/cloudns --config ${configFile}"; + requires = ["network-online.target"]; + serviceConfig = { + Type = "oneshot"; + }; + }; + + systemd.timers.cloudns = mkIf (cfg.timer != null) { + wantedBy = ["timers.target"]; + timerConfig = { + OnBootSec = "0s"; + OnUnitActiveSec = "${toString cfg.timer}s"; + Unit = "cloudns.service"; + }; + }; + }; +} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b67a146 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,40 @@ +[project] +name = "cloudns" +version = "0.1.0" +requires-python = "~=3.12, <4" +dependencies = ["requests~=2.32.3", "pydantic~=2.10.5"] + +[project.optional-dependencies] +dev = [ + "pytest~=8.3", + "mypy~=1.13", + "pylint~=3.3", + "types-requests~=2.32.0.20241016", +] + +[project.scripts] +cloudns = "cloudns.main:main" + +[build-system] +requires = ["setuptools~=75.1"] +build-backend = "setuptools.build_meta" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.setuptools.package-data] +cloudns = ["py.typed"] + +[tool.autopep8] +max_line_length = 150 + +[tool.pylint.'MESSAGES CONTROL'] +disable = [ + "line-too-long", + "missing-module-docstring", + "missing-class-docstring", + "missing-function-docstring", + "too-few-public-methods", + "broad-exception-caught", + "logging-fstring-interpolation", +] diff --git a/src/cloudns/__init__.py b/src/cloudns/__init__.py new file mode 100644 index 0000000..86966d1 --- /dev/null +++ b/src/cloudns/__init__.py @@ -0,0 +1 @@ +from .main import run diff --git a/src/cloudns/__main__.py b/src/cloudns/__main__.py new file mode 100644 index 0000000..5d6a810 --- /dev/null +++ b/src/cloudns/__main__.py @@ -0,0 +1,3 @@ +from .main import main + +main() diff --git a/src/cloudns/cloudns.py b/src/cloudns/cloudns.py new file mode 100644 index 0000000..0b22552 --- /dev/null +++ b/src/cloudns/cloudns.py @@ -0,0 +1,110 @@ +import re +from typing import Iterable, Literal + +import requests + +from .logger import getLogger + + +LOGGER = getLogger('cloudns') + + +class ZoneNotFoundError(Exception): + pass + +class CouldNotGetIPError(Exception): + pass + +class APIError(Exception): + pass + +def get_current_ip(resolvers: Iterable[str]) -> str: + ''' + Go through resolvers until one returns an IP. + + `resolvers` A list of IP resolvers. + + `log` A function which takes a string and logs it. + ''' + + for resolver in resolvers: + response = requests.get(resolver, timeout = 5) + + if not response.ok: + LOGGER.warning(f"[ERROR][{resolver}][{response.status_code}] {response.text}", extra = { 'resolver': resolver, 'status_code': response.status_code, 'content': response.content }) + + current_ip = response.text.strip() + + # It suffices to check whether the search is not None since the regex matches from beginning to end. + is_ipv4 = re.search(r'^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$', current_ip) is not None + + if is_ipv4: + LOGGER.debug(f"[OK][{resolver}] Current IP: '{current_ip}'", extra = { 'resolver': resolver, 'current_ip': current_ip }) + return current_ip # Break if we have found our IP + + LOGGER.warning(f"[WARNING][{resolver}] '{current_ip}' is not IPv4", extra = { 'resolver': resolver, 'ip': current_ip }) + + raise CouldNotGetIPError('Could not get IP.') + +def _cloudflare_api_request(method: Literal['GET', 'OPTIONS', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE'], endpoint: str, api_key: str, headers: dict | None = None, timeout: int | None = 5, **kwargs) -> dict: + response = requests.request( + method, + f'https://api.cloudflare.com/client/v4/{endpoint}', + headers = { + 'Authorization': f'Bearer {api_key}', + 'Content-Type': 'application/json' + } | (headers or {}), + timeout = timeout, + **kwargs + ) + + LOGGER.debug('Issued Cloudflare API request.', extra = { 'method': method, 'endpoint': endpoint, 'headers': headers, 'kwargs': kwargs, 'status_code': response.status_code, 'content': response.content }) + + if not response.ok: + LOGGER.error('', extra = { 'status_code': response.status_code, 'content': response.content }) + raise APIError(response.content) + + result = response.json() + + if not result['success']: + LOGGER.error('API call was not successful.', extra = { 'status_code': response.status_code, 'content': response.content }) + raise APIError('API call was not successful.') + + return result['result'] + +def api_key_is_valid(api_key: str) -> bool: + result = _cloudflare_api_request('GET', 'user/tokens/verify', api_key) + return result['status'] == 'active' + +def get_zone_id(api_key: str, domain: str) -> str: + result = _cloudflare_api_request('GET', 'zones', api_key, params = { 'name': domain }) + + if len(result) != 1: + message = f"Expected a list of length '1' but got length '{len(result)}'" + raise ZoneNotFoundError(message) + + return result[0]['id'] + +def get_A_records(api_key: str, zone_id: str) -> dict: # pylint: disable=invalid-name + result = _cloudflare_api_request('GET', f'zones/{zone_id}/dns_records', api_key, params = { 'type': 'A' }) + return result + +def create_A_record(api_key: str, zone_id: str, name: str, value: str) -> None: # pylint: disable=invalid-name + _cloudflare_api_request( + 'POST', + f'zones/{zone_id}/dns_records', + api_key, + json = { + 'type': 'A', + 'name': name, + 'content': value + } + ) + +def update_A_record(api_key: str, zone_id: str, record_id: str, value: str) -> None: # pylint: disable=invalid-name + _cloudflare_api_request( + 'PATCH', + f'/zones/{zone_id}/dns_records/{record_id}', + api_key, + json = { 'content': value } + ) diff --git a/src/cloudns/logger/__init__.py b/src/cloudns/logger/__init__.py new file mode 100644 index 0000000..4857813 --- /dev/null +++ b/src/cloudns/logger/__init__.py @@ -0,0 +1,3 @@ +from logging import Logger, getLogger + +from .logger import setup_logging diff --git a/src/cloudns/logger/logger.py b/src/cloudns/logger/logger.py new file mode 100644 index 0000000..be84f1d --- /dev/null +++ b/src/cloudns/logger/logger.py @@ -0,0 +1,175 @@ +import sys +import json +import logging +import logging.config +import logging.handlers +import atexit +from datetime import datetime, timezone +from typing_extensions import override + + + +LOG_RECORD_BUILTIN_ATTRS = { + "args", + "asctime", + "created", + "exc_info", + "exc_text", + "filename", + "funcName", + "levelname", + "levelno", + "lineno", + "module", + "msecs", + "message", + "msg", + "name", + "pathname", + "process", + "processName", + "relativeCreated", + "stack_info", + "thread", + "threadName", + "taskName", +} + + +class JSONFormatter(logging.Formatter): + + def __init__(self, *, fmt_keys: dict[str, str] | None = None): + super().__init__() + self.fmt_keys = fmt_keys if fmt_keys is not None else {} + + @override + def format(self, record: logging.LogRecord) -> str: + message = self._prepare_log_dict(record) + return json.dumps(message, default=str) + + def _prepare_log_dict(self, record: logging.LogRecord) -> dict: + always_fields = { + 'message': record.getMessage(), + 'timestamp': datetime.fromtimestamp( + record.created, tz=timezone.utc + ).isoformat() + } + + if record.exc_info is not None: + always_fields['exc_info'] = self.formatException(record.exc_info) + + if record.stack_info is not None: + always_fields['stack_info'] = self.formatStack(record.stack_info) + + message = { + key: msg_value + if (msg_value := always_fields.pop(value, None)) is not None + else getattr(record, value) + for key, value in self.fmt_keys.items() + } + + message.update(always_fields) + + for key, value in record.__dict__.items(): + if key not in LOG_RECORD_BUILTIN_ATTRS: + message[key] = value + + return message + + +class NonErrorFilter(logging.Filter): + @override + def filter(self, record: logging.LogRecord) -> bool | logging.LogRecord: + return record.levelno <= logging.INFO + + +def generate_log_config(log_path: str | None = None, backup_count: int = 3, max_bytes: int = 1024 * 1024 * 10) -> dict: + logger_config: dict = { + 'version': 1, + 'disable_existing_loggers': False, + 'filters': { + 'no_errors': { + "()": NonErrorFilter + } + }, + 'formatters': { + 'simple': { + 'format': '[%(asctime)s][%(levelname)s] %(message)s', + 'datefmt': '%Y-%m-%d %H:%M:%S' + }, + 'detailed': { + 'format': '[%(asctime)s][%(levelname)s] %(message)s', + 'datefmt': '%Y-%m-%dT%H:%M:%S%z' # ISO-8601 Timestamp + }, + 'json': { + '()': JSONFormatter, + 'fmt_keys': { + 'timestamp': 'timestamp', + 'level': 'levelname', + 'message': 'message', + 'logger': 'name', + 'module': 'module', + 'function': 'funcName', + 'line': 'lineno', + 'thread_name': 'threadName' + }, + } + }, + 'handlers': { + 'stdout': { + 'class': logging.StreamHandler, + 'level': 'DEBUG', + 'filters': ['no_errors'], + 'formatter': 'simple', + 'stream': 'ext://sys.stdout' + }, + 'stderr': { + 'class': logging.StreamHandler, + 'level': 'WARNING', + 'formatter': 'simple', + 'stream': 'ext://sys.stderr' + } + } | ({'file': { + 'class': logging.handlers.RotatingFileHandler, + 'level': 'DEBUG', + 'formatter': 'json', + 'filename': log_path, + 'maxBytes': max_bytes, + 'backupCount': backup_count + }} if log_path is not None else {}), + 'loggers': { + 'root': { + 'level': 'DEBUG', + 'handlers': [ + 'stdout', + 'stderr' + ] + (['file'] if log_path is not None else []), + } + } + } + + if sys.version_info >= (3, 12): # Python 3.12+ + logger_config['handlers']['queue_handler'] = { + 'class': logging.handlers.QueueHandler, + 'respect_handler_level': True, + 'handlers': [ + 'stdout', + 'stderr' + ] + (['file'] if log_path is not None else []), + } + + logger_config['loggers']['root']['handlers'] = ['queue_handler'] + + return logger_config + + +def setup_logging(log_path: str | None = None, backup_count: int = 3, max_bytes: int = 1024 * 1024 * 10) -> None: + log_config = generate_log_config( + log_path if log_path != '-' else None, backup_count, max_bytes) + logging.config.dictConfig(log_config) + + if sys.version_info >= (3, 12): # Python 3.12+ + queue_handler = logging.getHandlerByName('queue_handler') + if queue_handler is not None: + queue_handler.listener.start() # type: ignore + atexit.register(queue_handler.listener.stop) # type: ignore diff --git a/src/cloudns/main.py b/src/cloudns/main.py new file mode 100644 index 0000000..d6e2409 --- /dev/null +++ b/src/cloudns/main.py @@ -0,0 +1,123 @@ +import os +import sys +import argparse +import shutil +from typing import Any + +from typing_extensions import Sequence + +from .logger import setup_logging, getLogger +from .types import Config +from . import cloudns + + +def parse_args(args: Sequence[str]): + + class EnvDefault(argparse.Action): + # Custom action to enable environment variables + # https://stackoverflow.com/questions/10551117/setting-options-from-environment-variables-when-using-argparse/10551190#10551190 + def __init__(self, envvar: str, const: Any | None = None, default: Any = None, required: bool = True, **kwargs): + if envvar in os.environ: + default = os.environ[envvar] if const is None else const + + if const is not None: + required = False + kwargs['const'] = const + kwargs['nargs'] = 0 # no additional arguments are expected + + # Make the argument optional if a default is determined + if default is not None: + required = False + + super().__init__(default=default, required=required, metavar=envvar, **kwargs) + + def __call__(self, parser, namespace, values, option_string=None): + # If const is defined (store_const behavior), set it directly + setattr(namespace, self.dest, self.const if self.const is not None else values) + + def formatter(prog): + return argparse.ArgumentDefaultsHelpFormatter(prog, max_help_position=shutil.get_terminal_size().columns) + + parser = argparse.ArgumentParser(formatter_class=formatter) + + parser.add_argument( + '-c', '--config', type = argparse.FileType('r'), + action = EnvDefault, envvar = 'CLOUDNS_CONFIG', + default = './config.json', + help = 'Path to config file in JSON format.' + ) + + parser.add_argument( + '-d', '--dry-run', type = bool, + action = EnvDefault, envvar = 'CLOUDNS_DRY_RUN', + const = True, default = False, + help = 'Do not commit any changes' + ) + + return parser.parse_args(args) + + +def run(argv: Sequence[str]) -> None: # pylint: disable=too-many-locals + # Parse command-line parameters + args = parse_args(argv) # pylint: disable=unused-variable + + config = Config.model_validate_json(args.config.read()) + + print(config.log_path) + setup_logging(config.log_path) + logger = getLogger('cloudns') + logger.debug('Started program.', extra = { 'argv': argv }) + + try: + current_ip = cloudns.get_current_ip(config.resolvers) + + for api_key, domains in config.api.items(): + if not cloudns.api_key_is_valid(api_key): + logger.error(f"API key ending in '{api_key[-4:]}' is not active.") + continue + + zones = {} + for domain in domains: + try: + zones[domain] = cloudns.get_zone_id(api_key, domain) + except cloudns.ZoneNotFoundError as err: + logger.exception(err) + + records_to_update = {} # { ('sub_domain', 'domain'): ('zone_id', 'record_id' | None) } + for domain, zone_id in zones.items(): + records = { record['name']: record for record in cloudns.get_A_records(api_key, zone_id) } + for sub_domain in domains[domain]: + full_domain = f'{sub_domain}.{domain}' if sub_domain != '@' else domain + if full_domain not in records: + logger.info(f"Could not find an A record for '{full_domain}'. Will be created.", extra = { 'sub': sub_domain, 'domain': domain }) + records_to_update[(sub_domain, domain)] = (zone_id, None) + continue + + if (record := records[full_domain])['content'] != current_ip: + logger.info(f"IP for '{full_domain}' does not match current IP. Will be updated.", extra = { 'sub': sub_domain, 'domain': domain, 'content': record['content'] }) + records_to_update[(sub_domain, domain)] = (zone_id, record['id']) + + # Update/Create A Records # + if args.dry_run: + continue + + for (sub, domain), (zone_id, record_id) in records_to_update.items(): + full_domain = f'{sub}.{domain}' if sub != '@' else domain + + if record_id is None: + # Create record + cloudns.create_A_record(api_key, zone_id, full_domain, current_ip) + logger.info(f"A record for '{full_domain}' created.", extra = { 'sub': sub, 'domain': domain }) + continue + + # Update Record + cloudns.update_A_record(api_key, zone_id, record_id, current_ip) + logger.info(f"'A record for '{full_domain}' updated.", extra = { 'sub': sub, 'domain': domain }) + + except Exception as err: + logger.exception(err) + raise err from err + + +def main() -> None: + run(sys.argv[1:]) diff --git a/src/cloudns/py.typed b/src/cloudns/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/src/cloudns/types.py b/src/cloudns/types.py new file mode 100644 index 0000000..6447bd5 --- /dev/null +++ b/src/cloudns/types.py @@ -0,0 +1,19 @@ +from os import path + +from typing_extensions import Self +from pydantic import BaseModel, Field, model_validator + +class Config(BaseModel): + api: dict[str, dict[str, set[str]]] + resolvers: list[str] + log_path: str | None = Field(alias = 'log-path', default = None) + + @model_validator(mode = 'after') + def check_if_api_key_is_path(self) -> Self: + for key in set(self.api.keys()): + if path.exists(key): + with open(key, encoding = 'utf-8') as file: + api_key = file.read().strip() + self.api[api_key] = self.api.pop(key) + + return self diff --git a/tests/__main__.py b/tests/__main__.py new file mode 100644 index 0000000..15a901a --- /dev/null +++ b/tests/__main__.py @@ -0,0 +1,5 @@ +import sys + +import pytest + +retcode = pytest.main(sys.argv[1:]) diff --git a/tests/test_imports.py b/tests/test_imports.py new file mode 100644 index 0000000..edfa010 --- /dev/null +++ b/tests/test_imports.py @@ -0,0 +1,2 @@ +def test_import(): + import cloudns # pylint: disable=unused-import,import-outside-toplevel