-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlauncher.sh
More file actions
executable file
·169 lines (137 loc) · 4.65 KB
/
Copy pathlauncher.sh
File metadata and controls
executable file
·169 lines (137 loc) · 4.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/usr/bin/env sh
set -eu
BASE="/opt/QQ"
LITELOADER="$HOME/.config/QQ/LiteLoaderQQNT"
UID_NUM="$(id -u)"
GID_NUM="$(id -g)"
XAUTH_FILE="${XAUTHORITY:-$HOME/.Xauthority}"
mkdir -p "$HOME/.config/QQ"
mkdir -p "$HOME/Downloads"
args=""
# ===== Namespace =====
args="$args --unshare-all --share-net"
args="$args --die-with-parent"
args="$args --new-session"
args="$args --proc /proc"
# ===== Devices =====
args="$args --dev /dev"
if [ -d /dev/dri ]; then
args="$args --dev-bind /dev/dri /dev/dri"
fi
# Mesa / DRM 需要这些来识别显卡
if [ -d /sys/dev/char ]; then
args="$args --ro-bind /sys/dev/char /sys/dev/char"
fi
if [ -d /sys/devices ]; then
args="$args --ro-bind /sys/devices /sys/devices"
fi
if [ -d /run/udev ]; then
args="$args --ro-bind /run/udev /run/udev"
fi
# ===== Runtime dirs =====
args="$args --tmpfs /tmp"
args="$args --dir /run"
args="$args --dir /run/user"
args="$args --dir /run/user/$UID_NUM"
# ===== Minimal system view =====
args="$args --ro-bind /usr /usr"
args="$args --ro-bind /lib /lib"
if [ -d /lib64 ]; then
args="$args --ro-bind /lib64 /lib64"
fi
args="$args --ro-bind /bin /bin"
if [ -d /sbin ]; then
args="$args --ro-bind /sbin /sbin"
fi
args="$args --ro-bind /etc /etc"
args="$args --ro-bind $BASE $BASE"
# ===== HOME isolation =====
# 不再暴露整个真实 HOME,只给一个临时 HOME,然后精确放行
args="$args --tmpfs $HOME"
args="$args --dir $HOME/.config"
args="$args --dir $HOME/Downloads"
# QQ 配置持久化
args="$args --bind $HOME/.config/QQ $HOME/.config/QQ"
# 下载目录持久化
args="$args --bind $HOME/Downloads $HOME/Downloads"
# 临时缓存
args="$args --tmpfs $HOME/.cache"
# crash 目录临时化
args="$args --tmpfs $HOME/.config/QQ/crash_files"
# ===== X11 =====
if [ -n "${DISPLAY:-}" ]; then
args="$args --setenv DISPLAY $DISPLAY"
if [ -d /tmp/.X11-unix ]; then
args="$args --ro-bind /tmp/.X11-unix /tmp/.X11-unix"
fi
fi
if [ -f "$XAUTH_FILE" ]; then
args="$args --ro-bind $XAUTH_FILE $XAUTH_FILE"
args="$args --setenv XAUTHORITY $XAUTH_FILE"
fi
# ===== Wayland =====
args="$args --setenv XDG_RUNTIME_DIR /run/user/$UID_NUM"
if [ -n "${WAYLAND_DISPLAY:-}" ] && [ -S "/run/user/$UID_NUM/$WAYLAND_DISPLAY" ]; then
args="$args --bind /run/user/$UID_NUM/$WAYLAND_DISPLAY /run/user/$UID_NUM/$WAYLAND_DISPLAY"
args="$args --setenv WAYLAND_DISPLAY $WAYLAND_DISPLAY"
fi
# ===== D-Bus =====
if [ -S "/run/user/$UID_NUM/bus" ]; then
args="$args --bind /run/user/$UID_NUM/bus /run/user/$UID_NUM/bus"
args="$args --setenv DBUS_SESSION_BUS_ADDRESS unix:path=/run/user/$UID_NUM/bus"
fi
if [ -S /run/dbus/system_bus_socket ]; then
args="$args --ro-bind /run/dbus/system_bus_socket /run/dbus/system_bus_socket"
fi
# ===== Common env =====
args="$args --setenv HOME $HOME"
args="$args --setenv USER ${USER:-$(id -un)}"
args="$args --setenv LOGNAME ${LOGNAME:-$(id -un)}"
args="$args --setenv SHELL ${SHELL:-/bin/sh}"
args="$args --setenv PATH /usr/local/sbin:/usr/local/bin:/usr/bin:/bin"
args="$args --setenv XDG_CONFIG_HOME $HOME/.config"
args="$args --setenv XDG_CACHE_HOME $HOME/.cache"
args="$args --setenv XDG_DOWNLOAD_DIR $HOME/Downloads"
# ===== GPU/Mesa compatibility =====
# 某些 Electron/Chromium 程序会参考这些环境
if [ -d /usr/share/drirc.d ]; then
args="$args --ro-bind /usr/share/drirc.d /usr/share/drirc.d"
fi
if [ -d /usr/share/glvnd ]; then
args="$args --ro-bind /usr/share/glvnd /usr/share/glvnd"
fi
# ===== LD_PRELOAD inject =====
if [ -n "${DEBUG:-}" ]; then
inject="$(realpath "$(dirname "$0")")/inject/target/debug/libinject.so"
args="$args --setenv LD_PRELOAD $inject"
else
args="$args --setenv LD_PRELOAD $BASE/libinject.so"
fi
# ===== LiteLoader =====
if [ -d "$LITELOADER" ]; then
echo "Loading LiteLoaderQQNT..."
# 挂载 LiteLoaderQQNT 目录
mkdir -p "$LITELOADER"
args="$args --bind $LITELOADER $LITELOADER"
# 挂载 package.json
fake_package="$(mktemp)"
package_json="$BASE/resources/app/package.json"
sed -e 's/index.js/loader_index.js/g' \
-e 's/application.asar/./g' \
"$package_json" > "$fake_package"
args="$args --ro-bind $fake_package $package_json"
# 挂载入口 js
overlay_dir="$BASE/resources/app/app_launcher"
args="$args --tmpfs $overlay_dir"
for file in "$overlay_dir"/*; do
[ -e "$file" ] || continue
args="$args --bind $file $file"
done
fake_entry="$(mktemp)"
printf "require('%s');\n" "$LITELOADER" > "$fake_entry"
args="$args --ro-bind $fake_entry $BASE/resources/app/app_launcher/loader_index.js"
fi
# ===== Workdir / launch =====
args="$args --chdir $HOME"
# shellcheck disable=SC2086
exec bwrap $args "$BASE/main"