Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
193 changes: 193 additions & 0 deletions src/usr/lib/rsetup/mod/change_sources.sh
Comment thread
RadxaYuntian marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
# shellcheck shell=bash

#
# Radxa APT sources management module
# Provides APT mirror switching and restoration functionality
#

# Get list of Radxa APT source URLs
# Output: One URL per line, first is official source, rest are mirrors
change_sources_list_radxa_urls() {
local urls=(
"https://mirrors.aghost.cn/radxa-deb"
"https://mirrors.lzu.edu.cn/radxa-deb"
"https://mirrors.hust.edu.cn/radxa-deb"
"https://mirrors.sdu.edu.cn/radxa-deb"
"https://mirror.nju.edu.cn/radxa-deb"
"https://mirror.nyist.edu.cn/radxa-deb"
)
printf '%s\n' "${urls[@]}"
}

# Get list of Debian/Ubuntu APT mirror URLs
# Output: One URL per line, only includes mirror sources (excludes official sources)
change_sources_list_deb_urls() {
local urls=(
Comment thread
RadxaYuntian marked this conversation as resolved.
"https://mirrors.ustc.edu.cn"
"https://mirrors.tuna.tsinghua.edu.cn"
"https://mirrors.lzu.edu.cn"
"https://mirrors.hust.edu.cn"
"https://mirrors.sdu.edu.cn"
"https://mirror.nju.edu.cn"
"https://mirror.nyist.edu.cn"
)
printf '%s\n' "${urls[@]}"
}

