From b365bb205c602d7d5bff81be8ff0575e069a75a3 Mon Sep 17 00:00:00 2001
From: Crabbey <crabbey.zl@gmail.com>
Date: Sat, 23 Jun 2018 18:25:18 +0100
Subject: [PATCH] Add unbound generation script (#16)

---
 .gitignore                  |  1 +
 scripts/config.example.json | 19 +++++++++++
 scripts/create-unbound.sh   | 63 +++++++++++++++++++++++++++++++++++++
 3 files changed, 83 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 scripts/config.example.json
 create mode 100755 scripts/create-unbound.sh

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..86af95d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+scripts/output
diff --git a/scripts/config.example.json b/scripts/config.example.json
new file mode 100644
index 0000000..6d58ee4
--- /dev/null
+++ b/scripts/config.example.json
@@ -0,0 +1,19 @@
+{
+	"ips": {
+		"steam":	"10.10.3.11",
+		"origin":	"10.10.3.12",
+		"blizzard":	"10.10.3.13",
+		"windows":	"10.10.3.14",
+		"riot":		"10.10.3.15",
+		"generic":	"10.10.3.16"
+	},
+	"cache_domains": {
+		"default": 	"generic",
+		"blizzard": 	"blizzard",
+		"origin": 	"origin",
+		"riot": 	"riot",
+		"steam": 	"steam",
+		"wsus": 	"windows",
+		"xboxlive": 	"windows"
+	}
+}
diff --git a/scripts/create-unbound.sh b/scripts/create-unbound.sh
new file mode 100755
index 0000000..c0d4c0e
--- /dev/null
+++ b/scripts/create-unbound.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+basedir=".."
+outputdir="output/unbound"
+path="${basedir}/cache_domains.json"
+
+export IFS=' '
+
+test=$(which jq);
+out=$?
+if [ $out -gt 0 ] ; then
+	echo "This script requires jq to be installed."
+	echo "Your package manager should be able to find it"
+	exit 1
+fi
+
+cachenamedefault="disabled"
+
+while read line; do 
+	ip=$(jq -r ".ips[\"${line}\"]" config.json)
+	declare "cacheip$line"="$ip"
+done <<< $(jq -r '.ips | to_entries[] | .key' config.json)
+
+while read line; do 
+	name=$(jq -r ".cache_domains[\"${line}\"]" config.json)
+	declare "cachename$line"="$name"
+done <<< $(jq -r '.cache_domains | to_entries[] | .key' config.json)
+
+rm -rf ${outputdir}
+mkdir -p ${outputdir}
+while read entry; do 
+	unset cacheip
+	unset cachename
+	key=$(jq -r ".cache_domains[$entry].name" $path)
+	cachename="cachename${key}"
+	if [ -z "${!cachename}" ]; then
+		cachename="cachenamedefault"
+	fi
+	if [[ ${!cachename} == "disabled" ]]; then
+		continue;
+	fi
+	cacheipname="cacheip${!cachename}"
+	cacheip=${!cacheipname}
+	while read fileid; do
+		while read filename; do
+			destfilename=$(echo $filename | sed -e 's/txt/conf/')
+			outputfile=${outputdir}/${destfilename}
+			touch $outputfile
+			echo "server:" >> $outputfile
+			while read fileentry; do
+				# Ignore comments
+				if [[ $fileentry == \#* ]]; then
+					continue
+				fi
+				parsed=$(echo $fileentry | sed -e "s/^\*\.//")
+				if grep -q "$parsed" $outputfile; then
+					continue
+				fi
+				echo "  local-zone: \"${parsed}\" redirect" >> $outputfile
+				echo "  local-data: \"${parsed} 30 IN A ${cacheip}\"" >> $outputfile
+			done <<< $(cat ${basedir}/$filename);
+		done <<< $(jq -r ".cache_domains[$entry].domain_files[$fileid]" $path)
+	done <<< $(jq -r ".cache_domains[$entry].domain_files | to_entries[] | .key" $path)
+done <<< $(jq -r '.cache_domains | to_entries[] | .key' $path)