diff options
Diffstat (limited to 'client/engine/Inventory.lib')
-rwxr-xr-x | client/engine/Inventory.lib | 173 |
1 files changed, 131 insertions, 42 deletions
diff --git a/client/engine/Inventory.lib b/client/engine/Inventory.lib index b1173dd7..60da936f 100755 --- a/client/engine/Inventory.lib +++ b/client/engine/Inventory.lib @@ -4,7 +4,7 @@ #@brief Librería o clase Inventory #@class Inventory #@brief Funciones para recogida de datos de inventario de hardware y software de los clientes. -#@version 0.9.2 +#@version 1.0.5 #@warning License: GNU GPLv3+ #*/ @@ -29,28 +29,34 @@ fi #/** -# ogGetOsVersion int_ndisk int_npartition +# ogGetOsVersion int_ndisk int_nfilesys #@brief Devuelve la versión del sistema operativo instalado en un sistema de archivos. #@param int_ndisk nº de orden del disco -#@param int_npartition nº de orden de la partición -#@return OSType:OSVersion -#@note TipoSistema = { Linux, Windows } +#@param int_nfilesys nº de orden de la partición +#@return OSType:OSVersion - tipo y versión del sistema operativo. +#@note OSType = { Android, BSD, GrubLoader, Hurd, Linux, MacOS, Solaris, Windows, WinLoader } #@note Requisitos: awk, head, chroot #@exception OG_ERR_FORMAT Formato incorrecto. #@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositiv #@exception OG_ERR_PARTITION Fallo al montar el sistema de archivos. -#@version 0.9 - Primera versión para OpenGNSys +#@version 0.9 - Primera versión para OpenGnSys #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009-09-15 +#@version 1.0.4 - Incluir tipos BSD, MacOS y Solaris. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-06-29 +#@version 1.0.5 - Incluir tipos GrubLoader, Hurd y WinLoader, leer por defecto fichero /etc/os-release. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-10-07 #*/ ## function ogGetOsVersion () { # Variables locales. -local MNTDIR TYPE DISTRIB VERSION FILE +local MNTDIR TYPE DISTRIB VERSION IS64BIT FILE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ - "$FUNCNAME 1 2 => Linux:Ubuntu 11.04 64 bits" + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "$FUNCNAME 1 2 => Linux:Ubuntu precise (12.04 LTS) 64 bits" return fi # Error si no se reciben 2 parametros. @@ -59,35 +65,108 @@ fi # Montar la particion, si no lo estaba previamente. MNTDIR=$(ogMount $1 $2) || return $? -# Elección del tipo de sistema operativo. -case "$(ogGetFsType $1 $2)" in - EXT[234] | REISERFS | REISER4) - TYPE="Linux" - # Para Linux: leer descripción. - VERSION=$(chroot $MNTDIR lsb_release -d 2>/dev/null| awk -F: '{gsub (/\t/,""); print $2}') - # Si no se puede obtener, buscar en ficheros del sistema. - if [ -z "$VERSION" ]; then - FILE="$MNTDIR/etc/lsb-release" - [ -r $FILE ] && VERSION="$(awk 'BEGIN {FS="="}; $1~/DESCRIPTION/ {gsub(/\"/,"",$2); print $2}' $FILE)" - for DISTRIB in redhat SuSE mandrake; do - FILE="$MNTDIR/etc/${DISTRIB}-release" - [ -r $FILE ] && VERSION="$(head -1 $FILE)" - done - FILE="$MNTDIR/etc/arch-release" - [ -r $FILE ] && VERSION="Arch Linux" - fi - [ -e $MNTDIR/lib64 ] && VERSION="$VERSION $MSG_64BIT" - ;; - NTFS | HNTFS | FAT32 | HFAT32) - TYPE="Windows" - # Para Windows: leer la version del registro. - VERSION=$(ogGetRegistryValue $MNTDIR software '\Microsoft\Windows NT\CurrentVersion\ProductName') - [ -n "$(ogGetRegistryValue $MNTDIR software '\Microsoft\Windows\CurrentVersion\ProgramW6432Dir' 2>/dev/null)" ] && VERSION="$VERSION $MSG_64BIT" - ;; -esac +# Buscar tipo de sistema operativo. +# Para GNU/Linux: leer descripción. +TYPE="Linux" +FILE="$MNTDIR/etc/os-release" +[ -r $FILE ] && VERSION="$(awk -F= '$1~/PRETTY_NAME/ {gsub(/\"/,"",$2); print $2}' $FILE)" +# Si no se puede obtener, buscar en ficheros del sistema. +if [ -z "$VERSION" ]; then + FILE="$MNTDIR/etc/lsb-release" + [ -r $FILE ] && VERSION="$(awk -F= '$1~/DESCRIPTION/ {gsub(/\"/,"",$2); print $2}' $FILE)" + for DISTRIB in redhat SuSE mandrake gentoo; do + FILE="$MNTDIR/etc/${DISTRIB}-release" + [ -r $FILE ] && VERSION="$(head -1 $FILE)" + done + FILE="$MNTDIR/etc/arch-release" + [ -r $FILE ] && VERSION="Arch Linux" + FILE="$MNTDIR/etc/slackware-version" + [ -r $FILE ] && VERSION="Slackware $(cat $FILE)" +fi +# Si no se encuentra, intentar ejecutar "lsb_release". +[ -z "$VERSION" ] && VERSION=$(chroot $MNTDIR lsb_release -d 2>/dev/null | awk -F":\t" '{print $2}') +# Comprobar Linux de 64 bits. +[ -n "$VERSION" ] && [ -e $MNTDIR/lib64 ] && IS64BIT="$MSG_64BIT" +# Para cargador GRUB, comprobar fichero de configuración. +if [ -z "$VERSION" ]; then + TYPE="GrubLoader" + for FILE in $MNTDIR/{,boot/}grub/menu.lst; do + [ -r $FILE ] && VERSION="GRUB Loader" + done + for FILE in $MNTDIR/{,boot/}{grub{,2},EFI/*}/grub.cfg; do + [ -r $FILE ] && VERSION="GRUB2 Loader" + done +fi +# Para Android, leer fichero de propiedades. +if [ -z "$VERSION" ]; then + TYPE="Android" + FILE="$MNTDIR/android*/system/build.prop" + [ -r $FILE ] && VERSION="Android $(awk -F= '$1~/(product.brand|build.version.release)/ {print $2}' $FILE | tr '\n' ' ')" + [ -e $MNTDIR/lib64 ] && IS64BIT="$MSG_64BIT" +fi +# Para GNU/Hurd, comprobar fichero de inicio (basado en os-prober). +if [ -z "$VERSION" ]; then + TYPE="Hurd" + FILE="$MNTDIR/hurd/init" + [ -r $FILE ] && VERSION="GNU/Hurd" +fi +# Para Windows: leer la version del registro. +if [ -z "$VERSION" ]; then + TYPE="Windows" + VERSION=$(ogGetRegistryValue $MNTDIR software '\Microsoft\Windows NT\CurrentVersion\ProductName' 2>/dev/null) + [ -n "$(ogGetRegistryValue $MNTDIR software '\Microsoft\Windows\CurrentVersion\ProgramW6432Dir' 2>/dev/null)" ] && IS64BIT="$MSG_64BIT" +fi +# Para cargador Windows: buscar versión en fichero BCD (basado en os-prober). +if [ -z "$VERSION" ]; then + TYPE="WinLoader" + FILE="$(ogGetPath $MNTDIR/boot/bcd)" + if [ -n "$FILE" ]; then + for DISTRIB in "Windows 8" "Windows 7" "Windows Vista" \ + "Windwos Server 2008" "Windwos Server 2008 R2" \ + "Windwos Recovery Environment"; do + if grep -qs "$(echo "$DISTRIB" | sed 's/./&./g')" $FILE; then + VERSION="$DISTRIB loader" + fi + done + fi +fi +# Para MacOS: detectar kernel y completar con fichero plist de información del sistema. +if [ -z "$VERSION" ]; then + TYPE="MacOS" + # Kernel de Mac OS. + FILE="$MNTDIR/mach_kernel" + [ -n "$(file -b $FILE | grep 'Mach-O')" ] && VERSION="Mac OS" + [ -n "$(file -b $FILE | grep 'Mach-O 64-bit')" ] && IS64BIT="$MSG_64BIT" + # Datos de configuración de versión de Mac OS. + FILE="$MNTDIR/System/Library/CoreServices/SystemVersion.plist" + [ -r $FILE ] && VERSION=$(awk -F"[<>]" ' + /ProductName/ {getline;s=$3} + /ProductVersion/ {getline;v=$3} + END {print s,v}' $FILE) + # Datos de recuperación de Mac OS. + FILE="$MNTDIR/com.apple.recovery.boot" + [ -r $FILE -a -n "$VERSION" ] && VERSION="$VERSION recovery" +fi +# Para FreeBSD: obtener datos del Kernel. +### TODO Revisar solución. +if [ -z "$VERSION" ]; then + TYPE="BSD" + FILE="$MNTDIR/boot/kernel/kernel" + if [ -r $FILE ]; then + VERSION="$(strings $FILE|awk '/@.*RELEASE/ {print $1,$2}')" + [ -n "$(file -b $FILE | grep 'x86-64')" ] && IS64BIT="$MSG_64BIT" + fi +fi +# Para Solaris: leer el fichero de versión. +### TODO Revisar solución. +if [ -z "$VERSION" ]; then + TYPE="Solaris" + FILE="$MNTDIR/etc/release" + [ -r $FILE ] && VERSION="$(head -1 $FILE)" +fi # Mostrar resultado y salir sin errores. -[ -n "$VERSION" ] && echo "$TYPE:$VERSION" +[ -n "$VERSION" ] && echo "$TYPE:$VERSION $IS64BIT" return 0 } @@ -97,8 +176,8 @@ return 0 #@brief Devuelve el tipo del sistema operativo instalado. #@param int_ndisk nº de orden del disco #@param int_npartition nº de orden de la partición -#@return OSType -#@note OSType = { Linux, Windows } +#@return OSType - Tipo de sistema operativo. +#@note OSType = { Android, BSD, Linux, MacOS, Windows } #@see ogGetOsVersion #*/ ## function ogGetOsType () @@ -120,7 +199,7 @@ ogGetOsVersion "$@" | cut -sf1 -d: #@warning Se ignoran los parámetros de entrada. #@note TipoDispositivo = { ata, bio, boa, cdr, cpu, dis, fir, mem, mod, mul, net, ser, vga } #@note Requisitos: lshw, awk -#@version 0.1 - Primeras pruebas con OpenGNSys +#@version 0.1 - Primeras pruebas con OpenGnSys #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009-07-28 #*/ ## @@ -174,9 +253,12 @@ lshw | awk 'BEGIN {type="mod";} #@warning Se ignoran los parámetros de entrada. #@note Requisitos: ... #@todo Detectar software en Linux -#@version 0.1 - Primeras pruebas con OpenGNSys +#@version 0.1 - Primeras pruebas con OpenGnSys #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009-09-23 +#@version 1.0.5 - Aproximación para inventario de software de Mac OS. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-10-08 #*/ ## function ogListSoftware () { @@ -196,7 +278,7 @@ TYPE=$(ogGetFsType $1 $2) || return $? MNTDIR=$(ogMount $1 $2) || return $? case "$TYPE" in - EXT[234]|REISERFS|REISER4) + EXT[234]|REISERFS|REISER4) # Software de GNU/Linux. # Procesar paquetes dpkg. DPKGDIR="${MNTDIR}/var/lib/dpkg" if [ -r $DPKGDIR ]; then @@ -238,7 +320,7 @@ case "$TYPE" in ls -A $PACMANDIR fi ;; - NTFS|HNTFS|FAT32|HFAT32) + NTFS|HNTFS|FAT32|HFAT32) # Software de Windows. # Claves de registro para programas instalados: formato "{clave}". KEYS=$(ogListRegistryKeys $MNTDIR software '\Microsoft\Windows\CurrentVersion\Uninstall') KEYS32=$(ogListRegistryKeys $MNTDIR software '\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall') @@ -258,6 +340,13 @@ case "$TYPE" in fi done) | sort | uniq ;; + HFS|HFSPLUS) # Software de Mac OS. + # Listar directorios de aplicaciones (falta buscar versiones en ficheros .plist). + find "${MNTDIR}/Applications" -type d -name "*.app" -prune -print | \ + while read k; do + echo "$(basename "$k" .app)" + done | sort + ;; *) ogRaiseError $OG_ERR_PARTITION "$1, $2" return $? ;; esac |