#!/bin/bash GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' RED='\033[0;31m' NC='\033[0m' clear STATUS_FILE="/var/lib/dpkg/status" BACKUP_FILE="${STATUS_FILE}.bak" backup() { if [ ! -f "$BACKUP_FILE" ]; then echo -e "${BLUE}[+] Criando backup inicial do banco de dados dpkg...${NC}" cp "$STATUS_FILE" "$BACKUP_FILE" else echo -e "${YELLOW}[!] Backup anterior detectado. Criando cópia de segurança da sessão...${NC}" cp "$STATUS_FILE" "${STATUS_FILE}.tmp_bak" fi } # Limpa erros de parsing globais antes de começar limpeza_global() { echo -e "${BLUE}[*] Higienizando banco de dados (correção de gatilhos)...${NC}" awk ' /^Status: install ok installed/ { f=1; print; next } f && /^Config-Version:/ { next } f && /^Triggers-Pending:/ { next } f && /^Triggers-Awaited:/ { next } /^$/ { f=0 } { print }' "$STATUS_FILE" > "${STATUS_FILE}.tmp" && mv "${STATUS_FILE}.tmp" "$STATUS_FILE" } _system() { echo -e "${BLUE}[*] Neutralizando systemd e configurando machine-id...${NC}" dbus-uuidgen > /etc/machine-id 2>/dev/null ln -sf /bin/true /usr/bin/systemctl } trigger() { # Imprime a mensagem inicial sem o \n para o spinner entrar na mesma linha ou logo abaixo echo -e "${BLUE}[*] Iniciando diagnóstico de integridade...${NC}" export DEBIAN_FRONTEND=noninteractive # Agrupamos o update e o upgrade em um subshell () e mandamos para o background & # Assim a animação começa enquanto o APT ainda está baixando as listas ( apt-get update -y > /dev/null 2>&1 && apt-get upgrade -y -o Dpkg::Options::="--force-confold" > /dev/null 2>&1 ) & pid=$! disown $pid 2>/dev/null spin='/-\|' count=0 # O loop começa IMEDIATAMENTE após o comando acima while kill -0 $pid 2>/dev/null || [ $count -lt 30 ]; do i=$(( (count)%4 )) # Usamos \r para sobrescrever a linha e dar o efeito de movimento printf "\r${YELLOW}[${spin:$i:1}] Analisando pacotes e dependências...${NC}" sleep 0.1 ((count++)) done # Limpa a linha do spinner e mostra o sucesso printf "\r${GREEN}[√] Diagnóstico concluído com sucesso! ${NC}\n" } confi() { # Agora o dpkg -l vai funcionar porque a limpeza_global ja rodou antes broken_pkgs=($(dpkg -l | grep -E '^[a-z][U|F|t|W|H]' | awk '{print $2}')) if [ ${#broken_pkgs[@]} -eq 0 ]; then echo -e "${YELLOW}[+] Nenhum pacote quebrado encontrado..${NC}" return fi echo -e "${BLUE}[*] Ajustando blocos de pacotes específicos...${NC}" for pkg in "${broken_pkgs[@]}"; do FILE="/var/lib/dpkg/info/$pkg.postinst" if [ -f "$FILE" ]; then echo -e "${RED}[!] Neutralizando: $FILE${NC}" echo -e "#!/bin/sh\nexit 0" > "$FILE" chmod +x "$FILE" fi echo -e "${GREEN}[+] Aplicando patch via AWK: $pkg${NC}" awk -v p="$pkg" ' BEGIN { target="Package: " p } $0 ~ "^" target "(:| )" || $0 == target { f=1 } f && /^Status:/ { print "Status: install ok installed"; next } f && /^Config-Version:/ { next } f && /^Triggers-Pending:/ { next } f && /^Triggers-Awaited:/ { next } f && /^$/ { f=0 } { print }' "$STATUS_FILE" > "${STATUS_FILE}.tmp" && mv "${STATUS_FILE}.tmp" "$STATUS_FILE" done } limpeza() { echo -e "${BLUE}[*] Finalizando configuração e limpando lixo...${NC}" dpkg --configure -a --force-confold > /dev/null 2>&1 apt-get install -f -y > /dev/null 2>&1 apt-get autoremove -y > /dev/null 2>&1 apt-get clean echo -e "${GREEN}[√] Tudo limpo e sincronizado!${NC}" echo -e "${BLUE}[*] Sincronizando versões finais...${NC}" apt-get upgrade -y -o Dpkg::Options::="--force-confold" } backup limpeza_global _system trigger confi limpeza