Commit 4bcb74aa authored by Vitaly Lipatov's avatar Vitaly Lipatov

web-api: add googlevideo CDN collection and API

- Add POST/GET /api/googlevideo endpoints for pattern management - Add collect-googlevideo.sh daemon (tails BIND query log for CDN domains) - Normalizes rr3---sn-XXX.googlevideo.com to rr[1-8]---sn-XXX pattern Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 3efd019e
#!/bin/bash
# Collect googlevideo CDN domains from BIND query log and send to route-web-api.
# Runs as a systemd service on dhcp (DNS server).
# Tails the query log, extracts new rr*---sn-*.googlevideo.com domains,
# normalizes them and sends via API to igw.
API_URL="http://igw.etersoft.ru/api/googlevideo"
QUERY_LOG="/var/lib/bind/var/log/named/queries"
# Local cache of already-sent patterns (survives restarts)
SEEN_FILE="/var/lib/collect-googlevideo/seen-patterns"
mkdir -p "$(dirname "$SEEN_FILE")"
touch "$SEEN_FILE"
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') $*"
}
# Load known patterns into memory
declare -A SEEN
while IFS= read -r line; do
[ -n "$line" ] && SEEN["$line"]=1
done < "$SEEN_FILE"
log "Started, ${#SEEN[@]} known patterns"
tail -F "$QUERY_LOG" 2>/dev/null | grep --line-buffered 'googlevideo\.com' | while IFS= read -r line; do
# Extract domain: "query: rr4---sn-ajixh5-55.googlevideo.com IN A"
domain=$(echo "$line" | grep -oP 'query: \Krr\d+---sn-[a-z0-9-]+\.googlevideo\.com')
[ -z "$domain" ] && continue
# Normalize: rr4---sn-xxx -> sn-xxx
suffix="${domain#rr*---}"
pattern="rr[1-8]---${suffix}"
# Skip if already seen
[ -n "${SEEN[$pattern]}" ] && continue
SEEN["$pattern"]=1
# Send to API
response=$(curl -s -o /dev/null -w '%{http_code}' \
-X POST "$API_URL" \
-H 'Content-Type: application/json' \
-d "{\"domain\":\"$domain\"}" \
--connect-timeout 5 --max-time 10)
if [ "$response" = "200" ]; then
echo "$pattern" >> "$SEEN_FILE"
log "NEW $pattern (from $domain) -> API $response"
else
# Don't cache on failure — retry next time
unset 'SEEN[$pattern]'
log "FAIL $pattern (from $domain) -> API $response"
fi
done
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment