Skip to content

Commit 7257ef7

Browse files
authored
Merge pull request #3 from mohammadhasananisi/main
Add hamdocker and github action
2 parents 6ecf2d0 + 75a31e2 commit 7257ef7

4 files changed

Lines changed: 94 additions & 90 deletions

File tree

.github/workflows/main.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
name: Check Mirrors
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
8+
jobs:
9+
check-mirrors:
10+
runs-on: ubuntu-latest
11+
12+
steps:
13+
- name: Check out code
14+
uses: actions/checkout@v3
15+
16+
- name: Install dependencies
17+
run: |
18+
sudo apt-get update
19+
sudo apt-get install -y curl jq
20+
21+
sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq
22+
sudo chmod +x /usr/bin/yq
23+
yq --version
24+
25+
- name: Run mirror checker
26+
run: |
27+
chmod +x check_mirrors.sh
28+
./check_mirrors.sh

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@
3434
| [mirrors.kubarcloud.com](https://mirrors.kubarcloud.com/linux/) | میرور داخلی کوبار با پشتیبانی | سورس کرنل لینوکس و آرشیوهای متن‌باز متنوع |
3535
| [repo-portal.ito.gov.ir](https://repo-portal.ito.gov.ir/repo/) | نگهداری شده توسط سازمان فناوری اطلاعات ایران | مخازن YUM/DNF برای CentOS، Fedora، Rocky، مخازن Python، npm، Yarn و … |
3636
| [jamko.ir](https://jamko.ir/) | ارائه مستندات و نمونه‌های کانفیگ برای استفاده آسان‌تر | مخازن Maven، Gradle، Android SDK، APT، RPM، NuGet، Yarn، Composer، pip |
37-
| [runflare.com/mirrors](https://runflare.com/mirrors/) | دارای راهنمای ساده و آپدیت خودکار روزانه | Composer/Packagist، PyPI، npm، Node.js، رجیستری Docker |
37+
| [runflare.com/mirrors](https://runflare.com/mirrors/) | دارای راهنمای ساده و آپدیت خودکار روزانه | Composer/Packagist، PyPI، npm، Node.js |
38+
| [hub.hamdocker.ir](https://hub.hamdocker.ir) | داکر ریجستری | Docker Registry |
3839
| [repo.iut.ac.ir](https://repo.iut.ac.ir/) | میرور جامع دانشگاه صنعتی اصفهان با پوشش گسترده توزیع‌های لینوکسی و پروژه‌های متن‌باز | توزیع‌های Debian، Ubuntu، Mint، Arch Linux، Manjaro، Raspbian، Alpine، Rocky Linux، Fedora، OpenSUSE، OpenBSD و مخازن CTAN |
3940

41+
4042
---
4143

4244
## 🧪 دربارهٔ اسکریپت check_mirrors.sh

check_mirrors.sh

Lines changed: 56 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,64 @@
11
#!/usr/bin/env bash
22
set -euo pipefail
33

4-
# Requirements: yq, curl, dig or getent
5-
6-
MIRROR_FILE="mirrors_list.yaml"
7-
8-
# Check dependencies
9-
if ! command -v yq &>/dev/null; then
10-
echo "Error: 'yq' is not installed."
11-
exit 1
12-
fi
13-
if ! command -v curl &>/dev/null; then
14-
echo "Error: 'curl' is not installed."
15-
exit 1
16-
fi
17-
18-
# Check for DNS resolver command
19-
if command -v dig &>/dev/null; then
20-
DNS_CMD="dig +short"
21-
elif command -v getent &>/dev/null; then
22-
DNS_CMD="getent hosts"
23-
else
24-
echo "Error: neither 'dig' nor 'getent' found for DNS resolution."
25-
exit 1
26-
fi
27-
28-
# Get number of mirrors in the YAML file
29-
mirror_count=$(yq e '.mirrors | length' "$MIRROR_FILE")
30-
31-
# Function to check a single mirror
32-
check_mirror() {
33-
local idx=$1
34-
local name url domain ip http_status reachable
35-
36-
# Extract mirror name and URL from the YAML file
37-
name=$(yq e ".mirrors[$idx].name" "$MIRROR_FILE")
38-
url=$(yq e ".mirrors[$idx].url" "$MIRROR_FILE")
39-
40-
# Extract domain from URL for DNS resolution
41-
domain=$(echo "$url" | awk -F/ '{print $3}')
42-
43-
# Resolve IP address using dig or getent
44-
if [[ $DNS_CMD == "dig +short" ]]; then
45-
ip=$($DNS_CMD "$domain" | head -n1)
46-
else
47-
ip=$($DNS_CMD "$domain" | awk '{print $1}' | head -n1)
48-
fi
49-
50-
# If IP is empty, mark as unavailable
51-
if [[ -z "$ip" ]]; then
52-
ip="Unavailable"
53-
fi
54-
55-
# Try HTTP request to get status code (with 10 seconds timeout)
56-
http_status=$(curl -sL --max-time 10 -o /dev/null -w "%{http_code}" "$url") || http_status="000"
57-
58-
# If initial curl fails, retry with --insecure to skip SSL certificate errors
59-
if [[ "$http_status" == "000" ]]; then
60-
http_status=$(curl -sL --insecure --max-time 10 -o /dev/null -w "%{http_code}" "$url") || http_status="000"
61-
fi
4+
MIRROR_FILE="./mirrors_list.yaml"
5+
6+
declare -A PACKAGE_PATHS=(
7+
["Ubuntu"]="ubuntu"
8+
["Debian"]="debian"
9+
["Arch Linux"]="archlinux"
10+
["PyPI"]="simple"
11+
["npm"]="npm"
12+
["CentOS"]="centos"
13+
["Alpine"]="alpine"
14+
["Composer"]="packages.json"
15+
["Docker Registry"]="v2/"
16+
["Homebrew"]="brew"
17+
)
18+
19+
function check_url() {
20+
local url=$1
21+
status=$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "$url")
22+
echo "$status"
23+
}
6224

63-
# Determine reachability based on HTTP status
64-
if [[ "$http_status" == "000" ]]; then
65-
reachable="Unreachable or HTTP error"
25+
function check_docker_registry() {
26+
local url=$1
27+
# Docker Registry requires a GET to /v2/ and must respond with 200 or 401
28+
status=$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "$url/v2/")
29+
if [[ "$status" == "200" || "$status" == "401" ]]; then
30+
echo "✅ Docker Registry OK ($status)"
6631
else
67-
reachable="Reachable (HTTP $http_status)"
32+
echo "❌ Docker Registry Failed ($status)"
6833
fi
69-
70-
# Print results (suitable for Persian terminals, no emojis)
71-
echo "Mirror Name: $name"
72-
echo "URL: $url"
73-
echo "IP: $ip"
74-
echo "Status: $reachable"
75-
echo "-----------------------------"
7634
}
7735

78-
export -f check_mirror
79-
export MIRROR_FILE
80-
export DNS_CMD
81-
82-
# Run mirror checks in parallel, max 5 at a time for speed
83-
pids=()
84-
for ((i=0; i<mirror_count; i++)); do
85-
check_mirror "$i" &
86-
pids+=($!)
87-
if (( ${#pids[@]} >= 5 )); then
88-
wait "${pids[0]}"
89-
pids=("${pids[@]:1}")
90-
fi
91-
done
92-
93-
# Wait for any remaining jobs to finish
94-
wait
95-
96-
exit 0
36+
for idx in $(seq 0 $(yq e '.mirrors | length - 1' "$MIRROR_FILE")); do
37+
name=$(yq e ".mirrors[$idx].name" "$MIRROR_FILE")
38+
base_url=$(yq e ".mirrors[$idx].url" "$MIRROR_FILE")
39+
echo -e "\n🔍 Checking mirror: $name"
40+
echo "URL: $base_url"
41+
42+
package_count=$(yq e ".mirrors[$idx].packages | length" "$MIRROR_FILE")
43+
44+
for j in $(seq 0 $((package_count - 1))); do
45+
package=$(yq e ".mirrors[$idx].packages[$j]" "$MIRROR_FILE")
46+
path=${PACKAGE_PATHS[$package]:-}
47+
48+
if [[ "$package" == "Docker Registry" ]]; then
49+
check_docker_registry "$base_url"
50+
elif [[ -n "$path" ]]; then
51+
full_url="$base_url/$path"
52+
status=$(check_url "$full_url")
53+
if [[ "$status" == "200" || "$status" == "301" || "$status" == "302" ]]; then
54+
echo "$package -> $full_url ($status)"
55+
else
56+
echo "$package -> $full_url ($status)"
57+
fi
58+
else
59+
echo "⚠️ Unknown package type: $package"
60+
fi
61+
done
62+
63+
echo "----------------------------"
64+
done

mirrors_list.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ mirrors:
5252
- Arch Linux
5353
- PyPI
5454
- Homebrew
55-
5655
- name: IUT (Isfahan University of Technology)
5756
url: https://repo.iut.ac.ir/
5857
description: Local mirror by Isfahan University of Technology offering broad Linux and open-source package coverage.
@@ -69,3 +68,10 @@ mirrors:
6968
- OpenSuse
7069
- OpenBSD
7170
- CTAN
71+
- name: HamDocker
72+
url: https://hub.hamdocker.ir
73+
description: Docker containers without sanctions
74+
packages:
75+
- Docker Registry
76+
77+

0 commit comments

Comments
 (0)