Last active 1 day ago

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