setup-kapelu 3.0.0
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/LICENSE +21 -0
- package/README.md +120 -0
- package/config/.bashrc +148 -0
- package/config/protect-main.json +47 -0
- package/index.js +78 -0
- package/install.sh +164 -0
- package/package.json +33 -0
- package/script/btn-log.sh +98 -0
- package/script/btn-shd.sh +170 -0
- package/script/btn-sus.sh +176 -0
- package/script/node-clean.sh +326 -0
- package/script/setup.sh +463 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ╔════════════════════════════════════════════════════╗
|
|
3
|
+
# │ cerrar-sesion - Script para cerrar la sesión │
|
|
4
|
+
# │ Versión: 2.0 │
|
|
5
|
+
# │ Autor: Daniel Calderon - Kapelu │
|
|
6
|
+
# │ Fecha: 16/03/2024 │
|
|
7
|
+
# │ WebSite: https://danielcalderon.vercel.app/ │
|
|
8
|
+
# │ Github: https://github.com/Kapelu │
|
|
9
|
+
# ╚════════════════════════════════════════════════════╝
|
|
10
|
+
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
TARGETS=("node_modules" ".next")
|
|
14
|
+
NODE_DIRS=()
|
|
15
|
+
DRY_RUN=false
|
|
16
|
+
[[ "${1:-}" == "--dry-run" ]] && DRY_RUN=true
|
|
17
|
+
|
|
18
|
+
declare -A DIR_SIZES
|
|
19
|
+
|
|
20
|
+
cleanup() {
|
|
21
|
+
tput rmcup 2>/dev/null || true
|
|
22
|
+
clear
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
salir() {
|
|
26
|
+
cleanup
|
|
27
|
+
echo ""
|
|
28
|
+
echo "Gracias por usar node-clean by Kapelu."
|
|
29
|
+
echo "https://github.com/Kapelu"
|
|
30
|
+
echo "¡Hasta la próxima!"
|
|
31
|
+
echo ""
|
|
32
|
+
exit 0
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
trap salir EXIT INT TERM
|
|
36
|
+
|
|
37
|
+
validar_dialog() {
|
|
38
|
+
|
|
39
|
+
if command -v dialog >/dev/null 2>&1; then
|
|
40
|
+
return
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
echo "dialog no está instalado. Intentando instalar..."
|
|
44
|
+
|
|
45
|
+
if command -v apt >/dev/null 2>&1; then
|
|
46
|
+
sudo apt update && sudo apt install -y dialog
|
|
47
|
+
elif command -v dnf >/dev/null 2>&1; then
|
|
48
|
+
sudo dnf install -y dialog
|
|
49
|
+
elif command -v yum >/dev/null 2>&1; then
|
|
50
|
+
sudo yum install -y dialog
|
|
51
|
+
elif command -v pacman >/dev/null 2>&1; then
|
|
52
|
+
sudo pacman -Sy --noconfirm dialog
|
|
53
|
+
else
|
|
54
|
+
echo "No se pudo determinar el gestor de paquetes."
|
|
55
|
+
exit 1
|
|
56
|
+
fi
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
relative_path() {
|
|
60
|
+
echo "${1#$BASE_DIR/}"
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
get_size_mb() {
|
|
64
|
+
echo "${DIR_SIZES[$1]:-0}"
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
calc_height() {
|
|
68
|
+
|
|
69
|
+
local items=$1
|
|
70
|
+
local max_height=$((TERM_HEIGHT - 8))
|
|
71
|
+
|
|
72
|
+
if [[ $items -lt $max_height ]]; then
|
|
73
|
+
echo $((items + 8))
|
|
74
|
+
else
|
|
75
|
+
echo "$max_height"
|
|
76
|
+
fi
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
calc_all_sizes() {
|
|
80
|
+
|
|
81
|
+
local results
|
|
82
|
+
|
|
83
|
+
results=$(du -sm "${NODE_DIRS[@]}" 2>/dev/null)
|
|
84
|
+
|
|
85
|
+
while read -r size path; do
|
|
86
|
+
DIR_SIZES["$path"]=$size
|
|
87
|
+
done <<< "$results"
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
scan_with_progress() {
|
|
91
|
+
|
|
92
|
+
local TMP
|
|
93
|
+
TMP=$(mktemp)
|
|
94
|
+
|
|
95
|
+
(
|
|
96
|
+
find "$BASE_DIR" -type d \( -name node_modules -o -name .next \) -prune 2>/dev/null > "$TMP"
|
|
97
|
+
) &
|
|
98
|
+
|
|
99
|
+
local PID=$!
|
|
100
|
+
local progress=0
|
|
101
|
+
|
|
102
|
+
while kill -0 "$PID" 2>/dev/null; do
|
|
103
|
+
progress=$(( (progress + 2) % 100 ))
|
|
104
|
+
echo $progress
|
|
105
|
+
sleep 0.1
|
|
106
|
+
done | dialog --gauge "Escaneando proyectos Node..." 10 70 0
|
|
107
|
+
|
|
108
|
+
mapfile -t NODE_DIRS < "$TMP"
|
|
109
|
+
|
|
110
|
+
rm -f "$TMP"
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
confirmar_borrado() {
|
|
114
|
+
|
|
115
|
+
local DIRS=("$@")
|
|
116
|
+
local TOTAL_MB=0
|
|
117
|
+
local SIZE_MB
|
|
118
|
+
|
|
119
|
+
for DIR in "${DIRS[@]}"; do
|
|
120
|
+
SIZE_MB=$(get_size_mb "$DIR")
|
|
121
|
+
TOTAL_MB=$((TOTAL_MB + SIZE_MB))
|
|
122
|
+
done
|
|
123
|
+
|
|
124
|
+
dialog --title "Confirmación de borrado" \
|
|
125
|
+
--yes-label "Sí" --no-label "No" \
|
|
126
|
+
--yesno "Se van a eliminar ${#DIRS[@]} carpetas.\nEspacio total a liberar: ${TOTAL_MB} MB\n\n¿Desea continuar?" \
|
|
127
|
+
10 $((TERM_WIDTH / 2))
|
|
128
|
+
|
|
129
|
+
[[ $? -eq 0 ]]
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
mostrar_carpetas() {
|
|
133
|
+
|
|
134
|
+
local DIR_LIST=""
|
|
135
|
+
local TOTAL_MB=0
|
|
136
|
+
local SIZE_MB
|
|
137
|
+
local REL
|
|
138
|
+
|
|
139
|
+
for DIR in "${NODE_DIRS[@]}"; do
|
|
140
|
+
|
|
141
|
+
SIZE_MB=$(get_size_mb "$DIR")
|
|
142
|
+
REL=$(relative_path "$DIR")
|
|
143
|
+
|
|
144
|
+
DIR_LIST+="$REL → ${SIZE_MB} MB\n"
|
|
145
|
+
|
|
146
|
+
TOTAL_MB=$((TOTAL_MB + SIZE_MB))
|
|
147
|
+
|
|
148
|
+
done
|
|
149
|
+
|
|
150
|
+
local HEIGHT
|
|
151
|
+
HEIGHT=$(calc_height "${#NODE_DIRS[@]}")
|
|
152
|
+
|
|
153
|
+
dialog --title "Carpetas encontradas" \
|
|
154
|
+
--msgbox "Se encontraron ${#NODE_DIRS[@]} carpetas:\n\n$DIR_LIST\nTamaño total combinado: ${TOTAL_MB} MB" \
|
|
155
|
+
"$HEIGHT" "$TERM_WIDTH"
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
borrar_todas() {
|
|
159
|
+
|
|
160
|
+
local TOTAL_DELETED_MB=0
|
|
161
|
+
local SIZE_MB
|
|
162
|
+
local REL
|
|
163
|
+
|
|
164
|
+
if $DRY_RUN; then
|
|
165
|
+
|
|
166
|
+
local DIR_LIST=""
|
|
167
|
+
|
|
168
|
+
for DIR in "${NODE_DIRS[@]}"; do
|
|
169
|
+
REL=$(relative_path "$DIR")
|
|
170
|
+
DIR_LIST+="$REL\n"
|
|
171
|
+
done
|
|
172
|
+
|
|
173
|
+
dialog --msgbox "== DRY-RUN ==\n\n$DIR_LIST" \
|
|
174
|
+
"$(calc_height "${#NODE_DIRS[@]}")" "$TERM_WIDTH"
|
|
175
|
+
|
|
176
|
+
return
|
|
177
|
+
fi
|
|
178
|
+
|
|
179
|
+
confirmar_borrado "${NODE_DIRS[@]}" || return
|
|
180
|
+
|
|
181
|
+
for DIR in "${NODE_DIRS[@]}"; do
|
|
182
|
+
|
|
183
|
+
SIZE_MB=$(get_size_mb "$DIR")
|
|
184
|
+
|
|
185
|
+
[[ -d "$DIR" ]] && rm -rf -- "$DIR"
|
|
186
|
+
|
|
187
|
+
TOTAL_DELETED_MB=$((TOTAL_DELETED_MB + SIZE_MB))
|
|
188
|
+
|
|
189
|
+
done
|
|
190
|
+
|
|
191
|
+
dialog --msgbox "Se eliminaron todas las carpetas.\nEspacio liberado: ${TOTAL_DELETED_MB} MB" \
|
|
192
|
+
10 $((TERM_WIDTH / 2))
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
borrar_checklist() {
|
|
196
|
+
|
|
197
|
+
local CHECKLIST_ARGS=()
|
|
198
|
+
local MAP_DIRS=()
|
|
199
|
+
local TOTAL_DELETED_MB=0
|
|
200
|
+
local SIZE_MB
|
|
201
|
+
local REL
|
|
202
|
+
|
|
203
|
+
for DIR in "${NODE_DIRS[@]}"; do
|
|
204
|
+
|
|
205
|
+
SIZE_MB=$(get_size_mb "$DIR")
|
|
206
|
+
REL=$(relative_path "$DIR")
|
|
207
|
+
|
|
208
|
+
local LABEL="item$(( ${#MAP_DIRS[@]} + 1 ))"
|
|
209
|
+
|
|
210
|
+
MAP_DIRS+=("$DIR")
|
|
211
|
+
|
|
212
|
+
CHECKLIST_ARGS+=("$LABEL" "$REL → ${SIZE_MB} MB" "off")
|
|
213
|
+
|
|
214
|
+
done
|
|
215
|
+
|
|
216
|
+
local HEIGHT
|
|
217
|
+
HEIGHT=$(calc_height "${#NODE_DIRS[@]}")
|
|
218
|
+
|
|
219
|
+
local SELECTED
|
|
220
|
+
|
|
221
|
+
SELECTED=$(dialog \
|
|
222
|
+
--title "Seleccionar carpetas a borrar" \
|
|
223
|
+
--checklist "Use espacio para seleccionar:" \
|
|
224
|
+
"$HEIGHT" "$TERM_WIDTH" 20 \
|
|
225
|
+
"${CHECKLIST_ARGS[@]}" \
|
|
226
|
+
3>&1 1>&2 2>&3) || return
|
|
227
|
+
|
|
228
|
+
[[ -z "$SELECTED" ]] && return
|
|
229
|
+
|
|
230
|
+
local TO_DELETE=()
|
|
231
|
+
|
|
232
|
+
for LABEL in $SELECTED; do
|
|
233
|
+
|
|
234
|
+
LABEL=${LABEL//\"/}
|
|
235
|
+
|
|
236
|
+
local INDEX=$(( ${LABEL//[!0-9]/} - 1 ))
|
|
237
|
+
|
|
238
|
+
TO_DELETE+=("${MAP_DIRS[$INDEX]}")
|
|
239
|
+
|
|
240
|
+
done
|
|
241
|
+
|
|
242
|
+
confirmar_borrado "${TO_DELETE[@]}" || return
|
|
243
|
+
|
|
244
|
+
for DIR in "${TO_DELETE[@]}"; do
|
|
245
|
+
|
|
246
|
+
SIZE_MB=$(get_size_mb "$DIR")
|
|
247
|
+
|
|
248
|
+
[[ -d "$DIR" ]] && rm -rf -- "$DIR"
|
|
249
|
+
|
|
250
|
+
TOTAL_DELETED_MB=$((TOTAL_DELETED_MB + SIZE_MB))
|
|
251
|
+
|
|
252
|
+
done
|
|
253
|
+
|
|
254
|
+
dialog --msgbox "Proceso completado.\nEspacio liberado: ${TOTAL_DELETED_MB} MB" \
|
|
255
|
+
10 $((TERM_WIDTH / 2))
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
# MAIN
|
|
259
|
+
|
|
260
|
+
validar_dialog
|
|
261
|
+
|
|
262
|
+
tput smcup
|
|
263
|
+
clear
|
|
264
|
+
printf '\033[3J'
|
|
265
|
+
|
|
266
|
+
TERM_WIDTH=$(tput cols)
|
|
267
|
+
TERM_HEIGHT=$(tput lines)
|
|
268
|
+
|
|
269
|
+
while true; do
|
|
270
|
+
|
|
271
|
+
ROOT_DIR_NAME=$(dialog \
|
|
272
|
+
--title "Seleccionar carpeta raíz" \
|
|
273
|
+
--inputbox "Ingrese la carpeta donde buscar:" \
|
|
274
|
+
10 $((TERM_WIDTH / 2)) \
|
|
275
|
+
3>&1 1>&2 2>&3)
|
|
276
|
+
|
|
277
|
+
STATUS=$?
|
|
278
|
+
|
|
279
|
+
[[ $STATUS -ne 0 ]] && salir
|
|
280
|
+
|
|
281
|
+
if [[ -z "$ROOT_DIR_NAME" ]]; then
|
|
282
|
+
dialog --msgbox "No ingresó ningún nombre de carpeta." 6 $((TERM_WIDTH / 2))
|
|
283
|
+
continue
|
|
284
|
+
fi
|
|
285
|
+
|
|
286
|
+
BASE_DIR="$HOME/$ROOT_DIR_NAME"
|
|
287
|
+
|
|
288
|
+
[[ -d "$BASE_DIR" ]] && break
|
|
289
|
+
|
|
290
|
+
dialog --msgbox "La carpeta $BASE_DIR no existe." 6 $((TERM_WIDTH / 2))
|
|
291
|
+
|
|
292
|
+
done
|
|
293
|
+
|
|
294
|
+
scan_with_progress
|
|
295
|
+
|
|
296
|
+
[[ ${#NODE_DIRS[@]} -eq 0 ]] && {
|
|
297
|
+
|
|
298
|
+
dialog --msgbox "No se encontraron carpetas: ${TARGETS[*]}" \
|
|
299
|
+
8 $((TERM_WIDTH / 2))
|
|
300
|
+
|
|
301
|
+
salir
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
calc_all_sizes
|
|
305
|
+
|
|
306
|
+
mostrar_carpetas
|
|
307
|
+
|
|
308
|
+
while true; do
|
|
309
|
+
|
|
310
|
+
OPCION=$(dialog \
|
|
311
|
+
--title "Opciones de borrado" \
|
|
312
|
+
--menu "Seleccione una opción:" \
|
|
313
|
+
12 50 3 \
|
|
314
|
+
1 "Borrar todas" \
|
|
315
|
+
2 "Borrado múltiple" \
|
|
316
|
+
3 "Salir" \
|
|
317
|
+
3>&1 1>&2 2>&3) || salir
|
|
318
|
+
|
|
319
|
+
case $OPCION in
|
|
320
|
+
1) borrar_todas ;;
|
|
321
|
+
2) borrar_checklist ;;
|
|
322
|
+
3) salir ;;
|
|
323
|
+
*) dialog --msgbox "Opción inválida" 5 30 ;;
|
|
324
|
+
esac
|
|
325
|
+
|
|
326
|
+
done
|