mirror of
https://github.com/dockur/windows.git
synced 2026-07-27 21:42:36 +07:00
238 lines
6.3 KiB
YAML
238 lines
6.3 KiB
YAML
name: Links
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
schedule:
|
|
- cron: '0 0 * * *'
|
|
|
|
concurrency:
|
|
group: links
|
|
cancel-in-progress: false
|
|
|
|
jobs:
|
|
links:
|
|
name: Links
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
actions: read
|
|
packages: read
|
|
contents: read
|
|
steps:
|
|
-
|
|
name: Checkout
|
|
uses: actions/checkout@v7
|
|
with:
|
|
fetch-depth: 0
|
|
-
|
|
name: Install aria2
|
|
run: |
|
|
if ! command -v aria2c > /dev/null; then
|
|
sudo apt-get update -qq
|
|
sudo apt-get install -qq --no-install-recommends -y aria2
|
|
fi
|
|
-
|
|
name: Validate all download mirrors
|
|
id: validate
|
|
run: |
|
|
errors=0
|
|
tested=0
|
|
host=""
|
|
failed_links=""
|
|
failed_links_html=""
|
|
declare -A seen
|
|
|
|
ignored_domains=(
|
|
files.dog
|
|
)
|
|
|
|
check() {
|
|
local url="$1"
|
|
local agent="Mozilla/5.0 (X11; Linux x86_64; rv:154.0) Gecko/20100101 Firefox/154.0"
|
|
local tmp output pid blocks bytes rc
|
|
local start=$SECONDS
|
|
|
|
tmp=$(mktemp -d)
|
|
output="$tmp/aria2.log"
|
|
|
|
aria2c \
|
|
--no-conf=true \
|
|
--connect-timeout=30 \
|
|
--timeout=30 \
|
|
--max-tries=2 \
|
|
--retry-wait=2 \
|
|
--async-dns=false \
|
|
--follow-metalink=false \
|
|
--follow-torrent=false \
|
|
--user-agent="$agent" \
|
|
--split=4 \
|
|
--max-connection-per-server=4 \
|
|
--file-allocation=none \
|
|
--allow-overwrite=true \
|
|
--auto-file-renaming=false \
|
|
--continue=false \
|
|
--dir="$tmp" \
|
|
--out=probe \
|
|
--console-log-level=error \
|
|
--summary-interval=0 \
|
|
--download-result=hide \
|
|
--show-console-readout=false \
|
|
--enable-color=false \
|
|
-- "$url" > "$output" 2>&1 &
|
|
pid=$!
|
|
|
|
while kill -0 "$pid" 2>/dev/null; do
|
|
if [[ -f "$tmp/probe" ]]; then
|
|
blocks=$(stat -c '%b' "$tmp/probe" 2>/dev/null || echo 0)
|
|
bytes=$((blocks * 512))
|
|
|
|
if (( bytes >= 1048576 )); then
|
|
kill "$pid" 2>/dev/null || true
|
|
wait "$pid" 2>/dev/null || true
|
|
rm -rf -- "$tmp"
|
|
return 0
|
|
fi
|
|
fi
|
|
|
|
if (( SECONDS - start >= 60 )); then
|
|
kill "$pid" 2>/dev/null || true
|
|
break
|
|
fi
|
|
|
|
sleep 0.2
|
|
done
|
|
|
|
if wait "$pid"; then
|
|
rc=0
|
|
else
|
|
rc=$?
|
|
fi
|
|
|
|
blocks=0
|
|
|
|
if [[ -f "$tmp/probe" ]]; then
|
|
blocks=$(stat -c '%b' "$tmp/probe" 2>/dev/null || echo 0)
|
|
fi
|
|
|
|
bytes=$((blocks * 512))
|
|
|
|
if (( bytes >= 1048576 || (rc == 0 && bytes > 0) )); then
|
|
rm -rf -- "$tmp"
|
|
return 0
|
|
fi
|
|
|
|
sed 's/^/ /' "$output" >&2
|
|
echo " Downloaded bytes: $bytes" >&2
|
|
echo " aria2c exit status: $rc" >&2
|
|
rm -rf -- "$tmp"
|
|
return 1
|
|
}
|
|
|
|
isIgnoredDomain() {
|
|
local url="$1"
|
|
local domain ignored
|
|
|
|
domain="${url#*://}"
|
|
domain="${domain%%/*}"
|
|
domain="${domain%%:*}"
|
|
domain="${domain,,}"
|
|
|
|
for ignored in "${ignored_domains[@]}"; do
|
|
if [[ "$domain" == "$ignored" || "$domain" == *."$ignored" ]]; then
|
|
return 0
|
|
fi
|
|
done
|
|
|
|
return 1
|
|
}
|
|
|
|
while IFS= read -r line; do
|
|
if [[ "$line" =~ ^[[:space:]]*local[[:space:]]+host=\"(https://[^\"]+)\" ]]; then
|
|
host="${BASH_REMATCH[1]%/}"
|
|
continue
|
|
fi
|
|
|
|
[[ "$line" =~ ^[[:space:]]*url=\"(.+)\" ]] || continue
|
|
val="${BASH_REMATCH[1]#/}"
|
|
|
|
if [[ "$val" == https://* ]]; then
|
|
url="$val"
|
|
elif [[ -n "$host" ]]; then
|
|
url="$host/$val"
|
|
else
|
|
continue
|
|
fi
|
|
|
|
[[ -v seen[$url] ]] && continue
|
|
seen[$url]=1
|
|
|
|
if isIgnoredDomain "$url"; then
|
|
echo "SKIP: $url"
|
|
continue
|
|
fi
|
|
|
|
tested=$((tested + 1))
|
|
|
|
if check "$url"; then
|
|
echo " OK: $url"
|
|
else
|
|
echo "FAIL: $url"
|
|
errors=$((errors + 1))
|
|
failed_links+="$url"$'\n'
|
|
failed_links_html+="<li><a href=\"$url\">$url</a></li>"$'\n'
|
|
fi
|
|
done < "src/define.sh"
|
|
|
|
echo ""
|
|
printf '%d/%d tested links valid\n' "$((tested - errors))" "$tested"
|
|
|
|
if (( errors > 0 )); then
|
|
printf '%d blocking failure(s)\n' "$errors"
|
|
|
|
{
|
|
echo "failed=true"
|
|
echo "links<<EOF"
|
|
printf '%s' "$failed_links"
|
|
echo "EOF"
|
|
echo "html_links<<EOF"
|
|
printf '%s' "$failed_links_html"
|
|
echo "EOF"
|
|
} >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "failed=false" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
-
|
|
name: Send mail
|
|
if: steps.validate.outputs.failed == 'true'
|
|
uses: action-pack/send-mail@v1
|
|
with:
|
|
to: ${{secrets.MAILTO}}
|
|
from: Github Actions <${{secrets.MAILTO}}>
|
|
connection_url: ${{secrets.MAIL_CONNECTION}}
|
|
subject: Mirror verification failed!
|
|
body: |
|
|
Mirror verification failed!
|
|
|
|
The following links failed:
|
|
|
|
${{ steps.validate.outputs.links }}
|
|
|
|
See https://github.com/${{ github.repository }}/actions for more information.
|
|
html_body: |
|
|
<p>Mirror verification failed!</p>
|
|
|
|
<p>The following links failed:</p>
|
|
|
|
<ul>
|
|
${{ steps.validate.outputs.html_links }}
|
|
</ul>
|
|
|
|
<p>
|
|
See
|
|
<a href="https://github.com/${{ github.repository }}/actions">GitHub Actions</a>
|
|
for more information.
|
|
</p>
|
|
-
|
|
name: Fail workflow
|
|
if: always() && steps.validate.outputs.failed == 'true'
|
|
run: exit 1
|