The Gitea mirror db is registry-signed, so installs trust the registry key right after the pacman.conf restore, and a cn migration does the same on existing systems with an idempotent exact-line guard. The insertion lives in cn/lib/mirror.sh so 'omarchycn doctor mirror --fix' can restore the line after omarchy-refresh-pacman resets an overlay system's conf. Only stable is mirrored: the Gitea repository name must equal the pacman section name, and edge/rc stay on upstream directly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019hLK3wsDuKVAC37GgDqg6H
96 lines
3.0 KiB
Bash
96 lines
3.0 KiB
Bash
# shellcheck shell=bash
|
|
# Sourced helpers for omarchy-cn-mirror-* commands
|
|
|
|
CN_MIRRORS_JSON="$OMARCHY_PATH/cn/mirrors.json"
|
|
CN_MIRRORLIST="/etc/pacman.d/mirrorlist"
|
|
CN_PROFILE_FILE="$HOME/.config/omarchycn/mirror-profile"
|
|
CN_OMARCHY_MIRROR="https://git.zacharyzhang.com/api/packages/ZacharyZhang-NY/arch/omarchy/x86_64"
|
|
|
|
# [omarchy] mirror line management (stable channel only); shared by the
|
|
# rollout migration and doctor --fix so refresh-pacman resets stay healable
|
|
cn_mirror_omarchy_repo_ok() {
|
|
grep -qxF "Server = $CN_OMARCHY_MIRROR" "${OMARCHYCN_PACMAN_CONF:-/etc/pacman.conf}"
|
|
}
|
|
|
|
cn_mirror_omarchy_repo_fix() {
|
|
local conf="${OMARCHYCN_PACMAN_CONF:-/etc/pacman.conf}"
|
|
cn_mirror_omarchy_repo_ok && return 0
|
|
sudo sed -i "s|^Server = https://pkgs.omarchy.org/stable/|Server = $CN_OMARCHY_MIRROR\nServer = https://pkgs.omarchy.org/stable/|" "$conf"
|
|
}
|
|
|
|
cn_mirror_ids() {
|
|
jq -r '.mirrors[].id' "$CN_MIRRORS_JSON"
|
|
}
|
|
|
|
cn_mirror_url() {
|
|
jq -r --arg id "$1" '.mirrors[] | select(.id == $id) | .url' "$CN_MIRRORS_JSON"
|
|
}
|
|
|
|
cn_mirror_name() {
|
|
jq -r --arg id "$1" '.mirrors[] | select(.id == $id) | .name' "$CN_MIRRORS_JSON"
|
|
}
|
|
|
|
cn_mirror_ids_by_region() {
|
|
jq -r --arg r "$1" '.mirrors[] | select(.region == $r) | .id' "$CN_MIRRORS_JSON"
|
|
}
|
|
|
|
# Probe one mirror: prints "<speed_bytes_s> <ttfb_s> <sync_age_s|stale|unknown>"
|
|
cn_mirror_probe() {
|
|
local url="$1"
|
|
local out speed=0 ttfb=0 lastsync age="unknown" now
|
|
|
|
if out=$(curl -sSf -o /dev/null -m 12 --connect-timeout 5 \
|
|
-w '%{speed_download} %{time_starttransfer}' \
|
|
"$url/core/os/x86_64/core.db" 2>/dev/null); then
|
|
read -r speed ttfb <<<"$out"
|
|
speed="${speed%%.*}"
|
|
fi
|
|
|
|
if lastsync=$(curl -sSf -m 5 --connect-timeout 5 "$url/lastsync" 2>/dev/null); then
|
|
lastsync=$(tr -cd '0-9' <<<"$lastsync")
|
|
if [[ -n $lastsync ]]; then
|
|
now=$(date +%s)
|
|
age=$((now - lastsync))
|
|
if (( age > 86400 )); then
|
|
age="stale"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
echo "$speed $ttfb $age"
|
|
}
|
|
|
|
# Rank ids by probe speed, excluding dead (speed 0) and stale mirrors
|
|
cn_mirror_rank() {
|
|
local id url speed ttfb age
|
|
|
|
for id in "$@"; do
|
|
url=$(cn_mirror_url "$id")
|
|
read -r speed ttfb age < <(cn_mirror_probe "$url")
|
|
(( speed > 0 )) || continue
|
|
[[ $age == "stale" ]] && continue
|
|
echo "$speed $id"
|
|
done | sort -rn | awk '{print $2}'
|
|
}
|
|
|
|
# Write mirrorlist from mirror ids (first = primary), with timestamped backup
|
|
cn_mirror_write_list() {
|
|
local profile="$1"
|
|
shift
|
|
local stamp id url content=""
|
|
|
|
stamp=$(date +%Y%m%d-%H%M%S)
|
|
content="## OmarchyCN mirrorlist (profile: $profile, generated $stamp)\n"
|
|
for id in "$@"; do
|
|
url=$(cn_mirror_url "$id")
|
|
content+="## $id: $(cn_mirror_name "$id")\nServer = $url/\$repo/os/\$arch\n"
|
|
done
|
|
|
|
sudo cp "$CN_MIRRORLIST" "$CN_MIRRORLIST.omarchycn-bak-$stamp"
|
|
printf '%b' "$content" | sudo tee "$CN_MIRRORLIST" > /dev/null
|
|
|
|
mkdir -p "${CN_PROFILE_FILE%/*}"
|
|
echo "$profile" > "$CN_PROFILE_FILE"
|
|
echo "Mirrorlist written ($CN_MIRRORLIST), backup: $CN_MIRRORLIST.omarchycn-bak-$stamp"
|
|
}
|