.agent/scripts/upload-paiol-wiki.sh

137 lines
4.6 KiB
Bash
Executable file

#!/usr/bin/env bash
# ==============================================================================
# Script Utilitário: Upload de Arquivos e Mídias da Wiki para o MinIO Paiol
# Envia arquivos (PDFs, imagens, vídeos, anexos) para o MinIO Paiol e gera
# links formatados para inclusão em documentos Markdown da Wiki.
#
# Padrão:
# curl -X PUT --upload-file ./manual.pdf https://paiol.idz.one/wiki/{modulo}/{slug}-{aleatorio}.pdf
# ==============================================================================
set -e
VERDE="\033[0;32m"
AMARELO="\033[1;33m"
VERMELHO="\033[0;31m"
AZUL="\033[0;34m"
NEGRITO="\033[1m"
RESET="\033[0m"
exibir_ajuda() {
echo -e "${AZUL}${NEGRITO}Uso:${RESET} $0 <caminho-do-arquivo> <slug-funcionalidade-ou-pagina> [modulo-override]"
echo ""
echo -e "${NEGRITO}Exemplos:${RESET}"
echo " $0 ./manual.pdf licenciamento/dispensa-licenca"
echo " $0 ./fluxograma.png denuncias/fluxo-fiscalizacao"
echo " $0 ./relatorio.pdf auditoria/relatorio-anual meu-modulo"
echo ""
echo -e "${NEGRITO}Parâmetros:${RESET}"
echo " <caminho-do-arquivo> Caminho do arquivo local a ser enviado"
echo " <slug-funcionalidade> Identificador semântico da funcionalidade ou página da Wiki"
echo " [modulo-override] (Opcional) Sobrescreve o modulo-id de memorias-ia/modulo.yml"
exit 1
}
if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ -z "$1" ] || [ -z "$2" ]; then
exibir_ajuda
fi
ARQUIVO="$1"
SLUG_ORIGINAL="$2"
MODULO_OVERRIDE="$3"
if [ ! -f "$ARQUIVO" ]; then
echo -e "${VERMELHO}Erro:${RESET} Arquivo '$ARQUIVO' não encontrado ou não é um arquivo regular." >&2
exit 1
fi
# Identificar a raiz do projeto pai para ler memorias-ia/modulo.yml
if [ -f "memorias-ia/modulo.yml" ]; then
ROOT_DIR="."
elif [ -f "../memorias-ia/modulo.yml" ]; then
ROOT_DIR=".."
elif [ -f "../../memorias-ia/modulo.yml" ]; then
ROOT_DIR="../.."
else
ROOT_DIR="."
fi
# Resolver modulo-id
if [ -n "$MODULO_OVERRIDE" ]; then
MODULO_ID="$MODULO_OVERRIDE"
elif [ -f "$ROOT_DIR/memorias-ia/modulo.yml" ]; then
MODULO_ID=$(grep -E "^modulo-id:" "$ROOT_DIR/memorias-ia/modulo.yml" | awk '{print $2}' || true)
fi
if [ -z "$MODULO_ID" ]; then
echo -e "${AMARELO}Aviso:${RESET} 'modulo-id' não encontrado em memorias-ia/modulo.yml. Usando 'geral'." >&2
MODULO_ID="geral"
fi
# Obter extensão e nome base
NOME_COMPLETO=$(basename "$ARQUIVO")
EXT="${NOME_COMPLETO##*.}"
EXT=$(echo "$EXT" | tr '[:upper:]' '[:lower:]')
# Sanitizar slug (remover barras no início/fim e espaços)
SLUG=$(echo "$SLUG_ORIGINAL" | sed 's|^/||;s|/$||;s| \+|-|g')
# Gerar sufixo aleatório alfanumérico de 8 caracteres
if command -v openssl >/dev/null 2>&1; then
ALEATORIO=$(openssl rand -hex 4)
elif command -v md5sum >/dev/null 2>&1; then
ALEATORIO=$(head -c 16 /dev/urandom | md5sum | head -c 8)
else
ALEATORIO=$(head -c 8 /dev/urandom | tr -dc 'a-z0-9' | head -c 8)
fi
URL_DESTINO="https://paiol.idz.one/wiki/${MODULO_ID}/${SLUG}-${ALEATORIO}.${EXT}"
echo -e "${AZUL}${NEGRITO}Enviando arquivo para o MinIO Paiol...${RESET}"
echo -e " Arquivo: ${NEGRITO}$ARQUIVO${RESET}"
echo -e " Módulo: ${NEGRITO}$MODULO_ID${RESET}"
echo -e " Slug: ${NEGRITO}$SLUG${RESET}"
echo -e " Destino: ${NEGRITO}$URL_DESTINO${RESET}"
TEMP_RESPOSTA=$(mktemp)
HTTP_STATUS=$(curl -s -o "$TEMP_RESPOSTA" -w "%{http_code}" -X PUT --upload-file "$ARQUIVO" "$URL_DESTINO")
if [ "$HTTP_STATUS" -ge 200 ] && [ "$HTTP_STATUS" -lt 300 ]; then
rm -f "$TEMP_RESPOSTA"
echo -e "\n${VERDE}${NEGRITO}✓ Upload realizado com sucesso no MinIO Paiol!${RESET}"
echo -e " ${NEGRITO}URL:${RESET} $URL_DESTINO\n"
echo -e "${NEGRITO}--- Snippets prontos para a Wiki Markdown ---${RESET}"
NOME_FORMATADO=$(echo "$SLUG" | awk -F'/' '{print $NF}' | tr '-' ' ' | awk '{for(i=1;i<=NF;i++)sub(/./,toupper(substr($i,1,1)),$i)}1')
case "$EXT" in
png|jpg|jpeg|svg|gif|webp)
echo -e "${AZUL}Imagem:${RESET}"
echo "![$NOME_FORMATADO]($URL_DESTINO)"
;;
pdf)
echo -e "${AZUL}Documento / Manual PDF:${RESET}"
echo "[Baixar $NOME_FORMATADO (PDF)]($URL_DESTINO)"
;;
mp4|webm)
echo -e "${AZUL}Vídeo:${RESET}"
echo "<video controls src=\"$URL_DESTINO\" width=\"100%\"></video>"
;;
*)
echo -e "${AZUL}Arquivo / Download:${RESET}"
echo "[Baixar $NOME_FORMATADO]($URL_DESTINO)"
;;
esac
echo ""
exit 0
else
CONTEUDO_ERRO=$(cat "$TEMP_RESPOSTA" 2>/dev/null || true)
rm -f "$TEMP_RESPOSTA"
echo -e "\n${VERMELHO}${NEGRITO}✗ Falha no upload para o Paiol (HTTP $HTTP_STATUS)${RESET}" >&2
if [ -n "$CONTEUDO_ERRO" ]; then
echo -e "Resposta do servidor: $CONTEUDO_ERRO" >&2
fi
exit 1
fi