Compare commits

...

4 Commits

Author SHA1 Message Date
Kevin Brierly
55129a7e67
Merge 56a6d2f00f into 098c1e9c54 2025-07-25 12:26:49 +02:00
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
Kevin Brierly
56a6d2f00f
Update create-blocky.sh 2022-11-13 21:21:13 -06:00
Kevin Brierly
dec3811066
Create create-blocky.sh
Add create script for blocky custom dns yaml configuration
2022-11-13 20:54:52 -06:00
26 changed files with 699 additions and 492 deletions

View File

@ -2,7 +2,13 @@ root = true
[*] [*]
indent_style = space indent_style = space
indent_size = 4 indent_size = 2
trim_trailing_whitespace = true trim_trailing_whitespace = true
end_of_line = lf end_of_line = lf
insert_final_newline = true insert_final_newline = true
[*.md]
indent_size = 0
[*.sh]
indent_style = tab

55
.github/workflows/mega-linter.yml vendored Normal file
View File

@ -0,0 +1,55 @@
# MegaLinter GitHub Action configuration file
# More info at https://megalinter.io
---
name: MegaLinter
on:
pull_request:
branches:
- master
env:
GITHUB_STATUS_REPORTER: true
concurrency:
group: ${{ github.ref }}-${{ github.workflow }}
cancel-in-progress: true
jobs:
megalinter:
name: MegaLinter
runs-on: ubuntu-latest
permissions:
contents: write
issues: write
pull-requests: write
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }}
fetch-depth: 0
- name: MegaLinter
uses: oxsecurity/megalinter@v8
id: ml
env:
VALIDATE_ALL_CODEBASE: >-
${{
github.event_name == 'push' &&
github.ref == 'refs/heads/master'
}}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Archive production artifacts
uses: actions/upload-artifact@v4
if: success() || failure()
with:
name: MegaLinter reports
include-hidden-files: "true"
path: |
megalinter-reports
mega-linter.log

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
scripts/output scripts/output
scripts/config.json scripts/config.json
megalinter-reports/

19
.lefthook.yml Normal file
View File

@ -0,0 +1,19 @@
pre-commit:
parallel: true
jobs:
- name: sort cache domains
run: jq ".cache_domains |= sort_by(.name)" {all_files} > {all_files}.tmp && mv {all_files}.tmp {all_files}
glob: "cache_domains.json"
- name: sort cdns
run: |
for f in {all_files}; do
sort -uo ${f} ${f}
done
env:
LC_ALL: C
glob: "*.txt"
- name: megalinter
run: docker run --rm -e USER=$(id -u) -e GROUP=$(id -g) -v "$PWD:/tmp/lint" oxsecurity/megalinter:v8
stage_fixed: true

39
.mega-linter.yml Normal file
View File

@ -0,0 +1,39 @@
# Configuration file for MegaLinter
#
# See all available variables at https://megalinter.io/latest/config-file/ and in
# linters documentation
APPLY_FIXES: all
FLAVOR_SUGGESTIONS: false
PRINT_ALPACA: false
SHOW_ELAPSED_TIME: true
ENABLE:
- ACTION
- BASH
- EDITORCONFIG
- JSON
- MARKDOWN
- SPELL
- YAML
DISABLE_LINTERS:
- JSON_V8R
- MARKDOWN_MARKDOWNLINT
- SPELL_CSPELL
- YAML_V8R
PRE_COMMANDS:
- command: apk add --no-cache yq
cwd: root
- command: yq -i ".cache_domains |= sort_by(.name)" cache_domains.json
cwd: workspace
- command: |
for f in *.txt; do
sort -uo ${f} ${f}
done
cwd: workspace
POST_COMMANDS:
- command: find . -user root -group root -exec chown ${USER}:${GROUP} {} \;
cwd: workspace

View File

@ -1,11 +1,11 @@
dist.blizzard.com *.cdn.blizzard.com
dist.blizzard.com.edgesuite.net
blizzard.vo.llnwd.net blizzard.vo.llnwd.net
blzddist1-a.akamaihd.net blzddist1-a.akamaihd.net
blzddist2-a.akamaihd.net blzddist2-a.akamaihd.net
blzddist3-a.akamaihd.net blzddist3-a.akamaihd.net
cdn.blizzard.com
dist.blizzard.com
dist.blizzard.com.edgesuite.net
edge.blizzard.top.comcast.net
level3.blizzard.com level3.blizzard.com
nydus.battle.net nydus.battle.net
edge.blizzard.top.comcast.net
cdn.blizzard.com
*.cdn.blizzard.com

View File

