cache-domains/scripts/create-rpz.sh
Amir Zarrinkafsh 098c1e9c54
feat: add lefthook, megalinter and update editorconfig (#270)
This change adds [LeftHook](https://lefthook.dev/) as a GitHub hook management tool alongside [MegaLinter](https://megalinter.io/) to lint all relevant files within the repository.

For users that don't end up installing LeftHook for pre-commit hooks, megalinter picks up the necessary formatting changes and reports them.

* feat: add lefthook, megalinter and update editorconfig
* fix: lint commit ordering
* refactor: adjust megalinter reporters
* refactor: adjust description for cache domains
* refactor: single - for passing options
* refactor: add repo-specific fmt in megalinter pre-commands too
2025-07-24 10:59:52 +10:00

114 lines
2.9 KiB
Bash
Executable File

#!/bin/bash
basedir=".."
outputdir="output/rpz"
path="${basedir}/cache_domains.json"
basedomain=${1:-lancache.net}
export IFS=" "
if ! command -v jq >/dev/null; then
cat <<-EOF
This script requires jq to be installed.
Your package manager should be able to find it
EOF
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)"
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}
outputfile=${outputdir}/db.rpz.${basedomain}
cat >"${outputfile}" <<EOF
\$TTL 60 ; default TTL
\$ORIGIN rpz.${basedomain}.
@ SOA ns1.${basedomain}. admin.${basedomain}. (
$(date +%Y%m%d01) ; serial
604800 ; refresh (1 week)
600 ; retry (10 mins)
600 ; expire (10 mins)
600 ; minimum (10 mins)
)
NS ns1.${basedomain}.
NS ns2.${basedomain}.
EOF
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
echo "" >>"${outputfile}"
echo "; ${filename//.txt//}" >>"${outputfile}"
while read -r fileentry; do
# Ignore comments and newlines
if [[ ${fileentry} == \#* ]] || [[ -z ${fileentry} ]]; then
continue
fi
parsed=${fileentry}
if grep -qx "^\"${parsed}\". " "${outputfile}"; then
continue
fi
t=""
for i in ${cacheip}; do
# only one cname per domain is allowed
if [[ ${t} = "CNAME" ]]; then
continue
fi
# for cnames you must use a fqdn with trailing dot
t="CNAME"
if [[ ${i} =~ ^[0-9\.]+$ ]]; then
t="A"
elif [[ ! ${i} =~ \.$ ]]; then
i="${i}."
fi
printf "%-50s IN %s %s\n" \
"${parsed}" \
"${t}" \
"${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 include the rpz zone in your bind configuration"
- cp ${outputfile} /etc/bind
- configure the zone and use it
options {
[...]
response-policy {zone "rpz.${basedomain}";};
[...]
}
zone "rpz.$basedomain" {
type master;
file "/etc/bind/db.rpz.${basedomain}";
};
EOF