# Get all Radxa APT source configuration file paths
# Output: One file path per line
__change_sources_get_radxa_lists() {
shopt -s nullglob
local files=(/etc/apt/sources.list.d/*radxa*.list)
shopt -u nullglob

(( ${#files[@]} == 0 )) && return 0

printf '%s\n' "${files[@]}"
}

# Apply Radxa mirror replacement
# Args: $1 - new mirror URL
__change_sources_apply_radxa_mirror() {
local new_mirror="$1"
local all_mirrors=("https://radxa-repo.github.io")
local mirror_list=()
mapfile -t mirror_list < <(change_sources_list_radxa_urls)
all_mirrors+=("${mirror_list[@]}")

local file
while IFS= read -r file; do
[[ -n "$file" ]] || continue

# Replace all known Radxa mirrors with new mirror
local old_mirror
for old_mirror in "${all_mirrors[@]}"; do
sed -i "s|$old_mirror|$new_mirror|g" "$file"
done
done < <(__change_sources_get_radxa_lists)
}

# Set Radxa mirror
# Args: $1 - mirror URL
# Returns: 0 on success, 1 if mirror is not supported
change_sources_set_radxa_mirror() {
local mirror="$1"
local all_mirrors=()
mapfile -t all_mirrors < <(change_sources_list_radxa_urls)

if ! __in_array "$mirror" "${all_mirrors[@]}"; then
echo "Unsupported Radxa mirror: $mirror" >&2
return 1
fi

__change_sources_apply_radxa_mirror "$mirror"
echo "Radxa mirror set to: $mirror" >&2
}

# Apply Debian/Ubuntu mirror replacement
# Args: $1 - new mirror URL
__change_sources_apply_deb_mirror() {
local new_mirror="${1%/}"
local all_mirrors=(
"https://deb.debian.org"
"https://deb.ubuntu.com"
)
local mirror_list=()
mapfile -t mirror_list < <(change_sources_list_deb_urls)
all_mirrors+=("${mirror_list[@]}")

shopt -s nullglob
local lists=(/etc/apt/sources.list /etc/apt/sources.list.d/*.list)
shopt -u nullglob

local file
for file in "${lists[@]}"; do
[[ -f "$file" ]] || continue

# Skip Radxa source files to preserve chosen Radxa mirror
[[ "$file" == *radxa*.list ]] && continue

# Replace all known Debian/Ubuntu mirrors with new mirror
local old_mirror old_mirror_norm
for old_mirror in "${all_mirrors[@]}"; do
old_mirror_norm="${old_mirror%/}"
sed -i "s|$old_mirror_norm|$new_mirror|g" "$file"
done
done
}

# Set Debian/Ubuntu mirror
# Args: $1 - mirror URL
# Returns: 0 on success, 1 if mirror is not supported
change_sources_set_deb_mirror() {
local mirror="$1"
local all_mirrors=()
mapfile -t all_mirrors < <(change_sources_list_deb_urls)

if ! __in_array "$mirror" "${all_mirrors[@]}"; then
echo "Unsupported Debian/Ubuntu mirror: $mirror" >&2
return 1
fi

__change_sources_apply_deb_mirror "$mirror"
echo "Debian/Ubuntu mirror set to: $mirror" >&2
Comment thread
RadxaYuntian marked this conversation as resolved.
}

# Restore official APT sources
# Restores both Radxa and Debian/Ubuntu sources to official sources
change_sources_restore() {
# Restore Radxa to official source
__change_sources_apply_radxa_mirror "https://radxa-repo.github.io"

# Determine system type from /etc/os-release
local os_id=""
if [[ -f /etc/os-release ]]; then
# shellcheck disable=SC1091
source /etc/os-release
os_id="$ID"
fi

# Determine official mirror based on OS
local official_mirror
case "$os_id" in
ubuntu)
official_mirror="https://deb.ubuntu.com"
;;
debian)
official_mirror="https://deb.debian.org"
;;
*)
echo "Unable to determine OS type from /etc/os-release" >&2
return 1
;;
esac

# Restore Debian/Ubuntu sources to official sources
local all_mirrors=(
"https://deb.debian.org"
"https://deb.ubuntu.com"
)
local mirror_list=()
mapfile -t mirror_list < <(change_sources_list_deb_urls)
all_mirrors+=("${mirror_list[@]}")

shopt -s nullglob
local lists=(/etc/apt/sources.list /etc/apt/sources.list.d/*.list)
shopt -u nullglob

local file old_mirror old_mirror_norm
for file in "${lists[@]}"; do
[[ -f "$file" ]] || continue

# Skip Radxa source files
[[ "$file" == *radxa*.list ]] && continue

# Restore to official mirror based on detected OS
for old_mirror in "${all_mirrors[@]}"; do
old_mirror_norm="${old_mirror%/}"
sed -i "s|$old_mirror_norm|$official_mirror|g" "$file"
done
done

echo "APT sources restored to official sources" >&2
}
71 changes: 71 additions & 0 deletions src/usr/lib/rsetup/tui/system/system.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

# shellcheck source=src/usr/lib/rsetup/mod/get_setup_script.sh
source "/usr/lib/rsetup/mod/get_setup_script.sh"
source "/usr/lib/rsetup/mod/change_sources.sh"

__system_system_update() {
if yesno "System will be updated, continue?"
Expand Down Expand Up @@ -246,9 +247,79 @@ __system_bootloader_menu() {
menu_show "System Maintenance"
}

__system_change_sources() {
menu_init
menu_add __system_change_sources_radxa_select "Select Radxa mirror"
menu_add __system_change_sources_deb_select "Select Debian/Ubuntu mirror"
menu_add __system_change_sources_restore "Restore official sources"
menu_show "APT Sources"
}

__system_change_sources_radxa_select() {
menu_init

local mirrors=()
mapfile -t mirrors < <(change_sources_list_radxa_urls)

local m
for m in "${mirrors[@]}"; do
menu_add __system_apply_radxa_mirror "$m"
done
menu_emptymsg "No Radxa mirror is available."

menu_show "Select Radxa mirror:"
}

__system_apply_radxa_mirror() {
local mirror="$RTUI_MENU_SELECTED"

if change_sources_set_radxa_mirror "$mirror"; then
msgbox "Radxa sources updated to:\n$mirror"
else
msgbox "Failed to update Radxa sources." "$RTUI_PALETTE_ERROR"
fi
}

__system_change_sources_deb_select() {
menu_init

local mirrors=()
mapfile -t mirrors < <(change_sources_list_deb_urls)
local h
for h in "${mirrors[@]}"; do
menu_add __system_apply_deb_mirror "$h"
done
menu_emptymsg "No Debian/Ubuntu mirror is available."

menu_show "Select Debian/Ubuntu mirror:"
}

__system_apply_deb_mirror() {
local mirror="$RTUI_MENU_SELECTED"

if change_sources_set_deb_mirror "$mirror"; then
msgbox "Debian/Ubuntu sources updated to:\n$mirror"
else
msgbox "Failed to update Debian/Ubuntu sources." "$RTUI_PALETTE_ERROR"
fi
}

__system_change_sources_restore() {
if yesno "Restore official Radxa and Debian/Ubuntu sources?"
then
if change_sources_restore
then
msgbox "APT sources have been restored to official hosts."
else
msgbox "Failed to restore APT sources." "$RTUI_PALETTE_ERROR"
fi
fi
}

__system() {
menu_init
menu_add __system_system_update "System Update"
menu_add __system_change_sources "Change APT Sources"
menu_add __system_set_target "Change default boot target"
menu_add_separator
menu_add __system_bootloader_menu "Bootloader Management"
Expand Down