This commit is contained in:
marco
2026-09-07 17:44:49 -03:00
parent e5ea5269aa
commit 2132107c06
3386 changed files with 120 additions and 3 deletions
+81 -3
View File
@@ -11,6 +11,7 @@ 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'
@@ -74,11 +75,88 @@ 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 -r "$REQ_FILE" --quiet
pip install --upgrade --force-reinstall -r "$REQ_FILE" --quiet
log_info "Dependências instaladas."
# 8. Executa o programa
# 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 "=============================================="
python3 "$MAIN_SCRIPT"
$RUNNER "$MAIN_SCRIPT"