@ -2,19 +2,14 @@
"cache_domains": [ "cache_domains": [
{ {
"name": "arenanet", "name": "arenanet",
"description": "CDN for guild wars, HoT", "description": "CDN for Guild Wars, HoT",
"domain_files": ["arenanet.txt"] "domain_files": ["arenanet.txt"]
}, },
{ {
"name": "blizzard", "name": "blizzard",
"description": "CDN for blizzard/battle.net", "description": "CDN for Blizzard/Battle.net",
"domain_files": ["blizzard.txt"] "domain_files": ["blizzard.txt"]
}, },
{
"name": "cod",
"description": "CDN for Call of Duty",
"domain_files": ["cod.txt"]
},
{ {
"name": "bsg", "name": "bsg",
"description": "CDN for Battle State Games, Tarkov", "description": "CDN for Battle State Games, Tarkov",
@ -25,9 +20,14 @@
"description": "CDN for City of Heroes (Homecoming)", "description": "CDN for City of Heroes (Homecoming)",
"domain_files": ["cityofheroes.txt"] "domain_files": ["cityofheroes.txt"]
}, },
{
"name": "cod",
"description": "CDN for Call of Duty",
"domain_files": ["cod.txt"]
},
{ {
"name": "daybreak", "name": "daybreak",
"description": "Daybreak games CDN", "description": "CDN for Daybreak Games",
"domain_files": ["daybreak.txt"] "domain_files": ["daybreak.txt"]
}, },
{ {
@ -37,27 +37,27 @@
}, },
{ {
"name": "frontier", "name": "frontier",
"description": "CDN for frontier games", "description": "CDN for Frontier Games",
"domain_files": ["frontier.txt"] "domain_files": ["frontier.txt"]
}, },
{
"name": "nexusmods",
"description": "Nexus mods / skyrim content",
"domain_files": ["nexusmods.txt"]
},
{ {
"name": "neverwinter", "name": "neverwinter",
"description": "Cryptic CDN for Neverwinter", "description": "Cryptic CDN for Neverwinter",
"domain_files": ["neverwinter.txt"] "domain_files": ["neverwinter.txt"]
}, },
{
"name": "nexusmods",
"description": "CDN for Nexus Mods/Skyrim content",
"domain_files": ["nexusmods.txt"]
},
{ {
"name": "nintendo", "name": "nintendo",
"description": "CDN for Nintendo consoles and download servers", "description": "CDN for Nintendo consoles",
"domain_files": ["nintendo.txt"] "domain_files": ["nintendo.txt"]
}, },
{ {
"name": "origin", "name": "origin",
"description": "CDN for origin", "description": "CDN for Origin",
"notes": "Should be enabled for HTTP traffic only or with a HTTPS proxy else origin client download fails", "notes": "Should be enabled for HTTP traffic only or with a HTTPS proxy else origin client download fails",
"mixed_content": true, "mixed_content": true,
"domain_files": ["origin.txt"] "domain_files": ["origin.txt"]
@ -74,17 +74,17 @@
}, },
{ {
"name": "riot", "name": "riot",
"description": "CDN for riot games", "description": "CDN for Riot Games",
"domain_files": ["riot.txt"] "domain_files": ["riot.txt"]
}, },
{ {
"name": "rockstar", "name": "rockstar",
"description": "CDN for rockstar games", "description": "CDN for Rockstar Games",
"domain_files": ["rockstar.txt"] "domain_files": ["rockstar.txt"]
}, },
{ {
"name": "sony", "name": "sony",
"description": "CDN for sony / playstation", "description": "CDN for Sony/PSN",
"domain_files": ["sony.txt"] "domain_files": ["sony.txt"]
}, },
{ {
@ -94,19 +94,24 @@
}, },
{ {
"name": "steam", "name": "steam",
"description": "CDN for steam platform", "description": "CDN for Steam",
"domain_files": ["steam.txt"] "domain_files": ["steam.txt"]
}, },
{
"name": "uplay",
"description": "CDN for uplay downloader",
"domain_files": ["uplay.txt"]
},
{ {
"name": "teso", "name": "teso",
"description": "CDN for The Elder Scrolls Online", "description": "CDN for The Elder Scrolls Online",
"domain_files": ["teso.txt"] "domain_files": ["teso.txt"]
}, },
{
"name": "test",
"description": "CDN for Testing, recommended to enable for additional diagnostics",
"domain_files": ["test.txt"]
},
{
"name": "uplay",
"description": "CDN for Ubisoft",
"domain_files": ["uplay.txt"]
},
{ {
"name": "warframe", "name": "warframe",
"description": "CDN for Warframe", "description": "CDN for Warframe",
@ -114,23 +119,18 @@
}, },
{ {
"name": "wargaming", "name": "wargaming",
"description": "CDN for wargaming.net", "description": "CDN for Wargaming.net",
"domain_files": ["wargaming.net.txt"] "domain_files": ["wargaming.net.txt"]
}, },
{ {
"name": "wsus", "name": "wsus",
"description": "CDN for windows updates", "description": "CDN for Windows Updates",
"domain_files": ["windowsupdates.txt"] "domain_files": ["windowsupdates.txt"]
}, },
{ {
"name": "xboxlive", "name": "xboxlive",
"description": "CDN for xboxlive", "description": "CDN for Xbox Live",
"domain_files": ["xboxlive.txt"] "domain_files": ["xboxlive.txt"]
},
{
"name": "test",
"description": "Test CDN, recommended to enable for additional diagnostics",
"domain_files": ["test.txt"]
} }
] ]
} }

View File

@ -1,4 +1,4 @@
cdn-eu1.homecomingservers.com
cdn-na1.homecomingservers.com cdn-na1.homecomingservers.com
cdn-na2.homecomingservers.com cdn-na2.homecomingservers.com
cdn-na3.homecomingservers.com cdn-na3.homecomingservers.com
cdn-eu1.homecomingservers.com

View File

@ -1,6 +1,2 @@
# Daybreak games
#
# Do NOT cache manifest.patch.daybreakgames.com # Do NOT cache manifest.patch.daybreakgames.com
#
#PS2
pls.patch.daybreakgames.com pls.patch.daybreakgames.com

View File

@ -1,14 +1,14 @@
cdn1.epicgames.com
cdn2.epicgames.com
cdn.unrealengine.com cdn.unrealengine.com
cdn1.epicgames.com
cdn1.unrealengine.com cdn1.unrealengine.com
cdn2.epicgames.com
cdn2.unrealengine.com cdn2.unrealengine.com
cdn3.unrealengine.com cdn3.unrealengine.com
cloudflare.epicgamescdn.com
download.epicgames.com download.epicgames.com
download2.epicgames.com download2.epicgames.com
download3.epicgames.com download3.epicgames.com
download4.epicgames.com download4.epicgames.com
egdownload.fastly-edge.com
epicgames-download1.akamaized.net epicgames-download1.akamaized.net
fastly-download.epicgames.com fastly-download.epicgames.com
cloudflare.epicgamescdn.com
egdownload.fastly-edge.com

