Files
2026-09-07 17:44:49 -03:00

163 lines
5.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# iniciar.sh - Instala ambiente virtual, dependências e executa o programa
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
ENV_FILE="$SCRIPT_DIR/.env"
REQ_FILE="$SCRIPT_DIR/requirements.txt"
MAIN_SCRIPT="$SCRIPT_DIR/main.py"
VENV_DIR="$SCRIPT_DIR/venv"
LOG_FILE="$SCRIPT_DIR/log.txt"
BIN_DIR="$SCRIPT_DIR/bin"
# Cores para output
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[AVISO]${NC} $1"; }
log_error() { echo -e "${RED}[ERRO]${NC} $1"; }
echo "=============================================="
echo " Sistema de Cliques Automáticos - AutoTigrinho"
echo "=============================================="
echo ""
# 1. Verifica se Python 3 está instalado
if ! command -v python3 &>/dev/null; then
log_error "Python 3 não encontrado. Instale com: sudo apt install python3 python3-venv python3-pip"
exit 1
fi
log_info "Python 3 encontrado: $(python3 --version)"
# 2. Cria ambiente virtual se não existir
if [ ! -d "$VENV_DIR" ]; then
log_info "Criando ambiente virtual em '$VENV_DIR'..."
python3 -m venv "$VENV_DIR"
log_info "Ambiente virtual criado."
else
log_info "Ambiente virtual já existe."
fi
# 3. Ativa ambiente virtual
log_info "Ativando ambiente virtual..."
source "$VENV_DIR/bin/activate"
# 4. Atualiza pip
log_info "Atualizando pip..."
pip install --upgrade pip --quiet
# 5. Verifica arquivo .env
if [ ! -f "$ENV_FILE" ]; then
log_warn "Arquivo '.env' não encontrado. Criando com valores padrão..."
cat > "$ENV_FILE" << 'EOF'
INTERVALO_CLIQUE=5
HORA_INICIO=09:00
HORA_FIM=18:00
CONFIANCA=0.8
EOF
log_info "Arquivo '.env' criado. Edite-o antes de executar novamente."
exit 1
fi
log_info "Arquivo '.env' encontrado."
# 6. Verifica imagem do botão
if [ ! -f "$SCRIPT_DIR/botaoparaclicar.png" ]; then
log_warn "Arquivo 'botaoparaclicar.png' NÃO encontrado na raiz."
log_warn "Coloque a imagem do botão antes de iniciar."
exit 1
fi
log_info "Imagem 'botaoparaclicar.png' encontrada."
# 7. Instala/atualiza dependências
# Usamos --force-reinstall para garantir que pacotes com extensões C
# (opencv-python, numpy, Pillow) sejam recompilados para a arquitetura
# da máquina atual, evitando erro de "Illegal instruction" ao copiar
# o ambiente virtual de outro computador.
log_info "Verificando dependências..."
pip install --upgrade --force-reinstall -r "$REQ_FILE" --quiet
log_info "Dependências instaladas."
# 8. Garante Xvfb para servidores headless (sem DISPLAY)
# Em servidores sem ambiente gráfico, o pyautogui precisa de um display.
# Tentamos usar o Xvfb do sistema; se não existir, baixamos e extraímos
# o pacote .deb localmente (sem sudo).
setup_xvfb() {
if command -v xvfb-run &>/dev/null && command -v Xvfb &>/dev/null; then
log_info "Xvfb encontrado no sistema."
return 0
fi
log_warn "Xvfb não encontrado no sistema."
# Tenta baixar e extrair o pacote xvfb .deb localmente
if command -v apt-get &>/dev/null && command -v dpkg &>/dev/null; then
log_info "Tentando instalar Xvfb localmente (sem sudo)..."
TMPDIR=$(mktemp -d)
if apt-get download -o Dir::Cache::archives="$TMPDIR" xvfb 2>/dev/null; then
DEB_FILE=$(find "$TMPDIR" -name 'xvfb_*.deb' | head -1)
if [ -n "$DEB_FILE" ]; then
mkdir -p "$BIN_DIR"
# Extrai apenas os binários e bibliotecas necessárias
dpkg -x "$DEB_FILE" "$TMPDIR/xvfb-extract" 2>/dev/null
# Copia binários
if [ -f "$TMPDIR/xvfb-extract/usr/bin/xvfb-run" ]; then
cp "$TMPDIR/xvfb-extract/usr/bin/xvfb-run" "$BIN_DIR/"
sed -i "s|exec Xvfb |exec $SCRIPT_DIR/bin/Xvfb |g" "$BIN_DIR/xvfb-run"
log_info "xvfb-run embutido em '$BIN_DIR'."
fi
if [ -f "$TMPDIR/xvfb-extract/usr/bin/Xvfb" ]; then
cp "$TMPDIR/xvfb-extract/usr/bin/Xvfb" "$BIN_DIR/"
log_info "Xvfb embutido em '$BIN_DIR'."
fi
rm -rf "$TMPDIR"
if [ -f "$BIN_DIR/xvfb-run" ] && [ -f "$BIN_DIR/Xvfb" ]; then
log_info "Xvfb instalado localmente com sucesso."
return 0
fi
fi
fi
rm -rf "$TMPDIR"
fi
log_error "Não foi possível instalar Xvfb automaticamente."
log_error ""
log_error "O computador não tem ambiente gráfico e o Xvfb é necessário."
log_error "Instale manualmente com:"
log_error " sudo apt install xvfb"
return 1
}
# 9. Executa o programa
# Adiciona binários locais (Xvfb embutido) ao PATH
export PATH="$BIN_DIR:$PATH"
RUNNER="python3"
if [ -z "$DISPLAY" ]; then
log_info "Sem ambiente gráfico (DISPLAY não definido)."
if setup_xvfb; then
if [ -f "$BIN_DIR/xvfb-run" ] && [ -f "$BIN_DIR/Xvfb" ]; then
# Usa o xvfb-run embutido que referencia o Xvfb local
RUNNER="$BIN_DIR/xvfb-run -a"
log_info "Usando Xvfb embutido (servidor X virtual)."
else
RUNNER="xvfb-run -a"
log_info "Usando Xvfb do sistema (servidor X virtual)."
fi
else
exit 1
fi
else
log_info "Ambiente gráfico detectado (DISPLAY=$DISPLAY)."
fi
log_info "Iniciando programa..."
echo "=============================================="
$RUNNER "$MAIN_SCRIPT"