Skip to content

Commit d96893c

Browse files
committed
fix(shell): normalize package feeds to CERNET
1 parent 2475079 commit d96893c

4 files changed

Lines changed: 111 additions & 76 deletions

File tree

.github/scripts/test_installers.sh

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -163,29 +163,63 @@ run_feed_suite() (
163163
source_file="$temporary/distfeeds.list"
164164
target_file="$temporary/distfeeds.mirror"
165165
DISTRO_ID=immortalwrt
166-
167166
printf '%s\n' \
167+
'https://packages.example.invalid/custom/prefix/snapshots/packages/x86_64/base/packages.adb' \
168+
>"$source_file"
169+
rewrite_feed_to_mirror "$source_file" "$target_file" ||
170+
fail "$installer arbitrary ImmortalWrt feed normalization"
171+
assert_equal \
168172
'https://mirrors.cernet.edu.cn/immortalwrt/snapshots/packages/x86_64/base/packages.adb' \
173+
"$(cat "$target_file")" "$installer ImmortalWrt CERNET target"
174+
175+
printf '%s\n' \
176+
'src/gz custom_core http://mirror.example/releases/24.10.4/targets/x86/64/packages' \
177+
'src/gz custom_extra https://another.example/prefix/releases/24.10.4/packages/x86_64/base' \
169178
>"$source_file"
179+
DISTRO_ID=openwrt
170180
rewrite_feed_to_mirror "$source_file" "$target_file" ||
171-
fail "$installer CERNET ImmortalWrt feed acceptance"
172-
cmp -s "$source_file" "$target_file" ||
173-
fail "$installer CERNET ImmortalWrt feed preservation"
181+
fail "$installer arbitrary OpenWrt feed normalization"
182+
expected_openwrt='src/gz custom_core https://cernet.mirrors.ustc.edu.cn/openwrt/releases/24.10.4/targets/x86/64/packages
183+
src/gz custom_extra https://cernet.mirrors.ustc.edu.cn/openwrt/releases/24.10.4/packages/x86_64/base'
184+
assert_equal "$expected_openwrt" "$(cat "$target_file")" \
185+
"$installer OpenWrt CERNET targets"
174186

175187
printf '%s\n' \
176-
'https://downloads.immortalwrt.org/snapshots/packages/x86_64/base/packages.adb' \
188+
'# preserve comments in the temporary feed' \
189+
'https://downloads.openwrt.org/snapshots/packages/x86_64/base/packages.adb' \
190+
'https://packages.example.invalid/vendor/packages.adb' \
177191
>"$source_file"
178192
rewrite_feed_to_mirror "$source_file" "$target_file" ||
179-
fail "$installer official ImmortalWrt feed rewrite"
180-
grep -Fq \
181-
'https://mirror.nju.edu.cn/immortalwrt/snapshots/packages/x86_64/base/packages.adb' \
182-
"$target_file" || fail "$installer ImmortalWrt mirror target"
193+
fail "$installer OpenWrt snapshot normalization"
194+
expected_snapshot='# preserve comments in the temporary feed
195+
https://cernet.mirrors.ustc.edu.cn/openwrt/snapshots/packages/x86_64/base/packages.adb'
196+
assert_equal "$expected_snapshot" "$(cat "$target_file")" \
197+
"$installer excludes unrelated temporary feeds"
183198

184-
printf '%s\n' 'https://packages.example.invalid/custom/packages.adb' \
199+
printf '%s\n' 'https://packages.example.invalid/vendor/packages.adb' \
185200
>"$source_file"
186201
if rewrite_feed_to_mirror "$source_file" "$target_file"; then
187-
fail "$installer unknown ImmortalWrt feed rejection"
202+
fail "$installer feed without a standard distribution path"
188203
fi
204+
205+
live_feed="$temporary/live-distfeeds.list"
206+
original_feed='https://mirror.user.example/prefix/snapshots/packages/x86_64/base/packages.adb
207+
https://packages.user.example/vendor/packages.adb'
208+
printf '%s\n' "$original_feed" >"$live_feed"
209+
TMP_DIR="$temporary/runtime"
210+
mkdir -p "$TMP_DIR"
211+
FEED_FILE=$live_feed
212+
FEED_BACKUP=''
213+
FEED_CHANGED=0
214+
DISTRO_ID=immortalwrt
215+
prepare_temporary_feed ||
216+
fail "$installer temporary CERNET feed preparation"
217+
expected_live='https://mirrors.cernet.edu.cn/immortalwrt/snapshots/packages/x86_64/base/packages.adb'
218+
assert_equal "$expected_live" "$(cat "$live_feed")" \
219+
"$installer temporary feed content"
220+
restore_feed || fail "$installer original feed restoration"
221+
assert_equal "$original_feed" "$(cat "$live_feed")" \
222+
"$installer exact original feed restoration"
189223
)
190224

