feat: add coredns mysql image build and updater
This commit is contained in:
1 parent
c3ab4cfb70
commit
6835e480c1
7 files changed
+195
-1
No files matched your search
Executable
+56
@@ -0,0 +1,56 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: MIT
|
||||
# Copyright (C) 2026 Bryan Joshua Pedini
|
||||
|
||||
set -eu
|
||||
image=$1
|
||||
version=$2
|
||||
output=$(docker run --rm "$image" -plugins)
|
||||
printf '%s\n' "$output" | grep -qx 'mysql'
|
||||
docker run --rm "$image" -version | grep -F "CoreDNS-${version}"
|
||||
network="coredns-ci-$$"
|
||||
db="coredns-db-$$"
|
||||
dns="coredns-dns-$$"
|
||||
config=$(mktemp)
|
||||
cleanup() {
|
||||
docker rm -f "$dns" "$db" >/dev/null 2>&1 || true
|
||||
docker network rm "$network" >/dev/null 2>&1 || true
|
||||
rm -f "$config"
|
||||
}
|
||||
trap cleanup EXIT INT TERM
|
||||
docker network create --internal "$network" >/dev/null
|
||||
docker run -d --name "$db" --network "$network" --network-alias database -e MARIADB_ROOT_PASSWORD=test -e MARIADB_DATABASE=coredns mariadb:11 >/dev/null
|
||||
ready=0
|
||||
attempt=0
|
||||
while [ "$attempt" -lt 60 ]; do
|
||||
attempt=$((attempt + 1))
|
||||
if docker exec "$db" mariadb -uroot -ptest -e 'SELECT 1' >/dev/null 2>&1; then ready=1; break; fi
|
||||
sleep 1
|
||||
done
|
||||
[ "$ready" = 1 ] || { docker logs "$db"; exit 1; }
|
||||
docker exec -i "$db" mariadb -uroot -ptest coredns <<'SQL'
|
||||
CREATE TABLE coredns_records (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, zone VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, ttl INT DEFAULT NULL, content TEXT, record_type VARCHAR(255) NOT NULL);
|
||||
INSERT INTO coredns_records (zone, name, ttl, content, record_type) VALUES ('example.test.', 'www', 30, '{"ip":"192.0.2.10"}', 'A');
|
||||
SQL
|
||||
printf '%s\n' '.:1053 {' ' mysql {' ' dsn root:test@tcp(database:3306)/coredns' ' }' ' errors' '}' > "$config"
|
||||
docker create --name "$dns" --network "$network" --network-alias dns "$image" -conf /Corefile >/dev/null
|
||||
docker cp "$config" "$dns:/Corefile"
|
||||
docker start "$dns" >/dev/null
|
||||
docker run --rm --network "$network" python:3.13-slim python -c '
|
||||
import socket, struct, time
|
||||
query = bytes.fromhex("123401000001000000000000") + b"\x03www\x07example\x04test\0" + struct.pack("!HH", 1, 1)
|
||||
for attempt in range(30):
|
||||
try:
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
|
||||
sock.settimeout(1)
|
||||
sock.sendto(query, ("dns", 1053))
|
||||
response, _ = sock.recvfrom(4096)
|
||||
if response[:2] == b"\x12\x34" and response[3] & 15 == 0 and struct.unpack("!H", response[6:8])[0] and b"\xc0\x00\x02\x0a" in response:
|
||||
print("MySQL-backed DNS query passed")
|
||||
break
|
||||
except OSError:
|
||||
pass
|
||||
time.sleep(1)
|
||||
else:
|
||||
raise SystemExit("MySQL-backed DNS query failed")
|
||||
'
|
||||
@@ -0,0 +1,24 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
# Copyright (C) 2026 Bryan Joshua Pedini
|
||||
|
||||
import json
|
||||
import re
|
||||
import urllib.request
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def fetch(url):
|
||||
request = urllib.request.Request(url, headers={"Accept": "application/vnd.github+json", "User-Agent": "coredns-mysql-updater"})
|
||||
with urllib.request.urlopen(request, timeout=30) as response:
|
||||
return json.load(response)
|
||||
|
||||
|
||||
release = fetch("https://api.github.com/repos/coredns/coredns/releases/latest")
|
||||
plugin = fetch("https://api.github.com/repos/cloud66-oss/coredns_mysql/commits/HEAD")
|
||||
tag = release["tag_name"]
|
||||
revision = plugin["sha"]
|
||||
if not re.fullmatch(r"v[0-9]+\.[0-9]+\.[0-9]+", tag):
|
||||
raise SystemExit(f"Unexpected CoreDNS release: {tag}")
|
||||
if not re.fullmatch(r"[0-9a-f]{40}", revision):
|
||||
raise SystemExit("Unexpected plugin revision")
|
||||
Path("versions.env").write_text(f"COREDNS_VERSION={tag[1:]}\nMYSQL_PLUGIN_REV={revision}\n")
|
||||
Reference in new issue
Block a user