#!/bin/bash # ============================================================================= # check-module-versions.sh # Detecta modulos desactualizados en proyectos # Sistema: NEXUS v3.4 # ============================================================================= # # Descripcion: # Compara las versiones de modulos en el knowledge-base (fuente de verdad) # contra las versiones usadas en cada proyecto, identificando cuales # proyectos estan desactualizados. # # Uso: # ./check-module-versions.sh [opciones] # # Opciones: # --modulo Verificar solo un modulo especifico # --proyecto Verificar solo un proyecto especifico # --verbose Mostrar todos los modulos, no solo desactualizados # --json Output en formato JSON # --help Mostrar esta ayuda # # Exit codes: # 0 - Todos los proyectos estan al dia # 1 - Hay desactualizaciones detectadas # 2 - Error de configuracion # # Clasificacion de urgencia: # CRITICAL - Modulos con security fixes pendientes # HIGH - Bug fixes pendientes # MEDIUM - Features nuevos disponibles # LOW - Refactors o mejoras menores # # ============================================================================= set -e # Colores RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # Configuracion WORKSPACE="/home/isem/workspace-v1" KB_PATH="$WORKSPACE/shared/knowledge-base" TRAZABILIDAD="$KB_PATH/TRAZABILIDAD-PROYECTOS.yml" CATALOGO="$KB_PATH/CATALOGO-MODULOS.yml" # Parametros MODULO_FILTER="" PROYECTO_FILTER="" VERBOSE=false JSON_OUTPUT=false DESACTUALIZADOS=0 # ============================================================================= # FUNCIONES # ============================================================================= show_help() { head -35 "$0" | tail -30 exit 0 } log_header() { echo "" echo "============================================" echo " VERIFICADOR DE VERSIONES DE MODULOS" echo " Sistema: NEXUS v3.4" echo "============================================" echo "" } parse_args() { while [[ $# -gt 0 ]]; do case $1 in --help) show_help ;; --modulo) MODULO_FILTER=$2 shift 2 ;; --proyecto) PROYECTO_FILTER=$2 shift 2 ;; --verbose) VERBOSE=true shift ;; --json) JSON_OUTPUT=true shift ;; *) echo "Opcion desconocida: $1" echo "Use --help para ver opciones disponibles" exit 2 ;; esac done } check_files() { if [ ! -f "$TRAZABILIDAD" ]; then echo -e "${RED}[ERROR]${NC} TRAZABILIDAD-PROYECTOS.yml no encontrado" exit 2 fi } get_kb_version() { local modulo=$1 # Buscar en la seccion versiones_kb grep "^ $modulo:" "$TRAZABILIDAD" | head -1 | sed 's/.*: *"*//; s/"*$//' } get_project_version() { local proyecto=$1 local modulo=$2 # Buscar en la seccion del proyecto grep -A50 "^ $proyecto:" "$TRAZABILIDAD" | grep "$modulo:" | head -1 | sed 's/.*: *"*//; s/"*$//' } compare_versions() { local kb_version=$1 local project_version=$2 if [ "$kb_version" == "$project_version" ]; then echo "OK" else echo "OUTDATED" fi } get_urgency() { # Por defecto, asignar MEDIUM # En una implementacion mas completa, se leeria metadata del modulo echo "MEDIUM" } print_module_status() { local modulo=$1 local kb_version=$2 echo "" echo -e "${CYAN}$modulo${NC} (KB: v$kb_version)" # Obtener proyectos que usan este modulo local proyectos=$(grep -A20 "^ $modulo:" "$TRAZABILIDAD" | grep "^ - " | sed 's/^ - //') if [ -z "$proyectos" ]; then echo " (sin proyectos usando este modulo)" return fi for proyecto in $proyectos; do if [ -n "$PROYECTO_FILTER" ] && [ "$proyecto" != "$PROYECTO_FILTER" ]; then continue fi local project_version=$(get_project_version "$proyecto" "$modulo") if [ -z "$project_version" ]; then project_version="?" fi local status=$(compare_versions "$kb_version" "$project_version") if [ "$status" == "OK" ]; then if $VERBOSE; then echo -e " +-- $proyecto ................ ${GREEN}[OK]${NC} v$project_version" fi else local urgency=$(get_urgency) DESACTUALIZADOS=$((DESACTUALIZADOS + 1)) echo -e " +-- $proyecto ................ ${YELLOW}[!!]${NC} v$project_version (KB: $kb_version) [$urgency]" fi done } print_summary() { echo "" echo "--------------------------------------------" echo "" if [ $DESACTUALIZADOS -eq 0 ]; then echo -e "${GREEN}Todos los proyectos estan al dia!${NC}" else echo -e "${YELLOW}Propagaciones pendientes: $DESACTUALIZADOS${NC}" fi echo "" echo "Ultima verificacion: $(date '+%Y-%m-%d %H:%M:%S')" echo "" echo "============================================" } # ============================================================================= # MAIN # ============================================================================= main() { parse_args "$@" if ! $JSON_OUTPUT; then log_header fi check_files if ! $JSON_OUTPUT; then echo "Verificando versiones de modulos..." echo "" fi # Obtener lista de modulos desde versiones_kb local modulos=$(grep -A100 "^versiones_kb:" "$TRAZABILIDAD" | grep "^ [a-z]" | sed 's/:.*//; s/^ *//' | head -30) for modulo in $modulos; do if [ -n "$MODULO_FILTER" ] && [ "$modulo" != "$MODULO_FILTER" ]; then continue fi local kb_version=$(get_kb_version "$modulo") if [ -n "$kb_version" ]; then print_module_status "$modulo" "$kb_version" fi done if ! $JSON_OUTPUT; then print_summary fi if [ $DESACTUALIZADOS -gt 0 ]; then exit 1 else exit 0 fi } main "$@"