View File

@ -1,11 +1,11 @@
*.hac.lp1.d4c.nintendo.net
*.hac.lp1.eshop.nintendo.net
*.wup.eshop.nintendo.net
*.wup.shop.nintendo.net
ccs.cdn.wup.shop.nintendo.net.edgesuite.net ccs.cdn.wup.shop.nintendo.net.edgesuite.net
ecs-lp1.hac.shop.nintendo.net
geisha-wup.cdn.nintendo.net geisha-wup.cdn.nintendo.net
geisha-wup.cdn.nintendo.net.edgekey.net geisha-wup.cdn.nintendo.net.edgekey.net
idbe-wup.cdn.nintendo.net idbe-wup.cdn.nintendo.net
idbe-wup.cdn.nintendo.net.edgekey.net idbe-wup.cdn.nintendo.net.edgekey.net
ecs-lp1.hac.shop.nintendo.net
receive-lp1.dg.srv.nintendo.net receive-lp1.dg.srv.nintendo.net
*.wup.shop.nintendo.net
*.wup.eshop.nintendo.net
*.hac.lp1.d4c.nintendo.net
*.hac.lp1.eshop.nintendo.net

View File

@ -1,3 +1,3 @@
origin-a.akamaihd.net
lvlt.cdn.ea.com
cdn-patch.swtor.com cdn-patch.swtor.com
lvlt.cdn.ea.com
origin-a.akamaihd.net

View File

@ -1,2 +1,2 @@
patches.totemarts.services
patches.totemarts.games patches.totemarts.games
patches.totemarts.services

View File

@ -1,5 +1,5 @@
*.dyn.riotcdn.net
l3cdn.riotgames.com l3cdn.riotgames.com
worldwide.l3cdn.riotgames.com
riotgamespatcher-a.akamaihd.net riotgamespatcher-a.akamaihd.net
riotgamespatcher-a.akamaihd.net.edgesuite.net riotgamespatcher-a.akamaihd.net.edgesuite.net
*.dyn.riotcdn.net worldwide.l3cdn.riotgames.com

View File

