From 885cea3899e1f97977c197ea10ce8e461d423abf Mon Sep 17 00:00:00 2001
From: Nathan Adhitya <NathanAdhitya@users.noreply.github.com>
Date: Tue, 19 Jul 2022 19:23:56 +0700
Subject: [PATCH] added AdGuard Home scripts

---
 scripts/README.md             |  8 +++-
 scripts/config.example.json   |  1 +
 scripts/create-adguardhome.sh | 77 +++++++++++++++++++++++++++++++++++
 3 files changed, 85 insertions(+), 1 deletion(-)
 create mode 100644 scripts/create-adguardhome.sh

diff --git a/scripts/README.md b/scripts/README.md
index 35d2ed9..26463c1 100755
--- a/scripts/README.md
+++ b/scripts/README.md
@@ -7,6 +7,7 @@ configuration which can be utilised with:
 
 * Dnsmasq
 * Unbound
+* AdGuard Home
 
 ## Usage
 
@@ -39,4 +40,9 @@ configuration which can be utilised with:
 
 **This also applies to users utilising the script alongside Pi-hole.**
 
-Multi-IP Lancache setups are only supported with Dnsmasq or Pi-hole versions >= 2.86 or 2021.09 respectively.
\ No newline at end of file
+Multi-IP Lancache setups are only supported with Dnsmasq or Pi-hole versions >= 2.86 or 2021.09 respectively.
+
+### Notes for AdGuard Home users
+
+1. In the `config.json`, you may want to add an entry for your non-cached DNS upstreams. You can input this in `ip.adguardhome_upstream` as an array.
+2. Once you have ran the script, you can point the upstream list to the text file generated. For example: `upstream_dns_file: "/root/cache-domains/scripts/output/adguardhome/cache-domains.txt"`
\ No newline at end of file
diff --git a/scripts/config.example.json b/scripts/config.example.json
index 18362c4..e8f8717 100644
--- a/scripts/config.example.json
+++ b/scripts/config.example.json
@@ -1,5 +1,6 @@
 {
 	"ips": {
+		"adguardhome_upstream": ["tls://dns.google","https://dns.google/dns-query"],
 		"steam":	["10.10.3.10", "10.10.3.11"],
 		"origin":	"10.10.3.12",
 		"blizzard":	"10.10.3.13",
diff --git a/scripts/create-adguardhome.sh b/scripts/create-adguardhome.sh
new file mode 100644
index 0000000..352a8d8
--- /dev/null
+++ b/scripts/create-adguardhome.sh
@@ -0,0 +1,77 @@
+#!/bin/bash
+basedir=".."
+outputdir="output/adguardhome"
+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 -r line; do
+        ip=$(jq ".ips[\"${line}\"]" config.json)
+        declare "cacheip${line}"="${ip}"
+done <<< $(jq -r '.ips | to_entries[] | .key' config.json)
+
+agh_upstreams=$(jq -r ".ips[\"adguardhome_upstream\"] | .[]" config.json)
+
+while read -r 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}
+
+# add upstreams
+echo "${agh_upstreams}" >> "${outputdir}/cache-domains.txt"
+
+while read -r 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=$(jq -r 'if type == "array" then .[] else . end' <<< ${!cacheipname} | xargs)
+        while read -r fileid; do
+                while read -r filename; do
+                        destfilename="cache-domains.txt"  #$(echo $filename | sed -e 's/txt/conf/')
+                        outputfile=${outputdir}/${destfilename}
+                        touch ${outputfile}
+                        while read -r fileentry; do
+                                # Ignore comments, newlines and wildcards
+                                if [[ ${fileentry} == \#* ]] || [[ -z ${fileentry} ]]; then
+                                        continue
+                                fi
+                                parsed=$(echo ${fileentry} | sed -e "s/^\*\.//")
+                                for i in ${cacheip}; do
+                                        if grep -qx "\[/${parsed}/\]${i}" "${outputfile}"; then
+                                                continue
+                                        fi
+                                        echo "[/${parsed}/]${i}" >> "${outputfile}"
+                                done
+                        done <<< $(cat ${basedir}/${filename} | sort);
+                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})
+
+cat << EOF
+Configuration generation completed.
+
+Please point the setting upstream_dns_file in AdGuardHome.yaml to the generated file.
+For example:
+upstream_dns_file: "/root/cache-domains/scripts/output/adguardhome/cache-domains.txt"
+EOF
\ No newline at end of file