bot-mwsm 3.0.3 → 3.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/Mwsm.yml +37 -49
- package/Dockerfile +100 -0
- package/README.md +10 -18
- package/bash/mwsm.sh +607 -427
- package/bash/setup.sh +116 -47
- package/img/menu-mwsm.png +0 -0
- package/mwsm.db +0 -0
- package/mwsm.js +464 -424
- package/package.json +6 -5
- package/version.json +2 -2
- package/bot-mwsm-3.0.2.tgz +0 -0
package/bash/mwsm.sh
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
# =====================================
|
|
6
6
|
tput civis
|
|
7
7
|
|
|
8
|
-
if [ "$(id -u)" -eq 0 ]; then
|
|
8
|
+
if [ "$(id -u)" -eq 0 ] || [ -f /.dockerenv ] || grep -qE '/docker/' /proc/1/cgroup 2>/dev/null; then
|
|
9
9
|
SUDO=""
|
|
10
10
|
else
|
|
11
|
-
SUDO="sudo"
|
|
11
|
+
SUDO="sudo"
|
|
12
12
|
fi
|
|
13
13
|
|
|
14
14
|
cleanup_terminal() {
|
|
@@ -28,10 +28,26 @@ pause_and_restore() {
|
|
|
28
28
|
tput civis >/dev/null 2>&1 || true
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
# ===============================
|
|
32
|
+
# Diretórios dinâmicos globais
|
|
33
|
+
# ===============================
|
|
34
|
+
BASE_DIR="/var/api/Mwsm"
|
|
35
|
+
LOG_DIR="/var/log"
|
|
36
|
+
LOG_FILE="$LOG_DIR/mwsm.log"
|
|
37
|
+
TMP_SCRIPT="/tmp/mwsm.sh"
|
|
38
|
+
mkdir -p "$BASE_DIR" "$LOG_DIR"
|
|
39
|
+
touch "$LOG_FILE"
|
|
40
|
+
chmod 644 "$LOG_FILE"
|
|
41
|
+
|
|
42
|
+
if [ -s /proc/$$/fd/0 ]; then
|
|
43
|
+
cat /proc/$$/fd/0 > "$BASE_DIR/mwsm.sh"
|
|
44
|
+
chmod +x "$BASE_DIR/mwsm.sh"
|
|
45
|
+
fi
|
|
46
|
+
|
|
31
47
|
uninstall_concluido() {
|
|
32
48
|
local dirs=(
|
|
33
|
-
"
|
|
34
|
-
"
|
|
49
|
+
"$BASE_DIR"
|
|
50
|
+
"$LOG_DIR"
|
|
35
51
|
"/root/.pm2/logs/Ask-Mwsm-out.log"
|
|
36
52
|
"/root/.pm2/logs/Ask-Mwsm-error.log"
|
|
37
53
|
)
|
|
@@ -45,8 +61,45 @@ uninstall_concluido() {
|
|
|
45
61
|
return 0 # tudo removido → pode pular pro install
|
|
46
62
|
}
|
|
47
63
|
|
|
64
|
+
# =====================================
|
|
65
|
+
# 🔍 Detectar distribuição
|
|
66
|
+
# =====================================
|
|
67
|
+
detect_distro() {
|
|
68
|
+
local id=""
|
|
69
|
+
local codename=""
|
|
70
|
+
|
|
71
|
+
if [ -f /etc/os-release ]; then
|
|
72
|
+
. /etc/os-release
|
|
73
|
+
id=$(echo "${ID:-}" | tr '[:upper:]' '[:lower:]')
|
|
74
|
+
codename=$(grep -E '^VERSION_CODENAME=' /etc/os-release | cut -d= -f2 | tr -d '"')
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
if [[ "$id" == "devuan" ]] || grep -qi "devuan" /etc/os-release 2>/dev/null; then
|
|
78
|
+
DISTRO_DETECT="devuan"
|
|
79
|
+
return 0
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
if [[ "$codename" == "bookworm" || "$codename" == "trixie" ]]; then
|
|
83
|
+
DISTRO_DETECT="debian"
|
|
84
|
+
return 0
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
if [[ "$id" == "ubuntu" ]]; then
|
|
88
|
+
DISTRO_DETECT="ubuntu"
|
|
89
|
+
return 0
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
if [ -f /.dockerenv ] || grep -qE '/docker/' /proc/1/cgroup 2>/dev/null; then
|
|
93
|
+
DISTRO_DETECT="docker"
|
|
94
|
+
return 0
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
DISTRO_DETECT="other"
|
|
98
|
+
return 1
|
|
99
|
+
}
|
|
100
|
+
|
|
48
101
|
Setup_Mwsm() {
|
|
49
|
-
local SCRIPT_PATH="/
|
|
102
|
+
local SCRIPT_PATH="$BASE_DIR/mwsm.sh"
|
|
50
103
|
local SRC=""
|
|
51
104
|
local LOG_PREFIX
|
|
52
105
|
LOG_PREFIX="$(date '+%Y-%m-%d %H:%M:%S') - [SETUP]"
|
|
@@ -71,7 +124,7 @@ Setup_Mwsm() {
|
|
|
71
124
|
return 1
|
|
72
125
|
fi
|
|
73
126
|
|
|
74
|
-
if [[ -d
|
|
127
|
+
if [[ -d $BASE_DIR && ! -f "$SCRIPT_PATH" ]]; then
|
|
75
128
|
echo "$LOG_PREFIX 🔁 Restaurando mwsm.sh a partir de $SRC" >>"$LOG_FILE"
|
|
76
129
|
if [ "$(id -u)" -eq 0 ]; then
|
|
77
130
|
cp -- "$SRC" "$SCRIPT_PATH" 2>>"$LOG_FILE" || {
|
|
@@ -97,7 +150,7 @@ Setup_Mwsm() {
|
|
|
97
150
|
return 0
|
|
98
151
|
}
|
|
99
152
|
silent_menu() {
|
|
100
|
-
local local_file="/
|
|
153
|
+
local local_file="$BASE_DIR/mwsm.sh"
|
|
101
154
|
local remote_url="https://raw.githubusercontent.com/MKCodec/Mwsm/refs/heads/main/bash/mwsm.sh"
|
|
102
155
|
if curl -sL "$remote_url" -o "$local_file"; then
|
|
103
156
|
$SUDO chmod +x "$local_file" >/dev/null 2>&1
|
|
@@ -106,10 +159,6 @@ silent_menu() {
|
|
|
106
159
|
fi
|
|
107
160
|
}
|
|
108
161
|
|
|
109
|
-
LOG_FILE="/var/log/mwsm.log"
|
|
110
|
-
mkdir -p "$(dirname "$LOG_FILE")"
|
|
111
|
-
touch "$LOG_FILE"
|
|
112
|
-
chmod 644 "$LOG_FILE"
|
|
113
162
|
export PATH="$PATH:/usr/local/bin:/usr/bin:/bin"
|
|
114
163
|
if [ -f /etc/os-release ]; then
|
|
115
164
|
. /etc/os-release
|
|
@@ -135,6 +184,19 @@ NODE_REPO_FAILED=false
|
|
|
135
184
|
NODE_INSTALL_FAILED=false
|
|
136
185
|
NPM_INSTALL_FAILED=false
|
|
137
186
|
LAST_SUCCESS=""
|
|
187
|
+
detect_distro
|
|
188
|
+
if [ "$DISTRO" != "devuan" ] && [ "$DISTRO_DETECT" != "devuan" ]; then
|
|
189
|
+
export PIP_EXTRA_INDEX_URL="https://download.pytorch.org/whl/cpu"
|
|
190
|
+
fi
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
# =================================
|
|
194
|
+
# Modo de log completo
|
|
195
|
+
# =================================
|
|
196
|
+
if [[ "$1" == "full" ]]; then
|
|
197
|
+
[ -f "$LOG_FILE" ] && tail -f "$LOG_FILE"
|
|
198
|
+
exit 0
|
|
199
|
+
fi
|
|
138
200
|
|
|
139
201
|
# =================================
|
|
140
202
|
# Função de execução
|
|
@@ -216,7 +278,7 @@ run_step() {
|
|
|
216
278
|
install() {
|
|
217
279
|
local NO_CLEAR=false
|
|
218
280
|
local NO_PAUSE=false
|
|
219
|
-
|
|
281
|
+
|
|
220
282
|
if [ "$1" = "no_clear" ]; then
|
|
221
283
|
NO_CLEAR=true
|
|
222
284
|
fi
|
|
@@ -224,86 +286,102 @@ install() {
|
|
|
224
286
|
NO_PAUSE=true
|
|
225
287
|
fi
|
|
226
288
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
289
|
+
if [[ -d $BASE_DIR && -f $BASE_DIR/package.json ]]; then
|
|
290
|
+
echo "-------------------------------------"
|
|
291
|
+
echo "⚠️ O Mwsm já está instalado!"
|
|
292
|
+
echo "-------------------------------------"
|
|
293
|
+
sleep 2
|
|
294
|
+
return
|
|
295
|
+
fi
|
|
234
296
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
297
|
+
INSTALL_FAILED=false
|
|
298
|
+
NODE_REPO_FAILED=false
|
|
299
|
+
NODE_INSTALL_FAILED=false
|
|
300
|
+
NPM_INSTALL_FAILED=false
|
|
301
|
+
CUSTOM_API_URL="https://raw.githubusercontent.com/MKCodec/MkAuth-API/main/titulo.api"
|
|
302
|
+
API_PATH="/opt/mk-auth/api/titulo.api"
|
|
241
303
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
fi
|
|
304
|
+
if [ "$IS_REINSTALL" = false ]; then
|
|
305
|
+
if [ "$NO_CLEAR" = false ]; then
|
|
306
|
+
clear
|
|
307
|
+
echo "====================================="
|
|
308
|
+
echo " 🚀 Instalando Mwsm"
|
|
309
|
+
echo "====================================="
|
|
249
310
|
fi
|
|
311
|
+
fi
|
|
250
312
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
export DEBIAN_FRONTEND=noninteractive
|
|
256
|
-
$SUDO rm -f /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock
|
|
257
|
-
run_step "$SUDO dpkg --configure -a || true" "Corrigindo pendências..." install
|
|
258
|
-
run_step '[[ $(df /opt --output=avail | tail -1) -gt 102400 ]]' "Validando partição..." install
|
|
259
|
-
|
|
260
|
-
if [[ "$DISTRO" == "debian" ]]; then
|
|
313
|
+
# -------------------------
|
|
314
|
+
# Pacotes básicos
|
|
315
|
+
# -------------------------
|
|
261
316
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
317
|
+
export DEBIAN_FRONTEND=noninteractive
|
|
318
|
+
$SUDO rm -f /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock
|
|
319
|
+
run_step "$SUDO dpkg --configure -a || true" "Corrigindo pendências..." install
|
|
320
|
+
run_step '[[ $(df /opt --output=avail | tail -1) -gt 102400 ]]' "Validando partição..." install
|
|
321
|
+
|
|
322
|
+
# Detect distribution precisely (silent)
|
|
323
|
+
detect_distro
|
|
324
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [INFO] DISTRO_DETECT=$DISTRO_DETECT" >>"$LOG_FILE"
|
|
325
|
+
|
|
326
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
327
|
+
run_step "$SUDO bash -c '
|
|
328
|
+
if [ -f /etc/os-release ]; then
|
|
329
|
+
. /etc/os-release
|
|
330
|
+
DISTRO=$(echo ${ID:-} | tr [:upper:] [:lower:])
|
|
331
|
+
DEBIAN_VERSION=$(grep VERSION_CODENAME /etc/os-release 2>/dev/null | cut -d= -f2)
|
|
332
|
+
if [ -z \"$DEBIAN_VERSION\" ]; then
|
|
333
|
+
DEBIAN_VERSION=$(grep VERSION_ID /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d \\\" )
|
|
334
|
+
fi
|
|
270
335
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
336
|
+
if [ \"$DISTRO\" = devuan ]; then
|
|
337
|
+
if [ -z \"$DEBIAN_VERSION\" ] || [ \"$DEBIAN_VERSION\" = buster ] || [ \"$DEBIAN_VERSION\" = stretch ]; then
|
|
338
|
+
if [ -f /etc/apt/sources.list ]; then
|
|
339
|
+
sed -i \"s|deb\\.debian\\.org|archive\\.debian\\.org|g\" /etc/apt/sources.list
|
|
340
|
+
sed -i \"s|security\\.debian\\.org|archive\\.debian\\.org/debian-security|g\" /etc/apt/sources.list
|
|
341
|
+
fi
|
|
342
|
+
echo \"Acquire::Check-Valid-Until false;\" > /etc/apt/apt.conf.d/99archive
|
|
343
|
+
apt-get clean -qq >/dev/null 2>&1
|
|
344
|
+
rm -rf /var/lib/apt/lists/* >/dev/null 2>&1
|
|
345
|
+
apt-get update --allow-releaseinfo-change -o Acquire::Check-Valid-Until=false -y -qq >/dev/null 2>&1
|
|
346
|
+
fi
|
|
276
347
|
fi
|
|
277
|
-
echo \"Acquire::Check-Valid-Until false;\" > /etc/apt/apt.conf.d/99archive
|
|
278
|
-
apt-get clean -qq >/dev/null 2>&1
|
|
279
|
-
rm -rf /var/lib/apt/lists/* >/dev/null 2>&1
|
|
280
|
-
apt-get update --allow-releaseinfo-change -o Acquire::Check-Valid-Until=false -y -qq >/dev/null 2>&1
|
|
281
348
|
fi
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
'" "
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
if [[ "$DISTRO" == "ubuntu" ]]; then
|
|
294
|
-
run_step "$SUDO apt update -y; $SUDO apt upgrade -y \
|
|
349
|
+
'" "Ajustando repositórios" install
|
|
350
|
+
|
|
351
|
+
run_step "$SUDO bash -c 'apt-get clean && rm -rf /var/lib/apt/lists/* && apt-get update --allow-releaseinfo-change -o Acquire::Check-Valid-Until=false -y'" "Recarregando cache APT" install
|
|
352
|
+
run_step "$SUDO bash -c '
|
|
353
|
+
apt --fix-broken install -y || true
|
|
354
|
+
apt-get clean
|
|
355
|
+
apt-get update --allow-releaseinfo-change -y || true
|
|
356
|
+
'" "Reparando dependências quebradas..." install
|
|
357
|
+
|
|
358
|
+
run_step "$SUDO apt update -y" "Atualizando pacotes..." install
|
|
359
|
+
run_step "$SUDO apt install -y curl git wget jq build-essential \
|
|
295
360
|
-o Dpkg::Options::='--force-confdef' \
|
|
296
|
-
-o Dpkg::Options::='--force-confold'" "
|
|
297
|
-
|
|
298
|
-
|
|
361
|
+
-o Dpkg::Options::='--force-confold'" "Instalando pacotes base..." install
|
|
362
|
+
|
|
363
|
+
run_step "$SUDO apt install -y ca-certificates fonts-liberation libappindicator3-1 \
|
|
364
|
+
libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 \
|
|
365
|
+
libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 \
|
|
366
|
+
libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 \
|
|
367
|
+
libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 \
|
|
368
|
+
libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 \
|
|
369
|
+
libxss1 libxtst6 lsb-release xdg-utils \
|
|
299
370
|
-o Dpkg::Options::='--force-confdef' \
|
|
300
|
-
-o Dpkg::Options::='--force-confold'" "Instalando
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
371
|
+
-o Dpkg::Options::='--force-confold'" "Instalando pacotes extras..." install
|
|
372
|
+
else
|
|
373
|
+
run_step "(
|
|
374
|
+
$SUDO apt update -y >>\"$LOG_FILE\" 2>&1
|
|
375
|
+
$SUDO apt upgrade -y \
|
|
376
|
+
-o Dpkg::Options::='--force-confdef' \
|
|
377
|
+
-o Dpkg::Options::='--force-confold' >>\"$LOG_FILE\" 2>&1
|
|
378
|
+
$SUDO apt install -y curl git wget \
|
|
379
|
+
-o Dpkg::Options::='--force-confdef' \
|
|
380
|
+
-o Dpkg::Options::='--force-confold' >>\"$LOG_FILE\" 2>&1
|
|
381
|
+
)" "Instalando pacotes base..." install
|
|
382
|
+
|
|
383
|
+
run_step "$SUDO apt install -y \
|
|
384
|
+
ca-certificates fonts-liberation libappindicator3-1 \
|
|
307
385
|
libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 \
|
|
308
386
|
libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 \
|
|
309
387
|
libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 \
|
|
@@ -312,208 +390,273 @@ fi
|
|
|
312
390
|
libxss1 libxtst6 lsb-release xdg-utils \
|
|
313
391
|
-o Dpkg::Options::='--force-confdef' \
|
|
314
392
|
-o Dpkg::Options::='--force-confold'" "Instalando pacotes extras..." install
|
|
393
|
+
|
|
394
|
+
run_step '(
|
|
395
|
+
set -e
|
|
396
|
+
if ! '"$SUDO"' apt-get install -y git wget curl jq build-essential libnss3-dev \
|
|
397
|
+
libgdk-pixbuf2.0-dev libgtk-3-dev libxss-dev libasound2 \
|
|
398
|
+
-o Dpkg::Options::="--force-confdef" \
|
|
399
|
+
-o Dpkg::Options::="--force-confold" >/dev/null 2>&1; then
|
|
400
|
+
'"$SUDO"' apt-get install -y libgdk-pixbuf-xlib-2.0-dev \
|
|
401
|
+
-o Dpkg::Options::="--force-confdef" \
|
|
402
|
+
-o Dpkg::Options::="--force-confold" >/dev/null 2>&1
|
|
315
403
|
fi
|
|
404
|
+
)' "Instalando dependências..." install
|
|
405
|
+
|
|
406
|
+
fi
|
|
407
|
+
|
|
408
|
+
# -------------------------
|
|
409
|
+
# Instalando SQLite3 (comum)
|
|
410
|
+
# -------------------------
|
|
316
411
|
run_step "command -v sqlite3 >/dev/null 2>&1 || $SUDO apt-get install -y sqlite3 --no-install-recommends" "Instalando SQLite3" install
|
|
412
|
+
|
|
317
413
|
# -------------------------
|
|
318
|
-
# Node.js
|
|
414
|
+
# Node.js - Configurar repositório
|
|
319
415
|
# -------------------------
|
|
320
416
|
run_step "$SUDO bash -c '
|
|
321
417
|
cd /root || exit 1
|
|
322
418
|
apt-get update -y
|
|
323
|
-
apt-get install -y curl gnupg ca-certificates --no-install-recommends
|
|
419
|
+
apt-get install -y curl gnupg ca-certificates lsb-release apt-transport-https --no-install-recommends
|
|
324
420
|
curl -fsSL https://deb.nodesource.com/setup_20.x | bash - || exit 1
|
|
325
421
|
'" "Configurando repositório Node.js" install
|
|
326
422
|
|
|
327
|
-
if [ "$NODE_REPO_FAILED" = true ]; then
|
|
328
|
-
|
|
329
|
-
printf "❌ Instalando dependências Node\n"
|
|
330
|
-
printf "❌ Iniciando serviços\n"
|
|
331
|
-
INSTALL_FAILED=true
|
|
332
|
-
else
|
|
333
|
-
run_step "$SUDO bash -c '
|
|
334
|
-
cd /root || exit 1
|
|
335
|
-
apt-get update -y
|
|
336
|
-
apt-get install -y nodejs \
|
|
337
|
-
-o Dpkg::Options::=\"--force-confdef\" \
|
|
338
|
-
-o Dpkg::Options::=\"--force-confold\" --no-install-recommends
|
|
339
|
-
node -v && npm -v
|
|
340
|
-
'" "Instalando Node.js" install
|
|
341
|
-
|
|
342
|
-
if [ "$NODE_INSTALL_FAILED" = true ]; then
|
|
423
|
+
if [ "$NODE_REPO_FAILED" = true ]; then
|
|
424
|
+
printf "❌ Instalando Node.js\n"
|
|
343
425
|
printf "❌ Instalando dependências Node\n"
|
|
344
426
|
printf "❌ Iniciando serviços\n"
|
|
345
427
|
INSTALL_FAILED=true
|
|
346
428
|
else
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
429
|
+
run_step "$SUDO bash -c '
|
|
430
|
+
cd /root || exit 1
|
|
431
|
+
apt-get update -y
|
|
432
|
+
apt-get install -y nodejs \
|
|
433
|
+
-o Dpkg::Options::=\"--force-confdef\" \
|
|
434
|
+
-o Dpkg::Options::=\"--force-confold\" --no-install-recommends
|
|
435
|
+
'" "Instalando Node.js" install
|
|
436
|
+
|
|
437
|
+
if [ "$NODE_INSTALL_FAILED" = true ]; then
|
|
438
|
+
printf "❌ Instalando dependências Node\n"
|
|
439
|
+
printf "❌ Iniciando serviços\n"
|
|
440
|
+
INSTALL_FAILED=true
|
|
441
|
+
else
|
|
355
442
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
fi
|
|
443
|
+
# -------------------------
|
|
444
|
+
# 🐍 Python + Pip + Libs
|
|
445
|
+
# -------------------------
|
|
360
446
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
447
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
448
|
+
run_step "$SUDO apt update -y >/dev/null 2>&1 && \
|
|
449
|
+
$SUDO apt install -y python3 python3-pip python3-venv \
|
|
450
|
+
-o Dpkg::Options::='--force-confdef' \
|
|
451
|
+
-o Dpkg::Options::='--force-confold' >/dev/null 2>&1" \
|
|
452
|
+
'Instalando Python' install
|
|
365
453
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
'Instalando libs Python' install
|
|
390
|
-
fi
|
|
454
|
+
if ! command -v pip3 >/dev/null 2>&1; then
|
|
455
|
+
run_step "$SUDO python3 -m ensurepip --upgrade >/dev/null 2>&1" \
|
|
456
|
+
'Restaurando pip' install
|
|
457
|
+
fi
|
|
458
|
+
run_step "cd /tmp && \
|
|
459
|
+
PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ROOT_USER_ACTION=ignore \
|
|
460
|
+
$SUDO python3 -m pip install --quiet --no-input --upgrade pip setuptools wheel" \
|
|
461
|
+
'Atualizando Python' instal
|
|
462
|
+
run_step "cd /tmp && \
|
|
463
|
+
PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ROOT_USER_ACTION=ignore \
|
|
464
|
+
$SUDO python3 -m pip install --quiet --no-input \
|
|
465
|
+
'flask==2.2.5' \
|
|
466
|
+
'sentence-transformers==2.2.2' \
|
|
467
|
+
'transformers==4.25.1' \
|
|
468
|
+
'safetensors==0.3.1' \
|
|
469
|
+
'huggingface_hub==0.10.1'" \
|
|
470
|
+
'Instalando libs Python' install
|
|
471
|
+
else
|
|
472
|
+
run_step "$SUDO apt update -y >/dev/null 2>&1 && \
|
|
473
|
+
$SUDO apt install -y python3 python3-pip python3-venv \
|
|
474
|
+
-o Dpkg::Options::='--force-confdef' \
|
|
475
|
+
-o Dpkg::Options::='--force-confold' >/dev/null 2>&1" \
|
|
476
|
+
'Instalando Python' install
|
|
391
477
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
478
|
+
if ! command -v pip3 >/dev/null 2>&1; then
|
|
479
|
+
run_step "$SUDO python3 -m ensurepip --upgrade >/dev/null 2>&1" \
|
|
480
|
+
'Restaurando pip' install
|
|
481
|
+
fi
|
|
482
|
+
run_step "cd /tmp && \
|
|
483
|
+
PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ROOT_USER_ACTION=ignore \
|
|
484
|
+
$SUDO python3 -m ensurepip --upgrade >/dev/null 2>&1 && \
|
|
485
|
+
$SUDO python3 -m pip install --no-input --quiet --upgrade setuptools wheel >/dev/null 2>&1 || true" \
|
|
486
|
+
'Atualizando Python' install
|
|
487
|
+
run_step "PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ROOT_USER_ACTION=ignore \
|
|
488
|
+
$SUDO python3 -m pip install --quiet --no-input \
|
|
489
|
+
'flask==2.2.5' \
|
|
490
|
+
'sentence-transformers==2.2.2' \
|
|
491
|
+
'huggingface_hub==0.10.1' >/dev/null 2>&1 || true" \
|
|
492
|
+
'Instalando libs Python' install
|
|
493
|
+
fi
|
|
396
494
|
|
|
397
|
-
|
|
398
|
-
#
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
495
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
496
|
+
# --- Compatibilidade Devuan (Beowulf) ---
|
|
497
|
+
run_step "
|
|
498
|
+
command -v pip3 >/dev/null 2>&1 || $SUDO apt install -y python3-pip >/dev/null 2>&1
|
|
499
|
+
$SUDO python3 -m pip show flask >/dev/null 2>&1 || $SUDO python3 -m pip install --quiet flask
|
|
500
|
+
$SUDO python3 -m pip show sentence-transformers >/dev/null 2>&1 || $SUDO python3 -m pip install --quiet sentence-transformers
|
|
501
|
+
$SUDO python3 -m pip show huggingface_hub >/dev/null 2>&1 || $SUDO python3 -m pip install --quiet huggingface_hub
|
|
502
|
+
" 'Verificando integridade Python' install
|
|
503
|
+
else
|
|
504
|
+
# --- Compatibilidade Debian 11+ / Ubuntu 20+ ---
|
|
505
|
+
run_step "
|
|
506
|
+
command -v pip3 >/dev/null 2>&1 || $SUDO apt install -y python3-pip >/dev/null 2>&1
|
|
507
|
+
for pkg in flask sentence-transformers huggingface_hub; do
|
|
508
|
+
python3 -m pip show \$pkg >/dev/null 2>&1 || $SUDO python3 -m pip show \$pkg >/dev/null 2>&1 || \
|
|
509
|
+
$SUDO python3 -m pip install --quiet --no-input \$pkg >/dev/null 2>&1 || true
|
|
510
|
+
done
|
|
511
|
+
" 'Verificando integridade Python' install
|
|
410
512
|
fi
|
|
411
|
-
# -------------------------
|
|
412
|
-
# Dependências Node
|
|
413
|
-
# -------------------------
|
|
414
|
-
cd /var/api/Mwsm || return
|
|
415
|
-
run_step "node -v >/dev/null 2>&1" "Verificando instalação do Node.js" install
|
|
416
|
-
run_step "$SUDO npm cache clean --force" "Limpando cache NPM" install
|
|
417
|
-
run_step "npm config set registry https://registry.npmjs.org" "Configurando registro NPM" install
|
|
418
|
-
|
|
419
|
-
if [[ "$DISTRO" == "debian" ]]; then
|
|
420
|
-
run_step "$SUDO npm install -g npm@latest node-gyp@latest" "Atualizando npm e node-gyp" install
|
|
421
|
-
run_step "$SUDO npm install --silent --no-fund --no-audit" "Instalando dependências Node" install
|
|
422
|
-
command -v node >/dev/null 2>&1 || $SUDO ln -sf /usr/bin/nodejs /usr/bin/node
|
|
423
|
-
run_step "node -v && npm -v" "Verificando Node.js e NPM" install
|
|
424
|
-
|
|
425
|
-
$SUDO mkdir -p /opt/mk-auth/api
|
|
426
|
-
$SUDO chmod 755 /opt/mk-auth/api
|
|
427
|
-
|
|
428
|
-
if ! ping -c1 raw.githubusercontent.com &>/dev/null; then
|
|
429
|
-
echo "$(date '+%Y-%m-%d %H:%M:%S') - [WARN] Falha de conexão com raw.githubusercontent.com" >>"$LOG_FILE"
|
|
430
|
-
fi
|
|
431
513
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
514
|
+
|
|
515
|
+
# -------------------------
|
|
516
|
+
# Repositório Mwsm
|
|
517
|
+
# -------------------------
|
|
518
|
+
cp "$0" "$TMP_SCRIPT" >/dev/null 2>&1 || true
|
|
519
|
+
run_step "rm -rf $BASE_DIR && mkdir -p $BASE_DIR && cd $BASE_DIR && \
|
|
520
|
+
git init && git remote add origin https://github.com/MKCodec/Mwsm.git && \
|
|
521
|
+
git config core.sparseCheckout true && \
|
|
522
|
+
echo -e 'fonts/\nicon.png\nindex.html\njquery.js\nmwsm.db\nmwsm.js\nmwsm.json\nnodemon.json\npackage.json\nscript.js\nsocket.io.js\nstyle.css\nversion.json\nmwsm.py' > .git/info/sparse-checkout && \
|
|
523
|
+
git pull origin main || git pull origin master" "Baixando repositório Mwsm" install
|
|
524
|
+
|
|
525
|
+
# 🧩 Se já existir instalação anterior, ativa modo silencioso
|
|
526
|
+
if [ -f "$BASE_DIR/mwsm.sh" ]; then
|
|
527
|
+
silent_menu
|
|
528
|
+
exit 0
|
|
529
|
+
fi
|
|
530
|
+
|
|
531
|
+
if [ -f "$TMP_SCRIPT" ]; then
|
|
532
|
+
cp "$TMP_SCRIPT" "$BASE_DIR/mwsm.sh" >/dev/null 2>&1
|
|
533
|
+
chmod +x "$BASE_DIR/mwsm.sh"
|
|
534
|
+
ln -sf "$BASE_DIR/mwsm.sh" /usr/local/bin/mwsm 2>/dev/null || $SUDO ln -sf "$BASE_DIR/mwsm.sh" /usr/local/bin/mwsm
|
|
535
|
+
rm -f "$TMP_SCRIPT"
|
|
536
|
+
fi
|
|
537
|
+
|
|
538
|
+
CURRENT_USER=$(logname 2>/dev/null || echo "$USER")
|
|
539
|
+
$SUDO chown -R "$CURRENT_USER":"$CURRENT_USER" "$BASE_DIR"
|
|
540
|
+
|
|
541
|
+
# -------------------------
|
|
542
|
+
# Dependências Node
|
|
543
|
+
# -------------------------
|
|
544
|
+
cd $BASE_DIR || return
|
|
545
|
+
run_step "node -v >/dev/null 2>&1" "Verificando instalação do Node.js" install
|
|
546
|
+
run_step "$SUDO npm install -g npm@latest --quiet --no-progress" "Atualizando NPM" install
|
|
547
|
+
run_step "$SUDO npm cache clean --force >/dev/null 2>&1" "Limpando cache NPM" install
|
|
548
|
+
run_step "npm config set registry https://registry.npmjs.org >/dev/null 2>&1" "Configurando registro NPM" install
|
|
549
|
+
|
|
550
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
551
|
+
run_step "$SUDO npm install -g npm@latest node-gyp@latest" "Atualizando npm e node-gyp" install
|
|
552
|
+
run_step "$SUDO npm install --silent --no-fund --no-audit" "Instalando dependências Node" install
|
|
553
|
+
command -v node >/dev/null 2>&1 || $SUDO ln -sf /usr/bin/nodejs /usr/bin/node
|
|
554
|
+
run_step "node -v && npm -v" "Verificando Node.js e NPM" install
|
|
555
|
+
|
|
556
|
+
$SUDO mkdir -p /opt/mk-auth/api
|
|
557
|
+
$SUDO chmod 755 /opt/mk-auth/api
|
|
558
|
+
|
|
559
|
+
if ! ping -c1 raw.githubusercontent.com &>/dev/null; then
|
|
560
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [WARN] Falha de conexão com raw.githubusercontent.com" >>"$LOG_FILE"
|
|
440
561
|
fi
|
|
562
|
+
|
|
563
|
+
if ping -c1 raw.githubusercontent.com &>/dev/null; then
|
|
564
|
+
EXPECTED_HASH=$($SUDO wget -qO- "$CUSTOM_API_URL" | sha256sum | awk '{print $1}')
|
|
565
|
+
if [[ ! -f "$API_PATH" ]]; then
|
|
566
|
+
run_step "$SUDO wget -q \"$CUSTOM_API_URL\" -O \"$API_PATH\"" "Instalando integração MkAuth" install
|
|
567
|
+
else
|
|
568
|
+
LOCAL_HASH=$(sha256sum "$API_PATH" | awk '{print $1}')
|
|
569
|
+
if [[ "$LOCAL_HASH" != "$EXPECTED_HASH" ]]; then
|
|
570
|
+
run_step "$SUDO wget -q \"$CUSTOM_API_URL\" -O \"$API_PATH\"" "Atualizando integração MkAuth" install
|
|
571
|
+
fi
|
|
572
|
+
fi
|
|
573
|
+
else
|
|
574
|
+
run_step "false" "Instalando integração MkAuth" install
|
|
575
|
+
fi
|
|
576
|
+
|
|
577
|
+
else
|
|
578
|
+
run_step "$SUDO npm install --silent --no-fund --no-audit" "Instalando dependências Node" install
|
|
579
|
+
command -v node >/dev/null 2>&1 || $SUDO ln -sf /usr/bin/nodejs /usr/bin/node
|
|
580
|
+
run_step "node -v && npm -v" "Verificando Node.js e NPM" install
|
|
441
581
|
fi
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
582
|
+
|
|
583
|
+
# -------------------------
|
|
584
|
+
# Instalação e atualização do PM2
|
|
585
|
+
# -------------------------
|
|
586
|
+
if command -v pm2 >/dev/null 2>&1; then
|
|
587
|
+
CURRENT_PM2_VERSION=$(pm2 -v | head -n1 | tr -d '[:space:]')
|
|
588
|
+
LATEST_PM2_VERSION=$(npm view pm2 version 2>/dev/null | tr -d '[:space:]')
|
|
589
|
+
|
|
590
|
+
if [[ -n "$LATEST_PM2_VERSION" && "$CURRENT_PM2_VERSION" != "$LATEST_PM2_VERSION" ]]; then
|
|
591
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [INFO] Atualizando PM2 de $CURRENT_PM2_VERSION para $LATEST_PM2_VERSION" >>"$LOG_FILE"
|
|
592
|
+
run_step "$SUDO npm install -g pm2@$LATEST_PM2_VERSION --silent --no-audit --no-fund" \
|
|
593
|
+
"Atualizando PM2" install
|
|
445
594
|
else
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
595
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [INFO] PM2 já está atualizado (v$CURRENT_PM2_VERSION)" >>"$LOG_FILE"
|
|
596
|
+
run_step "$SUDO pm2 update >/dev/null 2>&1 || true" \
|
|
597
|
+
"Sincronizando PM2" install
|
|
449
598
|
fi
|
|
599
|
+
else
|
|
600
|
+
run_step "$SUDO npm install -g pm2@latest --silent --no-audit --no-fund" \
|
|
601
|
+
"Instalando PM2" install
|
|
602
|
+
run_step "$SUDO timeout 15s pm2 update >/dev/null 2>&1 || { $SUDO pm2 kill >/dev/null 2>&1; rm -rf ~/.pm2; $SUDO pm2 update >/dev/null 2>&1 || true; }" \
|
|
603
|
+
"Inicializando PM2" install
|
|
604
|
+
fi
|
|
605
|
+
|
|
606
|
+
# -------------------------
|
|
607
|
+
# Inicialização dos serviços
|
|
608
|
+
# -------------------------
|
|
609
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
610
|
+
run_step "$SUDO sh -c 'crontab -l 2>/dev/null | grep -v \"$BASE_DIR/mwsm.js\"; echo \"@reboot cd $BASE_DIR && npm run start:mkauth\"' | crontab -" "Configurando inicialização" install
|
|
611
|
+
run_step "$SUDO npm run setup:mkauth" "Iniciando serviços" install
|
|
612
|
+
else
|
|
613
|
+
run_step "$SUDO npm run setup:mwsm" "Iniciando serviços" install
|
|
614
|
+
fi
|
|
450
615
|
|
|
451
|
-
# -------------------------
|
|
452
|
-
# Instalação e atualização do PM2
|
|
453
|
-
# -------------------------
|
|
454
|
-
if command -v pm2 >/dev/null 2>&1; then
|
|
455
|
-
CURRENT_PM2_VERSION=$(pm2 -v | head -n1 | tr -d '[:space:]')
|
|
456
|
-
LATEST_PM2_VERSION=$(npm view pm2 version 2>/dev/null | tr -d '[:space:]')
|
|
457
|
-
if [[ -n "$LATEST_PM2_VERSION" && "$CURRENT_PM2_VERSION" != "$LATEST_PM2_VERSION" ]]; then
|
|
458
|
-
echo "$(date '+%Y-%m-%d %H:%M:%S') - [INFO] Atualizando PM2 de $CURRENT_PM2_VERSION para $LATEST_PM2_VERSION" >>"$LOG_FILE"
|
|
459
|
-
run_step "$SUDO npm install -g pm2@$LATEST_PM2_VERSION --silent --no-audit --no-fund" "Atualizando PM2" install
|
|
460
|
-
else
|
|
461
|
-
echo "$(date '+%Y-%m-%d %H:%M:%S') - [INFO] PM2 já está atualizado (v$CURRENT_PM2_VERSION)" >>"$LOG_FILE"
|
|
462
|
-
run_step "$SUDO pm2 update >/dev/null 2>&1 || true" "Sincronizando PM2" install
|
|
463
616
|
fi
|
|
464
|
-
else
|
|
465
|
-
run_step "$SUDO npm install -g pm2@latest --silent --no-audit --no-fund" "Instalando PM2" install
|
|
466
|
-
run_step "$SUDO pm2 update >/dev/null 2>&1 || true" "Inicializando PM2" install
|
|
467
617
|
fi
|
|
468
618
|
|
|
469
619
|
# -------------------------
|
|
470
|
-
#
|
|
620
|
+
# Resultado final
|
|
471
621
|
# -------------------------
|
|
472
|
-
if [
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
echo "-------------------------------------"
|
|
488
|
-
LAST_SUCCESS="install"
|
|
489
|
-
else
|
|
490
|
-
echo "-------------------------------------"
|
|
491
|
-
echo "❌ Falha na instalação."
|
|
492
|
-
echo "-------------------------------------"
|
|
493
|
-
if [ -d "/var/api/Mwsm" ]; then
|
|
494
|
-
rm -rf /var/api/Mwsm
|
|
495
|
-
echo "$(date '+%Y-%m-%d %H:%M:%S') - [ROLLBACK] Diretório /var/api/Mwsm removido por falha." >>"$LOG_FILE"
|
|
622
|
+
if [ "$IS_REINSTALL" = false ]; then
|
|
623
|
+
if [ "$INSTALL_FAILED" = false ]; then
|
|
624
|
+
echo "-------------------------------------"
|
|
625
|
+
echo "✅ Instalação concluída!"
|
|
626
|
+
echo "-------------------------------------"
|
|
627
|
+
LAST_SUCCESS="install"
|
|
628
|
+
else
|
|
629
|
+
echo "-------------------------------------"
|
|
630
|
+
echo "❌ Falha na instalação."
|
|
631
|
+
echo "-------------------------------------"
|
|
632
|
+
if [ -d "$BASE_DIR" ]; then
|
|
633
|
+
rm -rf $BASE_DIR
|
|
634
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [ROLLBACK] Diretório $BASE_DIR removido por falha." >>"$LOG_FILE"
|
|
635
|
+
fi
|
|
636
|
+
fi
|
|
496
637
|
fi
|
|
497
|
-
fi
|
|
498
|
-
fi
|
|
499
638
|
|
|
500
|
-
# Log
|
|
501
|
-
echo "$(date '+%Y-%m-%d %H:%M:%S') - [INSTALL] Fim da instalação (status: $([ "$INSTALL_FAILED" = true ] && echo FAIL || echo OK))" >>"$LOG_FILE"
|
|
639
|
+
# Log
|
|
640
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [INSTALL] Fim da instalação (status: $([ "$INSTALL_FAILED" = true ] && echo FAIL || echo OK))" >>"$LOG_FILE"
|
|
502
641
|
|
|
503
|
-
# Se for chamado pelo reinstall, não pausa
|
|
504
|
-
if [ "$NO_PAUSE" = true ]; then
|
|
505
|
-
|
|
506
|
-
fi
|
|
642
|
+
# Se for chamado pelo reinstall, não pausa
|
|
643
|
+
if [ "$NO_PAUSE" = true ]; then
|
|
644
|
+
return
|
|
645
|
+
fi
|
|
507
646
|
|
|
508
|
-
echo
|
|
509
|
-
pause_and_restore
|
|
647
|
+
echo
|
|
648
|
+
pause_and_restore
|
|
510
649
|
|
|
511
650
|
}
|
|
512
651
|
|
|
513
|
-
|
|
652
|
+
# -------------------------
|
|
653
|
+
# As demais funções do script original seguem exatamente como antes:
|
|
654
|
+
# backup_mwsm_db, migrate_mwsm, update, uninstall, reinstall, view_log_hidden, clear_log_hidden, menu, etc.
|
|
655
|
+
# (Vou preservar estas funções conforme estavam no seu script original, sem alterações.)
|
|
656
|
+
# -------------------------
|
|
514
657
|
|
|
515
658
|
backup_mwsm_db() {
|
|
516
|
-
local DB_PATH="/
|
|
659
|
+
local DB_PATH="$BASE_DIR/mwsm.db"
|
|
517
660
|
local BACKUP_DIR="/tmp/Mwsm"
|
|
518
661
|
local BACKUP_FILE="$BACKUP_DIR/mwsm.db"
|
|
519
662
|
|
|
@@ -528,18 +671,15 @@ backup_mwsm_db() {
|
|
|
528
671
|
fi
|
|
529
672
|
}
|
|
530
673
|
|
|
531
|
-
|
|
532
|
-
|
|
533
674
|
migrate_mwsm() {
|
|
534
675
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - [MIGRATION] Iniciando migração de banco Mwsm" >>"$LOG_FILE"
|
|
535
676
|
|
|
536
677
|
local SRC_DB="/tmp/Mwsm/mwsm.db"
|
|
537
|
-
local DEST_DB="/
|
|
678
|
+
local DEST_DB="$BASE_DIR/mwsm.db"
|
|
538
679
|
local SQLITE_BIN
|
|
539
680
|
SQLITE_BIN=$(command -v sqlite3)
|
|
540
681
|
local SYSTEM_TABLES=("attachments" "resources" "emotions" "console" "engine")
|
|
541
682
|
|
|
542
|
-
# Verificações iniciais
|
|
543
683
|
if [ ! -f "$SRC_DB" ]; then
|
|
544
684
|
echo "[MIGRATION] ERRO: Backup não encontrado em $SRC_DB" >>"$LOG_FILE"
|
|
545
685
|
return 1
|
|
@@ -552,11 +692,9 @@ migrate_mwsm() {
|
|
|
552
692
|
|
|
553
693
|
echo "[MIGRATION] Copiando dados personalizados do backup para o novo banco..." >>"$LOG_FILE"
|
|
554
694
|
|
|
555
|
-
# Percorre todas as tabelas do backup
|
|
556
695
|
for table in $($SQLITE_BIN "$SRC_DB" ".tables"); do
|
|
557
696
|
[[ -z "$table" ]] && continue
|
|
558
697
|
|
|
559
|
-
# Ignorar tabelas de sistema
|
|
560
698
|
for sys in "${SYSTEM_TABLES[@]}"; do
|
|
561
699
|
[[ "$table" == "$sys" ]] && {
|
|
562
700
|
echo "[MIGRATION] Ignorando tabela de sistema: $table" >>"$LOG_FILE"
|
|
@@ -564,18 +702,15 @@ migrate_mwsm() {
|
|
|
564
702
|
}
|
|
565
703
|
done
|
|
566
704
|
|
|
567
|
-
# Verifica se a tabela também existe no novo banco
|
|
568
705
|
if ! $SQLITE_BIN "$DEST_DB" "SELECT name FROM sqlite_master WHERE type='table' AND name='$table';" | grep -q "$table"; then
|
|
569
706
|
echo "[MIGRATION] ⚠️ Tabela $table não existe no novo DB — ignorando." >>"$LOG_FILE"
|
|
570
707
|
continue
|
|
571
708
|
fi
|
|
572
709
|
|
|
573
|
-
# Conta registros
|
|
574
710
|
local src_count dest_count
|
|
575
711
|
src_count=$($SQLITE_BIN "$SRC_DB" "SELECT COUNT(*) FROM '$table';")
|
|
576
712
|
dest_count=$($SQLITE_BIN "$DEST_DB" "SELECT COUNT(*) FROM '$table';")
|
|
577
713
|
|
|
578
|
-
# Se backup não tiver dados, pula
|
|
579
714
|
if [ "$src_count" -eq 0 ]; then
|
|
580
715
|
echo "[MIGRATION] ⚠️ Nenhum dado em $table no backup — pulando." >>"$LOG_FILE"
|
|
581
716
|
continue
|
|
@@ -583,23 +718,18 @@ migrate_mwsm() {
|
|
|
583
718
|
|
|
584
719
|
echo "[MIGRATION] 🔄 Migrando dados da tabela: $table" >>"$LOG_FILE"
|
|
585
720
|
|
|
586
|
-
# Recupera nomes de colunas
|
|
587
721
|
local columns
|
|
588
722
|
columns=$($SQLITE_BIN "$SRC_DB" "PRAGMA table_info('$table');" | awk -F'|' '{print $2}' | xargs | tr ' ' ',')
|
|
589
723
|
|
|
590
|
-
# Loop por ID — assume que há uma coluna "id"
|
|
591
724
|
for id in $($SQLITE_BIN "$SRC_DB" "SELECT id FROM '$table';"); do
|
|
592
|
-
# Se registro não existe no novo, insere
|
|
593
725
|
if ! $SQLITE_BIN "$DEST_DB" "SELECT id FROM '$table' WHERE id=$id;" | grep -q "$id"; then
|
|
594
726
|
$SQLITE_BIN "$DEST_DB" "INSERT INTO '$table' SELECT * FROM '$SRC_DB'.'$table' WHERE id=$id;" 2>>"$LOG_FILE" \
|
|
595
727
|
&& echo "[MIGRATION] ➕ Inserido registro id=$id em $table" >>"$LOG_FILE"
|
|
596
728
|
continue
|
|
597
729
|
fi
|
|
598
730
|
|
|
599
|
-
# Se existe, faz update seletivo
|
|
600
731
|
local updates=()
|
|
601
732
|
while IFS='|' read -r col val; do
|
|
602
|
-
# Pula colunas nulas ou id
|
|
603
733
|
[[ "$col" == "id" ]] && continue
|
|
604
734
|
[[ -z "$val" ]] && continue
|
|
605
735
|
local current
|
|
@@ -614,7 +744,6 @@ migrate_mwsm() {
|
|
|
614
744
|
echo "$col|$val"
|
|
615
745
|
done)
|
|
616
746
|
|
|
617
|
-
# Aplica atualização, se houver colunas a atualizar
|
|
618
747
|
if [ "${#updates[@]}" -gt 0 ]; then
|
|
619
748
|
local set_clause
|
|
620
749
|
set_clause=$(IFS=,; echo "${updates[*]}")
|
|
@@ -626,7 +755,6 @@ migrate_mwsm() {
|
|
|
626
755
|
|
|
627
756
|
echo "[MIGRATION] Migração concluída com sucesso." >>"$LOG_FILE"
|
|
628
757
|
|
|
629
|
-
# Remove backup após migração
|
|
630
758
|
rm -f "$SRC_DB"
|
|
631
759
|
echo "[MIGRATION] Backup removido: $SRC_DB" >>"$LOG_FILE"
|
|
632
760
|
}
|
|
@@ -637,14 +765,14 @@ migrate_mwsm() {
|
|
|
637
765
|
update() {
|
|
638
766
|
INSTALL_FAILED=false
|
|
639
767
|
|
|
640
|
-
if [[ ! -d
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
fi
|
|
647
|
-
cd
|
|
768
|
+
if [[ ! -d $BASE_DIR || ! -f $BASE_DIR/package.json ]]; then
|
|
769
|
+
echo "-------------------------------------"
|
|
770
|
+
echo "⚠️ O Mwsm não está instalado!"
|
|
771
|
+
echo "-------------------------------------"
|
|
772
|
+
sleep 2
|
|
773
|
+
return
|
|
774
|
+
fi
|
|
775
|
+
cd $BASE_DIR || return
|
|
648
776
|
clear
|
|
649
777
|
echo "====================================="
|
|
650
778
|
echo " 🔄 Atualizando Mwsm"
|
|
@@ -661,14 +789,27 @@ fi
|
|
|
661
789
|
run_step "$SUDO pm2 flush" "Limpando logs PM2" update
|
|
662
790
|
run_step "$SUDO pm2 delete all && $SUDO pm2 kill" "Parando serviços" update
|
|
663
791
|
fi
|
|
664
|
-
|
|
665
792
|
run_step "backup_mwsm_db" "Exportando dados Mwsm" update
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
793
|
+
|
|
794
|
+
cp "$0" "$TMP_SCRIPT" >/dev/null 2>&1 || true
|
|
795
|
+
|
|
796
|
+
run_step "cd $BASE_DIR && \
|
|
797
|
+
git fetch origin main && git reset --hard origin/main" \
|
|
798
|
+
"Atualizando repositório Mwsm" update
|
|
799
|
+
|
|
800
|
+
if [ -f "$TMP_SCRIPT" ]; then
|
|
801
|
+
cp "$TMP_SCRIPT" "$BASE_DIR/mwsm.sh" >/dev/null 2>&1
|
|
802
|
+
chmod +x "$BASE_DIR/mwsm.sh"
|
|
803
|
+
ln -sf "$BASE_DIR/mwsm.sh" /usr/local/bin/mwsm 2>/dev/null || \
|
|
804
|
+
$SUDO ln -sf "$BASE_DIR/mwsm.sh" /usr/local/bin/mwsm
|
|
805
|
+
rm -f "$TMP_SCRIPT"
|
|
671
806
|
fi
|
|
807
|
+
|
|
808
|
+
CURRENT_USER=$(logname 2>/dev/null || echo "$USER")
|
|
809
|
+
$SUDO chown -R "$CURRENT_USER":"$CURRENT_USER" "$BASE_DIR" >/dev/null 2>&1
|
|
810
|
+
|
|
811
|
+
Setup_Mwsm
|
|
812
|
+
|
|
672
813
|
run_step "$SUDO apt-get update -y >/dev/null 2>&1" "Verificando repositórios APT" update
|
|
673
814
|
run_step "$SUDO apt --fix-broken install -y >/dev/null 2>&1 || true" "Corrigindo pacotes quebrados" update
|
|
674
815
|
run_step "$SUDO apt-get install -y git wget curl jq build-essential sqlite3 --no-install-recommends >/dev/null 2>&1" "Verificando dependências" update
|
|
@@ -680,32 +821,62 @@ fi
|
|
|
680
821
|
run_step "node -v && npm -v" "Verificando Node.js e NPM" update
|
|
681
822
|
run_step "$SUDO npm cache clean --force" "Limpando cache NPM" update
|
|
682
823
|
run_step "npm config set registry https://registry.npmjs.org" "Configurando repositório NPM" update
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
824
|
+
|
|
825
|
+
# Use precise detection for update branches if needed
|
|
826
|
+
detect_distro
|
|
827
|
+
|
|
828
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
686
829
|
run_step "$SUDO npm install -g npm@latest node-gyp@latest --silent --no-audit --no-fund" "Atualizando npm e node-gyp" update
|
|
830
|
+
else
|
|
831
|
+
run_step "$SUDO npm install -g npm@latest --silent --no-audit --no-fund" "Atualizando npm" update
|
|
687
832
|
fi
|
|
833
|
+
|
|
688
834
|
run_step "$SUDO npm install --silent --no-fund --no-audit" "Atualizando dependências Node.js" update
|
|
689
835
|
|
|
836
|
+
# -------------------------
|
|
837
|
+
# 🐍 Atualização Python + Pip + Libs
|
|
838
|
+
# -------------------------
|
|
839
|
+
|
|
840
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
690
841
|
if ! command -v python3 >/dev/null 2>&1; then
|
|
691
842
|
run_step "$SUDO apt install -y python3 python3-pip python3-venv --no-install-recommends >/dev/null 2>&1" "Instalando Python" update
|
|
692
843
|
fi
|
|
693
|
-
|
|
694
844
|
run_step "$SUDO python3 -m pip install --quiet --upgrade pip setuptools wheel" "Atualizando pip" update
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
'flask==2.2.5' \
|
|
699
|
-
'sentence-transformers==2.2.2' \
|
|
700
|
-
'huggingface_hub==0.10.1'" "Atualizando libs Python" update
|
|
701
|
-
else
|
|
702
|
-
run_step "$SUDO python3 -m pip install --quiet --no-input \
|
|
845
|
+
run_step "cd /tmp && \
|
|
846
|
+
PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ROOT_USER_ACTION=ignore \
|
|
847
|
+
$SUDO python3 -m pip install --quiet --no-input \
|
|
703
848
|
'flask==2.2.5' \
|
|
704
849
|
'sentence-transformers==2.2.2' \
|
|
705
850
|
'transformers==4.25.1' \
|
|
706
851
|
'safetensors==0.3.1' \
|
|
707
|
-
'huggingface_hub==0.10.1'
|
|
708
|
-
|
|
852
|
+
'huggingface_hub==0.10.1' >/dev/null 2>&1 || true" \
|
|
853
|
+
"Atualizando libs Python" update
|
|
854
|
+
else
|
|
855
|
+
|
|
856
|
+
if ! command -v python3 >/dev/null 2>&1; then
|
|
857
|
+
run_step "$SUDO apt update -y >/dev/null 2>&1 && \
|
|
858
|
+
$SUDO apt install -y python3 python3-pip python3-venv \
|
|
859
|
+
-o Dpkg::Options::='--force-confdef' \
|
|
860
|
+
-o Dpkg::Options::='--force-confold' >/dev/null 2>&1" \
|
|
861
|
+
"Instalando Python" update
|
|
862
|
+
fi
|
|
863
|
+
|
|
864
|
+
run_step "cd /tmp && \
|
|
865
|
+
PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ROOT_USER_ACTION=ignore \
|
|
866
|
+
$SUDO python3 -m ensurepip --upgrade >/dev/null 2>&1 && \
|
|
867
|
+
$SUDO python3 -m pip install --no-input --quiet --upgrade setuptools wheel >/dev/null 2>&1 || true" \
|
|
868
|
+
"Atualizando pip" update
|
|
869
|
+
|
|
870
|
+
run_step "cd /tmp && \
|
|
871
|
+
PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ROOT_USER_ACTION=ignore \
|
|
872
|
+
$SUDO python3 -m pip install --quiet --no-input \
|
|
873
|
+
'flask==2.2.5' \
|
|
874
|
+
'sentence-transformers==2.2.2' \
|
|
875
|
+
'huggingface_hub==0.10.1' >/dev/null 2>&1 || true" \
|
|
876
|
+
"Atualizando libs Python" update
|
|
877
|
+
fi
|
|
878
|
+
|
|
879
|
+
|
|
709
880
|
|
|
710
881
|
if command -v pm2 >/dev/null 2>&1; then
|
|
711
882
|
CURRENT_PM2_VERSION=$(pm2 -v | head -n1 | tr -d '[:space:]')
|
|
@@ -717,21 +888,19 @@ fi
|
|
|
717
888
|
fi
|
|
718
889
|
else
|
|
719
890
|
run_step "$SUDO npm install -g pm2@latest --silent --no-audit --no-fund" "Instalando PM2" update
|
|
720
|
-
run_step "$SUDO pm2 update >/dev/null 2>&1 || true" "Inicializando PM2" update
|
|
891
|
+
run_step "$SUDO timeout 15s pm2 update >/dev/null 2>&1 || { $SUDO pm2 kill >/dev/null 2>&1; rm -rf ~/.pm2; $SUDO pm2 update >/dev/null 2>&1 || true; }" "Inicializando PM2" update
|
|
721
892
|
fi
|
|
722
893
|
|
|
723
894
|
run_step "migrate_mwsm" "Importando dados Mwsm" update
|
|
724
|
-
|
|
725
|
-
if [[ "$
|
|
726
|
-
run_step "$SUDO npm run
|
|
727
|
-
else
|
|
728
|
-
run_step "$SUDO sh -c 'crontab -l 2>/dev/null | grep -v \"/var/api/Mwsm/mwsm.js\"; echo \"@reboot cd /var/api/Mwsm && npm run start:mkauth\"' | crontab -" "Configurando inicialização" update
|
|
895
|
+
|
|
896
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
897
|
+
run_step "$SUDO sh -c 'crontab -l 2>/dev/null | grep -v \"$BASE_DIR/mwsm.js\"; echo \"@reboot cd $BASE_DIR && npm run start:mkauth\"' | crontab -" "Configurando inicialização" update
|
|
729
898
|
run_step "$SUDO npm run setup:mkauth" "Reiniciando serviços" update
|
|
899
|
+
|
|
900
|
+
else
|
|
901
|
+
run_step "$SUDO npm run setup:mwsm" "Reiniciando serviços" update
|
|
730
902
|
fi
|
|
731
903
|
|
|
732
|
-
# -------------------------
|
|
733
|
-
# Resultado final
|
|
734
|
-
# -------------------------
|
|
735
904
|
if [ "$INSTALL_FAILED" = false ]; then
|
|
736
905
|
echo "-------------------------------------"
|
|
737
906
|
echo "✅ Atualização concluída com sucesso!"
|
|
@@ -745,7 +914,7 @@ fi
|
|
|
745
914
|
|
|
746
915
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - [UPDATE] Fim da atualização (status: $([ "$INSTALL_FAILED" = true ] && echo FAIL || echo OK))" >>"$LOG_FILE"
|
|
747
916
|
echo
|
|
748
|
-
pause_and_restore
|
|
917
|
+
pause_and_restore
|
|
749
918
|
|
|
750
919
|
}
|
|
751
920
|
|
|
@@ -757,7 +926,7 @@ uninstall() {
|
|
|
757
926
|
local NO_PAUSE=false
|
|
758
927
|
|
|
759
928
|
if [ "$IS_REINSTALL" = false ]; then
|
|
760
|
-
if [[ ! -d
|
|
929
|
+
if [[ ! -d $BASE_DIR || ! -f $BASE_DIR/package.json ]]; then
|
|
761
930
|
echo "-------------------------------------"
|
|
762
931
|
echo "⚠️ O Mwsm não está instalado!"
|
|
763
932
|
echo "-------------------------------------"
|
|
@@ -766,7 +935,6 @@ uninstall() {
|
|
|
766
935
|
fi
|
|
767
936
|
fi
|
|
768
937
|
|
|
769
|
-
|
|
770
938
|
if [ "$1" = "no_clear" ]; then
|
|
771
939
|
NO_CLEAR=true
|
|
772
940
|
fi
|
|
@@ -774,7 +942,6 @@ uninstall() {
|
|
|
774
942
|
NO_PAUSE=true
|
|
775
943
|
fi
|
|
776
944
|
|
|
777
|
-
# Cabeçalho
|
|
778
945
|
if [ "$NO_CLEAR" = false ]; then
|
|
779
946
|
clear
|
|
780
947
|
echo "====================================="
|
|
@@ -784,84 +951,82 @@ uninstall() {
|
|
|
784
951
|
|
|
785
952
|
UNINSTALL_FAILED=false
|
|
786
953
|
|
|
787
|
-
# Parando serviços PM2
|
|
788
954
|
if command -v pm2 >/dev/null 2>&1; then
|
|
789
955
|
run_step "$SUDO pm2 stop all && $SUDO pm2 delete all" "Removendo serviços" uninstall || UNINSTALL_FAILED=true
|
|
790
956
|
else
|
|
791
|
-
|
|
792
|
-
fi
|
|
957
|
+
run_step "skip" "Removendo serviços" uninstall
|
|
958
|
+
fi
|
|
793
959
|
|
|
794
|
-
# Removendo inicialização
|
|
795
|
-
if command -v pm2 >/dev/null 2>&1; then
|
|
796
|
-
if [[ "$DISTRO" == "ubuntu" ]]; then
|
|
797
|
-
run_step "$SUDO pm2 unstartup systemd" "Removendo inicialização" uninstall || UNINSTALL_FAILED=true
|
|
798
|
-
else
|
|
799
|
-
run_step "crontab -l 2>/dev/null | grep -v '/var/api/Mwsm/mwsm.js' | crontab -" "Removendo inicialização" uninstall || UNINSTALL_FAILED=true
|
|
800
|
-
fi
|
|
801
|
-
else
|
|
802
|
-
run_step "skip" "Removendo inicialização" uninstall
|
|
803
|
-
fi
|
|
960
|
+
# Removendo inicialização
|
|
961
|
+
if command -v pm2 >/dev/null 2>&1; then
|
|
804
962
|
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
963
|
+
detect_distro
|
|
964
|
+
|
|
965
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
966
|
+
run_step "crontab -l 2>/dev/null | grep -v '$BASE_DIR/mwsm.js' | crontab -" "Removendo inicialização" uninstall || UNINSTALL_FAILED=true
|
|
967
|
+
else
|
|
968
|
+
run_step "$SUDO pm2 unstartup systemd" "Removendo inicialização" uninstall || UNINSTALL_FAILED=true
|
|
969
|
+
fi
|
|
811
970
|
|
|
812
|
-
# Limpando cache do NPM
|
|
813
|
-
if command -v npm >/dev/null 2>&1; then
|
|
814
|
-
if [ -d "$HOME/.npm" ]; then
|
|
815
|
-
run_step "cd /tmp && $SUDO npm cache clean --force" "Limpando cache NPM" uninstall || UNINSTALL_FAILED=true
|
|
816
971
|
else
|
|
817
|
-
|
|
818
|
-
fi
|
|
819
|
-
else
|
|
820
|
-
run_step "skip" "Limpando cache NPM" uninstall
|
|
821
|
-
fi
|
|
972
|
+
run_step "skip" "Removendo inicialização" uninstall
|
|
973
|
+
fi
|
|
822
974
|
|
|
975
|
+
if command -v pm2 >/dev/null 2>&1; then
|
|
976
|
+
run_step "$SUDO npm remove -g pm2" "Removendo PM2" uninstall || UNINSTALL_FAILED=true
|
|
977
|
+
else
|
|
978
|
+
run_step "skip" "Removendo PM2" uninstall
|
|
979
|
+
fi
|
|
823
980
|
|
|
824
|
-
|
|
825
|
-
if [
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
981
|
+
if command -v npm >/dev/null 2>&1; then
|
|
982
|
+
if [ -d "$HOME/.npm" ]; then
|
|
983
|
+
run_step "cd /tmp && $SUDO npm cache clean --force" "Limpando cache NPM" uninstall || UNINSTALL_FAILED=true
|
|
984
|
+
else
|
|
985
|
+
run_step "skip" "Limpando cache NPM" uninstall
|
|
986
|
+
fi
|
|
987
|
+
else
|
|
988
|
+
run_step "skip" "Limpando cache NPM" uninstall
|
|
989
|
+
fi
|
|
831
990
|
|
|
832
|
-
if [
|
|
833
|
-
|
|
834
|
-
|
|
991
|
+
if [[ -d $BASE_DIR ]]; then
|
|
992
|
+
[[ "$PWD" =~ $BASE_DIR ]] && cd /root 2>/dev/null || cd /tmp
|
|
993
|
+
run_step "rm -rf $BASE_DIR" "Limpando diretórios" uninstall || UNINSTALL_FAILED=true
|
|
994
|
+
else
|
|
995
|
+
run_step "skip" "Limpando diretórios" uninstall
|
|
996
|
+
fi
|
|
835
997
|
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
998
|
+
if [ -L /usr/local/bin/mwsm ] || [ -f /usr/local/bin/mwsm ]; then
|
|
999
|
+
rm -f /usr/local/bin/mwsm 2>/dev/null || $SUDO rm -f /usr/local/bin/mwsm
|
|
1000
|
+
fi
|
|
1001
|
+
|
|
1002
|
+
if [ "$NO_PAUSE" = false ]; then
|
|
1003
|
+
if [ "$UNINSTALL_FAILED" = false ]; then
|
|
1004
|
+
echo "-------------------------------------"
|
|
1005
|
+
echo "✅ Remoção concluída!"
|
|
1006
|
+
echo "-------------------------------------"
|
|
1007
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [UNINSTALL] Fim da remoção (OK)" >>"$LOG_FILE"
|
|
1008
|
+
else
|
|
1009
|
+
echo "-------------------------------------"
|
|
1010
|
+
echo "❌ Falha na remoção."
|
|
1011
|
+
echo "-------------------------------------"
|
|
1012
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [UNINSTALL] Fim da remoção (FAIL)" >>"$LOG_FILE"
|
|
1013
|
+
fi
|
|
843
1014
|
else
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
fi
|
|
849
|
-
|
|
850
|
-
if [ "$UNINSTALL_FAILED" = false ]; then
|
|
851
|
-
echo "$(date '+%Y-%m-%d %H:%M:%S') - [UNINSTALL] Fim da remoção (OK - modo silencioso)" >>"$LOG_FILE"
|
|
852
|
-
else
|
|
853
|
-
echo "$(date '+%Y-%m-%d %H:%M:%S') - [UNINSTALL] Fim da remoção (FAIL - modo silencioso)" >>"$LOG_FILE"
|
|
854
|
-
fi
|
|
855
|
-
fi
|
|
1015
|
+
if [ "$UNINSTALL_FAILED" = false ]; then
|
|
1016
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [UNINSTALL] Fim da remoção (OK - modo silencioso)" >>"$LOG_FILE"
|
|
1017
|
+
else
|
|
1018
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [UNINSTALL] Fim da remoção (FAIL - modo silencioso)" >>"$LOG_FILE"
|
|
1019
|
+
fi
|
|
1020
|
+
fi
|
|
856
1021
|
|
|
857
|
-
if [ "$NO_PAUSE" = true ]; then
|
|
858
|
-
|
|
859
|
-
fi
|
|
1022
|
+
if [ "$NO_PAUSE" = true ]; then
|
|
1023
|
+
return
|
|
1024
|
+
fi
|
|
860
1025
|
|
|
861
|
-
echo
|
|
862
|
-
if [ "$NO_PAUSE" = false ]; then
|
|
863
|
-
|
|
864
|
-
fi
|
|
1026
|
+
echo
|
|
1027
|
+
if [ "$NO_PAUSE" = false ]; then
|
|
1028
|
+
pause_and_restore
|
|
1029
|
+
fi
|
|
865
1030
|
}
|
|
866
1031
|
|
|
867
1032
|
# ========================
|
|
@@ -899,6 +1064,15 @@ reinstall() {
|
|
|
899
1064
|
}
|
|
900
1065
|
|
|
901
1066
|
view_log_hidden() {
|
|
1067
|
+
# sempre restaura o terminal ao sair (mesmo se der erro)
|
|
1068
|
+
cleanup_view() {
|
|
1069
|
+
stty sane >/dev/null 2>&1 || true
|
|
1070
|
+
tput cnorm >/dev/null 2>&1 || true
|
|
1071
|
+
tput sgr0 >/dev/null 2>&1 || true
|
|
1072
|
+
}
|
|
1073
|
+
trap cleanup_view EXIT
|
|
1074
|
+
|
|
1075
|
+
cleanup_view # garante início limpo
|
|
902
1076
|
while true; do
|
|
903
1077
|
clear
|
|
904
1078
|
echo "====================================="
|
|
@@ -911,52 +1085,50 @@ view_log_hidden() {
|
|
|
911
1085
|
echo "-------------------------------------"
|
|
912
1086
|
printf "Escolha uma opção: "
|
|
913
1087
|
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
1088
|
+
read -rsn1 log_choice
|
|
1089
|
+
echo "$log_choice"
|
|
1090
|
+
|
|
1091
|
+
case $log_choice in
|
|
1092
|
+
1)
|
|
1093
|
+
cleanup_view
|
|
1094
|
+
cutoff_date=$(date -d '24 hours ago' '+%Y-%m-%d %H:%M:%S')
|
|
1095
|
+
grep -E "^[0-9]{4}-[0-9]{2}-[0-9]{2}" "$LOG_FILE" | \
|
|
1096
|
+
awk -v cutoff="$cutoff_date" '
|
|
1097
|
+
{
|
|
1098
|
+
if ($0 >= cutoff) print $0
|
|
1099
|
+
}' | iconv -f utf-8 -t utf-8
|
|
1100
|
+
echo
|
|
1101
|
+
read -rp "Pressione ENTER para voltar..."
|
|
1102
|
+
;;
|
|
1103
|
+
2)
|
|
1104
|
+
cleanup_view
|
|
1105
|
+
grep "^[0-9]\\{4\\}-" "$LOG_FILE" | iconv -f utf-8 -t utf-8
|
|
1106
|
+
echo
|
|
1107
|
+
read -rp "Pressione ENTER para voltar..."
|
|
1108
|
+
;;
|
|
1109
|
+
3)
|
|
1110
|
+
cleanup_view
|
|
1111
|
+
grep -v "^[0-9]\\{4\\}-" "$LOG_FILE" | iconv -f utf-8 -t utf-8
|
|
1112
|
+
echo
|
|
1113
|
+
read -rp "Pressione ENTER para voltar..."
|
|
1114
|
+
;;
|
|
1115
|
+
0)
|
|
1116
|
+
cleanup_view
|
|
1117
|
+
break
|
|
1118
|
+
;;
|
|
1119
|
+
*)
|
|
1120
|
+
continue
|
|
1121
|
+
;;
|
|
920
1122
|
esac
|
|
921
1123
|
done
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
1
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
if (match($0, /[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]/)) {
|
|
931
|
-
ts = substr($0, RSTART, RLENGTH)
|
|
932
|
-
cmd = "date -d \"" ts "\" +%s"
|
|
933
|
-
cmd | getline t
|
|
934
|
-
close(cmd)
|
|
935
|
-
if (t >= cutoff) print $0
|
|
936
|
-
}
|
|
937
|
-
}' "$LOG_FILE" | iconv -f utf-8 -t utf-8
|
|
938
|
-
|
|
939
|
-
printf "\\nPressione ENTER para voltar ao menu principal..."
|
|
940
|
-
IFS= read -r _
|
|
941
|
-
break
|
|
942
|
-
;;
|
|
943
|
-
2)
|
|
944
|
-
cat "$LOG_FILE" | grep "^[0-9]\\{4\\}-" | iconv -f utf-8 -t utf-8
|
|
945
|
-
printf "\\nPressione ENTER para voltar ao menu principal..."
|
|
946
|
-
IFS= read -r _
|
|
947
|
-
break
|
|
948
|
-
;;
|
|
949
|
-
3)
|
|
950
|
-
cat "$LOG_FILE" | grep -v "^[0-9]\\{4\\}-" | iconv -f utf-8 -t utf-8
|
|
951
|
-
printf "\\nPressione ENTER para voltar ao menu principal..."
|
|
952
|
-
IFS= read -r _
|
|
953
|
-
break
|
|
954
|
-
;;
|
|
955
|
-
0)
|
|
956
|
-
break
|
|
957
|
-
;;
|
|
958
|
-
esac
|
|
959
|
-
done
|
|
1124
|
+
|
|
1125
|
+
cleanup_view
|
|
1126
|
+
trap - EXIT
|
|
1127
|
+
sleep 0.1
|
|
1128
|
+
clear
|
|
1129
|
+
stty sane >/dev/null 2>&1 || true
|
|
1130
|
+
tput civis >/dev/null 2>&1 || true
|
|
1131
|
+
|
|
960
1132
|
}
|
|
961
1133
|
|
|
962
1134
|
# ========================
|
|
@@ -968,24 +1140,32 @@ clear_log_hidden() {
|
|
|
968
1140
|
echo "🧹 Log limpo com sucesso!"
|
|
969
1141
|
echo "-------------------------------------"
|
|
970
1142
|
sleep 2
|
|
1143
|
+
stty sane >/dev/null 2>&1 || true
|
|
1144
|
+
tput civis >/dev/null 2>&1 || true
|
|
971
1145
|
}
|
|
972
1146
|
|
|
973
1147
|
# ========================
|
|
974
1148
|
# Menu principal
|
|
975
1149
|
# ========================
|
|
976
1150
|
menu() {
|
|
977
|
-
# Desativa o cursor logo no início, antes de qualquer saída
|
|
978
1151
|
command -v tput >/dev/null 2>&1 && tput civis >/dev/null 2>&1 || true
|
|
979
|
-
|
|
1152
|
+
detect_distro
|
|
980
1153
|
while true; do
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
1154
|
+
|
|
1155
|
+
if [ -t 0 ]; then
|
|
1156
|
+
stty sane >/dev/null 2>&1 || true
|
|
1157
|
+
fi
|
|
984
1158
|
|
|
985
1159
|
clear
|
|
986
1160
|
|
|
987
1161
|
echo "====================================="
|
|
988
1162
|
echo " 📦 Gerenciador do Bot-Mwsm"
|
|
1163
|
+
echo "-------------------------------------"
|
|
1164
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
1165
|
+
echo "Sistema: MkAuth"
|
|
1166
|
+
else
|
|
1167
|
+
echo "Sistema: $(echo "$DISTRO_DETECT" | awk '{print toupper(substr($0,1,1)) tolower(substr($0,2))}')"
|
|
1168
|
+
fi
|
|
989
1169
|
echo "====================================="
|
|
990
1170
|
echo "1) Instalar"
|
|
991
1171
|
echo "2) Atualizar"
|
|
@@ -995,17 +1175,18 @@ menu() {
|
|
|
995
1175
|
echo "-------------------------------------"
|
|
996
1176
|
printf "Escolha uma opção: "
|
|
997
1177
|
|
|
998
|
-
# Mantém o cursor oculto o tempo todo
|
|
999
1178
|
command -v tput >/dev/null 2>&1 && tput civis >/dev/null 2>&1 || true
|
|
1000
1179
|
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1180
|
+
|
|
1181
|
+
while true; do
|
|
1182
|
+
stty -echo -icanon time 0 min 0 2>/dev/null || true
|
|
1183
|
+
read -rsn1 choice
|
|
1184
|
+
stty sane 2>/dev/null || true
|
|
1185
|
+
case "$choice" in
|
|
1186
|
+
[0-6]) break ;;
|
|
1187
|
+
*) continue ;;
|
|
1188
|
+
esac
|
|
1189
|
+
done
|
|
1009
1190
|
|
|
1010
1191
|
echo "$choice"
|
|
1011
1192
|
|
|
@@ -1019,15 +1200,14 @@ menu() {
|
|
|
1019
1200
|
5) view_log_hidden ;; # oculto
|
|
1020
1201
|
6) clear_log_hidden ;; # oculto
|
|
1021
1202
|
0)
|
|
1022
|
-
# Reativa o cursor antes de sair
|
|
1023
1203
|
command -v tput >/dev/null 2>&1 && tput cnorm >/dev/null 2>&1 || true
|
|
1024
1204
|
if [[ "$LAST_SUCCESS" == "install" ]]; then
|
|
1025
1205
|
if command -v pm2 >/dev/null 2>&1; then
|
|
1026
|
-
NAME=$(jq -r .name /
|
|
1206
|
+
NAME=$(jq -r .name $BASE_DIR/package.json 2>/dev/null)
|
|
1027
1207
|
MATCHED=""
|
|
1028
1208
|
|
|
1029
|
-
if [[ -n "$NAME" && -f /
|
|
1030
|
-
if jq -r 'tostring' /
|
|
1209
|
+
if [[ -n "$NAME" && -f $BASE_DIR/mwsm.json ]]; then
|
|
1210
|
+
if jq -r 'tostring' $BASE_DIR/mwsm.json 2>/dev/null | grep -q "$NAME"; then
|
|
1031
1211
|
MATCHED="$NAME"
|
|
1032
1212
|
fi
|
|
1033
1213
|
fi
|