initial commit

This commit is contained in:
Kristian Krsnik 2025-03-23 21:08:31 +01:00
commit 8e45625fc1
Signed by: Kristian
GPG Key ID: FD1330AC9F909E85
18 changed files with 1124 additions and 0 deletions

1
.envrc Normal file
View File

@ -0,0 +1 @@
use flake

26
.gitignore vendored Normal file
View File

@ -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

98
README.md Normal file
View File

@ -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

27
flake.lock generated Normal file
View File

@ -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
}

105
flake.nix Normal file
View File

@ -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;
};
}

323
log.txt Normal file
View File

@ -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}}'"}

63
nix/module.nix Normal file
View File

@ -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 = "dcloudns.service";
};
};
};
}

40
pyproject.toml Normal file
View File

@ -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",
]

1
src/cloudns/__init__.py Normal file
View File

@ -0,0 +1 @@
from .main import run

3
src/cloudns/__main__.py Normal file
View File

@ -0,0 +1,3 @@
from .main import main
main()

110
src/cloudns/cloudns.py Normal file
View File

@ -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 }
)

View File

@ -0,0 +1,3 @@
from logging import Logger, getLogger
from .logger import setup_logging

View File

@ -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

123
src/cloudns/main.py Normal file
View File

@ -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:])

0
src/cloudns/py.typed Normal file
View File

19
src/cloudns/types.py Normal file
View File

@ -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

5
tests/__main__.py Normal file
View File

@ -0,0 +1,5 @@
import sys
import pytest
retcode = pytest.main(sys.argv[1:])

2
tests/test_imports.py Normal file
View File

@ -0,0 +1,2 @@
def test_import():
import cloudns # pylint: disable=unused-import,import-outside-toplevel