#!/usr/bin/env bash ############################################################################### # Desktop Tuning Manager # Rollback + HTML diff report # Autor: Diego Costa (@diegocostaroot) / Projeto Root (youtube.com/projetoroot) # Versão: 1.0 # Veja o link: https://wiki.projetoroot.com.br # 2026 # Primeira versão com alguns bugs na geração do relatório - ideal para aprendizado (Favor avaliar a versão 1.1 ou+) ############################################################################### set -Eeuo pipefail export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin SYSCTL_BIN="$(command -v sysctl || true)" if [[ -z "$SYSCTL_BIN" ]]; then echo "Erro crítico: sysctl não encontrado no sistema" exit 1 fi if [ "$EUID" -ne 0 ]; then echo "Execute como root" exit 1 fi DATE=$(date +%F-%H-%M-%S) echo read -p "Informe o diretório para salvar relatórios (ex: /root ou /home/user): " REPORT_BASE if [ ! -d "$REPORT_BASE" ]; then echo "Diretório não existe" exit 1 fi BACKUP_DIR="/var/backups/sysctl-tuning" SYSCTL_DIR="/etc/sysctl.d" mkdir -p "$BACKUP_DIR" mkdir -p "$SYSCTL_DIR" BACKUP_FILE="$BACKUP_DIR/sysctl_backup_$DATE.conf" BEFORE_TXT="$REPORT_BASE/sysctl_before_$DATE.txt" AFTER_TXT="$REPORT_BASE/sysctl_after_$DATE.txt" DIFF_HTML="$REPORT_BASE/sysctl_diff_$DATE.html" ######################################### # Rollback manual sysctl ######################################### rollback_sysctl_menu() { echo echo "Backups disponíveis:" echo mapfile -t BACKUPS < <(find "$BACKUP_DIR" -type f -name "*.conf" -size +0c | sort) if [ ${#BACKUPS[@]} -eq 0 ]; then echo "Nenhum backup válido encontrado" return 1 fi for i in "${!BACKUPS[@]}"; do printf "%d) %s\n" "$((i+1))" "$(basename "${BACKUPS[$i]}")" done echo read -p "Escolha o número do backup: " CHOICE if ! [[ "$CHOICE" =~ ^[0-9]+$ ]]; then echo "Entrada inválida" return 1 fi INDEX=$((CHOICE-1)) if [ "$INDEX" -lt 0 ] || [ "$INDEX" -ge "${#BACKUPS[@]}" ]; then echo "Opção fora da lista" return 1 fi SELECTED="${BACKUPS[$INDEX]}" echo echo "Backup selecionado:" echo "$SELECTED" echo read -p "Confirma restaurar? (s/n): " CONFIRM if [[ "$CONFIRM" =~ ^[sS]$ ]]; then echo "Aplicando rollback..." sysctl -p "$SELECTED" cp "$SELECTED" /etc/sysctl.d/99-rollback-manual.conf sysctl --system echo "Rollback concluído" else echo "Cancelado" fi } ######################################### # Backup atual ######################################### echo "Criando backup atual" sysctl -a 2>/dev/null | sort > "$BACKUP_FILE" ######################################### # BEFORE snapshot ######################################### echo "Capturando estado BEFORE" sysctl -a 2>/dev/null | sort > "$BEFORE_TXT" ######################################### # Detectar perfil ativo atual ######################################### CURRENT_PROFILE="Nenhum" if ls $SYSCTL_DIR/99-desktop-gaming.conf >/dev/null 2>&1; then CURRENT_PROFILE="Gaming" CURRENT_PROFILE_ID=2 elif ls $SYSCTL_DIR/99-desktop-laptop.conf >/dev/null 2>&1; then CURRENT_PROFILE="Laptop Economia" CURRENT_PROFILE_ID=3 elif ls $SYSCTL_DIR/99-desktop-dev.conf >/dev/null 2>&1; then CURRENT_PROFILE="Dev Workstation" CURRENT_PROFILE_ID=4 elif ls $SYSCTL_DIR/99-desktop-streaming.conf >/dev/null 2>&1; then CURRENT_PROFILE="Streaming OBS" CURRENT_PROFILE_ID=5 else CURRENT_PROFILE_ID=1 CURRENT_PROFILE="Desktop Geral" fi ######################################### # Menu perfil ######################################### clear echo "Perfil atualmente ativo: $CURRENT_PROFILE" echo "Escolha perfil:" echo "1 Desktop Geral" echo "2 Gaming" echo "3 Laptop Economia" echo "4 Dev Workstation" echo "5 Streaming OBS" echo "6 Economia de Energia" echo "7 Restaurar backup sysctl" echo read -p "Opção: " PROFILE ######################################### # Bloquear reaplicação do mesmo perfil ######################################### if [[ "$PROFILE" =~ ^[1-5]$ ]]; then if [ "$PROFILE" -eq "${CURRENT_PROFILE_ID:-0}" ]; then echo echo "Perfil $CURRENT_PROFILE já está ativo." echo "Nada será alterado." exit 0 fi fi case "$PROFILE" in 1) PROFILE_NAME="Desktop Geral" ;; 2) PROFILE_NAME="Gaming" ;; 3) PROFILE_NAME="Laptop Economia" ;; 4) PROFILE_NAME="Dev Workstation" ;; 5) PROFILE_NAME="Streaming OBS" ;; 6) PROFILE_NAME="Economia de Energia" ;; 7) PROFILE_NAME="Rollback Sysctl"; rollback_sysctl_menu ;; *) PROFILE_NAME="Desconhecido" ;; esac echo "Selecionado: $PROFILE $PROFILE_NAME" ######################################### # Limpeza perfis antigos ######################################### echo "Removendo perfis antigos" find "$SYSCTL_DIR" -maxdepth 1 -type f -name "99-desktop-*.conf" \ ! -name "99-desktop-baseline.conf" \ -exec rm -f {} \; ######################################### # Baseline ######################################### cat > $SYSCTL_DIR/99-desktop-baseline.conf < $SYSCTL_DIR/99-desktop-gaming.conf < $SYSCTL_DIR/99-desktop-laptop.conf < "$CPUFREQ" done # brilho mínimo (opcional, se for laptop) if [ -d /sys/class/backlight ]; then for BR in /sys/class/backlight/*/brightness; do MAX=$(cat $(dirname $BR)/max_brightness) MIN=$((MAX / 4)) echo "$MIN" > "$BR" done fi fi ;; 4) cat > $SYSCTL_DIR/99-desktop-dev.conf < $SYSCTL_DIR/99-desktop-streaming.conf < $SYSCTL_DIR/99-desktop-powersave.conf </dev/null 2>&1 done < "$BACKUP_FILE" echo "Rollback concluído" exit 1 fi ######################################### # AFTER snapshot ######################################### echo "Capturando estado AFTER" sysctl -a 2>/dev/null | sort > "$AFTER_TXT" ######################################### # Gerar HTML Diff ######################################### echo "Gerando relatório comparativo HTML" { echo "" echo "Sysctl Diff Report" echo "" echo "" echo "

Sysctl Antes vs Depois - $DATE

" echo "###################################################### " echo "

Mudancas Realizadas

" echo " " echo "

Perfil Selecionado: $PROFILE - $PROFILE_NAME

" echo " " echo "

Valores novos

" echo "

Valores antigos

" echo " " echo "###################################################### " echo "
"

diff "$BEFORE_TXT" "$AFTER_TXT" | while read line; do
    if [[ $line == \<* ]]; then
        echo "$line"
    elif [[ $line == \>* ]]; then
        echo "$line"
    else
        echo "$line"
    fi
done

echo "
" echo "" } > "$DIFF_HTML" ######################################### # Final ######################################### echo echo "Concluído" echo echo "Arquivos gerados:" echo "$BEFORE_TXT" echo "$AFTER_TXT" echo "$DIFF_HTML"