|
1 | 1 | #!/usr/bin/env bash |
2 | | -set -euo pipefail |
3 | | -shopt -s nullglob globstar |
4 | 2 | # Enhanced system cleaning with privacy configuration |
5 | 3 | # Refactored version with improved structure and maintainability |
6 | | -IFS=$'\n\t' |
7 | | -export LC_ALL=C LANG=C HOME="/home/${SUDO_USER:-$USER}" |
8 | | -#============ Colors ============ |
9 | | -readonly LBLU=$'\e[38;5;117m' |
10 | | -readonly PNK=$'\e[38;5;218m' |
11 | | -readonly BWHT=$'\e[97m' |
12 | | -readonly BLU=$'\e[34m' |
13 | | -readonly GRN=$'\e[32m' |
14 | | -readonly YLW=$'\e[33m' |
15 | | -readonly MGN=$'\e[35m' |
16 | | -readonly DEF=$'\e[0m' |
| 4 | + |
| 5 | +# Source shared libraries |
| 6 | +SCRIPT_DIR="$(cd "${BASH_SOURCE[0]%/*}" && pwd)" |
| 7 | +# shellcheck source=lib/core.sh |
| 8 | +source "$SCRIPT_DIR/../lib/core.sh" |
| 9 | +# shellcheck source=lib/arch.sh |
| 10 | +source "$SCRIPT_DIR/../lib/arch.sh" |
| 11 | +# shellcheck source=lib/browser.sh |
| 12 | +source "$SCRIPT_DIR/../lib/browser.sh" |
| 13 | + |
17 | 14 | #============ Configuration ============ |
18 | 15 | declare -r MAX_PARALLEL_JOBS="$(nproc 2>/dev/null || echo 4)" |
19 | 16 | declare -r SQLITE_TIMEOUT=30 |
20 | 17 |
|
21 | | -#============ Helper Functions ============ |
22 | | -has(){ command -v -- "$1" &>/dev/null; } |
23 | | -get_pkg_manager(){ |
24 | | - if has paru; then |
25 | | - echo 'paru' |
26 | | - elif has yay; then |
27 | | - echo 'yay' |
28 | | - else |
29 | | - echo 'pacman' |
30 | | - fi |
31 | | -} |
32 | | - |
33 | | -capture_disk_usage(){ df -h --output=used,pcent / 2>/dev/null | awk 'NR==2{print $1, $2}'; } |
34 | | - |
35 | | -# Enhanced SQLite vacuum with reporting |
36 | | -vacuum_sqlite(){ |
37 | | - local db=$1 s_old s_new saved |
38 | | - [[ -f $db ]] || return 0 |
39 | | - [[ -f ${db}-wal || -f ${db}-journal ]] && return 0 |
40 | | - # Use fixed-string grep (-F) for faster matching |
41 | | - head -c 16 "$db" 2>/dev/null | grep -qF -- 'SQLite format 3' || return 0 |
42 | | - s_old=$(stat -c%s "$db" 2>/dev/null) || return 0 |
43 | | - # VACUUM already rebuilds indices, REINDEX is redundant |
44 | | - sqlite3 "$db" 'PRAGMA journal_mode=delete; VACUUM; PRAGMA optimize;' &>/dev/null || return 0 |
45 | | - s_new=$(stat -c%s "$db" 2>/dev/null) || s_new=$s_old |
46 | | - saved=$((s_old - s_new)) |
47 | | - ((saved > 0)) && echo "$saved" |
48 | | -} |
49 | | - |
50 | | -# Process SQLite databases with parallel processing |
51 | | -clean_sqlite_dbs(){ |
52 | | - local total=0 saved db_list=() count=0 |
53 | | - while IFS= read -r -d '' db; do |
54 | | - [[ -f $db ]] && db_list+=("$db") |
55 | | - done < <(find . -maxdepth 2 -type f -name '*.sqlite*' -print0 2>/dev/null) |
56 | | - [[ ${#db_list[@]} -eq 0 ]] && return 0 |
57 | | - if has parallel; then |
58 | | - while IFS= read -r line; do |
59 | | - [[ $line =~ ^[0-9]+$ ]] && { |
60 | | - total=$((total + line)) |
61 | | - ((count++)) |
62 | | - } |
63 | | - done < <(printf '%s\n' "${db_list[@]}" | parallel -j"$MAX_PARALLEL_JOBS" vacuum_sqlite) |
64 | | - elif has rust-parallel; then |
65 | | - while IFS= read -r line; do |
66 | | - [[ $line =~ ^[0-9]+$ ]] && { |
67 | | - total=$((total + line)) |
68 | | - ((count++)) |
69 | | - } |
70 | | - done < <(printf '%s\n' "${db_list[@]}" | rust-parallel vacuum_sqlite) |
71 | | - else |
72 | | - for db in "${db_list[@]}"; do |
73 | | - saved=$(vacuum_sqlite "$db" 2>/dev/null) |
74 | | - [[ $saved =~ ^[0-9]+$ ]] && { |
75 | | - total=$((total + saved)) |
76 | | - ((count++)) |
77 | | - } |
78 | | - done |
79 | | - fi |
80 | | - ((total > 0)) && printf ' %s %s (%d files)\n' "${GRN}Vacuumed:" "$((total / 1024)) KB${DEF}" "$count" |
81 | | -} |
82 | | - |
83 | | -ensure_not_running(){ |
84 | | - local timeout=6 pattern |
85 | | - pattern=$(printf '%s|' "$@") |
86 | | - pattern=${pattern%|} |
87 | | - pgrep -x -u "$USER" -f "$pattern" &>/dev/null || return 0 |
88 | | - for p in "$@"; do |
89 | | - pgrep -x -u "$USER" "$p" &>/dev/null && printf ' %s\n' "${YLW}Waiting for ${p}...${DEF}" |
90 | | - done |
91 | | - local wait_time=$timeout |
92 | | - while ((wait_time-- > 0)); do |
93 | | - pgrep -x -u "$USER" -f "$pattern" &>/dev/null || return 0 |
94 | | - sleep 1 |
95 | | - done |
96 | | - pkill -KILL -x -u "$USER" -f "$pattern" &>/dev/null || : |
97 | | -} |
98 | | - |
99 | | -# Mozilla profile discovery with IsRelative support |
100 | | -mozilla_profiles(){ |
101 | | - local base=$1 p is_rel path_val |
102 | | - [[ -d $base ]] || return 0 |
103 | | - if [[ -f $base/installs.ini ]]; then |
104 | | - while IFS='=' read -r key val; do |
105 | | - [[ $key == Default ]] && { |
106 | | - path_val=$val |
107 | | - [[ -d $base/$path_val ]] && echo "$base/$path_val" |
108 | | - } |
109 | | - done < <(grep -E '^Default=' "$base/installs.ini" 2>/dev/null) |
110 | | - fi |
111 | | - if [[ -f $base/profiles.ini ]]; then |
112 | | - is_rel=1 path_val='' |
113 | | - while IFS='=' read -r key val; do |
114 | | - case $key in |
115 | | - IsRelative) is_rel=$val ;; |
116 | | - Path) |
117 | | - path_val="$val" |
118 | | - if [[ $is_rel -eq 0 ]]; then |
119 | | - [[ -d $path_val ]] && echo "$path_val" |
120 | | - else |
121 | | - [[ -d $base/$path_val ]] && echo "$base/$path_val" |
122 | | - fi |
123 | | - path_val='' is_rel=1 |
124 | | - ;; |
125 | | - esac |
126 | | - done < <(grep -E '^(IsRelative|Path)=' "$base/profiles.ini" 2>/dev/null) |
127 | | - fi |
128 | | -} |
129 | | - |
130 | | -chrome_profiles(){ |
131 | | - local root="$1" |
132 | | - for d in "$root"/Default "$root"/"Profile "*; do [[ -d $d ]] && echo "$d"; done |
133 | | -} |
134 | | - |
135 | 18 | configure_firefox_privacy(){ |
136 | 19 | local prefs_changed=0 |
137 | 20 | local -a firefox_prefs=( |
|
0 commit comments