163 lines
5.4 KiB
Bash
Executable File
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"
|