feat: add lefthook, megalinter and update editorconfig

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.
This commit is contained in:
Amir Zarrinkafsh 2025-07-23 14:09:14 +10:00
parent e7fc17ae5b
commit a2a12ae80d
No known key found for this signature in database
GPG Key ID: ECDB8EF9E77E4EBF
25 changed files with 604 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

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

@ -0,0 +1,57 @@
# MegaLinter GitHub Action configuration file
# More info at https://megalinter.io
---
name: MegaLinter
on:
pull_request:
branches:
- master
env:
APPLY_FIXES: all
APPLY_FIXES_EVENT: pull_request
APPLY_FIXES_MODE: commit
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/

21
.lefthook.yml Normal file
View File

@ -0,0 +1,21 @@
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"
stage_fixed: true
- name: sort cdns
run: |
for f in {all_files}; do
sort -u -o ${f} ${f}
done
env:
LC_ALL: C
glob: "*.txt"
stage_fixed: true
- name: megalinter
run: docker run --rm -e USER=$(id -u) -e GROUP=$(id -g) -v "$PWD:/tmp/lint" oxsecurity/megalinter:v8
stage_fixed: true

28
.mega-linter.yml Normal file
View File

@ -0,0 +1,28 @@
# 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
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

@ -10,11 +10,6 @@
"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,6 +20,11 @@
"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": "Daybreak games CDN",
@ -40,16 +40,16 @@
"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": "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 and download servers",
@ -97,16 +97,21 @@
"description": "CDN for steam platform", "description": "CDN for steam platform",
"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": "Test CDN, recommended to enable for additional diagnostics",
"domain_files": ["test.txt"]
},
{
"name": "uplay",
"description": "CDN for uplay downloader",
"domain_files": ["uplay.txt"]
},
{ {
"name": "warframe", "name": "warframe",
"description": "CDN for Warframe", "description": "CDN for Warframe",
@ -126,11 +131,6 @@
"name": "xboxlive", "name": "xboxlive",
"description": "CDN for xboxlive", "description": "CDN for xboxlive",
"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,21 +55,21 @@ 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

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,24 +34,24 @@ 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}"
@ -59,13 +60,13 @@ while read -r entry; do
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

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=""
@ -87,12 +87,12 @@ while read entry; do
"${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.

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,40 +28,39 @@ 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.

View File

@ -3,71 +3,72 @@ 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

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