Files

57 lines
2.4 KiB
Bash
Executable File

#!/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")
'