#!/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"