#!/bin/bash

# Función para mostrar el progreso
function mostrar_progreso {
    echo "Verificando..."
    $1
    local resultado=$?
    if [ $resultado -ne 0 ]; then
        echo "Error en $1"
        exit $resultado
    #else
    #    echo "$1 completado con éxito."
    fi
    echo ""
}

# Datasource
function funcion1 {
    local cloud_id=$(cloud-id)

    case $cloud_id in
        cloudstack)
            echo "Datasource: cloudstack"
            ;;
        configdrive)
            echo "Datasource: configdrive"
            ;;
        none)
            echo "Error: No se reconoce el datasource"
            exit 1
            ;;
    esac
}

# Username configurado en cloud-init
function funcion2 {
    default_user=$(grep -A 1 'default_user' /etc/cloud/cloud.cfg | awk '/name/ {print $2}')
    os_name=$(awk -F'=' '/^NAME/ {gsub(/"/, "", $2); print $2}' /etc/os-release | awk '{print $1}')

    if echo "$default_user" | grep -iq "^$os_name$"; then
        echo "Usuario principal $default_user basado en nombre de distro Linux $os_name"
    else
        echo "Error: El usuario principal $default_user no coincide con el nombre de la distro Linux $os_name"
        echo "Usuario: $default_user"
        echo "Distribucion: $os_name"
    fi
}

# Acceso con SSH-Keys habilitado
function funcion3 {
    # Buscar registros que indiquen autenticacion con ssh-key
    journalctl -u ssh.service | grep 'Accepted publickey' > /tmp/ssh_logins.log
    # Verificar si hubo logins con ssh-keys
    if [ -s /tmp/ssh_logins.log ]; then
        echo "Logueo con SSH-Keys - OK"
    else
        echo "No se encontraron logins con SSH-Keys"
    fi
}

# Verifica si usuario default esta en grupo sudo
function funcion4 {
    if groups "$default_user" | grep -qw "sudo"; then
        echo "El usuario $default_user tiene sudo habilitado"
    else
        echo "El usuario $default_user NO tiene sudo habilitado"
    fi
}

# Verificar si usuario root esta bloqueado
function funcion5 {
    root_status=$(passwd -S root | awk '{print $2}')
    if [ $root_status == 'L' ]; then
        echo "Usuario root bloqueado"
    else
        echo "Usuario root habilitado"
    fi
}

# verificar disco con tamanio de 8GB y particiones
function funcion6 {
    # Disco con tamanio de 8G
    disco_pcpal=$(lsblk -l -o name,size,type | grep -E '8G' | awk '{print $1}')
    if [ -n disco_pcpal ]; then
        disco_pcpal_ok=true
    fi
    # Particiones encontradas
    particiones=$(lsblk -l -o name,size,type,mountpoints | grep -E 'part')

    if [ -n "$particiones" ]; then
        while read -r line; do
            n_particion=$(echo $line | awk '{print $1}')
            n_partbase=${n_particion%?}
            if [ "$n_partbase" != "$disco_pcpal" ]; then
                disco_pcpal_ok=false
            fi
        done <<< "$particiones"
    else
        disco_pcpal_ok=false
        echo "Disco principal no es el esperado"
    fi

    if $disco_pcpal_ok; then
        echo "Disco principal $disco_pcpal de 8GB"
    fi
}

# Unidad de disco de datos disponible
function funcion7 {
    discos=$(lsblk -l -o name,size,type | grep -E 'disk')
    if [ -n discos ]; then
        while read -r line; do
            disco_aux=$(echo "$line" | awk '{print $1}')
            disco_size=$(echo "$line" | awk '{print $2}')
            if [ $disco_aux != $disco_pcpal ]; then
                device=$disco_aux
                format=$(parted /dev/${device} --script mklabel msdos && parted /dev/$device --script mkpart primary ext4 0% 100% && mkfs.ext4 /dev/${device}1 && mount /dev/${device}1 /mnt)
                echo "El disco secundario es $device y su tamanio es $disco_size"
                device_montado=$(lsblk -l -o name,size,type,mountpoints | grep -E $device)
                echo ""
                echo "$device_montado"
            fi
        done <<< $discos
    else
        echo "No se encuentra ningun disco secundario"
    fi
}

# Verificar correcto seteo de zona horaria
function funcion8 {
    hora_local=$(timedatectl | grep -i 'time zone' | awk '{print $3}')
    if timedatectl | grep -qw "America/Argentina/Buenos_Aires"; then
        echo "Horario local correcto: $hora_local"
    else
        echo "Horario local incorrecto: $hora_local"
        hora_local_ok=$(timedatectl set-timezone America/Argentina/Buenos_Aires)
        echo "Hora corregida a: $hora_local_ok"
    fi
}

# Verificar herramienta de gestion de hypervisores
function funcion9 {
    if vmware-checkvm 2>/dev/null; then
        echo "open-vm-tools instaladas"
    elif systemctl is-enabled xe-linux-distribution 2>/dev/null; then
        echo "xen-tools instaladas"
    elif systemctl is-enabled xe-daemon 2>/dev/null; then
        echo "xen-tools instaladas"
    else
        echo "No hay herramientas de gestion de hypervisores instaladas"
    fi
}

# Ejecutar las funciones mostrando progreso
mostrar_progreso funcion1
mostrar_progreso funcion2
mostrar_progreso funcion3
mostrar_progreso funcion4
mostrar_progreso funcion5
mostrar_progreso funcion6
mostrar_progreso funcion7
mostrar_progreso funcion8
mostrar_progreso funcion9
echo "Script completado."