@ -3,49 +3,50 @@ basedir=".."
outputdir="output/adguardhome" outputdir="output/adguardhome"
path="${basedir}/cache_domains.json" path="${basedir}/cache_domains.json"
export IFS=' ' export IFS=" "
test=$(which jq); if ! command -v jq >/dev/null; then
if [ $? -gt 0 ] ; then cat <<-EOF
echo "This script requires jq to be installed." This script requires jq to be installed.
echo "Your package manager should be able to find it" Your package manager should be able to find it
EOF
exit 1 exit 1
fi fi
cachenamedefault="disabled" cachenamedefault="disabled"
combinedoutput=$(jq -r ".combined_output" config.json) combinedoutput=$(jq -r ".combined_output" config.json)
while read line; do while read -r line; do
ip=$(jq ".ips[\"${line}\"]" config.json) ip=$(jq ".ips[\"${line}\"]" config.json)
declare "cacheip${line}"="${ip}" declare "cacheip${line}"="${ip}"
done <<< $(jq -r '.ips | to_entries[] | .key' config.json) done <<<"$(jq -r ".ips | to_entries[] | .key" config.json)"
while read line; do while read -r line; do
name=$(jq -r ".cache_domains[\"${line}\"]" config.json) name=$(jq -r ".cache_domains[\"${line}\"]" config.json)
declare "cachename$line"="$name" declare "cachename${line}"="${name}"
done <<< $(jq -r '.cache_domains | to_entries[] | .key' config.json) done <<<"$(jq -r ".cache_domains | to_entries[] | .key" config.json)"
rm -rf ${outputdir} rm -rf ${outputdir}
mkdir -p ${outputdir} mkdir -p ${outputdir}
while read entry; do while read -r entry; do
unset cacheip unset cacheip
unset cachename unset cachename
key=$(jq -r ".cache_domains[$entry].name" ${path}) key=$(jq -r ".cache_domains[$entry].name" ${path})
cachename="cachename${key}" cachename="cachename${key}"
if [ -z "${!cachename}" ]; then if [ -z "${!cachename}" ]; then
cachename="cachenamedefault" cachename=${cachenamedefault}
fi fi
if [[ ${!cachename} == "disabled" ]]; then if [[ ${cachename} == "disabled" ]]; then
continue; continue
fi fi
cacheipname="cacheip${!cachename}" cacheipname="cacheip${!cachename}"
cacheip=$(jq -r 'if type == "array" then .[] else . end' <<< ${!cacheipname} | xargs) cacheip=$(jq -r "if type == \"array\" then .[] else . end" <<<"${!cacheipname}" | xargs)
while read fileid; do while read -r fileid; do
while read filename; do while read -r filename; do
destfilename=$(echo ${filename} | sed -e 's/txt/conf/') destfilename=${filename//txt/conf}
outputfile=${outputdir}/${destfilename} outputfile=${outputdir}/${destfilename}
touch ${outputfile} touch "${outputfile}"
while read fileentry; do while read -r fileentry; do
# Ignore comments and newlines # Ignore comments and newlines
if [[ ${fileentry} == \#* ]] || [[ -z ${fileentry} ]]; then if [[ ${fileentry} == \#* ]] || [[ -z ${fileentry} ]]; then
continue continue
@ -54,24 +55,24 @@ while read entry; do
if [[ $fileentry =~ ^\*\. ]]; then if [[ $fileentry =~ ^\*\. ]]; then
domainprefix="||" domainprefix="||"
fi fi
parsed=$(echo ${fileentry} | sed -e "s/^\*\.//") parsed="${fileentry#\*\.}"
if grep -q "${domainprefix}${parsed}^\$dnsrewrite" ${outputfile}; then if grep -q "${domainprefix}${parsed}^\$dnsrewrite" "${outputfile}"; then
continue continue
fi fi
for i in ${cacheip}; do for i in ${cacheip}; do
echo "${domainprefix}${parsed}^\$dnsrewrite=${i}" >> ${outputfile} echo "${domainprefix}${parsed}^\$dnsrewrite=${i}" >>"${outputfile}"
echo "${domainprefix}${parsed}^\$dnstype=AAAA" >> ${outputfile} echo "${domainprefix}${parsed}^\$dnstype=AAAA" >>"${outputfile}"
done done
done <<< $(cat ${basedir}/$filename | sort); done <<<"$(cat ${basedir}/"${filename}" | sort)"
done <<< $(jq -r ".cache_domains[${entry}].domain_files[${fileid}]" ${path}) 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[${entry}].domain_files | to_entries[] | .key" ${path})"
done <<< $(jq -r '.cache_domains | to_entries[] | .key' ${path}) done <<<"$(jq -r ".cache_domains | to_entries[] | .key" ${path})"
if [[ ${combinedoutput} == "true" ]]; then if [[ ${combinedoutput} == "true" ]]; then
for file in ${outputdir}/*; do f=${file//${outputdir}\/} && f=${f//.conf} && echo "# ${f^}" >> ${outputdir}/lancache.conf && cat ${file} >> ${outputdir}/lancache.conf && rm ${file}; done for file in "${outputdir}"/*; do f=${file//${outputdir}\//} && f=${f//.conf/} && echo "# ${f^}" >>${outputdir}/lancache.conf && cat "${file}" >>${outputdir}/lancache.conf && rm "${file}"; done
fi fi
cat << EOF cat <<EOF
Configuration generation completed. Configuration generation completed.
Please copy the following files: Please copy the following files:

88
scripts/create-blocky.sh Normal file
View File

@ -0,0 +1,88 @@
#!/bin/bash
basedir=".."
outputdir="output/blocky"
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)
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}/custom_dns.yml
cat > $outputfile << EOF
customDNS:
customTTL: 1h
filterUnmappedTypes: true
mapping:
EOF
while read -r entry; do
unset cacheip
unset cachename
unset cacheip_count
unset ciplist
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
while read -r fileentry; do
# Ignore comments, newlines and wildcards
if [[ ${fileentry} == \#* ]] || [[ -z ${fileentry} ]]; then
continue
fi
parsed=$(echo ${fileentry} | sed -e "s/^\*\.//")
cacheip_count=1
for i in ${cacheip}; do
if [ $cacheip_count -gt 1 ]
then
ciplist="${ciplist}, ${i}"
else
ciplist="${i}"
fi
cacheip_count=$((cacheip_count+1))
done
if grep -qx " ${parsed}: ${ciplist}" "${outputfile}"; then
continue
fi
echo " ${parsed}: ${ciplist}" >> "${outputfile}"
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 copy output/blocky/custom_dns.yml to your blocky config directory, or integrate
it into your main config.yml
EOF

View File

@ -3,12 +3,13 @@ basedir=".."
outputdir="output/dnsmasq" outputdir="output/dnsmasq"
path="${basedir}/cache_domains.json" path="${basedir}/cache_domains.json"
export IFS=' ' export IFS=" "
test=$(which jq); if ! command -v jq >/dev/null; then
if [ $? -gt 0 ] ; then cat <<-EOF
echo "This script requires jq to be installed." This script requires jq to be installed.
echo "Your package manager should be able to find it" Your package manager should be able to find it
EOF
exit 1 exit 1
fi fi
@ -18,12 +19,12 @@ combinedoutput=$(jq -r ".combined_output" config.json)
while read -r line; do while read -r line; do
ip=$(jq ".ips[\"${line}\"]" config.json) ip=$(jq ".ips[\"${line}\"]" config.json)
declare "cacheip${line}"="${ip}" declare "cacheip${line}"="${ip}"
done <<< $(jq -r '.ips | to_entries[] | .key' config.json) done <<<"$(jq -r ".ips | to_entries[] | .key" config.json)"
while read -r line; do while read -r line; do
name=$(jq -r ".cache_domains[\"${line}\"]" config.json) name=$(jq -r ".cache_domains[\"${line}\"]" config.json)
declare "cachename${line}"="${name}" declare "cachename${line}"="${name}"
done <<< $(jq -r '.cache_domains | to_entries[] | .key' config.json) done <<<"$(jq -r ".cache_domains | to_entries[] | .key" config.json)"
rm -rf ${outputdir} rm -rf ${outputdir}
mkdir -p ${outputdir} mkdir -p ${outputdir}
@ -33,42 +34,42 @@ while read -r entry; do
key=$(jq -r ".cache_domains[${entry}].name" ${path}) key=$(jq -r ".cache_domains[${entry}].name" ${path})
cachename="cachename${key}" cachename="cachename${key}"
if [ -z "${!cachename}" ]; then if [ -z "${!cachename}" ]; then
cachename="cachenamedefault" cachename=${cachenamedefault}
fi fi
if [[ ${!cachename} == "disabled" ]]; then if [[ ${cachename} == "disabled" ]]; then
continue; continue
fi fi
cacheipname="cacheip${!cachename}" cacheipname="cacheip${!cachename}"
cacheip=$(jq -r 'if type == "array" then .[] else . end' <<< ${!cacheipname} | xargs) cacheip=$(jq -r "if type == \"array\" then .[] else . end" <<<"${!cacheipname}" | xargs)
while read -r fileid; do while read -r fileid; do
while read -r filename; do while read -r filename; do
destfilename=$(echo ${filename} | sed -e 's/txt/conf/') destfilename=${filename//txt/conf}
outputfile=${outputdir}/${destfilename} outputfile=${outputdir}/${destfilename}
touch ${outputfile} touch "${outputfile}"
while read -r fileentry; do while read -r fileentry; do
# Ignore comments, newlines and wildcards # Ignore comments, newlines and wildcards
if [[ ${fileentry} == \#* ]] || [[ -z ${fileentry} ]]; then if [[ ${fileentry} == \#* ]] || [[ -z ${fileentry} ]]; then
continue continue
fi fi
parsed=$(echo ${fileentry} | sed -e "s/^\*\.//") parsed="${fileentry#\*\.}"
for i in ${cacheip}; do for i in ${cacheip}; do
if ! grep -qx "address=/${parsed}/${i}" "${outputfile}"; then if ! grep -qx "address=/${parsed}/${i}" "${outputfile}"; then
echo "address=/${parsed}/${i}" >> "${outputfile}" echo "address=/${parsed}/${i}" >>"${outputfile}"
fi fi
if ! grep -qx "local=/${parsed}/" "${outputfile}"; then if ! grep -qx "local=/${parsed}/" "${outputfile}"; then
echo "local=/${parsed}/" >> "${outputfile}" echo "local=/${parsed}/" >>"${outputfile}"
fi fi
done done
done <<< $(cat ${basedir}/${filename} | sort); done <<<"$(cat ${basedir}/"${filename}" | sort)"
done <<< $(jq -r ".cache_domains[${entry}].domain_files[$fileid]" ${path}) 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[${entry}].domain_files | to_entries[] | .key" ${path})"
done <<< $(jq -r '.cache_domains | to_entries[] | .key' ${path}) done <<<"$(jq -r ".cache_domains | to_entries[] | .key" ${path})"
if [[ ${combinedoutput} == "true" ]]; then if [[ ${combinedoutput} == "true" ]]; then
for file in ${outputdir}/*; do f=${file//${outputdir}\/} && f=${f//.conf} && echo "# ${f^}" >> ${outputdir}/lancache.conf && cat ${file} >> ${outputdir}/lancache.conf && rm ${file}; done for file in "${outputdir}"/*; do f=${file//${outputdir}\//} && f=${f//.conf/} && echo "# ${f^}" >>${outputdir}/lancache.conf && cat "${file}" >>${outputdir}/lancache.conf && rm "${file}"; done
fi fi
cat << EOF cat <<EOF
Configuration generation completed. Configuration generation completed.
Please copy the following files: Please copy the following files:

View File

@ -4,31 +4,32 @@ outputdir="output/rpz"
path="${basedir}/cache_domains.json" path="${basedir}/cache_domains.json"
basedomain=${1:-lancache.net} basedomain=${1:-lancache.net}
export IFS=' ' export IFS=" "
test=$(which jq); if ! command -v jq >/dev/null; then
if [ $? -gt 0 ] ; then cat <<-EOF
echo "This script requires jq to be installed." This script requires jq to be installed.
echo "Your package manager should be able to find it" Your package manager should be able to find it
EOF
exit 1 exit 1
fi fi
cachenamedefault="disabled" cachenamedefault="disabled"
while read line; do while read -r line; do
ip=$(jq ".ips[\"${line}\"]" config.json) ip=$(jq ".ips[\"${line}\"]" config.json)
declare "cacheip${line}"="${ip}" declare "cacheip${line}"="${ip}"
done <<< $(jq -r '.ips | to_entries[] | .key' config.json) done <<<"$(jq -r ".ips | to_entries[] | .key" config.json)"
while read line; do while read -r line; do
name=$(jq -r ".cache_domains[\"${line}\"]" config.json) name=$(jq -r ".cache_domains[\"${line}\"]" config.json)
declare "cachename${line}"="${name}" declare "cachename${line}"="${name}"
done <<< $(jq -r '.cache_domains | to_entries[] | .key' config.json) done <<<"$(jq -r ".cache_domains | to_entries[] | .key" config.json)"
rm -rf ${outputdir} rm -rf ${outputdir}
mkdir -p ${outputdir} mkdir -p ${outputdir}
outputfile=${outputdir}/db.rpz.${basedomain} outputfile=${outputdir}/db.rpz.${basedomain}
cat > ${outputfile} << EOF cat >"${outputfile}" <<EOF
\$TTL 60 ; default TTL \$TTL 60 ; default TTL
\$ORIGIN rpz.${basedomain}. \$ORIGIN rpz.${basedomain}.
@ SOA ns1.${basedomain}. admin.${basedomain}. ( @ SOA ns1.${basedomain}. admin.${basedomain}. (
@ -43,31 +44,30 @@ cat > ${outputfile} << EOF
EOF EOF
while read entry; do while read -r entry; do
unset cacheip unset cacheip
unset cachename unset cachename
key=$(jq -r ".cache_domains[${entry}].name" ${path}) key=$(jq -r ".cache_domains[${entry}].name" ${path})
cachename="cachename${key}" cachename="cachename${key}"
if [ -z "${!cachename}" ]; then if [ -z "${!cachename}" ]; then
cachename="cachenamedefault" cachename=${cachenamedefault}
fi fi
if [[ ${!cachename} == "disabled" ]]; then if [[ ${cachename} == "disabled" ]]; then
continue; continue
fi fi
cacheipname="cacheip${!cachename}" cacheipname="cacheip${!cachename}"
cacheip=$(jq -r 'if type == "array" then .[] else . end' <<< ${!cacheipname} | xargs) cacheip=$(jq -r "if type == \"array\" then .[] else . end" <<<"${!cacheipname}" | xargs)
while read fileid; do while read -r fileid; do
while read filename; do while read -r filename; do
echo "" >> ${outputfile} echo "" >>"${outputfile}"
echo "; $(echo ${filename} | sed -e 's/.txt$//')" >> ${outputfile} echo "; ${filename//.txt//}" >>"${outputfile}"
destfilename=$(echo ${filename} | sed -e 's/txt/conf/') while read -r fileentry; do
while read fileentry; do
# Ignore comments and newlines # Ignore comments and newlines
if [[ ${fileentry} == \#* ]] || [[ -z ${fileentry} ]]; then if [[ ${fileentry} == \#* ]] || [[ -z ${fileentry} ]]; then
continue continue
fi fi
parsed=$(echo ${fileentry}) parsed=${fileentry}
if grep -qx "^\"${parsed}\". " ${outputfile}; then if grep -qx "^\"${parsed}\". " "${outputfile}"; then
continue continue
fi fi
t="" t=""
@ -78,23 +78,23 @@ while read entry; do
fi fi
# for cnames you must use a fqdn with trailing dot # for cnames you must use a fqdn with trailing dot
t="CNAME" t="CNAME"
if [[ ${i} =~ ^[0-9\.]+$ ]] ; then if [[ ${i} =~ ^[0-9\.]+$ ]]; then
t="A" t="A"
elif [[ ! ${i} =~ \.$ ]] ; then elif [[ ! ${i} =~ \.$ ]]; then
i="${i}." i="${i}."
fi fi
printf "%-50s IN %s %s\n" \ printf "%-50s IN %s %s\n" \
"${parsed}" \ "${parsed}" \
"${t}" \ "${t}" \
"${i}" \ "${i}" \
>> ${outputfile} >>"${outputfile}"
done done
done <<< $(cat ${basedir}/${filename} | sort); done <<<"$(cat ${basedir}/"${filename}" | sort)"
done <<< $(jq -r ".cache_domains[${entry}].domain_files[${fileid}]" ${path}) 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[${entry}].domain_files | to_entries[] | .key" ${path})"
done <<< $(jq -r '.cache_domains | to_entries[] | .key' ${path}) done <<<"$(jq -r ".cache_domains | to_entries[] | .key" ${path})"
cat << EOF cat <<EOF
Configuration generation completed. Configuration generation completed.
Please include the rpz zone in your bind configuration" Please include the rpz zone in your bind configuration"

View File

@ -4,12 +4,13 @@ outputdir="output/squid"
path="${basedir}/cache_domains.json" path="${basedir}/cache_domains.json"
REGEX="^\\*\\.(.*)$" REGEX="^\\*\\.(.*)$"
export IFS=' ' export IFS=" "
test=$(which jq); if ! command -v jq >/dev/null; then
if [ $? -gt 0 ] ; then cat <<-EOF
echo "This script requires jq to be installed." This script requires jq to be installed.
echo "Your package manager should be able to find it" Your package manager should be able to find it
EOF
exit 1 exit 1
fi fi
@ -18,7 +19,7 @@ cachenamedefault="disabled"
while read -r line; do while read -r line; do
name=$(jq -r ".cache_domains[\"${line}\"]" config.json) name=$(jq -r ".cache_domains[\"${line}\"]" config.json)
declare "cachename${line}"="${name}" declare "cachename${line}"="${name}"
done <<< $(jq -r '.cache_domains | to_entries[] | .key' config.json) done <<<"$(jq -r ".cache_domains | to_entries[] | .key" config.json)"
rm -rf ${outputdir} rm -rf ${outputdir}
mkdir -p ${outputdir} mkdir -p ${outputdir}
@ -27,42 +28,41 @@ while read -r entry; do
key=$(jq -r ".cache_domains[$entry].name" ${path}) key=$(jq -r ".cache_domains[$entry].name" ${path})
cachename="cachename${key}" cachename="cachename${key}"
if [ -z "${!cachename}" ]; then if [ -z "${!cachename}" ]; then
cachename="cachenamedefault" cachename=${cachenamedefault}
fi fi
if [[ ${!cachename} == "disabled" ]]; then if [[ ${cachename} == "disabled" ]]; then
continue; continue
fi fi
while read -r fileid; do while read -r fileid; do
while read -r filename; do while read -r filename; do
destfilename=$(echo ${!cachename}.txt) destfilename=${!cachename}.txt
outputfile=${outputdir}/${destfilename} outputfile=${outputdir}/${destfilename}
touch ${outputfile} touch "${outputfile}"
while read -r fileentry; do while read -r fileentry; do
# Ignore comments # Ignore comments
if [[ ${fileentry} == \#* ]] || [[ -z ${fileentry} ]]; then if [[ ${fileentry} == \#* ]] || [[ -z ${fileentry} ]]; then
continue continue
fi fi
# Ha wildcards to squid wildcards # Ha wildcards to squid wildcards
parsed=$(echo ${fileentry} | sed -e "s/^\*\./\./") parsed="${fileentry#\*}"
# If we have cdn.thing and *.cdn.thing in cache_domains # If we have cdn.thing and *.cdn.thing in cache_domains
# Squid requires ONLY cdn.thing # Squid requires ONLY cdn.thing
# #
# If the fileentry starts with *.cdn.thing # If the fileentry starts with *.cdn.thing
if [[ ${fileentry} =~ $REGEX ]]; then if [[ ${fileentry} =~ $REGEX ]]; then
# Does the cache_domains file also contain cdn.thing # Does the cache_domains file also contain cdn.thing
grep "${BASH_REMATCH[1]}" ${basedir}/${filename} | grep -v "${fileentry}" > /dev/null if grep "${BASH_REMATCH[1]}" ${basedir}/"${filename}" | grep -v "${fileentry}" >/dev/null; then
if [[ $? -eq 0 ]]; then
# Skip *.cdn.thing as cdn.thing will be collected earlier/later # Skip *.cdn.thing as cdn.thing will be collected earlier/later
continue continue
fi fi
fi fi
echo "${parsed}" >> "${outputfile}" echo "${parsed}" >>"${outputfile}"
done <<< $(cat ${basedir}/${filename} | sort); done <<<"$(cat ${basedir}/"${filename}" | sort)"
done <<< $(jq -r ".cache_domains[${entry}].domain_files[${fileid}]" ${path}) 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[${entry}].domain_files | to_entries[] | .key" ${path})"
done <<< $(jq -r '.cache_domains | to_entries[] | .key' ${path}) done <<<"$(jq -r ".cache_domains | to_entries[] | .key" ${path})"
cat << EOF cat <<EOF
Configuration generation completed. Configuration generation completed.
Please copy the following files: Please copy the following files:

View File

@ -3,74 +3,75 @@ basedir=".."
outputdir="output/unbound" outputdir="output/unbound"
path="${basedir}/cache_domains.json" path="${basedir}/cache_domains.json"
export IFS=' ' export IFS=" "
test=$(which jq); if ! command -v jq >/dev/null; then
if [ $? -gt 0 ] ; then cat <<-EOF
echo "This script requires jq to be installed." This script requires jq to be installed.
echo "Your package manager should be able to find it" Your package manager should be able to find it
EOF
exit 1 exit 1
fi fi
cachenamedefault="disabled" cachenamedefault="disabled"
combinedoutput=$(jq -r ".combined_output" config.json) combinedoutput=$(jq -r ".combined_output" config.json)
while read line; do while read -r line; do
ip=$(jq ".ips[\"${line}\"]" config.json) ip=$(jq ".ips[\"${line}\"]" config.json)
declare "cacheip${line}"="${ip}" declare "cacheip${line}"="${ip}"
done <<< $(jq -r '.ips | to_entries[] | .key' config.json) done <<<"$(jq -r ".ips | to_entries[] | .key" config.json)"
while read line; do while read -r line; do
name=$(jq -r ".cache_domains[\"${line}\"]" config.json) name=$(jq -r ".cache_domains[\"${line}\"]" config.json)
declare "cachename${line}"="${name}" declare "cachename${line}"="${name}"
done <<< $(jq -r '.cache_domains | to_entries[] | .key' config.json) done <<<"$(jq -r ".cache_domains | to_entries[] | .key" config.json)"
rm -rf ${outputdir} rm -rf ${outputdir}
mkdir -p ${outputdir} mkdir -p ${outputdir}
while read entry; do while read -r entry; do
unset cacheip unset cacheip
unset cachename unset cachename
key=$(jq -r ".cache_domains[${entry}].name" ${path}) key=$(jq -r ".cache_domains[${entry}].name" ${path})
cachename="cachename${key}" cachename="cachename${key}"
if [ -z "${!cachename}" ]; then if [ -z "${!cachename}" ]; then
cachename="cachenamedefault" cachename=${cachenamedefault}
fi fi
if [[ ${!cachename} == "disabled" ]]; then if [[ ${cachename} == "disabled" ]]; then
continue; continue
fi fi
cacheipname="cacheip${!cachename}" cacheipname="cacheip${!cachename}"
cacheip=$(jq -r 'if type == "array" then .[] else . end' <<< ${!cacheipname} | xargs) cacheip=$(jq -r "if type == \"array\" then .[] else . end" <<<"${!cacheipname}" | xargs)
while read fileid; do while read -r fileid; do
while read filename; do while read -r filename; do
destfilename=$(echo ${filename} | sed -e 's/txt/conf/') destfilename=${filename//txt/conf}
outputfile=${outputdir}/${destfilename} outputfile=${outputdir}/${destfilename}
touch ${outputfile} touch "${outputfile}"
while read fileentry; do while read -r fileentry; do
# Ignore comments and newlines # Ignore comments and newlines
if [[ ${fileentry} == \#* ]] || [[ -z ${fileentry} ]]; then if [[ ${fileentry} == \#* ]] || [[ -z ${fileentry} ]]; then
continue continue
fi fi
parsed=$(echo ${fileentry} | sed -e "s/^\*\.//") parsed="${fileentry#\*\.}"
if grep -qx " local-zone: \"${parsed}\" redirect" ${outputfile}; then if grep -qx " local-zone: \"${parsed}\" redirect" "${outputfile}"; then
continue continue
fi fi
if [[ $(head -n 1 ${outputfile}) != "server:" ]]; then if [[ $(head -n 1 "${outputfile}") != "server:" ]]; then
echo "server:" >> ${outputfile} echo "server:" >>"${outputfile}"
fi fi
echo " local-zone: \"${parsed}\" redirect" >> ${outputfile} echo " local-zone: \"${parsed}\" redirect" >>"${outputfile}"
for i in ${cacheip}; do for i in ${cacheip}; do
echo " local-data: \"${parsed} 30 IN A ${i}\"" >> ${outputfile} echo " local-data: \"${parsed} 30 IN A ${i}\"" >>"${outputfile}"
done done
done <<< $(cat ${basedir}/${filename} | sort); done <<<"$(cat ${basedir}/"${filename}" | sort)"
done <<< $(jq -r ".cache_domains[${entry}].domain_files[${fileid}]" ${path}) 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[${entry}].domain_files | to_entries[] | .key" ${path})"
done <<< $(jq -r '.cache_domains | to_entries[] | .key' ${path}) done <<<"$(jq -r ".cache_domains | to_entries[] | .key" ${path})"
if [[ ${combinedoutput} == "true" ]]; then if [[ ${combinedoutput} == "true" ]]; then
for file in ${outputdir}/*; do f=${file//${outputdir}\/} && f=${f//.conf} && echo "# ${f^}" >> ${outputdir}/lancache.conf && cat ${file} >> ${outputdir}/lancache.conf && rm ${file}; done for file in "${outputdir}"/*; do f=${file//${outputdir}\//} && f=${f//.conf/} && echo "# ${f^}" >>${outputdir}/lancache.conf && cat "${file}" >>${outputdir}/lancache.conf && rm "${file}"; done
fi fi
cat << EOF cat <<EOF
Configuration generation completed. Configuration generation completed.
Please copy the following files: Please copy the following files:

View File

@ -1,16 +1,16 @@
gs2.ww.prod.dl.playstation.net
*.gs2.ww.prod.dl.playstation.net
*.gs2.sonycoment.loris-e.llnwd.net
gs2-ww-prod.psn.akadns.net
*.gs2-ww-prod.psn.akadns.net *.gs2-ww-prod.psn.akadns.net
gs2.ww.prod.dl.playstation.net.edgesuite.net *.gs2.sonycoment.loris-e.llnwd.net
*.gs2.ww.prod.dl.playstation.net
*.gs2.ww.prod.dl.playstation.net.edgesuite.net *.gs2.ww.prod.dl.playstation.net.edgesuite.net
gs-sec.ww.np.dl.playstation.net
gs2-ww-prod.psn.akadns.net
gs2.ww.prod.dl.playstation.net
gs2.ww.prod.dl.playstation.net.edgesuite.net
gst.prod.dl.playstation.net
playstation4.sony.akadns.net playstation4.sony.akadns.net
psnobj.prod.dl.playstation.net
sgst.prod.dl.playstation.net
theia.dl.playstation.net theia.dl.playstation.net
tmdb.np.dl.playstation.net tmdb.np.dl.playstation.net
gs-sec.ww.np.dl.playstation.net
uef.np.dl.playstation.net uef.np.dl.playstation.net
gst.prod.dl.playstation.net
vulcan.dl.playstation.net vulcan.dl.playstation.net
sgst.prod.dl.playstation.net
psnobj.prod.dl.playstation.net

View File

@ -1,6 +1,6 @@
canary.uklans.net
litmus.uklans.net
trigger.uklans.net
canary.lancache.net canary.lancache.net
canary.uklans.net
litmus.lancache.net litmus.lancache.net
litmus.uklans.net
trigger.lancache.net trigger.lancache.net
trigger.uklans.net

View File

@ -1,16 +1,16 @@
dl-wot-ak.wargaming.net
dl-wot-cdx.wargaming.net
dl-wot-gc.wargaming.net
dl-wot-se.wargaming.net
dl-wowp-ak.wargaming.net
dl-wowp-cdx.wargaming.net
dl-wowp-gc.wargaming.net
dl-wowp-se.wargaming.net
dl-wows-ak.wargaming.net
dl-wows-cdx.wargaming.net
dl-wows-gc.wargaming.net
dl-wows-se.wargaming.net
dl2.wargaming.net dl2.wargaming.net
wg.gcdn.co wg.gcdn.co
wgus-wotasia.wargaming.net wgus-wotasia.wargaming.net
dl-wot-ak.wargaming.net
dl-wot-gc.wargaming.net
dl-wot-se.wargaming.net
dl-wot-cdx.wargaming.net
dl-wows-ak.wargaming.net
dl-wows-gc.wargaming.net
dl-wows-se.wargaming.net
dl-wows-cdx.wargaming.net
dl-wowp-ak.wargaming.net
dl-wowp-gc.wargaming.net
dl-wowp-se.wargaming.net
dl-wowp-cdx.wargaming.net
wgus-woteu.wargaming.net wgus-woteu.wargaming.net

View File

@ -1,13 +1,13 @@
*.windowsupdate.com
*.dl.delivery.mp.microsoft.com *.dl.delivery.mp.microsoft.com
dl.delivery.mp.microsoft.com
*.update.microsoft.com
*.do.dsp.mp.microsoft.com *.do.dsp.mp.microsoft.com
*.microsoft.com.edgesuite.net *.microsoft.com.edgesuite.net
*.update.microsoft.com
*.windowsupdate.com
amupdatedl.microsoft.com amupdatedl.microsoft.com
amupdatedl2.microsoft.com amupdatedl2.microsoft.com
amupdatedl3.microsoft.com amupdatedl3.microsoft.com
amupdatedl4.microsoft.com amupdatedl4.microsoft.com
amupdatedl5.microsoft.com amupdatedl5.microsoft.com
dl.delivery.mp.microsoft.com
officecdn.microsoft.com officecdn.microsoft.com
officecdn.microsoft.com.edgesuite.net officecdn.microsoft.com.edgesuite.net

View File

@ -1,7 +1,7 @@
assets1.xboxlive.com assets1.xboxlive.com
assets2.xboxlive.com
xbox-mbr.xboxlive.com
assets1.xboxlive.com.nsatc.net assets1.xboxlive.com.nsatc.net
assets2.xboxlive.com
d1.xboxlive.com
xbox-mbr.xboxlive.com
xvcf1.xboxlive.com xvcf1.xboxlive.com
xvcf2.xboxlive.com xvcf2.xboxlive.com
d1.xboxlive.com