191225
run_model_suite() (

shell/README.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,21 +53,22 @@ sh /tmp/check_cpu_version.sh
5353

5454
1. 识别 OpenWrt 或 ImmortalWrt,以及 `opkg``apk`
5555
2. 使用 `cp -p` 备份当前 `distfeeds`
56-
3. 在任何 `opkg update``apk update` 之前直接切换到指定镜像
56+
3. 忽略原软件源域名,将标准发行版仓库路径写入临时 CERNET 软件源
5757
4. 更新索引并安装依赖;
5858
5. 无论成功、失败还是收到 INT、TERM、HUP,都恢复运行前的完整软件源配置。
5959

6060
镜像映射如下:
6161

62-
| 发行版 | 识别的基础地址 | 本次运行使用的镜像 |
62+
| 发行版 | 当前软件源 | 本次运行使用的镜像 |
6363
| --- | --- | --- |
64-
| ImmortalWrt | `downloads.immortalwrt.org``mirrors.vsean.net/openwrt` | `mirror.nju.edu.cn/immortalwrt` |
65-
| ImmortalWrt | `mirrors.cernet.edu.cn/immortalwrt` | 保持当前 CERNET 镜像 |
66-
| OpenWrt | `downloads.openwrt.org` | `mirrors.ustc.edu.cn/openwrt` |
64+
| ImmortalWrt | 任意包含标准 `/releases/``/snapshots/` 路径的软件源 | `mirrors.cernet.edu.cn/immortalwrt` |
65+
| OpenWrt | 任意包含标准 `/releases/``/snapshots/` 路径的软件源 | `cernet.mirrors.ustc.edu.cn/openwrt` |
6766

68-
安装器只替换上述已知基础地址,后续版本、架构和仓库路径保持不变。第三方或自定义软件源原样保留。发行版已识别,但 `distfeeds` 中没有相应的已知地址时,安装器会明确失败,不会猜测地址或静默使用原始源
67+
安装器不再维护软件源域名白名单。安装器从当前 `distfeeds` 提取标准的 `/releases/…``/snapshots/…` 路径,保留版本、目标、架构和仓库名称,并统一写入对应的 CERNET 根地址。原软件源域名、镜像前缀和不属于发行版标准仓库的条目不会进入临时软件源;运行前的完整文件仍会在依赖阶段结束时恢复
6968

70-
如果软件源已经指向该发行版的目标镜像或已识别的 CERNET 镜像,安装器会直接使用;未实际修改的文件不会被覆盖。
69+
OpenWrt 使用中国科学技术大学的 CERNET 网络入口。CERNET 智能聚合根地址当前可能把 OpenWrt snapshots 导向不包含 snapshots 的成员镜像,因此安装器不使用该不稳定路径。
70+
71+
如果 `distfeeds` 中没有任何标准 `/releases/``/snapshots/` 仓库路径,安装器无法构造对应的 CERNET 地址,并会在修改软件源前停止。
7172

7273
### 2. 插件本体由安装器自行覆盖重装
7374

shell/install_openclash_dev.sh

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -305,31 +305,37 @@ rewrite_feed_to_mirror() {
305305
target_file=$2
306306

307307
case "$DISTRO_ID" in
308-
immortalwrt)
309-
if ! grep -Fq 'https://downloads.immortalwrt.org' "$source_file" &&
310-
! grep -Fq 'https://mirrors.vsean.net/openwrt' "$source_file" &&
311-
! grep -Fq 'https://mirrors.cernet.edu.cn/immortalwrt' "$source_file" &&
312-
! grep -Fq 'https://mirror.nju.edu.cn/immortalwrt' "$source_file"; then
313-
return 1
314-
fi
315-
sed \
316-
-e 's,https://downloads\.immortalwrt\.org,https://mirror.nju.edu.cn/immortalwrt,g' \
317-
-e 's,https://mirrors\.vsean\.net/openwrt,https://mirror.nju.edu.cn/immortalwrt,g' \
318-
"$source_file" >"$target_file"
319-
;;
320-
openwrt)
321-
if ! grep -Fq 'https://downloads.openwrt.org' "$source_file" &&
322-
! grep -Fq 'https://mirrors.ustc.edu.cn/openwrt' "$source_file"; then
323-
return 1
324-
fi
325-
sed \
326-
-e 's,https://downloads\.openwrt\.org,https://mirrors.ustc.edu.cn/openwrt,g' \
327-
"$source_file" >"$target_file"
328-
;;
308+
immortalwrt) mirror_root='https://mirrors.cernet.edu.cn/immortalwrt' ;;
309+
openwrt) mirror_root='https://cernet.mirrors.ustc.edu.cn/openwrt' ;;
329310
*)
330311
return 1
331312
;;
332313
esac
314+
315+
awk -v mirror_root="$mirror_root" '
316+
/^[[:space:]]*($|#)/ {
317+
print
318+
next
319+
}
320+
{
321+
url_start = match($0, /https?:\/\//)
322+
if (!url_start) next
323+
324+
url = substr($0, url_start)
325+
path_start = index(url, "/releases/")
326+
snapshot_start = index(url, "/snapshots/")
327+
if (!path_start || (snapshot_start && snapshot_start < path_start)) {
328+
path_start = snapshot_start
329+
}
330+
if (!path_start) next
331+
332+
print substr($0, 1, url_start - 1) mirror_root substr(url, path_start)
333+
rewritten++
334+
}
335+
END {
336+
if (!rewritten) exit 1
337+
}
338+
' "$source_file" >"$target_file"
333339
}
334340

