#/**
#         ogr ListSoftware int_ndisk int_nfilesys
#@brief   Lista el inventario de software instalado en un sistema operativo.
#@param   int_ndisk     nº de orden del disco
#@param   int_nfilesys  nº de orden del sistema de archivos
#@return  str_progr name str_progr version ...
#@warning Se ignoran los parámetros de entrada.
#@note    Requisitos: ...
#@todo    Detectar software en Linux
#@version 0.1 - Primeras pruebas con OpenGNSys
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2009-09-23
#*/ ##
# Variables locales.
local MNTDIR TYPE DPKGDIR RPMDIR KEYS k PROG VERS

# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
    ogr Help "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
           "$FUNCNAME 1 1"
    return
fi
# Error si no se reciben 2 parametros.
[ $# = 2 ] || ogr RaiseError $OG_ERR_FORMAT || return $?

# Obtener tipo de sistema de archivos y montarlo.
TYPE=$(ogr GetFsType $1 $2) || return $?
MNTDIR=$(ogr Mount $1 $2) || return $?

case "$TYPE" in
    EXT[234]|REISERFS|REISER4)
        # Procesar paquetes dpkg.
        DPKGDIR="${MNTDIR}/var/lib/dpkg"
        if [ -r $DPKGDIR ]; then
        #    dpkg --admindir=$DPKGDIR -l | \
            # Proceso de fichero en sistemas de 64 bits.
            if [ -e $MNTDIR/lib64 ]; then
                awk '/Package:/ {if (pack!="") print pack,vers;
                                 sub(/-dev$/,"",$2);
                                 pack=$2}
                     /Version:/ {sub(/^.*:/,"",$2); sub(/-.*$/,"",$2);
                                 vers=$2}
                     /Status:/  {if ($2!="install") pack=vers=""}
                     END        {if (pack!="") print pack,vers}
                    ' $MNTDIR/var/lib/dpkg/status | sort | uniq
            else
                # FIXME Sólo 32 bits
                chroot "$MNTDIR" /usr/bin/dpkg -l | \
                    awk '$1~/ii/ {sub(/-dev$/,"",$2); sub(/^.*:/,"",$3);
                                  sub(/-.*$/,"",$3); print $2,$3}
                        ' | sort | uniq
            fi
        fi
        # Procesar paquetes RPM.
        RPMDIR="${MNTDIR}/var/lib/rpm"
        if [ -r $RPMDIR ]; then
            # Correccion inconsistencia de version de base de datos.
            #    rm -f ${RPMDIR}/__db.*
            #    rpm --dbpath $RPMDIR -qa --qf "%{NAME} %{VERSION}\n" | \
            # FIXME Sólo 32 bits
            chroot $MNTDIR /bin/rpm -qa --qf "%{NAME} %{VERSION}\n" | \
                   awk '$1!~/-devel$/ {sub(/-.*$/,"",$2); print $0}' | \
                   sort | uniq
           	#    rm -f ${RPMDIR}/__db.*
        fi
        # Procesar paquetes pacman.
        PACMANDIR="${MNTDIR}/var/lib/pacman/local"
        if [ -r $PACMANDIR ]; then
            # FIXME Separar nombre y versión de los paquetes
            ls -A $PACMANDIR
        fi
        ;;
    NTFS|FAT32|FAT16)
        # Claves de registro para progr ramas instalados: formato "{clave}".
        KEYS=$(ogr ListRegistryKeys $MNTDIR software '\Microsoft\Windows\CurrentVersion\Uninstall')
        # Mostrar los valores "DisplayName" y "DisplayVersion" para cada clave.
        (for k in $KEYS; do
            PROG=$(ogr GetRegistryValue $MNTDIR software "\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$k\\DisplayName")
            if [ -n "$PROG" ]; then
                VERS=$(ogr GetRegistryValue $MNTDIR software "\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$k\\DisplayVersion")
                echo "$PROG $VERS"
            fi
        done) | sort | uniq
        ;;
    *)  ogr RaiseError $OG_ERR_PARTITION "$1, $2"
        return $? ;;
esac
