update at 2026-03-18 13:35:19
This commit is contained in:
@@ -4,15 +4,20 @@ set -eu
|
||||
ROOT_DIR="$(CDPATH= cd -- "$(dirname "$0")" && pwd)"
|
||||
WATCHTHIS_DIR="$ROOT_DIR/dash/staging/watchthis"
|
||||
POST_JAILBREAK_ROOT="$ROOT_DIR/dash/staging/post-jailbreak-root"
|
||||
KTERM_STAGING_DIR="$ROOT_DIR/dash/staging/kterm"
|
||||
SSH_HELPERS_DIR="$ROOT_DIR/scripts/kindle"
|
||||
SYNC_SCRIPT="$ROOT_DIR/scripts/sync-layered-clock-to-kindle.sh"
|
||||
THEMES_JSON="$ROOT_DIR/calendar/config/themes.json"
|
||||
KTERM_GITHUB_REPO="bfabiszewski/kterm"
|
||||
|
||||
MODE="all"
|
||||
VOLUME_PATH="/Volumes/Kindle"
|
||||
HOST_TARGET="kindle"
|
||||
THEME_ID=""
|
||||
ORIENTATION=""
|
||||
KTERM_PACKAGE=""
|
||||
DOWNLOAD_KTERM=false
|
||||
KTERM_VERSION="latest"
|
||||
SHOW_BACKGROUND=true
|
||||
START_DASHBOARD=false
|
||||
|
||||
@@ -31,6 +36,9 @@ print_usage() {
|
||||
-k, --kindle <host> Kindle SSH 主机名,默认 kindle
|
||||
-t, --theme <theme-id> SSH 阶段切换到指定主题;默认使用 themes.json 的默认主题
|
||||
-o, --orientation <value> SSH 阶段切换到指定方向;默认使用 themes.json 的默认方向
|
||||
--kterm-package <path> 指定 KTerm 安装包;官方 release 用 .zip,也兼容外部 .bin
|
||||
--download-kterm 在 Mac 侧联网下载 KTerm 到 dash/staging/kterm/,再预置到 Kindle
|
||||
--kterm-version <tag> 下载指定 KTerm 版本;默认 latest
|
||||
--no-background SSH 阶段不同步后立即切主题出图
|
||||
--start-dashboard SSH 阶段额外后台启动 dashboard 主循环
|
||||
-h, --help 查看帮助
|
||||
@@ -44,6 +52,20 @@ print_usage() {
|
||||
4. 搜索 ;log mrpi 安装 KUAL / MRPI / USBNetwork
|
||||
5. 首次进 KTerm 执行 sh /mnt/us/ssh-force-dropbear-22.sh
|
||||
|
||||
关于 KTerm:
|
||||
1. 当前仓库默认不自带 KTerm 安装包。
|
||||
2. 官方 KTerm release 使用 .zip,解压后是 kterm/ 扩展目录。
|
||||
3. 如果你手头已经有 KTerm 安装包,可以:
|
||||
- 放到 dash/staging/kterm/ 目录下,脚本会自动尝试拾取
|
||||
- 或执行时显式传:--kterm-package /绝对路径/kterm-kindle-*.zip
|
||||
4. 如果你希望脚本直接从网上拉,可以执行:
|
||||
--download-kterm --kterm-version latest
|
||||
或:
|
||||
--download-kterm --kterm-version v2.6
|
||||
5. 下载发生在 Mac 侧,文件会缓存到 dash/staging/kterm/,然后再解压或复制到 Kindle。
|
||||
6. 对这台 Voyage 5.13.6,脚本默认优先选择“不带 armhf 后缀”的 zip。
|
||||
7. 如果脚本没有检测到 KTerm 包,会明确提示“这一步仍需手工补装 KTerm”。
|
||||
|
||||
推荐操作顺序:
|
||||
|
||||
阶段 A:先做 USB 预置
|
||||
@@ -56,6 +78,8 @@ print_usage() {
|
||||
- Kindle 根目录出现 ssh-force-dropbear-22.sh 等脚本
|
||||
- Kindle 根目录出现 dashboard/、extensions/、mrpackages/
|
||||
- Kindle 根目录出现 .demo/KV-5.13.6.zip、.demo/demo.json、.demo/goodreads/
|
||||
- 如果提供了 KTerm zip,extensions/ 里会被解压出 kterm/
|
||||
- 如果提供了外部 KTerm bin,mrpackages/ 里会出现对应文件
|
||||
5. 安全弹出 Kindle。
|
||||
|
||||
阶段 B:在 Kindle 上完成 WatchThis 和越狱
|
||||
@@ -77,6 +101,7 @@ print_usage() {
|
||||
- 首页出现 KUAL
|
||||
- KUAL 菜单里有 Rename OTA Binaries
|
||||
- KUAL 菜单里有 kindle-dash
|
||||
- 如果本次预置了 KTerm 安装包,首页或搜索里应能找到 KTerm
|
||||
4. 先在 KUAL 中执行:
|
||||
Rename OTA Binaries -> Rename
|
||||
|
||||
@@ -114,9 +139,12 @@ print_usage() {
|
||||
2. 真正导 payload 的时机,是隐藏手势返回后,再次进入 ;demo -> Sideload Content。
|
||||
3. 首次 SSH 最稳的入口是 KTerm,不是 USB 直连盲试。
|
||||
4. post-ssh 阶段如果不带 -t/-o,会退回 themes.json 里的默认主题和方向。
|
||||
5. 如果本轮没有预置 KTerm 包,阶段 C 结束后仍需你手工补装 KTerm。
|
||||
|
||||
示例:
|
||||
sh bootstrap-new-kindle.sh prepare-storage
|
||||
sh bootstrap-new-kindle.sh prepare-storage --kterm-package ~/Downloads/kterm-kindle-2.6.zip
|
||||
sh bootstrap-new-kindle.sh prepare-storage --download-kterm --kterm-version latest
|
||||
sh bootstrap-new-kindle.sh all -t simple -o portrait
|
||||
sh bootstrap-new-kindle.sh post-ssh -k kindle --start-dashboard
|
||||
EOF
|
||||
@@ -135,6 +163,115 @@ require_path() {
|
||||
fi
|
||||
}
|
||||
|
||||
detect_kterm_package() {
|
||||
if [ -n "$KTERM_PACKAGE" ]; then
|
||||
if [ ! -f "$KTERM_PACKAGE" ]; then
|
||||
echo "指定的 KTerm 安装包不存在: $KTERM_PACKAGE" >&2
|
||||
exit 1
|
||||
fi
|
||||
printf '%s\n' "$KTERM_PACKAGE"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ ! -d "$KTERM_STAGING_DIR" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
set +e
|
||||
set -- "$KTERM_STAGING_DIR"/*.zip "$KTERM_STAGING_DIR"/*.bin
|
||||
status=$?
|
||||
set -e
|
||||
|
||||
if [ "$status" -ne 0 ] || [ ! -e "$1" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
printf '%s\n' "$1"
|
||||
}
|
||||
|
||||
download_kterm_if_requested() {
|
||||
if [ "$DOWNLOAD_KTERM" != true ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
mkdir -p "$KTERM_STAGING_DIR"
|
||||
metadata_json="$KTERM_STAGING_DIR/kterm-release-${KTERM_VERSION}.json"
|
||||
|
||||
case "$KTERM_VERSION" in
|
||||
latest)
|
||||
release_api_url="https://api.github.com/repos/$KTERM_GITHUB_REPO/releases/latest"
|
||||
;;
|
||||
*)
|
||||
release_api_url="https://api.github.com/repos/$KTERM_GITHUB_REPO/releases/tags/$KTERM_VERSION"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "正在从 GitHub 获取 KTerm release 元数据: $release_api_url"
|
||||
curl -fsSL "$release_api_url" -o "$metadata_json"
|
||||
|
||||
release_info="$(python3 - "$metadata_json" <<'PY'
|
||||
import json
|
||||
import pathlib
|
||||
import sys
|
||||
|
||||
path = pathlib.Path(sys.argv[1])
|
||||
data = json.loads(path.read_text())
|
||||
assets = data.get("assets", [])
|
||||
|
||||
preferred = None
|
||||
fallback = None
|
||||
for asset in assets:
|
||||
name = asset.get("name", "")
|
||||
url = asset.get("browser_download_url", "")
|
||||
if not name.endswith(".zip"):
|
||||
continue
|
||||
if fallback is None:
|
||||
fallback = (name, url)
|
||||
if "armhf" not in name.lower():
|
||||
preferred = (name, url)
|
||||
break
|
||||
|
||||
selected = preferred or fallback
|
||||
if not selected:
|
||||
raise SystemExit("未找到可用的 KTerm zip 资产")
|
||||
|
||||
tag = data.get("tag_name", "unknown")
|
||||
print(f"TAG={tag}")
|
||||
print(f"NAME={selected[0]}")
|
||||
print(f"URL={selected[1]}")
|
||||
PY
|
||||
)"
|
||||
|
||||
downloaded_tag=""
|
||||
downloaded_name=""
|
||||
downloaded_url=""
|
||||
while IFS='=' read -r key value; do
|
||||
case "$key" in
|
||||
TAG)
|
||||
downloaded_tag=$value
|
||||
;;
|
||||
NAME)
|
||||
downloaded_name=$value
|
||||
;;
|
||||
URL)
|
||||
downloaded_url=$value
|
||||
;;
|
||||
esac
|
||||
done <<EOF
|
||||
$release_info
|
||||
EOF
|
||||
|
||||
if [ -z "$downloaded_name" ] || [ -z "$downloaded_url" ]; then
|
||||
echo "无法解析 KTerm 下载地址。" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
downloaded_path="$KTERM_STAGING_DIR/$downloaded_name"
|
||||
echo "下载 KTerm: tag=$downloaded_tag asset=$downloaded_name"
|
||||
curl -fL "$downloaded_url" -o "$downloaded_path"
|
||||
KTERM_PACKAGE="$downloaded_path"
|
||||
}
|
||||
|
||||
kindle_volume_available() {
|
||||
[ -d "$VOLUME_PATH" ]
|
||||
}
|
||||
@@ -219,6 +356,31 @@ copy_post_jailbreak_bundle() {
|
||||
rsync -av --no-o --no-g "$POST_JAILBREAK_ROOT/dashboard/" "$VOLUME_PATH/dashboard/"
|
||||
}
|
||||
|
||||
install_kterm_package_if_available() {
|
||||
detected_kterm_package=$(detect_kterm_package || true)
|
||||
if [ -z "$detected_kterm_package" ]; then
|
||||
echo "未检测到 KTerm 安装包;本轮只预置 SSH 恢复脚本,KTerm 仍需手工补装。"
|
||||
return
|
||||
fi
|
||||
|
||||
case "$detected_kterm_package" in
|
||||
*.zip)
|
||||
mkdir -p "$VOLUME_PATH/extensions"
|
||||
unzip -oq "$detected_kterm_package" -d "$VOLUME_PATH/extensions"
|
||||
echo "已预置 KTerm 扩展包并解压到 extensions/: $(basename "$detected_kterm_package")"
|
||||
;;
|
||||
*.bin)
|
||||
mkdir -p "$VOLUME_PATH/mrpackages"
|
||||
cp "$detected_kterm_package" "$VOLUME_PATH/mrpackages/"
|
||||
echo "已预置 KTerm bin 到 mrpackages/: $(basename "$detected_kterm_package")"
|
||||
;;
|
||||
*)
|
||||
echo "不支持的 KTerm 安装包格式: $detected_kterm_package" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
copy_ssh_helpers() {
|
||||
require_path "$SSH_HELPERS_DIR/ssh-force-dropbear-22.sh" "SSH helper scripts"
|
||||
|
||||
@@ -251,12 +413,18 @@ prepare_storage() {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_step "USB" "检查并下载 KTerm 安装包"
|
||||
download_kterm_if_requested
|
||||
|
||||
log_step "USB" "预置 WatchThis payload"
|
||||
copy_watchthis_payload
|
||||
|
||||
log_step "USB" "预置越狱后安装包"
|
||||
copy_post_jailbreak_bundle
|
||||
|
||||
log_step "USB" "检查并预置 KTerm 安装包"
|
||||
install_kterm_package_if_available
|
||||
|
||||
log_step "USB" "预置 SSH 恢复脚本"
|
||||
copy_ssh_helpers
|
||||
|
||||
@@ -265,7 +433,7 @@ prepare_storage() {
|
||||
}
|
||||
|
||||
prepare_remote_helpers() {
|
||||
ssh "$HOST_TARGET" "chmod +x /mnt/us/ssh-collect.sh /mnt/us/ssh-fix-all-keys.sh /mnt/us/ssh-force-dropbear-22.sh /mnt/us/ssh-force-openssh-22.sh /mnt/us/ssh-stop-all.sh 2>/dev/null || true"
|
||||
ssh "$HOST_TARGET" "chmod +x /mnt/us/ssh-collect.sh /mnt/us/ssh-fix-all-keys.sh /mnt/us/ssh-force-dropbear-22.sh /mnt/us/ssh-stop-all.sh 2>/dev/null || true"
|
||||
ssh "$HOST_TARGET" "if [ -f /mnt/us/ssh-fix-all-keys.sh ]; then sh /mnt/us/ssh-fix-all-keys.sh; fi"
|
||||
}
|
||||
|
||||
@@ -355,6 +523,17 @@ while [ "$#" -gt 0 ]; do
|
||||
shift
|
||||
ORIENTATION=${1:?"missing orientation"}
|
||||
;;
|
||||
--kterm-package)
|
||||
shift
|
||||
KTERM_PACKAGE=${1:?"missing KTerm package path"}
|
||||
;;
|
||||
--download-kterm)
|
||||
DOWNLOAD_KTERM=true
|
||||
;;
|
||||
--kterm-version)
|
||||
shift
|
||||
KTERM_VERSION=${1:?"missing KTerm version"}
|
||||
;;
|
||||
--no-background)
|
||||
SHOW_BACKGROUND=false
|
||||
;;
|
||||
|
||||
Reference in New Issue
Block a user