335341
prepare_temporary_feed() {
@@ -342,14 +348,8 @@ prepare_temporary_feed() {
342348
rewrite_feed_to_mirror "$FEED_BACKUP" "$feed_candidate" || return 1
343349

344350
case "$DISTRO_ID" in
345-
immortalwrt)
346-
if grep -Fq 'https://mirrors.cernet.edu.cn/immortalwrt' "$feed_candidate"; then
347-
FEED_MIRROR_LABEL="CERNET ImmortalWrt 镜像"
348-
else
349-
FEED_MIRROR_LABEL="南京大学 ImmortalWrt 镜像"
350-
fi
351-
;;
352-
openwrt) FEED_MIRROR_LABEL="中国科学技术大学 OpenWrt 镜像" ;;
351+
immortalwrt) FEED_MIRROR_LABEL="CERNET ImmortalWrt 镜像" ;;
352+
openwrt) FEED_MIRROR_LABEL="CERNET OpenWrt 镜像" ;;
353353
esac
354354

355355
if cmp -s "$FEED_BACKUP" "$feed_candidate"; then

shell/install_openclash_dev_update.sh

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -320,31 +320,37 @@ rewrite_feed_to_mirror() {
320320
target_file=$2
321321

322322
case "$DISTRO_ID" in
323-
immortalwrt)
324-
if ! grep -Fq 'https://downloads.immortalwrt.org' "$source_file" &&
325-
! grep -Fq 'https://mirrors.vsean.net/openwrt' "$source_file" &&
326-
! grep -Fq 'https://mirrors.cernet.edu.cn/immortalwrt' "$source_file" &&
327-
! grep -Fq 'https://mirror.nju.edu.cn/immortalwrt' "$source_file"; then
328-
return 1
329-
fi
330-
sed \
331-
-e 's,https://downloads\.immortalwrt\.org,https://mirror.nju.edu.cn/immortalwrt,g' \
332-
-e 's,https://mirrors\.vsean\.net/openwrt,https://mirror.nju.edu.cn/immortalwrt,g' \
333-
"$source_file" >"$target_file"
334-
;;
335-
openwrt)
336-
if ! grep -Fq 'https://downloads.openwrt.org' "$source_file" &&
337-
! grep -Fq 'https://mirrors.ustc.edu.cn/openwrt' "$source_file"; then
338-
return 1
339-
fi
340-
sed \
341-
-e 's,https://downloads\.openwrt\.org,https://mirrors.ustc.edu.cn/openwrt,g' \
342-
"$source_file" >"$target_file"
343-
;;
323+
immortalwrt) mirror_root='https://mirrors.cernet.edu.cn/immortalwrt' ;;
324+
openwrt) mirror_root='https://cernet.mirrors.ustc.edu.cn/openwrt' ;;
344325
*)
345326
return 1
346327
;;
347328
esac
329+
330+
awk -v mirror_root="$mirror_root" '
331+
/^[[:space:]]*($|#)/ {
332+
print
333+
next
334+
}
335+
{
336+
url_start = match($0, /https?:\/\//)
337+
if (!url_start) next
338+
339+
url = substr($0, url_start)
340+
path_start = index(url, "/releases/")
341+
snapshot_start = index(url, "/snapshots/")
342+
if (!path_start || (snapshot_start && snapshot_start < path_start)) {
343+
path_start = snapshot_start
344+
}
345+
if (!path_start) next
346+
347+
print substr($0, 1, url_start - 1) mirror_root substr(url, path_start)
348+
rewritten++
349+
}
350+
END {
351+
if (!rewritten) exit 1
352+
}
353+
' "$source_file" >"$target_file"
348354
}
349355

350356
prepare_temporary_feed() {
@@ -357,14 +363,8 @@ prepare_temporary_feed() {
357363
rewrite_feed_to_mirror "$FEED_BACKUP" "$feed_candidate" || return 1
358364

359365
case "$DISTRO_ID" in
360-
immortalwrt)
361-
if grep -Fq 'https://mirrors.cernet.edu.cn/immortalwrt' "$feed_candidate"; then
362-
FEED_MIRROR_LABEL="CERNET ImmortalWrt 镜像"
363-
else
364-
FEED_MIRROR_LABEL="南京大学 ImmortalWrt 镜像"
365-
fi
366-
;;
367-
openwrt) FEED_MIRROR_LABEL="中国科学技术大学 OpenWrt 镜像" ;;
366+
immortalwrt) FEED_MIRROR_LABEL="CERNET ImmortalWrt 镜像" ;;
367+
openwrt) FEED_MIRROR_LABEL="CERNET OpenWrt 镜像" ;;
368368
esac
369369

370370
if cmp -s "$FEED_BACKUP" "$feed_candidate"; then

0 commit comments

Comments
 (0)