bot-mwsm 3.0.2 → 3.0.4
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/CODE_OF_CONDUCT.md +18 -0
- package/.github/CONTRIBUTING.md +29 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +56 -0
- package/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +30 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +23 -0
- package/.github/SECURITY.md +17 -0
- package/.github/workflows/Mwsm.yml +25 -0
- package/.github/workflows/cleanup.yml +31 -0
- package/Dockerfile +42 -0
- package/README.md +34 -128
- package/bash/mwsm.sh +465 -413
- package/bash/setup.sh +100 -51
- package/img/Mwsm.png +0 -0
- package/img/menu-mwsm.png +0 -0
- package/img/mkauth-api.png +0 -0
- package/img/mkauth-credenciais.png +0 -0
- package/img/mkauth-opcoes.png +0 -0
- package/img/mkauth-servidor.png +0 -0
- package/img/mwsm-api-auto.png +0 -0
- package/img/mwsm-api-disparo.png +0 -0
- package/img/mwsm-api-one.png +0 -0
- package/img/mwsm-api.png +0 -0
- package/img/mwsm-billing.png +0 -0
- package/img/mwsm-cli.png +0 -0
- package/img/mwsm-connected.png +0 -0
- package/img/mwsm-debbuger-webadmin.png +0 -0
- package/img/mwsm-eraser-webadmin.png +0 -0
- package/img/mwsm-list-webadmin.png +0 -0
- package/img/mwsm-log.png +0 -0
- package/img/mwsm-pix-webadmin.png +0 -0
- package/img/mwsm-qr.png +0 -0
- package/img/mwsm-qrcode.png +0 -0
- package/img/mwsm-qrsucess.png +0 -0
- package/img/mwsm-run.png +0 -0
- package/img/mwsm-schedule.png +0 -0
- package/img/mwsm-settings-extras.png +0 -0
- package/img/mwsm-settings-options.png +0 -0
- package/img/mwsm-settings.png +0 -0
- package/img/mwsm-simulator-webadmin.png +0 -0
- package/img/mwsm-stop-webadmin.png +0 -0
- package/img/mwsm-token.png +0 -0
- package/mwsm.db +0 -0
- package/package.json +1 -1
- package/version.json +2 -2
- package/img/autobot.png +0 -0
- package/img/autupdate.png +0 -0
- package/img/cli.png +0 -0
- package/img/cronshed.png +0 -0
- package/img/debug.log +0 -0
- package/img/debug.png +0 -0
- package/img/delay.png +0 -0
- package/img/dev.png +0 -0
- package/img/endpoint.png +0 -0
- package/img/log.png +0 -0
- package/img/mkauth.png +0 -0
- package/img/msn.png +0 -0
- package/img/paycon.png +0 -0
- package/img/prevent.png +0 -0
- package/img/resent.png +0 -0
- package/img/reset.png +0 -0
- package/img/resync.png +0 -0
- package/img/settings.png +0 -0
- package/img/shifts.png +0 -0
- package/img/spam.png +0 -0
- package/img/spam2.png +0 -0
- package/img/status.png +0 -0
- package/img/status2.png +0 -0
- package/img/stop.png +0 -0
- package/img/sync.png +0 -0
- package/img/terminal.png +0 -0
- package/img/timers.png +0 -0
- package/img/update.png +0 -0
- package/img/whatsapp.png +0 -0
- /package/img/{auth.png → mwsm-auth-webadmin.png} +0 -0
- /package/img/{find.png → mwsm-find-webadmin.png} +0 -0
- /package/img/{success.png → mwsm-success-webadmin.png} +0 -0
- /package/img/{uid.png → mwsm-uid-webadmin.png} +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,28 @@ 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
|
+
if [[ "$DISTRO_DETECT" == "docker" ]]; then
|
|
35
|
+
BASE_DIR="/app/Mwsm"
|
|
36
|
+
LOG_DIR="/app/logs"
|
|
37
|
+
else
|
|
38
|
+
BASE_DIR="/var/api/Mwsm"
|
|
39
|
+
LOG_DIR="/var/log/Mwsm"
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
LOG_FILE="$LOG_DIR/mwsm.log"
|
|
43
|
+
|
|
44
|
+
mkdir -p "$BASE_DIR" "$LOG_DIR"
|
|
45
|
+
touch "$LOG_FILE"
|
|
46
|
+
chmod 644 "$LOG_FILE"
|
|
47
|
+
|
|
48
|
+
|
|
31
49
|
uninstall_concluido() {
|
|
32
50
|
local dirs=(
|
|
33
|
-
"
|
|
34
|
-
"
|
|
51
|
+
"$BASE_DIR"
|
|
52
|
+
"$LOG_DIR"
|
|
35
53
|
"/root/.pm2/logs/Ask-Mwsm-out.log"
|
|
36
54
|
"/root/.pm2/logs/Ask-Mwsm-error.log"
|
|
37
55
|
)
|
|
@@ -45,8 +63,45 @@ uninstall_concluido() {
|
|
|
45
63
|
return 0 # tudo removido → pode pular pro install
|
|
46
64
|
}
|
|
47
65
|
|
|
66
|
+
# =====================================
|
|
67
|
+
# 🔍 Detectar distribuição
|
|
68
|
+
# =====================================
|
|
69
|
+
detect_distro() {
|
|
70
|
+
local id=""
|
|
71
|
+
local codename=""
|
|
72
|
+
|
|
73
|
+
if [ -f /etc/os-release ]; then
|
|
74
|
+
. /etc/os-release
|
|
75
|
+
id=$(echo "${ID:-}" | tr '[:upper:]' '[:lower:]')
|
|
76
|
+
codename=$(grep -E '^VERSION_CODENAME=' /etc/os-release | cut -d= -f2 | tr -d '"')
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
if [[ "$id" == "devuan" ]] || grep -qi "devuan" /etc/os-release 2>/dev/null; then
|
|
80
|
+
DISTRO_DETECT="devuan"
|
|
81
|
+
return 0
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
if [[ "$codename" == "bookworm" || "$codename" == "trixie" ]]; then
|
|
85
|
+
DISTRO_DETECT="debian"
|
|
86
|
+
return 0
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
if [[ "$id" == "ubuntu" ]]; then
|
|
90
|
+
DISTRO_DETECT="ubuntu"
|
|
91
|
+
return 0
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
if [ -f /.dockerenv ] || grep -qE '/docker/' /proc/1/cgroup 2>/dev/null; then
|
|
95
|
+
DISTRO_DETECT="docker"
|
|
96
|
+
return 0
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
DISTRO_DETECT="other"
|
|
100
|
+
return 1
|
|
101
|
+
}
|
|
102
|
+
|
|
48
103
|
Setup_Mwsm() {
|
|
49
|
-
local SCRIPT_PATH="/
|
|
104
|
+
local SCRIPT_PATH="$BASE_DIR/mwsm.sh"
|
|
50
105
|
local SRC=""
|
|
51
106
|
local LOG_PREFIX
|
|
52
107
|
LOG_PREFIX="$(date '+%Y-%m-%d %H:%M:%S') - [SETUP]"
|
|
@@ -71,7 +126,7 @@ Setup_Mwsm() {
|
|
|
71
126
|
return 1
|
|
72
127
|
fi
|
|
73
128
|
|
|
74
|
-
if [[ -d
|
|
129
|
+
if [[ -d $BASE_DIR && ! -f "$SCRIPT_PATH" ]]; then
|
|
75
130
|
echo "$LOG_PREFIX 🔁 Restaurando mwsm.sh a partir de $SRC" >>"$LOG_FILE"
|
|
76
131
|
if [ "$(id -u)" -eq 0 ]; then
|
|
77
132
|
cp -- "$SRC" "$SCRIPT_PATH" 2>>"$LOG_FILE" || {
|
|
@@ -97,7 +152,7 @@ Setup_Mwsm() {
|
|
|
97
152
|
return 0
|
|
98
153
|
}
|
|
99
154
|
silent_menu() {
|
|
100
|
-
local local_file="/
|
|
155
|
+
local local_file="$BASE_DIR/mwsm.sh"
|
|
101
156
|
local remote_url="https://raw.githubusercontent.com/MKCodec/Mwsm/refs/heads/main/bash/mwsm.sh"
|
|
102
157
|
if curl -sL "$remote_url" -o "$local_file"; then
|
|
103
158
|
$SUDO chmod +x "$local_file" >/dev/null 2>&1
|
|
@@ -106,10 +161,6 @@ silent_menu() {
|
|
|
106
161
|
fi
|
|
107
162
|
}
|
|
108
163
|
|
|
109
|
-
LOG_FILE="/var/log/mwsm.log"
|
|
110
|
-
mkdir -p "$(dirname "$LOG_FILE")"
|
|
111
|
-
touch "$LOG_FILE"
|
|
112
|
-
chmod 644 "$LOG_FILE"
|
|
113
164
|
export PATH="$PATH:/usr/local/bin:/usr/bin:/bin"
|
|
114
165
|
if [ -f /etc/os-release ]; then
|
|
115
166
|
. /etc/os-release
|
|
@@ -136,6 +187,14 @@ NODE_INSTALL_FAILED=false
|
|
|
136
187
|
NPM_INSTALL_FAILED=false
|
|
137
188
|
LAST_SUCCESS=""
|
|
138
189
|
|
|
190
|
+
# =================================
|
|
191
|
+
# Modo de log completo
|
|
192
|
+
# =================================
|
|
193
|
+
if [[ "$1" == "full" ]]; then
|
|
194
|
+
[ -f "$LOG_FILE" ] && tail -f "$LOG_FILE"
|
|
195
|
+
exit 0
|
|
196
|
+
fi
|
|
197
|
+
|
|
139
198
|
# =================================
|
|
140
199
|
# Função de execução
|
|
141
200
|
# =================================
|
|
@@ -216,7 +275,7 @@ run_step() {
|
|
|
216
275
|
install() {
|
|
217
276
|
local NO_CLEAR=false
|
|
218
277
|
local NO_PAUSE=false
|
|
219
|
-
|
|
278
|
+
|
|
220
279
|
if [ "$1" = "no_clear" ]; then
|
|
221
280
|
NO_CLEAR=true
|
|
222
281
|
fi
|
|
@@ -224,296 +283,307 @@ install() {
|
|
|
224
283
|
NO_PAUSE=true
|
|
225
284
|
fi
|
|
226
285
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
286
|
+
if [[ -d $BASE_DIR && -f $BASE_DIR/package.json ]]; then
|
|
287
|
+
echo "-------------------------------------"
|
|
288
|
+
echo "⚠️ O Mwsm já está instalado!"
|
|
289
|
+
echo "-------------------------------------"
|
|
290
|
+
sleep 2
|
|
291
|
+
return
|
|
292
|
+
fi
|
|
234
293
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
294
|
+
INSTALL_FAILED=false
|
|
295
|
+
NODE_REPO_FAILED=false
|
|
296
|
+
NODE_INSTALL_FAILED=false
|
|
297
|
+
NPM_INSTALL_FAILED=false
|
|
298
|
+
CUSTOM_API_URL="https://raw.githubusercontent.com/MKCodec/MkAuth-API/main/titulo.api"
|
|
299
|
+
API_PATH="/opt/mk-auth/api/titulo.api"
|
|
241
300
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
fi
|
|
301
|
+
if [ "$IS_REINSTALL" = false ]; then
|
|
302
|
+
if [ "$NO_CLEAR" = false ]; then
|
|
303
|
+
clear
|
|
304
|
+
echo "====================================="
|
|
305
|
+
echo " 🚀 Instalando Mwsm"
|
|
306
|
+
echo "====================================="
|
|
249
307
|
fi
|
|
308
|
+
fi
|
|
250
309
|
|
|
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
|
|
310
|
+
# -------------------------
|
|
311
|
+
# Pacotes básicos
|
|
312
|
+
# -------------------------
|
|
261
313
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
314
|
+
export DEBIAN_FRONTEND=noninteractive
|
|
315
|
+
$SUDO rm -f /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock
|
|
316
|
+
run_step "$SUDO dpkg --configure -a || true" "Corrigindo pendências..." install
|
|
317
|
+
run_step '[[ $(df /opt --output=avail | tail -1) -gt 102400 ]]' "Validando partição..." install
|
|
318
|
+
|
|
319
|
+
# Detect distribution precisely (silent)
|
|
320
|
+
detect_distro
|
|
321
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [INFO] DISTRO_DETECT=$DISTRO_DETECT" >>"$LOG_FILE"
|
|
322
|
+
|
|
323
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
324
|
+
run_step "$SUDO bash -c '
|
|
325
|
+
if [ -f /etc/os-release ]; then
|
|
326
|
+
. /etc/os-release
|
|
327
|
+
DISTRO=$(echo ${ID:-} | tr [:upper:] [:lower:])
|
|
328
|
+
DEBIAN_VERSION=$(grep VERSION_CODENAME /etc/os-release 2>/dev/null | cut -d= -f2)
|
|
329
|
+
if [ -z \"$DEBIAN_VERSION\" ]; then
|
|
330
|
+
DEBIAN_VERSION=$(grep VERSION_ID /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d \\\" )
|
|
331
|
+
fi
|
|
270
332
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
333
|
+
if [ \"$DISTRO\" = devuan ]; then
|
|
334
|
+
if [ -z \"$DEBIAN_VERSION\" ] || [ \"$DEBIAN_VERSION\" = buster ] || [ \"$DEBIAN_VERSION\" = stretch ]; then
|
|
335
|
+
if [ -f /etc/apt/sources.list ]; then
|
|
336
|
+
sed -i \"s|deb\\.debian\\.org|archive\\.debian\\.org|g\" /etc/apt/sources.list
|
|
337
|
+
sed -i \"s|security\\.debian\\.org|archive\\.debian\\.org/debian-security|g\" /etc/apt/sources.list
|
|
338
|
+
fi
|
|
339
|
+
echo \"Acquire::Check-Valid-Until false;\" > /etc/apt/apt.conf.d/99archive
|
|
340
|
+
apt-get clean -qq >/dev/null 2>&1
|
|
341
|
+
rm -rf /var/lib/apt/lists/* >/dev/null 2>&1
|
|
342
|
+
apt-get update --allow-releaseinfo-change -o Acquire::Check-Valid-Until=false -y -qq >/dev/null 2>&1
|
|
343
|
+
fi
|
|
276
344
|
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
345
|
fi
|
|
282
|
-
|
|
283
|
-
fi
|
|
284
|
-
'" "Ajustando repositórios Debian antigos" install
|
|
346
|
+
'" "Ajustando repositórios" install
|
|
285
347
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
348
|
+
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
|
|
349
|
+
run_step "$SUDO bash -c '
|
|
350
|
+
apt --fix-broken install -y || true
|
|
351
|
+
apt-get clean
|
|
352
|
+
apt-get update --allow-releaseinfo-change -y || true
|
|
353
|
+
'" "Reparando dependências quebradas..." install
|
|
354
|
+
|
|
355
|
+
run_step "$SUDO apt update -y" "Atualizando pacotes..." install
|
|
356
|
+
run_step "$SUDO apt install -y curl git wget jq build-essential \
|
|
357
|
+
-o Dpkg::Options::='--force-confdef' \
|
|
358
|
+
-o Dpkg::Options::='--force-confold'" "Instalando pacotes base..." install
|
|
359
|
+
|
|
360
|
+
run_step "$SUDO apt install -y ca-certificates fonts-liberation libappindicator3-1 \
|
|
361
|
+
libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 \
|
|
362
|
+
libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 \
|
|
363
|
+
libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 \
|
|
364
|
+
libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 \
|
|
365
|
+
libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 \
|
|
366
|
+
libxss1 libxtst6 lsb-release xdg-utils \
|
|
367
|
+
-o Dpkg::Options::='--force-confdef' \
|
|
368
|
+
-o Dpkg::Options::='--force-confold'" "Instalando pacotes extras..." install
|
|
369
|
+
else
|
|
370
|
+
run_step "$SUDO apt update -y; $SUDO apt upgrade -y \
|
|
295
371
|
-o Dpkg::Options::='--force-confdef' \
|
|
296
372
|
-o Dpkg::Options::='--force-confold'" "Atualizando pacotes..." install
|
|
297
|
-
|
|
373
|
+
run_step "$SUDO apt-get install -y git wget curl jq build-essential libnss3-dev \
|
|
298
374
|
libgdk-pixbuf2.0-dev libgtk-3-dev libxss-dev libasound2 \
|
|
299
375
|
-o Dpkg::Options::='--force-confdef' \
|
|
300
376
|
-o Dpkg::Options::='--force-confold'" "Instalando dependências..." install
|
|
301
|
-
else
|
|
302
|
-
run_step "$SUDO apt update -y" "Atualizando pacotes..." install
|
|
303
|
-
run_step "$SUDO apt install -y curl git wget jq build-essential \
|
|
304
|
-
-o Dpkg::Options::='--force-confdef' \
|
|
305
|
-
-o Dpkg::Options::='--force-confold'" "Instalando pacotes base..." install
|
|
306
|
-
run_step "$SUDO apt install -y ca-certificates fonts-liberation libappindicator3-1 \
|
|
307
|
-
libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 \
|
|
308
|
-
libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 \
|
|
309
|
-
libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 \
|
|
310
|
-
libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 \
|
|
311
|
-
libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 \
|
|
312
|
-
libxss1 libxtst6 lsb-release xdg-utils \
|
|
313
|
-
-o Dpkg::Options::='--force-confdef' \
|
|
314
|
-
-o Dpkg::Options::='--force-confold'" "Instalando pacotes extras..." install
|
|
315
377
|
fi
|
|
378
|
+
|
|
379
|
+
# -------------------------
|
|
380
|
+
# Instalando SQLite3 (comum)
|
|
381
|
+
# -------------------------
|
|
316
382
|
run_step "command -v sqlite3 >/dev/null 2>&1 || $SUDO apt-get install -y sqlite3 --no-install-recommends" "Instalando SQLite3" install
|
|
383
|
+
|
|
317
384
|
# -------------------------
|
|
318
|
-
# Node.js
|
|
385
|
+
# Node.js - Configurar repositório
|
|
319
386
|
# -------------------------
|
|
320
|
-
run_step "$SUDO bash -c '
|
|
321
|
-
cd /root || exit 1
|
|
322
|
-
apt-get update -y
|
|
323
|
-
apt-get install -y curl gnupg ca-certificates --no-install-recommends
|
|
324
|
-
curl -fsSL https://deb.nodesource.com/setup_20.x | bash - || exit 1
|
|
325
|
-
'" "Configurando repositório Node.js" install
|
|
326
|
-
|
|
327
|
-
if [ "$NODE_REPO_FAILED" = true ]; then
|
|
328
|
-
printf "❌ Instalando Node.js\n"
|
|
329
|
-
printf "❌ Instalando dependências Node\n"
|
|
330
|
-
printf "❌ Iniciando serviços\n"
|
|
331
|
-
INSTALL_FAILED=true
|
|
332
|
-
else
|
|
333
387
|
run_step "$SUDO bash -c '
|
|
334
388
|
cd /root || exit 1
|
|
335
389
|
apt-get update -y
|
|
336
|
-
apt-get install -y
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
node -v && npm -v
|
|
340
|
-
'" "Instalando Node.js" install
|
|
390
|
+
apt-get install -y curl gnupg ca-certificates --no-install-recommends
|
|
391
|
+
curl -fsSL https://deb.nodesource.com/setup_20.x | bash - || exit 1
|
|
392
|
+
'" "Configurando repositório Node.js" install
|
|
341
393
|
|
|
342
|
-
if [ "$
|
|
394
|
+
if [ "$NODE_REPO_FAILED" = true ]; then
|
|
395
|
+
printf "❌ Instalando Node.js\n"
|
|
343
396
|
printf "❌ Instalando dependências Node\n"
|
|
344
397
|
printf "❌ Iniciando serviços\n"
|
|
345
398
|
INSTALL_FAILED=true
|
|
346
399
|
else
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
400
|
+
run_step "$SUDO bash -c '
|
|
401
|
+
cd /root || exit 1
|
|
402
|
+
apt-get update -y
|
|
403
|
+
apt-get install -y nodejs \
|
|
404
|
+
-o Dpkg::Options::=\"--force-confdef\" \
|
|
405
|
+
-o Dpkg::Options::=\"--force-confold\" --no-install-recommends
|
|
406
|
+
'" "Instalando Node.js" install
|
|
407
|
+
|
|
408
|
+
if [ "$NODE_INSTALL_FAILED" = true ]; then
|
|
409
|
+
printf "❌ Instalando dependências Node\n"
|
|
410
|
+
printf "❌ Iniciando serviços\n"
|
|
411
|
+
INSTALL_FAILED=true
|
|
412
|
+
else
|
|
413
|
+
# -------------------------
|
|
414
|
+
# 🐍 Python + Pip + Libs
|
|
415
|
+
# -------------------------
|
|
416
|
+
run_step "$SUDO apt update -y >/dev/null 2>&1 && \
|
|
417
|
+
$SUDO apt install -y python3 python3-pip python3-venv \
|
|
418
|
+
-o Dpkg::Options::='--force-confdef' \
|
|
419
|
+
-o Dpkg::Options::='--force-confold' >/dev/null 2>&1" \
|
|
420
|
+
'Instalando Python' install
|
|
421
|
+
|
|
422
|
+
if ! command -v pip3 >/dev/null 2>&1; then
|
|
423
|
+
run_step "$SUDO python3 -m ensurepip --upgrade >/dev/null 2>&1" \
|
|
424
|
+
'Restaurando pip' install
|
|
425
|
+
fi
|
|
360
426
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
427
|
+
run_step "cd /tmp && \
|
|
428
|
+
PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ROOT_USER_ACTION=ignore \
|
|
429
|
+
$SUDO python3 -m pip install --quiet --no-input --upgrade pip setuptools wheel" \
|
|
430
|
+
'Atualizando Python' install
|
|
431
|
+
|
|
432
|
+
# Instala libs Python dependendo da distro detectada
|
|
433
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
434
|
+
run_step "cd /tmp && \
|
|
435
|
+
PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ROOT_USER_ACTION=ignore \
|
|
436
|
+
$SUDO python3 -m pip install --quiet --no-input \
|
|
437
|
+
'flask==2.2.5' \
|
|
438
|
+
'sentence-transformers==2.2.2' \
|
|
439
|
+
'transformers==4.25.1' \
|
|
440
|
+
'safetensors==0.3.1' \
|
|
441
|
+
'huggingface_hub==0.10.1'" \
|
|
442
|
+
'Instalando libs Python' install
|
|
365
443
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
'Instalando libs Python' install
|
|
376
|
-
elif grep -qi 'ubuntu' /etc/os-release; then
|
|
377
|
-
run_step "cd /tmp && \
|
|
378
|
-
PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ROOT_USER_ACTION=ignore \
|
|
379
|
-
$SUDO python3 -m pip install --quiet --no-input \
|
|
380
|
-
'flask==2.2.5' \
|
|
381
|
-
'sentence-transformers==2.2.2' \
|
|
382
|
-
'huggingface_hub==0.10.1'" \
|
|
383
|
-
'Instalando libs Python' install
|
|
384
|
-
else
|
|
385
|
-
run_step "cd /tmp && \
|
|
386
|
-
PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ROOT_USER_ACTION=ignore \
|
|
387
|
-
$SUDO python3 -m pip install --quiet --no-input \
|
|
388
|
-
flask sentence-transformers 'huggingface_hub==0.10.1'" \
|
|
389
|
-
'Instalando libs Python' install
|
|
390
|
-
fi
|
|
444
|
+
else
|
|
445
|
+
run_step "cd /tmp && \
|
|
446
|
+
PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ROOT_USER_ACTION=ignore \
|
|
447
|
+
$SUDO python3 -m pip install --quiet --no-input \
|
|
448
|
+
'flask==2.2.5' \
|
|
449
|
+
'sentence-transformers==2.2.2' \
|
|
450
|
+
'huggingface_hub==0.10.1'" \
|
|
451
|
+
'Instalando libs Python' install
|
|
452
|
+
fi
|
|
391
453
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
454
|
+
run_step "python3 -m pip show flask >/dev/null 2>&1 && \
|
|
455
|
+
python3 -m pip show sentence-transformers >/dev/null 2>&1 && \
|
|
456
|
+
python3 -m pip show huggingface_hub >/dev/null 2>&1" \
|
|
457
|
+
'Verificando integridade Python' install
|
|
458
|
+
|
|
459
|
+
# -------------------------
|
|
460
|
+
# Repositório Mwsm
|
|
461
|
+
# -------------------------
|
|
462
|
+
run_step "rm -rf $BASE_DIR && mkdir -p $BASE_DIR && cd $BASE_DIR && \
|
|
463
|
+
git init && git remote add origin https://github.com/MKCodec/Mwsm.git && \
|
|
464
|
+
git config core.sparseCheckout true && 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 && \
|
|
465
|
+
git pull origin main || git pull origin master" "Baixando repositório Mwsm" install
|
|
466
|
+
CURRENT_USER=$(logname 2>/dev/null || echo "$USER")
|
|
467
|
+
$SUDO chown -R "$CURRENT_USER":"$CURRENT_USER" $BASE_DIR
|
|
468
|
+
Setup_Mwsm
|
|
469
|
+
if [ -f $BASE_DIR/mwsm.sh ]; then
|
|
470
|
+
ln -sf $BASE_DIR/mwsm.sh /usr/local/bin/mwsm 2>/dev/null || $SUDO ln -sf $BASE_DIR/mwsm.sh /usr/local/bin/mwsm
|
|
471
|
+
chmod +x /usr/local/bin/mwsm 2>/dev/null || $SUDO chmod +x /usr/local/bin/mwsm
|
|
472
|
+
fi
|
|
396
473
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
474
|
+
# -------------------------
|
|
475
|
+
# Dependências Node
|
|
476
|
+
# -------------------------
|
|
477
|
+
cd $BASE_DIR || return
|
|
478
|
+
run_step "node -v >/dev/null 2>&1" "Verificando instalação do Node.js" install
|
|
479
|
+
run_step "$SUDO npm cache clean --force" "Limpando cache NPM" install
|
|
480
|
+
run_step "npm config set registry https://registry.npmjs.org" "Configurando registro NPM" install
|
|
481
|
+
|
|
482
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
483
|
+
run_step "$SUDO npm install -g npm@latest node-gyp@latest" "Atualizando npm e node-gyp" install
|
|
484
|
+
run_step "$SUDO npm install --silent --no-fund --no-audit" "Instalando dependências Node" install
|
|
485
|
+
command -v node >/dev/null 2>&1 || $SUDO ln -sf /usr/bin/nodejs /usr/bin/node
|
|
486
|
+
run_step "node -v && npm -v" "Verificando Node.js e NPM" install
|
|
487
|
+
|
|
488
|
+
$SUDO mkdir -p /opt/mk-auth/api
|
|
489
|
+
$SUDO chmod 755 /opt/mk-auth/api
|
|
490
|
+
|
|
491
|
+
if ! ping -c1 raw.githubusercontent.com &>/dev/null; then
|
|
492
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [WARN] Falha de conexão com raw.githubusercontent.com" >>"$LOG_FILE"
|
|
493
|
+
fi
|
|
494
|
+
|
|
495
|
+
if ping -c1 raw.githubusercontent.com &>/dev/null; then
|
|
496
|
+
EXPECTED_HASH=$($SUDO wget -qO- "$CUSTOM_API_URL" | sha256sum | awk '{print $1}')
|
|
497
|
+
if [[ ! -f "$API_PATH" ]]; then
|
|
498
|
+
run_step "$SUDO wget -q \"$CUSTOM_API_URL\" -O \"$API_PATH\"" "Instalando integração MkAuth" install
|
|
499
|
+
else
|
|
500
|
+
LOCAL_HASH=$(sha256sum "$API_PATH" | awk '{print $1}')
|
|
501
|
+
if [[ "$LOCAL_HASH" != "$EXPECTED_HASH" ]]; then
|
|
502
|
+
run_step "$SUDO wget -q \"$CUSTOM_API_URL\" -O \"$API_PATH\"" "Atualizando integração MkAuth" install
|
|
503
|
+
fi
|
|
504
|
+
fi
|
|
505
|
+
else
|
|
506
|
+
run_step "false" "Instalando integração MkAuth" install
|
|
507
|
+
fi
|
|
431
508
|
|
|
432
|
-
if ping -c1 raw.githubusercontent.com &>/dev/null; then
|
|
433
|
-
EXPECTED_HASH=$($SUDO wget -qO- "$CUSTOM_API_URL" | sha256sum | awk '{print $1}')
|
|
434
|
-
if [[ ! -f "$API_PATH" ]]; then
|
|
435
|
-
run_step "$SUDO wget -q \"$CUSTOM_API_URL\" -O \"$API_PATH\"" "Instalando integração MkAuth" install
|
|
436
509
|
else
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
510
|
+
run_step "$SUDO npm install --silent --no-fund --no-audit" "Instalando dependências Node" install
|
|
511
|
+
command -v node >/dev/null 2>&1 || $SUDO ln -sf /usr/bin/nodejs /usr/bin/node
|
|
512
|
+
run_step "node -v && npm -v" "Verificando Node.js e NPM" install
|
|
513
|
+
fi
|
|
514
|
+
|
|
515
|
+
# -------------------------
|
|
516
|
+
# Instalação e atualização do PM2
|
|
517
|
+
# -------------------------
|
|
518
|
+
if command -v pm2 >/dev/null 2>&1; then
|
|
519
|
+
CURRENT_PM2_VERSION=$(pm2 -v | head -n1 | tr -d '[:space:]')
|
|
520
|
+
LATEST_PM2_VERSION=$(npm view pm2 version 2>/dev/null | tr -d '[:space:]')
|
|
521
|
+
if [[ -n "$LATEST_PM2_VERSION" && "$CURRENT_PM2_VERSION" != "$LATEST_PM2_VERSION" ]]; then
|
|
522
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [INFO] Atualizando PM2 de $CURRENT_PM2_VERSION para $LATEST_PM2_VERSION" >>"$LOG_FILE"
|
|
523
|
+
run_step "$SUDO npm install -g pm2@$LATEST_PM2_VERSION --silent --no-audit --no-fund" "Atualizando PM2" install
|
|
524
|
+
else
|
|
525
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [INFO] PM2 já está atualizado (v$CURRENT_PM2_VERSION)" >>"$LOG_FILE"
|
|
526
|
+
run_step "$SUDO pm2 update >/dev/null 2>&1 || true" "Sincronizando PM2" install
|
|
440
527
|
fi
|
|
528
|
+
else
|
|
529
|
+
run_step "$SUDO npm install -g pm2@latest --silent --no-audit --no-fund" "Instalando PM2" install
|
|
530
|
+
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" install
|
|
441
531
|
fi
|
|
442
|
-
|
|
443
|
-
|
|
532
|
+
|
|
533
|
+
# -------------------------
|
|
534
|
+
# Inicialização dos serviços
|
|
535
|
+
# -------------------------
|
|
536
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
537
|
+
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
|
|
538
|
+
run_step "$SUDO npm run setup:mkauth" "Iniciando serviços" install
|
|
539
|
+
else
|
|
540
|
+
run_step "$SUDO npm run setup:mwsm" "Iniciando serviços" install
|
|
541
|
+
fi
|
|
542
|
+
|
|
444
543
|
fi
|
|
445
|
-
else
|
|
446
|
-
run_step "$SUDO npm install --silent --no-fund --no-audit" "Instalando dependências Node" install
|
|
447
|
-
command -v node >/dev/null 2>&1 || $SUDO ln -sf /usr/bin/nodejs /usr/bin/node
|
|
448
|
-
run_step "node -v && npm -v" "Verificando Node.js e NPM" install
|
|
449
544
|
fi
|
|
450
545
|
|
|
451
546
|
# -------------------------
|
|
452
|
-
#
|
|
547
|
+
# Resultado final
|
|
453
548
|
# -------------------------
|
|
454
|
-
if
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
echo "
|
|
459
|
-
|
|
549
|
+
if [ "$IS_REINSTALL" = false ]; then
|
|
550
|
+
if [ "$INSTALL_FAILED" = false ]; then
|
|
551
|
+
echo "-------------------------------------"
|
|
552
|
+
echo "✅ Instalação concluída!"
|
|
553
|
+
echo "-------------------------------------"
|
|
554
|
+
LAST_SUCCESS="install"
|
|
460
555
|
else
|
|
461
|
-
echo "
|
|
462
|
-
|
|
556
|
+
echo "-------------------------------------"
|
|
557
|
+
echo "❌ Falha na instalação."
|
|
558
|
+
echo "-------------------------------------"
|
|
559
|
+
if [ -d "$BASE_DIR" ]; then
|
|
560
|
+
rm -rf $BASE_DIR
|
|
561
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [ROLLBACK] Diretório $BASE_DIR removido por falha." >>"$LOG_FILE"
|
|
562
|
+
fi
|
|
463
563
|
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
564
|
fi
|
|
468
565
|
|
|
469
|
-
#
|
|
470
|
-
|
|
471
|
-
# -------------------------
|
|
472
|
-
if [[ "$DISTRO" == "ubuntu" ]]; then
|
|
473
|
-
run_step "$SUDO npm run setup:mwsm" "Iniciando serviços" install
|
|
474
|
-
else
|
|
475
|
-
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" install
|
|
476
|
-
run_step "$SUDO npm run setup:mkauth" "Iniciando serviços" install
|
|
477
|
-
fi
|
|
478
|
-
fi
|
|
479
|
-
fi
|
|
480
|
-
# -------------------------
|
|
481
|
-
# Resultado final
|
|
482
|
-
# -------------------------
|
|
483
|
-
if [ "$IS_REINSTALL" = false ]; then
|
|
484
|
-
if [ "$INSTALL_FAILED" = false ]; then
|
|
485
|
-
echo "-------------------------------------"
|
|
486
|
-
echo "✅ Instalação concluída!"
|
|
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"
|
|
496
|
-
fi
|
|
497
|
-
fi
|
|
498
|
-
fi
|
|
566
|
+
# Log
|
|
567
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [INSTALL] Fim da instalação (status: $([ "$INSTALL_FAILED" = true ] && echo FAIL || echo OK))" >>"$LOG_FILE"
|
|
499
568
|
|
|
500
|
-
#
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
if [ "$NO_PAUSE" = true ]; then
|
|
505
|
-
return
|
|
506
|
-
fi
|
|
569
|
+
# Se for chamado pelo reinstall, não pausa
|
|
570
|
+
if [ "$NO_PAUSE" = true ]; then
|
|
571
|
+
return
|
|
572
|
+
fi
|
|
507
573
|
|
|
508
|
-
echo
|
|
509
|
-
pause_and_restore
|
|
574
|
+
echo
|
|
575
|
+
pause_and_restore
|
|
510
576
|
|
|
511
577
|
}
|
|
512
578
|
|
|
513
|
-
|
|
579
|
+
# -------------------------
|
|
580
|
+
# As demais funções do script original seguem exatamente como antes:
|
|
581
|
+
# backup_mwsm_db, migrate_mwsm, update, uninstall, reinstall, view_log_hidden, clear_log_hidden, menu, etc.
|
|
582
|
+
# (Vou preservar estas funções conforme estavam no seu script original, sem alterações.)
|
|
583
|
+
# -------------------------
|
|
514
584
|
|
|
515
585
|
backup_mwsm_db() {
|
|
516
|
-
local DB_PATH="/
|
|
586
|
+
local DB_PATH="$BASE_DIR/mwsm.db"
|
|
517
587
|
local BACKUP_DIR="/tmp/Mwsm"
|
|
518
588
|
local BACKUP_FILE="$BACKUP_DIR/mwsm.db"
|
|
519
589
|
|
|
@@ -528,18 +598,15 @@ backup_mwsm_db() {
|
|
|
528
598
|
fi
|
|
529
599
|
}
|
|
530
600
|
|
|
531
|
-
|
|
532
|
-
|
|
533
601
|
migrate_mwsm() {
|
|
534
602
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - [MIGRATION] Iniciando migração de banco Mwsm" >>"$LOG_FILE"
|
|
535
603
|
|
|
536
604
|
local SRC_DB="/tmp/Mwsm/mwsm.db"
|
|
537
|
-
local DEST_DB="/
|
|
605
|
+
local DEST_DB="$BASE_DIR/mwsm.db"
|
|
538
606
|
local SQLITE_BIN
|
|
539
607
|
SQLITE_BIN=$(command -v sqlite3)
|
|
540
608
|
local SYSTEM_TABLES=("attachments" "resources" "emotions" "console" "engine")
|
|
541
609
|
|
|
542
|
-
# Verificações iniciais
|
|
543
610
|
if [ ! -f "$SRC_DB" ]; then
|
|
544
611
|
echo "[MIGRATION] ERRO: Backup não encontrado em $SRC_DB" >>"$LOG_FILE"
|
|
545
612
|
return 1
|
|
@@ -552,11 +619,9 @@ migrate_mwsm() {
|
|
|
552
619
|
|
|
553
620
|
echo "[MIGRATION] Copiando dados personalizados do backup para o novo banco..." >>"$LOG_FILE"
|
|
554
621
|
|
|
555
|
-
# Percorre todas as tabelas do backup
|
|
556
622
|
for table in $($SQLITE_BIN "$SRC_DB" ".tables"); do
|
|
557
623
|
[[ -z "$table" ]] && continue
|
|
558
624
|
|
|
559
|
-
# Ignorar tabelas de sistema
|
|
560
625
|
for sys in "${SYSTEM_TABLES[@]}"; do
|
|
561
626
|
[[ "$table" == "$sys" ]] && {
|
|
562
627
|
echo "[MIGRATION] Ignorando tabela de sistema: $table" >>"$LOG_FILE"
|
|
@@ -564,18 +629,15 @@ migrate_mwsm() {
|
|
|
564
629
|
}
|
|
565
630
|
done
|
|
566
631
|
|
|
567
|
-
# Verifica se a tabela também existe no novo banco
|
|
568
632
|
if ! $SQLITE_BIN "$DEST_DB" "SELECT name FROM sqlite_master WHERE type='table' AND name='$table';" | grep -q "$table"; then
|
|
569
633
|
echo "[MIGRATION] ⚠️ Tabela $table não existe no novo DB — ignorando." >>"$LOG_FILE"
|
|
570
634
|
continue
|
|
571
635
|
fi
|
|
572
636
|
|
|
573
|
-
# Conta registros
|
|
574
637
|
local src_count dest_count
|
|
575
638
|
src_count=$($SQLITE_BIN "$SRC_DB" "SELECT COUNT(*) FROM '$table';")
|
|
576
639
|
dest_count=$($SQLITE_BIN "$DEST_DB" "SELECT COUNT(*) FROM '$table';")
|
|
577
640
|
|
|
578
|
-
# Se backup não tiver dados, pula
|
|
579
641
|
if [ "$src_count" -eq 0 ]; then
|
|
580
642
|
echo "[MIGRATION] ⚠️ Nenhum dado em $table no backup — pulando." >>"$LOG_FILE"
|
|
581
643
|
continue
|
|
@@ -583,23 +645,18 @@ migrate_mwsm() {
|
|
|
583
645
|
|
|
584
646
|
echo "[MIGRATION] 🔄 Migrando dados da tabela: $table" >>"$LOG_FILE"
|
|
585
647
|
|
|
586
|
-
# Recupera nomes de colunas
|
|
587
648
|
local columns
|
|
588
649
|
columns=$($SQLITE_BIN "$SRC_DB" "PRAGMA table_info('$table');" | awk -F'|' '{print $2}' | xargs | tr ' ' ',')
|
|
589
650
|
|
|
590
|
-
# Loop por ID — assume que há uma coluna "id"
|
|
591
651
|
for id in $($SQLITE_BIN "$SRC_DB" "SELECT id FROM '$table';"); do
|
|
592
|
-
# Se registro não existe no novo, insere
|
|
593
652
|
if ! $SQLITE_BIN "$DEST_DB" "SELECT id FROM '$table' WHERE id=$id;" | grep -q "$id"; then
|
|
594
653
|
$SQLITE_BIN "$DEST_DB" "INSERT INTO '$table' SELECT * FROM '$SRC_DB'.'$table' WHERE id=$id;" 2>>"$LOG_FILE" \
|
|
595
654
|
&& echo "[MIGRATION] ➕ Inserido registro id=$id em $table" >>"$LOG_FILE"
|
|
596
655
|
continue
|
|
597
656
|
fi
|
|
598
657
|
|
|
599
|
-
# Se existe, faz update seletivo
|
|
600
658
|
local updates=()
|
|
601
659
|
while IFS='|' read -r col val; do
|
|
602
|
-
# Pula colunas nulas ou id
|
|
603
660
|
[[ "$col" == "id" ]] && continue
|
|
604
661
|
[[ -z "$val" ]] && continue
|
|
605
662
|
local current
|
|
@@ -614,7 +671,6 @@ migrate_mwsm() {
|
|
|
614
671
|
echo "$col|$val"
|
|
615
672
|
done)
|
|
616
673
|
|
|
617
|
-
# Aplica atualização, se houver colunas a atualizar
|
|
618
674
|
if [ "${#updates[@]}" -gt 0 ]; then
|
|
619
675
|
local set_clause
|
|
620
676
|
set_clause=$(IFS=,; echo "${updates[*]}")
|
|
@@ -626,7 +682,6 @@ migrate_mwsm() {
|
|
|
626
682
|
|
|
627
683
|
echo "[MIGRATION] Migração concluída com sucesso." >>"$LOG_FILE"
|
|
628
684
|
|
|
629
|
-
# Remove backup após migração
|
|
630
685
|
rm -f "$SRC_DB"
|
|
631
686
|
echo "[MIGRATION] Backup removido: $SRC_DB" >>"$LOG_FILE"
|
|
632
687
|
}
|
|
@@ -637,14 +692,14 @@ migrate_mwsm() {
|
|
|
637
692
|
update() {
|
|
638
693
|
INSTALL_FAILED=false
|
|
639
694
|
|
|
640
|
-
if [[ ! -d
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
fi
|
|
647
|
-
cd
|
|
695
|
+
if [[ ! -d $BASE_DIR || ! -f $BASE_DIR/package.json ]]; then
|
|
696
|
+
echo "-------------------------------------"
|
|
697
|
+
echo "⚠️ O Mwsm não está instalado!"
|
|
698
|
+
echo "-------------------------------------"
|
|
699
|
+
sleep 2
|
|
700
|
+
return
|
|
701
|
+
fi
|
|
702
|
+
cd $BASE_DIR || return
|
|
648
703
|
clear
|
|
649
704
|
echo "====================================="
|
|
650
705
|
echo " 🔄 Atualizando Mwsm"
|
|
@@ -665,10 +720,10 @@ fi
|
|
|
665
720
|
run_step "backup_mwsm_db" "Exportando dados Mwsm" update
|
|
666
721
|
run_step "git fetch origin main && git reset --hard origin/main" "Atualizando repositório Mwsm" update
|
|
667
722
|
Setup_Mwsm
|
|
668
|
-
if [ -f /
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
fi
|
|
723
|
+
if [ -f $BASE_DIR/mwsm.sh ]; then
|
|
724
|
+
ln -sf $BASE_DIR/mwsm.sh /usr/local/bin/mwsm 2>/dev/null || $SUDO ln -sf $BASE_DIR/mwsm.sh /usr/local/bin/mwsm
|
|
725
|
+
chmod +x /usr/local/bin/mwsm 2>/dev/null || $SUDO chmod +x /usr/local/bin/mwsm
|
|
726
|
+
fi
|
|
672
727
|
run_step "$SUDO apt-get update -y >/dev/null 2>&1" "Verificando repositórios APT" update
|
|
673
728
|
run_step "$SUDO apt --fix-broken install -y >/dev/null 2>&1 || true" "Corrigindo pacotes quebrados" update
|
|
674
729
|
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,30 +735,33 @@ fi
|
|
|
680
735
|
run_step "node -v && npm -v" "Verificando Node.js e NPM" update
|
|
681
736
|
run_step "$SUDO npm cache clean --force" "Limpando cache NPM" update
|
|
682
737
|
run_step "npm config set registry https://registry.npmjs.org" "Configurando repositório NPM" update
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
738
|
+
|
|
739
|
+
# Use precise detection for update branches if needed
|
|
740
|
+
detect_distro
|
|
741
|
+
|
|
742
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
686
743
|
run_step "$SUDO npm install -g npm@latest node-gyp@latest --silent --no-audit --no-fund" "Atualizando npm e node-gyp" update
|
|
744
|
+
else
|
|
745
|
+
run_step "$SUDO npm install -g npm@latest --silent --no-audit --no-fund" "Atualizando npm" update
|
|
687
746
|
fi
|
|
688
|
-
run_step "$SUDO npm install --silent --no-fund --no-audit" "Atualizando dependências Node.js" update
|
|
689
747
|
|
|
748
|
+
run_step "$SUDO npm install --silent --no-fund --no-audit" "Atualizando dependências Node.js" update
|
|
690
749
|
if ! command -v python3 >/dev/null 2>&1; then
|
|
691
750
|
run_step "$SUDO apt install -y python3 python3-pip python3-venv --no-install-recommends >/dev/null 2>&1" "Instalando Python" update
|
|
692
751
|
fi
|
|
693
|
-
|
|
694
752
|
run_step "$SUDO python3 -m pip install --quiet --upgrade pip setuptools wheel" "Atualizando pip" update
|
|
695
753
|
|
|
696
|
-
if
|
|
754
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
697
755
|
run_step "$SUDO python3 -m pip install --quiet --no-input \
|
|
698
756
|
'flask==2.2.5' \
|
|
699
757
|
'sentence-transformers==2.2.2' \
|
|
758
|
+
'transformers==4.25.1' \
|
|
759
|
+
'safetensors==0.3.1' \
|
|
700
760
|
'huggingface_hub==0.10.1'" "Atualizando libs Python" update
|
|
701
761
|
else
|
|
702
762
|
run_step "$SUDO python3 -m pip install --quiet --no-input \
|
|
703
763
|
'flask==2.2.5' \
|
|
704
764
|
'sentence-transformers==2.2.2' \
|
|
705
|
-
'transformers==4.25.1' \
|
|
706
|
-
'safetensors==0.3.1' \
|
|
707
765
|
'huggingface_hub==0.10.1'" "Atualizando libs Python" update
|
|
708
766
|
fi
|
|
709
767
|
|
|
@@ -717,21 +775,19 @@ fi
|
|
|
717
775
|
fi
|
|
718
776
|
else
|
|
719
777
|
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
|
|
778
|
+
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
779
|
fi
|
|
722
780
|
|
|
723
781
|
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
|
|
782
|
+
|
|
783
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
784
|
+
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
785
|
run_step "$SUDO npm run setup:mkauth" "Reiniciando serviços" update
|
|
786
|
+
|
|
787
|
+
else
|
|
788
|
+
run_step "$SUDO npm run setup:mwsm" "Reiniciando serviços" update
|
|
730
789
|
fi
|
|
731
790
|
|
|
732
|
-
# -------------------------
|
|
733
|
-
# Resultado final
|
|
734
|
-
# -------------------------
|
|
735
791
|
if [ "$INSTALL_FAILED" = false ]; then
|
|
736
792
|
echo "-------------------------------------"
|
|
737
793
|
echo "✅ Atualização concluída com sucesso!"
|
|
@@ -745,7 +801,7 @@ fi
|
|
|
745
801
|
|
|
746
802
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - [UPDATE] Fim da atualização (status: $([ "$INSTALL_FAILED" = true ] && echo FAIL || echo OK))" >>"$LOG_FILE"
|
|
747
803
|
echo
|
|
748
|
-
pause_and_restore
|
|
804
|
+
pause_and_restore
|
|
749
805
|
|
|
750
806
|
}
|
|
751
807
|
|
|
@@ -757,7 +813,7 @@ uninstall() {
|
|
|
757
813
|
local NO_PAUSE=false
|
|
758
814
|
|
|
759
815
|
if [ "$IS_REINSTALL" = false ]; then
|
|
760
|
-
if [[ ! -d
|
|
816
|
+
if [[ ! -d $BASE_DIR || ! -f $BASE_DIR/package.json ]]; then
|
|
761
817
|
echo "-------------------------------------"
|
|
762
818
|
echo "⚠️ O Mwsm não está instalado!"
|
|
763
819
|
echo "-------------------------------------"
|
|
@@ -766,7 +822,6 @@ uninstall() {
|
|
|
766
822
|
fi
|
|
767
823
|
fi
|
|
768
824
|
|
|
769
|
-
|
|
770
825
|
if [ "$1" = "no_clear" ]; then
|
|
771
826
|
NO_CLEAR=true
|
|
772
827
|
fi
|
|
@@ -774,7 +829,6 @@ uninstall() {
|
|
|
774
829
|
NO_PAUSE=true
|
|
775
830
|
fi
|
|
776
831
|
|
|
777
|
-
# Cabeçalho
|
|
778
832
|
if [ "$NO_CLEAR" = false ]; then
|
|
779
833
|
clear
|
|
780
834
|
echo "====================================="
|
|
@@ -784,84 +838,82 @@ uninstall() {
|
|
|
784
838
|
|
|
785
839
|
UNINSTALL_FAILED=false
|
|
786
840
|
|
|
787
|
-
# Parando serviços PM2
|
|
788
841
|
if command -v pm2 >/dev/null 2>&1; then
|
|
789
842
|
run_step "$SUDO pm2 stop all && $SUDO pm2 delete all" "Removendo serviços" uninstall || UNINSTALL_FAILED=true
|
|
790
843
|
else
|
|
791
|
-
|
|
792
|
-
fi
|
|
844
|
+
run_step "skip" "Removendo serviços" uninstall
|
|
845
|
+
fi
|
|
793
846
|
|
|
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
|
|
847
|
+
# Removendo inicialização
|
|
848
|
+
if command -v pm2 >/dev/null 2>&1; then
|
|
804
849
|
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
850
|
+
detect_distro
|
|
851
|
+
|
|
852
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
853
|
+
run_step "crontab -l 2>/dev/null | grep -v '$BASE_DIR/mwsm.js' | crontab -" "Removendo inicialização" uninstall || UNINSTALL_FAILED=true
|
|
854
|
+
else
|
|
855
|
+
run_step "$SUDO pm2 unstartup systemd" "Removendo inicialização" uninstall || UNINSTALL_FAILED=true
|
|
856
|
+
fi
|
|
811
857
|
|
|
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
858
|
else
|
|
817
|
-
|
|
818
|
-
fi
|
|
819
|
-
else
|
|
820
|
-
run_step "skip" "Limpando cache NPM" uninstall
|
|
821
|
-
fi
|
|
859
|
+
run_step "skip" "Removendo inicialização" uninstall
|
|
860
|
+
fi
|
|
822
861
|
|
|
862
|
+
if command -v pm2 >/dev/null 2>&1; then
|
|
863
|
+
run_step "$SUDO npm remove -g pm2" "Removendo PM2" uninstall || UNINSTALL_FAILED=true
|
|
864
|
+
else
|
|
865
|
+
run_step "skip" "Removendo PM2" uninstall
|
|
866
|
+
fi
|
|
823
867
|
|
|
824
|
-
|
|
825
|
-
if [
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
868
|
+
if command -v npm >/dev/null 2>&1; then
|
|
869
|
+
if [ -d "$HOME/.npm" ]; then
|
|
870
|
+
run_step "cd /tmp && $SUDO npm cache clean --force" "Limpando cache NPM" uninstall || UNINSTALL_FAILED=true
|
|
871
|
+
else
|
|
872
|
+
run_step "skip" "Limpando cache NPM" uninstall
|
|
873
|
+
fi
|
|
874
|
+
else
|
|
875
|
+
run_step "skip" "Limpando cache NPM" uninstall
|
|
876
|
+
fi
|
|
831
877
|
|
|
832
|
-
if [
|
|
833
|
-
|
|
834
|
-
|
|
878
|
+
if [[ -d $BASE_DIR ]]; then
|
|
879
|
+
[[ "$PWD" =~ $BASE_DIR ]] && cd /root 2>/dev/null || cd /tmp
|
|
880
|
+
run_step "rm -rf $BASE_DIR" "Limpando diretórios" uninstall || UNINSTALL_FAILED=true
|
|
881
|
+
else
|
|
882
|
+
run_step "skip" "Limpando diretórios" uninstall
|
|
883
|
+
fi
|
|
835
884
|
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
885
|
+
if [ -L /usr/local/bin/mwsm ] || [ -f /usr/local/bin/mwsm ]; then
|
|
886
|
+
rm -f /usr/local/bin/mwsm 2>/dev/null || $SUDO rm -f /usr/local/bin/mwsm
|
|
887
|
+
fi
|
|
888
|
+
|
|
889
|
+
if [ "$NO_PAUSE" = false ]; then
|
|
890
|
+
if [ "$UNINSTALL_FAILED" = false ]; then
|
|
891
|
+
echo "-------------------------------------"
|
|
892
|
+
echo "✅ Remoção concluída!"
|
|
893
|
+
echo "-------------------------------------"
|
|
894
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [UNINSTALL] Fim da remoção (OK)" >>"$LOG_FILE"
|
|
895
|
+
else
|
|
896
|
+
echo "-------------------------------------"
|
|
897
|
+
echo "❌ Falha na remoção."
|
|
898
|
+
echo "-------------------------------------"
|
|
899
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [UNINSTALL] Fim da remoção (FAIL)" >>"$LOG_FILE"
|
|
900
|
+
fi
|
|
843
901
|
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
|
|
902
|
+
if [ "$UNINSTALL_FAILED" = false ]; then
|
|
903
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [UNINSTALL] Fim da remoção (OK - modo silencioso)" >>"$LOG_FILE"
|
|
904
|
+
else
|
|
905
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') - [UNINSTALL] Fim da remoção (FAIL - modo silencioso)" >>"$LOG_FILE"
|
|
906
|
+
fi
|
|
907
|
+
fi
|
|
856
908
|
|
|
857
|
-
if [ "$NO_PAUSE" = true ]; then
|
|
858
|
-
|
|
859
|
-
fi
|
|
909
|
+
if [ "$NO_PAUSE" = true ]; then
|
|
910
|
+
return
|
|
911
|
+
fi
|
|
860
912
|
|
|
861
|
-
echo
|
|
862
|
-
if [ "$NO_PAUSE" = false ]; then
|
|
863
|
-
|
|
864
|
-
fi
|
|
913
|
+
echo
|
|
914
|
+
if [ "$NO_PAUSE" = false ]; then
|
|
915
|
+
pause_and_restore
|
|
916
|
+
fi
|
|
865
917
|
}
|
|
866
918
|
|
|
867
919
|
# ========================
|
|
@@ -911,52 +963,50 @@ view_log_hidden() {
|
|
|
911
963
|
echo "-------------------------------------"
|
|
912
964
|
printf "Escolha uma opção: "
|
|
913
965
|
|
|
914
|
-
# Lê uma única tecla (sem Enter) e só aceita 0–3
|
|
915
966
|
while true; do
|
|
916
967
|
read -rsn1 log_choice
|
|
917
968
|
case "$log_choice" in
|
|
918
969
|
[0-3]) break ;;
|
|
919
970
|
*) continue ;;
|
|
971
|
+
esac
|
|
972
|
+
done
|
|
973
|
+
echo "$log_choice"
|
|
974
|
+
|
|
975
|
+
case $log_choice in
|
|
976
|
+
1)
|
|
977
|
+
cutoff_epoch=$(date -d '24 hours ago' +%s)
|
|
978
|
+
awk -v cutoff="$cutoff_epoch" '
|
|
979
|
+
{
|
|
980
|
+
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]/)) {
|
|
981
|
+
ts = substr($0, RSTART, RLENGTH)
|
|
982
|
+
cmd = "date -d \"" ts "\" +%s"
|
|
983
|
+
cmd | getline t
|
|
984
|
+
close(cmd)
|
|
985
|
+
if (t >= cutoff) print $0
|
|
986
|
+
}
|
|
987
|
+
}' "$LOG_FILE" | iconv -f utf-8 -t utf-8
|
|
988
|
+
|
|
989
|
+
printf "\\nPressione ENTER para voltar ao menu principal..."
|
|
990
|
+
IFS= read -r _
|
|
991
|
+
break
|
|
992
|
+
;;
|
|
993
|
+
2)
|
|
994
|
+
cat "$LOG_FILE" | grep "^[0-9]\\{4\\}-" | iconv -f utf-8 -t utf-8
|
|
995
|
+
printf "\\nPressione ENTER para voltar ao menu principal..."
|
|
996
|
+
IFS= read -r _
|
|
997
|
+
break
|
|
998
|
+
;;
|
|
999
|
+
3)
|
|
1000
|
+
cat "$LOG_FILE" | grep -v "^[0-9]\\{4\\}-" | iconv -f utf-8 -t utf-8
|
|
1001
|
+
printf "\\nPressione ENTER para voltar ao menu principal..."
|
|
1002
|
+
IFS= read -r _
|
|
1003
|
+
break
|
|
1004
|
+
;;
|
|
1005
|
+
0)
|
|
1006
|
+
break
|
|
1007
|
+
;;
|
|
920
1008
|
esac
|
|
921
1009
|
done
|
|
922
|
-
echo "$log_choice"
|
|
923
|
-
|
|
924
|
-
case $log_choice in
|
|
925
|
-
1)
|
|
926
|
-
cutoff_epoch=$(date -d '24 hours ago' +%s)
|
|
927
|
-
# awk: encontra a primeira timestamp válida em cada linha, converte e compara
|
|
928
|
-
awk -v cutoff="$cutoff_epoch" '
|
|
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
|
|
960
1010
|
}
|
|
961
1011
|
|
|
962
1012
|
# ========================
|
|
@@ -974,9 +1024,8 @@ clear_log_hidden() {
|
|
|
974
1024
|
# Menu principal
|
|
975
1025
|
# ========================
|
|
976
1026
|
menu() {
|
|
977
|
-
# Desativa o cursor logo no início, antes de qualquer saída
|
|
978
1027
|
command -v tput >/dev/null 2>&1 && tput civis >/dev/null 2>&1 || true
|
|
979
|
-
|
|
1028
|
+
detect_distro
|
|
980
1029
|
while true; do
|
|
981
1030
|
if [ -t 0 ]; then
|
|
982
1031
|
stty -echo -icanon time 0 min 0 || true
|
|
@@ -986,6 +1035,12 @@ menu() {
|
|
|
986
1035
|
|
|
987
1036
|
echo "====================================="
|
|
988
1037
|
echo " 📦 Gerenciador do Bot-Mwsm"
|
|
1038
|
+
echo "-------------------------------------"
|
|
1039
|
+
if [[ "$DISTRO_DETECT" == "devuan" ]]; then
|
|
1040
|
+
echo "Sistema: MkAuth"
|
|
1041
|
+
else
|
|
1042
|
+
echo "Sistema: $(echo "$DISTRO_DETECT" | awk '{print toupper(substr($0,1,1)) tolower(substr($0,2))}')"
|
|
1043
|
+
fi
|
|
989
1044
|
echo "====================================="
|
|
990
1045
|
echo "1) Instalar"
|
|
991
1046
|
echo "2) Atualizar"
|
|
@@ -995,15 +1050,13 @@ menu() {
|
|
|
995
1050
|
echo "-------------------------------------"
|
|
996
1051
|
printf "Escolha uma opção: "
|
|
997
1052
|
|
|
998
|
-
# Mantém o cursor oculto o tempo todo
|
|
999
1053
|
command -v tput >/dev/null 2>&1 && tput civis >/dev/null 2>&1 || true
|
|
1000
1054
|
|
|
1001
|
-
# Lê uma única tecla (sem Enter)
|
|
1002
1055
|
while true; do
|
|
1003
1056
|
read -rsn1 choice
|
|
1004
1057
|
case "$choice" in
|
|
1005
1058
|
[0-6]) break ;; # aceita apenas 0–6
|
|
1006
|
-
*) continue ;;
|
|
1059
|
+
*) continue ;;
|
|
1007
1060
|
esac
|
|
1008
1061
|
done
|
|
1009
1062
|
|
|
@@ -1019,15 +1072,14 @@ menu() {
|
|
|
1019
1072
|
5) view_log_hidden ;; # oculto
|
|
1020
1073
|
6) clear_log_hidden ;; # oculto
|
|
1021
1074
|
0)
|
|
1022
|
-
# Reativa o cursor antes de sair
|
|
1023
1075
|
command -v tput >/dev/null 2>&1 && tput cnorm >/dev/null 2>&1 || true
|
|
1024
1076
|
if [[ "$LAST_SUCCESS" == "install" ]]; then
|
|
1025
1077
|
if command -v pm2 >/dev/null 2>&1; then
|
|
1026
|
-
NAME=$(jq -r .name /
|
|
1078
|
+
NAME=$(jq -r .name $BASE_DIR/package.json 2>/dev/null)
|
|
1027
1079
|
MATCHED=""
|
|
1028
1080
|
|
|
1029
|
-
if [[ -n "$NAME" && -f /
|
|
1030
|
-
if jq -r 'tostring' /
|
|
1081
|
+
if [[ -n "$NAME" && -f $BASE_DIR/mwsm.json ]]; then
|
|
1082
|
+
if jq -r 'tostring' $BASE_DIR/mwsm.json 2>/dev/null | grep -q "$NAME"; then
|
|
1031
1083
|
MATCHED="$NAME"
|
|
1032
1084
|
fi
|
|
1033
1085
|
fi
|