summaryrefslogtreecommitdiffstats
path: root/client/engine/Inventory.lib
diff options
context:
space:
mode:
Diffstat (limited to 'client/engine/Inventory.lib')
-rwxr-xr-xclient/engine/Inventory.lib173
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