Last active 2 days ago

Revision a1432d1eb6af7e6ed20d65e6bfbdf958bae61b58

ubuntu_to_aos.sh Raw
1#!/bin/bash
2#==========================
3# Set up the environment
4#==========================
5set -e # exit on error
6set -o pipefail # exit on pipeline error
7set -u # treat unset variable as error
8
9
10#==========================
11# Color
12#==========================
13Green="\033[32m"
14Red="\033[31m"
15Yellow="\033[33m"
16Blue="\033[36m"
17Font="\033[0m"
18GreenBG="\033[42;37m"
19RedBG="\033[41;37m"
20OK="${Green}[ OK ]${Font}"
21ERROR="${Red}[FAILED]${Font}"
22WARNING="${Yellow}[ WARN ]${Font}"
23
24#==========================
25# Print Colorful Text
26#==========================
27function print_ok() {
28 echo -e "${OK} ${Blue} $1 ${Font}"
29}
30
31function print_error() {
32 echo -e "${ERROR} ${Red} $1 ${Font}"
33}
34
35function print_warn() {
36 echo -e "${WARNING} ${Yellow} $1 ${Font}"
37}
38
39#==========================
40# Judge function
41#==========================
42function judge() {
43 if [[ 0 -eq $? ]]; then
44 print_ok "$1 succeeded"
45 sleep 0.2
46 else
47 print_error "$1 failed"
48 exit 1
49 fi
50}
51#==========================
52
53# Clean up function
54#==========================
55function clean_up() {
56 # Clean up
57 print_ok "Cleaning up old files..."
58 sudo umount /mnt/anduinos_squashfs >/dev/null 2>&1 || true
59 sudo umount /mnt/anduinos_iso >/dev/null 2>&1 || true
60 sudo rm -rf /mnt/anduinos_squashfs >/dev/null 2>&1 || true
61 sudo rm -rf /mnt/anduinos_iso >/dev/null 2>&1 || true
62 sudo rm /tmp/AnduinOS-1.4.0* >/dev/null 2>&1 || true
63 judge "Cleanup"
64}
65
66clean_up
67
68print_ok "Checking system compatibility..."
69codename=$(lsb_release -cs)
70if [[ "$codename" != "questing" ]] then
71 print_error "This upgrade script only supports AnduinOS Noble, Verne, and Turing."
72 exit 1
73fi
74judge "System compatibility check"
75
76print_ok "Installing required packages (aria2, curl, lsb-release)..."
77sudo apt install -y aria2 curl lsb-release
78judge "Install required packages"
79
80# $LANG maybe en_US.UTF-8, so we use only the `en_US` part
81CURRENT_LANG=${LANG%%.*}
82DOWNLOAD_URL="https://download.anduinos.com/1.4/1.4.0/AnduinOS-1.4.0-${CURRENT_LANG}.torrent"
83HASH_URL="https://download.anduinos.com/1.4/1.4.0/AnduinOS-1.4.0-${CURRENT_LANG}.sha256"
84
85print_ok "Current system language detected: ${CURRENT_LANG}"
86print_ok "Attempting to download with URL: ${DOWNLOAD_URL}"
87
88# If download URL is not reachable, fallback to en_US
89if ! curl --head --silent --fail "$DOWNLOAD_URL" >/dev/null; then
90 print_warn "Language pack for ${CURRENT_LANG} not found, falling back to en_US"
91 DOWNLOAD_URL="https://download.anduinos.com/1.4/1.4.0/AnduinOS-1.4.0-en_US.torrent"
92 HASH_URL="https://download.anduinos.com/1.4/1.4.0/AnduinOS-1.4.0-en_US.sha256"
93fi
94
95# Ensure download URL is reachable
96if ! curl --head --silent --fail "$DOWNLOAD_URL" >/dev/null; then
97 print_error "Download URL is not reachable. Please check your network connection."
98 exit 1
99fi
100
101print_ok "Downloading AnduinOS 1.4.0 torrent, please wait..."
102curl -o /tmp/AnduinOS-1.4.0.torrent "$DOWNLOAD_URL"
103curl -o /tmp/AnduinOS-1.4.0.sha256 "$HASH_URL"
104judge "Download AnduinOS 1.4.0 torrent"
105
106print_ok "Starting download via aria2..."
107aria2c --allow-overwrite=true --seed-ratio=0.0 --seed-time=0 -x 16 -s 16 -k 1M -d /tmp /tmp/AnduinOS-1.4.0.torrent
108judge "Download AnduinOS 1.4.0 ISO"
109
110ISO_FILE_PATH=$(ls /tmp/AnduinOS-1.4.0*.iso | head -n 1)
111print_ok "Ensure downloaded ISO file exists..."
112if [[ -f "$ISO_FILE_PATH" ]]; then
113 print_ok "Downloaded ISO file found: $ISO_FILE_PATH"
114else
115 print_error "Downloaded ISO file not found."
116 exit 1
117fi
118
119SHA256_FILE_PATH="/tmp/AnduinOS-1.4.0.sha256"
120
121print_ok "Verifying download integrity..."
122ACTUAL_SHA256=$(sha256sum "$ISO_FILE_PATH" | awk '{print $1}')
123EXPECTED_SHA256=$(grep 'SHA256:' "$SHA256_FILE_PATH" | awk '{print $2}')
124if [[ "$ACTUAL_SHA256" == "$EXPECTED_SHA256" ]]; then
125 print_ok "SHA256 checksum verification passed."
126else
127 print_ok "Expected SHA256: $EXPECTED_SHA256"
128 print_ok "Actual SHA256: $ACTUAL_SHA256"
129 print_error "SHA256 checksum verification failed. The downloaded file may be corrupted."
130 exit 1
131fi
132
133print_ok "Mounting the ISO..."
134sudo mkdir -p /mnt/anduinos_iso
135sudo mount -o loop,ro "$ISO_FILE_PATH" /mnt/anduinos_iso
136judge "Mount ISO"
137
138print_ok "Verifying content in the ISO..."
139(cd /mnt/anduinos_iso && sudo md5sum -c md5sum.txt)
140judge "ISO content integrity verification"
141
142print_ok "Mounting the filesystem.squashfs..."
143sudo mkdir -p /mnt/anduinos_squashfs
144sudo mount -o loop,ro /mnt/anduinos_iso/casper/filesystem.squashfs /mnt/anduinos_squashfs
145judge "Mount filesystem.squashfs"
146
147print_ok "Updating package mirrors..."
148curl -s https://gitlab.aiursoft.cn/anduin/init-server/-/raw/master/mirror.sh?ref_type=heads | bash
149sudo apt update
150judge "Update package mirrors"
151
152# Reset apt settings
153print_ok "Resetting APT configuration files..."
154sudo rm /etc/apt/preferences.d/* >/dev/null 2>&1 || true
155judge "Reset APT configuration files"
156
157# Add Mozilla Team PPA
158print_ok "Updating Mozilla Team PPA..."
159sudo rm -f /etc/apt/sources.list.d/mozillateam*
160sudo rsync -Aax /mnt/anduinos_squashfs/etc/apt/sources.list.d/mozillateam* /etc/apt/sources.list.d/
161judge "Update Mozilla Team PPA"
162
163# Install missing package.
164print_ok "Installing missing packages from the new release..."
165MANIFEST_FILE="/mnt/anduinos_iso/casper/filesystem.manifest-desktop"
166cut -d' ' -f1 "$MANIFEST_FILE" \
167 | grep -v '^linux-' \
168 | grep -v '^lib' \
169 | grep -v '^plymouth-' \
170 | grep -v '^software-properties-' \
171 | xargs sudo apt install -y # <-- 让 xargs 自己调用 apt
172judge "Install missing packages"
173
174# Remove obsolete packages.
175print_ok "Removing obsolete packages..."
176sudo apt autoremove -y \
177 distro-info \
178 software-properties-gtk \
179 ubuntu-advantage-tools \
180 ubuntu-pro-client \
181 ubuntu-pro-client-l10n \
182 ubuntu-release-upgrader-gtk \
183 ubuntu-report \
184 ubuntu-settings \
185 update-notifier-common \
186 update-manager \
187 update-manager-core \
188 update-notifier \
189 ubuntu-release-upgrader-core \
190 ubuntu-advantage-desktop-daemon \
191 kgx
192judge "Remove obsolete packages"
193
194print_ok "Upgrading installed packages..."
195sudo apt upgrade -y
196sudo apt autoremove --purge -y
197judge "System package cleanup"
198
199print_ok "Upgrading GNOME Shell extensions..."
200sudo rsync -Aax --update --delete /mnt/anduinos_squashfs/usr/share/gnome-shell/extensions/ /usr/share/gnome-shell/extensions/
201judge "Upgrade GNOME Shell extensions"
202
203print_ok "Upgrading APT configuration files..."
204sudo rsync -Aax --update --delete /mnt/anduinos_squashfs/etc/apt/apt.conf.d/ /etc/apt/apt.conf.d/
205judge "Upgrade APT configuration files"
206
207print_ok "Upgrading APT preferences files..."
208sudo rsync -Aax --update --delete /mnt/anduinos_squashfs/etc/apt/preferences.d/ /etc/apt/preferences.d/
209judge "Upgrade APT preferences files"
210
211print_ok "Upgrading session files..."
212sudo rsync -Aax --update --delete /mnt/anduinos_squashfs/usr/share/gnome-session/sessions/ /usr/share/gnome-session/sessions/
213sudo rsync -Aax --update --delete /mnt/anduinos_squashfs/usr/share/wayland-sessions/ /usr/share/wayland-sessions/
214judge "Upgrade session files"
215
216print_ok "Upgrading pixmaps..."
217sudo rsync -Aax --update --delete /mnt/anduinos_squashfs/usr/share/pixmaps/ /usr/share/pixmaps/
218judge "Upgrade pixmaps"
219
220print_ok "Upgrading python-apt templates and distro info..."
221sudo rsync -Aax --update --delete /mnt/anduinos_squashfs/usr/share/python-apt/templates/ /usr/share/python-apt/templates/
222sudo rsync -Aax --update --delete /mnt/anduinos_squashfs/usr/share/distro-info/ /usr/share/distro-info/
223judge "Upgrade python-apt templates and distro info"
224
225print_ok "Upgrading deskmon service..."
226systemctl --user stop deskmon.service || true
227sudo rsync -Aax /mnt/anduinos_squashfs/usr/local/bin/deskmon /usr/local/bin/deskmon
228sudo rsync -Aax /mnt/anduinos_squashfs/etc/systemd/user/deskmon.service /etc/systemd/user/deskmon.service
229sudo rsync -Aax /mnt/anduinos_squashfs/etc/systemd/user/default.target.wants/deskmon.service /etc/systemd/user/default.target.wants/deskmon.service
230systemctl --user daemon-reload
231systemctl --user start deskmon.service
232judge "Upgrade deskmon service"
233
234print_ok "Updating system version information..."
235sudo rsync -Aax /mnt/anduinos_squashfs/usr/bin/do_anduinos_upgrade /usr/local/bin/do_anduinos_upgrade
236sudo rsync -Aax /mnt/anduinos_squashfs/usr/bin/add-apt-repository /usr/bin/add-apt-repository
237sudo rsync -Aax /mnt/anduinos_squashfs/etc/lsb-release /etc/lsb-release
238sudo rsync -Aax /mnt/anduinos_squashfs/etc/issue /etc/issue
239sudo rsync -Aax /mnt/anduinos_squashfs/etc/issue.net /etc/issue.net
240sudo rsync -Aax /mnt/anduinos_squashfs/etc/os-release /etc/os-release
241sudo rsync -Aax /mnt/anduinos_squashfs/usr/lib/os-release /usr/lib/os-release
242sudo rsync -Aax /mnt/anduinos_squashfs/etc/legal /etc/legal
243sudo rsync -Aax /mnt/anduinos_squashfs/etc/sysctl.d/20-apparmor-donotrestrict.conf /etc/sysctl.d/20-apparmor-donotrestrict.conf
244judge "Update system version information"
245
246print_ok "Applying dconf settings patch..."
247VERSION=$(grep -oP "VERSION_ID=\"\\K\\d+\\.\\d+" /etc/os-release)
248PATCH_URL="https://gitlab.aiursoft.cn/anduin/anduinos/-/raw/$VERSION/src/mods/35-dconf-patch/dconf.ini?ref_type=heads"
249
250if [[ -n "$SUDO_USER" ]]; then
251 sudo -u "$SUDO_USER" DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u $SUDO_USER)/bus" \
252 bash -c "curl -sL '$PATCH_URL' | dconf load /org/gnome/"
253else
254 bash -c "curl -sL '$PATCH_URL' | dconf load /org/gnome/"
255fi
256judge "Apply dconf settings patch"
257
258print_ok "Upgrade completed! Please reboot your system to apply all changes."
259
260print_ok "Starting cleanup..."
261clean_up
262