57 lines
2.4 KiB
Bash
Executable File
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")
|
|
'
|