summaryrefslogtreecommitdiffstats
path: root/client/engine
diff options
context:
space:
mode:
authorramon <ramongomez@us.es>2009-10-19 09:47:15 +0000
committerramon <ramongomez@us.es>2009-10-19 09:47:15 +0000
commit8964f9b26b06f61e20fba15bfe4fb653cc1a31b5 (patch)
tree8663353fbea6faab97ee1ac38d541d5485771018 /client/engine
parent87b02b26e403807cf587356ed77ac52c74eba3fd (diff)
Resstructuración de trunk.
git-svn-id: https://opengnsys.es/svn/trunk@390 a21b9725-9963-47de-94b9-378ad31fedc9
Diffstat (limited to 'client/engine')
-rwxr-xr-xclient/engine/Boot.lib371
-rwxr-xr-xclient/engine/Disk.lib591
-rwxr-xr-xclient/engine/File.lib225
-rwxr-xr-xclient/engine/FileSystem.lib847
-rwxr-xr-xclient/engine/Image.lib324
-rwxr-xr-xclient/engine/Inventory.lib233
-rw-r--r--client/engine/README.es.txt11
-rwxr-xr-xclient/engine/System.lib115
-rw-r--r--client/engine/ToolsGNU.c37
-rw-r--r--client/engine/correspondencia-api.txt227
-rwxr-xr-xclient/engine/loadenviron.sh89
11 files changed, 3070 insertions, 0 deletions
diff --git a/client/engine/Boot.lib b/client/engine/Boot.lib
new file mode 100755
index 00000000..c37a65c1
--- /dev/null
+++ b/client/engine/Boot.lib
@@ -0,0 +1,371 @@
+#!/bin/bash
+#/**
+#@file Boot.lib
+#@brief Librería o clase Boot
+#@class Boot
+#@brief Funciones para arranque y post-configuración de sistemas de archivos.
+#@version 0.9
+#@warning License: GNU GPLv3+
+#*/
+
+
+#/**
+# ogBoot int_ndisk int_npartition
+#@brief Inicia el proceso de arranque de un sistema de archivos.
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@return (activar el sistema de archivos).
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
+#@exception OG_ERR_NOTOS La partición no tiene instalado un sistema operativo.
+#@warning Primeras pruebas.
+#@todo Revisar parámetros de arranque en Windows y Linux.
+#@version 0.1 - Primera adaptación para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-11
+#*/
+function ogBoot () {
+
+# Variables locales.
+local PART TYPE MNTDIR PARAMS KERNEL INITRD APPEND FILE LOADER
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Detectar tipo de sistema de archivos y montarlo.
+TYPE=$(ogGetFsType $1 $2) || return $?
+MNTDIR=$(ogMount $1 $2)
+[ -z "$MNTDIR" ] && ogRaiseError OG_ERR_PARTITION && return $?
+
+case "$TYPE" in
+ EXT[234]|REISERFS|REISER4)
+ #/// Obtiene los parámetros de arranque para Linux.
+ PARAMS=$(ogLinuxBootParameters $1 $2) || return $?
+ read -e KERNEL INITRD APPEND <<<"$PARAMS"
+ # Si no hay kernel, no hay sistema operativo.
+ [ -z "$KERNEL" ] && ogRaiseError $OG_ERR_NOTOS && return $?
+ # Configurar kernel Linux con los parámetros leidos de su GRUB.
+ kexec -l ${MNTDIR}${KERNEL} --append="$APPEND" --initrd=${MNTDIR}${INITRD}
+ ;;
+ NTFS|HNTFS|FAT32|HFAT32)
+ #/// Compruebar si hay un cargador de Windows.
+ for f in io.sys ntldr bootmgr; do
+ FILE="$(ogGetPath $1 $2 $f 2>/dev/null)"
+ [ -n "$FILE" ] && LOADER="$(basename $FILE)"
+ done
+ [ -z "$LOADER" ] && ogRaiseError $OG_ERR_NOTOS && return $?
+ # Activar la partición y copiar Grub4DOS.
+ ogSetPartitionActive $1 $2
+ cp $OGLIB/grub4dos/* $MNTDIR # */ (necesario para Doxygen)
+ kexec -l $MNTDIR/grub.exe --append=--config-file="find --set-root /$LOADER; chainloader /$LOADER; tpm --init"
+ ;;
+ *) ogRaiseError $OG_ERR_PARTITION
+ return $?
+ ;;
+esac
+
+#/// Arrancar.
+kexec -e
+}
+
+
+#/**
+# ogGetRegistryValue path_mountpoint str_registrytype str_valuename
+#@brief Devuelve el dato de un valor del registro de Windows.
+#@arg \c mountpoint directorio donde está montado el sistema Windows
+#@arg \c registrytype tipo de registro a leer
+#@arg \c valuename valor de registro
+#@return str_valuedata - valor de la clave.
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
+#@note registrytype = { default, sam, security, software, system, components }
+#@warning Requisitos: chntpw, awk
+#@warning La partición de Windows debe estar montada previamente.
+#@version 0.9 - Primera adaptación para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-11
+#*/
+function ogGetRegistryValue () {
+
+# Variables locales.
+local FILE FILENT FILEXP
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_registrytype str_key"
+ return
+fi
+#/// Error si no se reciben 3 parámetros.
+[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Camino del fichero de registro en NT/2000 o XP/Vista/7.
+FILENT=$(ogGetPath "/$1/winnt/system32/config/$2")
+[ -f $FILENT ] && FILE="$FILENT"
+FILEXP=$(ogGetPath "/$1/windows/system32/config/$2")
+[ -f $FLEHXP ] && FILE="$FILEXP"
+[ ! -f $FILE ] && ogRaiseError OG_ERR_NOTFOUND "$1,$2" && return $?
+
+#/// Devolver el dato del valor de registro.
+chntpw $FILE << FIN 2>/dev/null | awk '/> Value/ {getline;print $0;}'
+cd ${3%\\*}
+cat ${3##*\\}
+q
+FIN
+}
+
+
+#/**
+# ogGetWindowsName int_ndisk int_npartition
+#@brief Muestra el nombre del equipo en el registro de Windows.
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@return str_name - nombre del equipo
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
+#@version 0.1 - Primera adaptación para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-23
+#*/
+function ogGetWindowsName () {
+
+# Variables locales.
+local PART MNTDIR
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1 ==> PRACTICA-PC"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Montar el sistema de archivos.
+MNTDIR=$(ogMount $1 $2) || return $?
+[ -z "$MNTDIR" ] && ogRaiseError OG_ERR_PARTITION "$1,$2" && return $?
+
+#/// Obtener dato del valor de registro.
+ogGetRegistryValue $MNTDIR system '\ControlSet001\Control\ComputerName\ComputerName\ComputerName'
+}
+
+
+#/**
+# ogListRegistryKeys path_mountpoint str_registrytype str_key
+#@brief Lista los nombres de claves de una determinada clave del registro de Windows.
+#@arg \c mountpoint directorio donde está montado el sistema Windows
+#@arg \c registrytype tipo de registro a leer
+#@arg \c key clave de registro
+#@return
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
+#@note registrytype = { default, sam, security, software, system, components }
+#@warning Requisitos: chntpw, awk
+#@warning La partición de Windows debe estar montada previamente.
+#@version 0.9 - Primera adaptación para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-23
+#*/
+function ogListRegistryKeys () {
+
+# Variables locales.
+local FILE FILENT FILEXP
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_registrytype str_key"
+ return
+fi
+#/// Error si no se reciben 3 parámetros.
+[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Camino del fichero de registro en NT/2000 o XP/Vista/7.
+FILENT=$(ogGetPath "/$1/winnt/system32/config/$2")
+[ -f $FILENT ] && FILE="$FILENT"
+FILEXP=$(ogGetPath "/$1/windows/system32/config/$2")
+[ -f $FLEHXP ] && FILE="$FILEXP"
+[ ! -f $FILE ] && ogRaiseError OG_ERR_NOTFOUND "$1,$2" && return $?
+
+#/// Devolver la lista de claves de registro.
+chntpw $FILE << FIN 2>/dev/null | awk 'BEGIN {FS="[<>]"} $1~/^ $/ {print $2}'
+ls $3
+q
+FIN
+}
+
+
+#/**
+# ogLinuxBootParameters int_ndisk int_npartition
+#@brief Muestra los parámetros de arranque de un sistema de archivos Linux.
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@return kernel initrd parámetros ...
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
+#@warning Función básica usada por \c ogBoot
+#@version 0.9 - Primera adaptación para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-11
+#*/
+function ogLinuxBootParameters () {
+
+# Variables locales.
+local MNTDIR CONF
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 2 ==> ..."
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Detectar id. de tipo de partición y codificar al mnemonico.
+MNTDIR=$(ogMount $1 $2) || return $?
+[ -z "$MNTDIR" ] && ogRaiseError OG_ERR_PARTITION && return $?
+
+# Fichero de configuración de GRUB.
+CONF="$MNTDIR/boot/grub/menu.lst"
+[ ! -e $CONF ] && CONF="$MNTDIR/boot/grub/grub.cfg"
+[ ! -e $CONF ] && ogRaiseError $OG_ERR_NOTFOUND "grub.cfg" && return $?
+
+#/** Toma del fichero de configuracion los valores del kernel, initrd
+# y parámetros de arranque usando las cláusulas por defecto
+# ("default" en GRUB1, "set default" en GRUB2)
+# y los formatea para que sean compatibles con \c kexec . */
+#/* (ncesario para Doxygen)
+awk 'BEGIN {cont=-1;}
+ $1~/^default/ {sub(/=/," "); def=$2;}
+ $1~/^set/ && $2~/^default/ {gsub(/[="]/," "); def=$3;}
+ $1~/^title|^menuentry/ {cont++}
+ $1~/^kernel|^linux/ {if (def==cont) {
+ kern=$2;
+ sub($1,"");sub($1,"");sub(/^[ \t]*/,"");app=$0}
+ }
+ $1~/^initrd/ {if (def==cont) init=$2}
+ END {if (kern!="") printf("%s %s %s", kern,init,app)}
+ ' $CONF
+}
+
+
+
+#/**
+# ogSetRegistryValue path_mountpoint str_registrytype str_valuename str_valuedata
+#@brief Establece el dato asociado a un valor del registro de Windows.
+#@arg \c mountpoint directorio donde está montado el sistema Windows
+#@arg \c registrytype tipo de registro
+#@arg \c valuename nombre del valor de registro
+#@arg \c valuedata dato del valor de registro
+#@return (nada)
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
+#@note registrytype = { default, sam, security, software, system, components }
+#@warning Requisitos: chntpw, awk
+#@warning La partición de Windows debe estar montada previamente.
+#@version 0.9 - Primera adaptación para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-24
+#*/
+function ogSetRegistryValue () {
+
+# Variables locales.
+local FILE FILENT FILEXP
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_registrytype str_key"
+ return
+fi
+#/// Error si no se reciben 4 parámetros.
+[ $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Camino del fichero de registro en NT/2000 o XP/Vista/7.
+FILENT=$(ogGetPath "/$1/winnt/system32/config/$2")
+[ -f $FILENT ] && FILE="$FILENT"
+FILEXP=$(ogGetPath "/$1/windows/system32/config/$2")
+[ -f $FLEHXP ] && FILE="$FILEXP"
+[ ! -f $FILE ] && ogRaiseError OG_ERR_NOTFOUND "$1,$2" && return $?
+
+#/// Cambiar el dato del valor de registro.
+chntpw $FILE << FIN 2>/dev/null
+ed $3
+$4
+q
+y
+FIN
+}
+
+
+#/**
+# ogSetWindowsName int_ndisk int_npartition str_name
+#@brief Establece el nombre del equipo en el registro de Windows.
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@arg \c name nombre asignado
+#@return (nada)
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
+#@version 0.1 - Primera adaptación para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-24
+#*/
+function ogSetWindowsName () {
+
+# Variables locales.
+local PART MNTDIR NAME
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1 PRACTICA-PC"
+ return
+fi
+#/// Error si no se reciben 3 parámetros.
+[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Montar el sistema de archivos.
+MNTDIR=$(ogMount $1 $2) || return $?
+[ -z "$MNTDIR" ] && ogRaiseError OG_ERR_PARTITION "$1,$2" && return $?
+NAME="$3"
+
+#/// Modificar datos de los valores de registro.
+ogSetRegistryKey $MNTDIR system '\ControlSet001\Control\ComputerName\ComputerName\ComputerName' "$NAME"
+ogSetRegistryKey $MNTDIR system '\ControlSet001\Services\Tcpip\Parameters\Hostname' "$NAME"
+ogSetRegistryKey $MNTDIR system '\ControlSet001\Services\Tcpip\Parameters\NV Hostname' "$NAME"
+}
+
+function ogNewMbrXP () {
+#/** @function NewMbrXP: @brief Genera un nuevo Master Boot Record en el disco duro indicado, compatible con los SO tipo Windows
+#@param $1 obligatorio int_numdisk
+#@return salida del programa my-sys
+#@warning no definidos
+#@attention Requisitos: my-sys, compilado ubicado en /var/EAC/admin/source
+#@note
+#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
+#*/
+#
+if [ $# = 0 ]
+then
+ Msg "sintaxis: ogNewMbrXP int_disco " red
+return
+fi
+if [ $# = 1 ]
+then
+ particion=`ogDiskToDev $1`
+ ms-sys -z -f $particion
+ ms-sys -m -f $particion
+fi
+}
diff --git a/client/engine/Disk.lib b/client/engine/Disk.lib
new file mode 100755
index 00000000..b2dff7cc
--- /dev/null
+++ b/client/engine/Disk.lib
@@ -0,0 +1,591 @@
+#!/bin/bash
+#/**
+#@file Disk.lib
+#@brief Librería o clase Disk
+#@class Disk
+#@brief Funciones para gestión de discos y particiones.
+#@version 0.9
+#@warning License: GNU GPLv3+
+#*/
+
+
+#/**
+# ogCreatePartitions ndisk parttype:partsize ...
+#@brief Define el conjunto de particiones de un disco.
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c str_parttype mnemónico del tipo de partición
+#@arg \c int_partsize tamaño de la partición (en KB)
+#@return (nada, por determinar)
+#@exception OG_ERR_FORMAT formato incorrecto.
+#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
+#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
+#@attention Pueden definirse particiones vacías de tipo \c EMPTY
+#@note Requisitos: sfdisk, parted, partprobe, awk
+#@todo Definir atributos (arranque, oculta) y tamaños en MB, GB, etc.
+#@version 0.9 - Primera versión para OpenGNSys
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009/09/09
+#*/
+function ogCreatePartitions () {
+
+# Variables locales.
+local DISK PART SECTORS START SIZE TYPE EXTSTART EXTSIZE tmpsfdisk
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_parttype:int_partsize ..." \
+ "$FUNCNAME 1 NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000"
+ return
+fi
+#/// Error si no se reciben menos de 2 parámetros.
+[ $# -gt 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Sustituye nº de disco por su dispositivo.
+DISK="$(ogDiskToDev $1)" || return $?
+shift
+
+# Nº total de sectores, para evitar desbordamiento
+SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions)
+# Sector de inicio de la particon (la 1ª empieza en el sector 63).
+START=63
+PART=1
+
+# Fichero temporal de entrada para "sfdisk"
+tmpsfdisk=/tmp/sfdisk$$
+trap "rm -f $tmpsfdisk" 1 2 3 9 15
+
+echo "unit: sectors" >$tmpsfdisk
+echo >>$tmpsfdisk
+
+#/// Generar fichero de entrada para "sfdisk" con las particiones.
+while [ $# -gt 0 ]; do
+ #/// Leer formato de cada parámetro - Tipo:Tamaño
+ TYPE="${1%%:*}"
+ SIZE="${1#*:}"
+ [ -z "$SIZE" ] && ogRaiseError $OG_ERR_FORMAT && return $?
+ #/// Convertir en sectores de 512 B.
+ SIZE=$[SIZE*2]
+ [ $SIZE -eq 0 ] && ogRaiseError $OG_ERR_FORMAT && return $?
+ #/// Obtener identificador de tipo de partición.
+ case "$TYPE" in
+ EMPTY) ID=0 ;;
+ EXTENDED) ID=5
+ [ $PART -gt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $?
+ EXTSTART=$START
+ EXTSIZE=$SIZE
+ ;;
+ NTFS|EXFAT) ID=7 ;;
+ HNTFS) ID=17 ;;
+ FAT32) ID=b ;;
+ HFAT32) ID=1b ;;
+ EXT[234]|REISERFS|REISER4|XFS|JFS)
+ ID=83 ;;
+ LINUX-SWAP) ID=82 ;;
+ SOLARIS) ID=bf ;;
+ CACHE) ID=ca ;;
+ *) ogRaiseError $OG_ERR_PARTITION "$TYPE"
+ return $? ;;
+ esac
+ #/// Incluir particiones lógicas dentro de la partición extendida.
+ if [ $PART = 5 ]; then
+ [ -z "$EXTSTART" ] && ogRaiseError $OG_ERR_FORMAT && return $?
+ START=$EXTSTART
+ SECTORS=$[EXTSTART+EXTSIZE]
+ fi
+ #/// Generar datos para la partición.
+ echo "$DISK$PART : start=$START, size=$SIZE, Id=$ID" >>$tmpsfdisk
+ #/// Error si se supera el nº total de sectores.
+ START=$[START+SIZE]
+ [ $START -gt $SECTORS ] && ogRaiseError $OG_ERR_FORMAT && return $?
+ PART=$[PART+1]
+ shift
+done
+# Si no se indican las 4 particiones primarias, definirlas como vacías.
+while [ $PART -le 4 ]; do
+ echo "$DISK$PART : start=0, size=0, Id=0" >>$tmpsfdisk
+ PART=$[PART+1]
+done
+# Si se define partición extendida sin lógicas, crear particion 5 vacía.
+if [ $PART = 5 -a -n "$EXTSTART" ]; then
+ echo "${DISK}5 : start=$EXTSTART, size=$EXTSIZE, Id=0" >>$tmpsfdisk
+fi
+
+# Desmontar todos los sistemas de archivos del disco.
+ogUnmountAll $1
+# Si la tabla de particiones no es valida, volver a generarla.
+[ $(parted -s $DISK print >/dev/null) ] || fdisk $DISK <<< "w"
+#/// Definir particiones y notificar al kernel.
+sfdisk -f $DISK < $tmpsfdisk 2>/dev/null
+rm -f $tmpsfdisk
+}
+
+
+#/**
+# ogDevToDisk device
+#@brief Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo.
+#@arg \c path_device Camino del fichero de dispositivo.
+#@return ndisk (para dispositivo de disco)
+#@return ndisk npartition (para dispositivo de partición).
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
+#@note Requisitos: awk
+#@version 0.9 - Primera versión para OpenGNSys
+#@author Ramon Gomez, ETSII Universidad Sevilla
+#@date 2009-07-20
+#*/
+function ogDevToDisk () {
+
+# Variables locales.
+local d n
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME path_device" \
+ "$FUNCNAME /dev/sda => 1 1"
+ return
+fi
+
+#/// Error si no se recibe 1 parámetro.
+[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+#/// Error si no es fichero de bloques.
+[ -b "$1" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
+
+#/// Procesa todos los discos para devolver su nº de orden y de partición.
+n=1
+for d in $(ogDiskToDev); do
+ [ -n "$(echo $1 | grep $d)" ] && echo "$n ${1#$d}" && return
+ n=$[n+1]
+done
+ogRaiseError $OG_ERR_NOTFOUND "$1"
+return $OG_ERR_NOTFOUND
+}
+
+
+#/**
+# ogDiskToDev [ndisk [npartition]]
+#@brief Devuelve la equivalencia entre el nº de orden del dispositivo (dicso o partición) y el nombre de fichero de dispositivo correspondiente.
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c int_npartition nº de orden de la partición
+#@return Para 0 parametros: Devuelve los nombres de ficheros de los dispositivos sata/ata/usb linux encontrados.
+#@return Para 1 parametros: Devuelve la ruta del disco duro indicado.
+#@return Para 2 parametros: Devuelve la ruta de la particion indicada.
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
+#@note Requisitos: awk, lvm
+#@version 0.9 - Primera versión para OpenGNSys
+#@author Ramon Gomez, ETSII Universidad Sevilla
+#@date 2009-07-20
+#*/
+function ogDiskToDev () {
+
+# Variables locales
+local ALLDISKS VOLGROUPS DISK PART
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk [int_npartition]" \
+ "$FUNCNAME => /dev/sda /dev/sdb" \
+ "$FUNCNAME 1 => /dev/sda" \
+ "$FUNCNAME 1 1 => /dev/sda1"
+ return
+fi
+
+#/// Listar dispositivo para los discos duros (tipos: 3=hd, 8=sd).
+ALLDISKS=$(awk '($1==3 || $1==8) && $4!~/[0-9]/ {printf "/dev/%s ",$4}' /proc/partitions)
+VOLGROUPS=$(vgchange -ay &>/dev/null && vgs -a --noheadings | awk '{printf "/dev/%s ",$1}')
+ALLDISKS="$ALLDISKS $VOLGROUPS"
+
+#/// Mostrar salidas segun el número de parametros.
+case $# in
+ 0) # Muestra todos los discos, separados por espacios.
+ echo $ALLDISKS
+ ;;
+ 1) # Error si el parámetro no es un digito.
+ [ -z "${1/[1-9]/}" ] || ogRaiseError $OG_ERR_FORMAT || return $?
+ DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}')
+ # Error si el fichero no existe.
+ [ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
+ echo "$DISK"
+ ;;
+ 2) # Error si los 2 parámetros no son digitos.
+ [ -z "${1/[1-9]/}" -a -z "${2/[1-9]/}" ] || ogRaiseError $OG_ERR_FORMAT|| return $?
+ DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}')
+ [ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
+ PART="$DISK$2"
+ #/// Comprobar si es partición.
+ if [ -b "$PART" ]; then
+ echo "$PART"
+ elif [ -n "$VOLGROUPS" ]; then
+ #/// Comprobar si volumen lógico.
+ PART=$(lvscan -a 2>/dev/null | grep "'$DISK/" | awk -v n=$2 -F\' '{if (NR==n) print $2}')
+ [ -e "$PART" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
+ echo "$PART"
+ else
+ ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
+ fi
+ ;;
+ *) # Formato erroneo.
+ ogRaiseError $OG_ERR_FORMAT
+ return $OG_ERR_FORMAT
+ ;;
+esac
+}
+
+
+#/**
+# ogGetPartitionActive ndisk
+#@brief Muestra que particion de un disco esta marcada como de activa.
+#@arg \c int_ndisk nº de orden del disco
+#@return Nº de partición activa
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@note Requisitos: parted
+#@todo Queda definir formato para atributos (arranque, oculta, ...).
+#@version 0.9 - Primera versión compatible con OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009/07/24
+#*/
+function ogGetPartitionActive () {
+
+# Variables locales
+local DISK
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "$FUNCNAME 1 => 1"
+ return
+fi
+#/// Error si no se recibe 1 parámetro.
+[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Comprobar que el disco existe y listar su partición activa.
+DISK="$(ogDiskToDev $1)" || return $?
+parted $DISK print 2>/dev/null | awk '/boot/ {print $1}'
+}
+
+
+#/**
+# ogGetPartitionId ndisk npartition
+#@brief Devuelve el mnemonico con el tipo de sistema de archivos.
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c int_npartition nº de orden de la partición
+#@return Identificador de tipo de partición.
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@note Requisitos: sfdisk
+#@version 0.9 - Primera versión compatible con OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 25/03/2009
+#*/
+function ogGetPartitionId () {
+
+# Variables locales.
+local DISK PART
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1 => 7"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Detectar id. de tipo de particion y codificar al mnemonico.
+DISK=$(ogDiskToDev $1) || return $?
+PART=$(ogDiskToDev $1 $2) || return $?
+echo $(sfdisk --id $DISK $2 2>/dev/null)
+}
+
+
+#/**
+# ogGetPartitionSize ndisk npartition
+#@brief Muestra el tamano en KB de una particion determinada.
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c int_npartition nº de orden de la partición
+#@return tamañoKB
+#@exception OG_ERR_FORMAT formato incorrecto.
+#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
+#@note Requisitos: sfdisk, awk
+#@version 0.9 - Primera versión para OpenGNSys
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009/07/24
+#*/
+function ogGetPartitionSize () {
+
+# Variables locales.
+local PART
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1 => 10000000"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Obtener el tamaño de la partición.
+PART="$(ogDiskToDev $1 $2)" || return $?
+sfdisk -s $PART
+}
+
+
+#/**
+# ogListPartitions int_ndisk
+#@brief Lista las particiones definidas en un disco.
+#@arg \c int_ndisk nº de orden del disco
+#@return tipo:tamanoKB ...
+#@exception OG_ERR_FORMAT formato incorrecto.
+#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
+#@note Requisitos: \c parted \c awk
+#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
+#@attention Las tuplas de valores están separadas por espacios.
+#@version 0.9 - Primera versión para OpenGNSys
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009/07/24
+#*/
+function ogListPartitions () {
+
+# Variables locales.
+local DISK PART NPARTS
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \
+ "$FUNCNAME 1 => NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000"
+ return
+fi
+#/// Error si no se recibe 1 parámetro.
+[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT "$FORMAT" || return $?
+
+#/// Procesar la salida de \c parted .
+DISK="$(ogDiskToDev $1)" || return $?
+NPARTS=$(parted -s $DISK print | awk '$1~/^[1-9]/ {print $1}')
+for PART in $NPARTS; do
+ echo -n "$(ogGetFsType $1 $PART):$(ogGetPartitionSize $1 $PART) "
+done
+echo
+}
+
+
+#/**
+# ogSetPartitionActive ndisk npartition
+#@brief Establece cual es la partición activa de un disco.
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c int_npartition nº de orden de la partición
+#@return Nada.
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo.
+#@note Requisitos: parted
+#@version 0.9 - Primera versión compatible con OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009/09/17
+#*/
+function ogSetPartitionActive () {
+
+# Variables locales
+local DISK PART
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Comprobar que el disco existe y activar la partición indicada.
+DISK="$(ogDiskToDev $1)" || return $?
+PART="$(ogDiskToDev $1 $2)" || return $?
+parted -s $DISK set $2 boot on 2>/dev/null
+}
+
+
+#/**
+# ogSetPartitionSize ndisk npartition size
+#@brief Muestra el tamano en KB de una particion determinada.
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c int_npartition nº de orden de la partición
+#@arg \c int_size tamaño de la partición (en KB)
+#@return (nada)
+#@exception OG_ERR_FORMAT formato incorrecto.
+#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
+#@note Requisitos: sfdisk, awk
+#@todo Compruebar que el tamaño sea numérico positivo y evitar que pueda solaparse con la siguiente partición.
+#@version 0.9 - Primera versión para OpenGNSys
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009/07/24
+#*/
+function ogSetPartitionSize () {
+
+# Variables locales.
+local DISK PART SIZE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1 10000000"
+ return
+fi
+#/// Error si no se reciben 3 parámetros.
+[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Obtener el tamaño de la partición.
+DISK="$(ogDiskToDev $1)" || return $?
+PART="$(ogDiskToDev $1 $2)" || return $?
+# Convertir tamaño en KB a sectores de 512 B.
+SIZE=$[$3*2] || ogRaiseError $OG_ERR_FORMAT || return $?
+#/// Usar \c sfdisk para redefinir el tamaño.
+sfdisk -f -uS -N$2 $DISK <<< ",$SIZE" || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
+}
+
+
+#/**
+# ogUpdatePartitionTable
+#@brief Fuerza al kernel releer la tabla de particiones de los discos duros
+#@arg \c no requiere
+#@return informacion propia de la herramienta
+#@note Requisitos: \c partprobe
+#@warning pendiente estructurar la funcion a opengnsys
+#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
+#@note funcion importada de EAC
+#*/
+
+function ogUpdatePartitionTable () {
+echo "Forzando al kernel la lectura de la tabla de particiones"
+list=`partprobe -s | cut -f1 -d: ` 2>/dev/null
+echo $list > /tmp/disk
+}
+
+
+
+
+function ogGetPartitionsNumber () {
+#/** @function ogGetPartitionsNumber: @brief detecta el numero de particiones del disco duro indicado.
+#@param int_numdisk (indentificado EAC del disco)
+#@return devuelve el numero paritiones del disco duro indicado
+#@warning Salidas de errores no determinada
+#@attention Requisitos: parted
+#@note Notas sin especificar
+#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
+#*/
+disco=`ogDiskToDev $1`
+totalpart=`parted $disco print | egrep ^" [0123456789] " -c`
+echo $totalpart
+}
+
+
+function ogDiskToRelativeDev () {
+#/** @function ogDiskToRelativeDev: @brief Traduce los ID de discos o particiones EAC a ID Linux relativos, es decir 1 1 => sda1
+#@param Admite 1 parametro: $1 int_numdisk
+#@param Admite 2 parametro: $1 int_numdisk $2 int_partition
+#@return Para 1 parametros traduce Discos Duros: Devuelve la ruta relativa linux del disco duro indicado con nomenclatura EAC.........ejemplo: IdPartition 1 => sda
+#@return Para 2 parametros traduce Particiones: Devuelve la ruta relativa linux de la particion indicado con nomenclatura EAC........... ejemplo: IdPartition 2 1 => sdb1
+#@warning No definidas
+#@attention
+#@note Notas sin especificar
+#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
+#*/
+
+if [ $# = 0 ]
+then
+ Msg "Info: Traduce el identificador del dispositivo EAC a dispositivo linux \n" info
+ Msg "Sintaxis1: IdPartition int_disk -----------------Ejemplo1: IdPartition 1 -> sda " example
+ Msg "Sintaxis2: IdPartition int_disk int_partition --Ejemplo2: IdPartition 1 2 -> sda2 " example
+
+return
+fi
+#PART="$(Disk|cut -f$1 -d' ')$2" # se comenta esta linea porque doxygen no reconoce la funcion disk y no crea los enlaces y referencias correctas.
+PART=$(ogDiskToDev|cut -f$1 -d' ')$2
+echo $PART | cut -f3 -d \/
+}
+
+
+function ogDeletePartitionTable () {
+#/** @function ogDeletePartitionTable: @brief Borra la tabla de particiones del disco.
+#@param $1 opcion A (identificador LINUX) str_ID_linux (/dev/sda)
+#@param $1 opcion B (Identifiador EAC) int_numdiskEAC(1)
+#@return la informacion propia del fdisk
+#@warning no definidos
+#@attention
+#@note
+#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
+#*/
+if [ $# = 0 ]
+then
+ Msg "sintaxis1: ogDeletePartitionTable int_disk" red
+ Msg "sintaxis2: ogDeletePartitionTable str_/dev/sdX" red
+ return
+fi
+if [ -n "${1%/dev/*}" ]
+ then
+ dev=`DiskToDev $1`
+ else
+ dev=$1
+fi
+echo -ne "o\nw" | fdisk $dev
+}
+
+
+
+function ogSetPartitionId() {
+#/** @function ogSetPartitionId: @brief Cambia el identificador de la particion, pero no su sistema de archivos.
+#@param $1 int_numdiskEAC
+#@param $2 int_numpartitionEAC
+#@param $3 str_tipoPartition admite EXT2 EXT3 NTFS FAT32 SWAP CACHE
+#@return la propia del fdisk
+#@warning no controla los parametros, si se introducen mal o simplemente no se introducen no muestra mensaje
+#@warning Identifica por nombre del sistema de archivos no por número
+#@attention Requisitos: fdisk
+#@note
+#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
+#*/
+
+# Variables locales
+local DISK PART ID
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1 10000000"
+ return
+fi
+#/// Error si no se reciben 3 parámetros.
+[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Sustituye nº de disco por su dispositivo.
+DISK=`ogDiskToDev $1` || return $?
+PART=`ogDiskToDev $1 $2` || return $?
+
+#/// Elección del tipo de partición.
+case "$3" in
+ EMPTY) ID=0 ;;
+ EXTENDED) ID=5 ;;
+ NTFS|EXFAT) ID=7 ;;
+ FAT32) ID=b ;;
+ HNTFS) ID=17 ;;
+ HFAT32) ID=1b ;;
+ LINUX-SWAP) ID=82 ;;
+ EXT[234]|REISERFS|REISER4|XFS|JFS)
+ ID=83 ;;
+ SOLARIS) ID=bf ;;
+ CACHE) ID=ca ;;
+ *) ogRaiseError $OG_ERR_PARTITION "$TYPE"
+ return $? ;;
+esac
+echo -ne "t\n$2\n${ID}\nw\n" | fdisk $DISK 1>/dev/null 2>&1
+}
+
+
+function ogDeletePartitionsLabels () {
+#/** @function ogDeletePartitionsLabels: @brief Elimina la informacion que tiene el kernel del cliente og sobre los labels de los sistemas de archivos
+#@param No requiere
+#@return Nada
+#@warning
+#@attention Requisitos: comando interno linux rm
+#@note
+#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
+#*/
+rm /dev/disk/by-label/* # */ COMENTARIO OBLIGATORIO PARA DOXYGEN
+}
+
diff --git a/client/engine/File.lib b/client/engine/File.lib
new file mode 100755
index 00000000..22ef4649
--- /dev/null
+++ b/client/engine/File.lib
@@ -0,0 +1,225 @@
+#!/bin/bash
+#/**
+#@file File.lib
+#@brief Librería o clase File
+#@class File
+#@brief Funciones para gestión de archivos y directorios.
+#@version 0.9
+#@warning License: GNU GPLv3+
+#*/
+
+
+##### PRUEBAS
+# ogGetPath [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
+function ogCopyFile () {
+local SOURCE TARGET
+case "$1" in
+ /*) SOURCE=$(ogGetFile "$1") # */ (necesario Doxygen)
+ shift ;;
+ [1-9]*) SOURCE=$(ogGetFile "$1" "$2" "$3")
+ shift 3 ;;
+ *) SOURCE=$(ogGetFile "$1" "$2")
+ shift 2 ;;
+esac
+
+}
+
+
+#/**
+# ogGetPath [ str_repo | int_ndisk int_npartition ] path_filepath
+#@brief Inicia el proceso de arranque de un sistema de archivos.
+#@arg \c filepath camino del fichero (independiente de mayúsculas)
+#@arg \c repo repositorio de ficheros
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@return path_file - camino completo real del fichero.
+#@note repo = { REPO, CACHE | CDROM }
+#@note Requisitos: \c grep \c sed
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Fichero o dispositivo no encontrado.
+#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
+#@warning En caso de error, sólo devuelve el código y no da mensajes.
+#@todo Terminar de definir parámetros para acceso a repositorios.
+#@version 0.9 - Pruebas con OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-15
+#*/
+function ogGetPath () {
+
+# Variables locales.
+local MNTDIR FILE PREVFILE FILEPATH CURRENTDIR
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME \"/mnt/sda1/windows/system32\" ==> /mnt/sda1/WINDOWS/System32" \
+ "$FUNCNAME REPO /etc/fstab ==> /opt/opengnsys/images/etc/fstab" \
+ "$FUNCNAME 1 1 \"/windows/system32\" ==> /mnt/sda1/WINDOWS/System32"
+ return
+fi
+
+#/// Procesar camino según el número de parámetros.
+case $# in
+ 1) FILE="$1" ;;
+ 2) case "$1" in
+ REPO|repo)
+ FILE="$OGIMG/$2" ;;
+ CACHE|cache)
+ FILE="$OGCAC/$OGIMG/$2" ;;
+ CDROM|cdrom)
+ FILE="$(ogMount cdrom)/$2" ;;
+ *) ogRaiseError $OG_ERR_FORMAT
+ return $? ;;
+ esac ;;
+ 3) FILE="$(ogMount $1 $2)/$3" ;;
+ *) ogRaiseError $OG_ERR_FORMAT
+ return $? ;;
+esac
+
+#/// Eliminar caracteres \c / iniciales, finales y duplicados.
+CURRENTDIR="$PWD"
+FILE="$(echo $FILE|sed -e 's/\(\/\)*\1/\//g' -e 's/^\///' -e 's/\/$//')"
+PREVFILE=""
+FILEPATH="/"
+while [ "$FILE" != "$PREVFILE" ]; do
+ #/// Busca el nombre correcto en el directorio actual.
+ cd "$FILEPATH"
+ FILEPATH="${FILEPATH}/$(ls -A | grep -i -m1 "^${FILE%%/*}$")" || return $?
+ PREVFILE="$FILE"
+ FILE="${FILE#*/}"
+done
+
+#/// Muestra el camino Linux, quitando el "/" inicial duplicado.
+[ "$FILEPATH" != "/" ] && echo ${FILEPATH#/}
+cd $CURRENTDIR
+}
+
+
+#/**
+# ogGetParentPath [ str_repo | int_ndisk int_npartition ] path_filepath
+#@brief Metafunción que devuelve el camino del directorio padre.
+#@see ogGetPath
+#@version 0.9 - Pruebas con OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-29
+#*/
+function ogGetParentPath () {
+local PARENT
+case $# in
+ 1) PARENT="$(dirname "$1")" ;;
+ 2) PARENT="$1 $(dirname "$2")" ;;
+ 3) PARENT="$1 $2 $(dirname "$3")" ;;
+ *) ogRaiseError $OG_ERR_FORMAT
+ return $? ;;
+esac
+ogGetPath $PARENT
+}
+
+
+#/**
+# ogDeleteFile [ str_repo | int_ndisk int_npartition ] path_filepath
+#@brief Metafunción que borra un fichero de un dispositivo.
+#@see ogGetPath
+#@version 0.9 - Pruebas con OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-29
+#*/
+function ogDeleteFile () {
+local FILE
+FILE=$(ogGetPath "$@") || return $?
+[ -z "$FILE" ] && ogRaiseError $OG_ERR_NOTFOUND "$*" && reutrn $?
+rm -f "$FILE" || ogRaiseError $OG_ERR_NOTFOUND "$*" || reutrn $?
+}
+
+
+#/**
+# ogDeleteTree [ str_repo | int_ndisk int_npartition ] path_dirpath
+#@brief Metafunción que borra todo un subárbol de directorios de un dispositivo.
+#@see ogGetPath
+#@version 0.9 - Pruebas con OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-29
+#*/
+# Borrar subárbol de directorio.
+function ogDeleteTree () {
+local DIR
+DIR=$(ogGetPath "$@") || return $?
+[ -z "$DIR" ] && ogRaiseError $OG_ERR_NOTFOUND "$*" && reutrn $?
+rm -fr "$DIR" || ogRaiseError $OG_ERR_NOTFOUND "$*" || reutrn $?
+}
+
+
+#/**
+# ogMakeDir [ str_repo | int_ndisk int_npartition ] path_dirpath
+#@brief Metafunción que crea un subdirectorio vacío en un dispositivo.
+#@see ogGetParentPath
+#@version 0.9 - Pruebas con OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-29
+#*/
+function ogMakeDir () {
+local PARENT DIR
+PARENT=$(ogGetParentPath "$@") || return $?
+DIR="$(basename "${!#}")"
+echo mkdir -p "$PARENT/$DIR"
+mkdir -p "$PARENT/$DIR" || ogRaiseError $OG_ERR_NOTFOUND "$*" || reutrn $?
+}
+
+
+#/**
+# ogNewPath [ str_repo | int_ndisk int_npartition ] path_filepath
+#@brief Crea el directorio especificado
+#@arg \c filepath camino del fichero (independiente de mayúsculas)
+#@arg \c repo repositorio de ficheros
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@return file - camino completo real del directorio creado
+#@note repo = { REPO, CACHE }
+#@note Requisitos: \c grep \c sed
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
+#@warning Primeras pruebas.
+#@todo Terminar de definir parámetros para acceso a repositorios.
+#@version 0.1 - Primera adaptación para OpenGNSys.
+#@author obtenido de ogGetPath de Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-15
+#*/
+function ogNewPath () {
+
+# Variables locales.
+local MNTDIR FILE PREVFILE FILEPATH CURRENTDIR
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME \"/mnt/sda1/windows/system32\" ==> /mnt/sda1/WINDOWS/System32" \
+ "$FUNCNAME REPO /etc/fstab ==> /opt/opengnsys/images/etc/fstab" \
+ "$FUNCNAME 1 1 \"/windows/system32\" ==> /mnt/sda1/WINDOWS/System32"
+ return
+fi
+
+#/// Procesar camino según el número de parámetros.
+case $# in
+ # si 1 parametro directorio-fichero completo.
+ 1) FILE="$1" ;;
+ # Si 2 parametros es REPOSITORIO DIRECTORIO-FICHERO
+ 2) case "$1" in
+ # consultando servidor repositorio base
+ REPO | $IPREPOMAN ) FILE="$OGIMG/$2" || return $OG_ERR_NOTFOUND ;;
+ # consultando particion auxiliar cache local
+ CACHE | $IP )
+ ogMountCache >> /dev/null && FILE="$OGCAC/$OGIMG/$2" || return $OG_ERR_NOTFOUND ;;
+ # conectando con Servidor Axuliar.
+ *) ogRaiseError $OG_ERR_FORMAT
+ return $? ;;
+ esac ;;
+ # Si 3 parametros DISK PARTITION DIRECTORIO-FICHERO
+ 3) FILE="$(ogMount $1 $2)/$3" || return $OG_ERR_NOTFOUND ;;
+ *) return $OG_ERR_FORMAT ;;
+esac
+
+mkdir -p ${FILE}
+echo $FILE
+}
+
diff --git a/client/engine/FileSystem.lib b/client/engine/FileSystem.lib
new file mode 100755
index 00000000..896f2006
--- /dev/null
+++ b/client/engine/FileSystem.lib
@@ -0,0 +1,847 @@
+#!/bin/bash
+#/**
+#@file FileSystem.lib
+#@brief Librería o clase FileSystem
+#@class FileSystem
+#@brief Funciones para gestión de sistemas de archivos.
+#@version 0.9
+#@warning License: GNU GPLv3+
+#*/
+
+
+#/**
+# ogCheckFs int_ndisk int_npartition
+#@brief Comprueba el estado de un sistema de archivos.
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c int_npartition nº de orden de la partición
+#@return (nada)
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
+#@note Requisitos: *fsck*
+#@warning No se comprueban sistemas de archivos montados o bloqueados.
+#@todo Definir salidas.
+#@version 0.9 - Primera adaptación para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-10-07
+#*/
+function ogCheckFs () {
+
+# Variables locales
+local PART TYPE
+
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+#/// Obtener partición.
+PART="$(ogDiskToDev $1 $2)" || return $?
+
+TYPE=$(ogGetFsType $1 $2)
+case "$TYPE" in
+ EXT[234]) PROG="e2fsck" ;;
+ REISERFS) PROG="reiserfsck"; PARAMS="<<<\"Yes\"" ;;
+ JFS) PROG="fsck.jfs" ;;
+ XFS) PROG="fsck.xfs" ;;
+ NTFS|HNTFS) PROG="ntfsfix" ;;
+ FAT32|FAT32) PROG="fsck.vfat" ;;
+ FAT16|FAT16) PROG="fsck.msdos" ;;
+ *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
+ return $? ;;
+esac
+#/// Error si el sistema de archivos esta montado o bloqueado.
+if ogIsMounted $1 $2; then
+ ogRaiseError $OG_ERR_PARTITION "$1 $2" # Indicar nuevo error
+ return $?
+fi
+if ogIsLocked $1 $2; then
+ ogRaiseError $OG_ERR_LOCKED "$1 $2"
+ return $?
+fi
+#/// Comprobar en modo uso exclusivo.
+ogLock $1 $2
+eval $PROG $PARAMS $PART
+ERRCODE=$?
+case $ERRCODE in
+ 0) ;;
+ 127) ogRaiseError $OG_ERR_NOTEXEC "$PROG" ;;
+ *) ogRaiseError $OG_ERR_PARTITION "$1 $2" ;;
+esac
+ogUnlock $1 $2
+return $ERRCODE
+}
+
+
+#/**
+# ogExtendFs int_ndisk int_npartition
+#@brief Extiende un sistema de archivos al tamaño de su partición.
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@return (nada)
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
+#@note Requisitos: *resize*
+#@version 0.9 - Primera adaptación para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-23
+#*/
+function ogExtendFs () {
+
+# Variables locales.
+local PART PROG PARAMS
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Obtener partición.
+PART="$(ogDiskToDev $1 $2)" || return $?
+
+ogUnmount $1 $2 >/dev/null
+#/// Redimensionar al tamano máximo según el tipo de partición.
+TYPE=$(ogGetFsType $1 $2)
+case "$TYPE" in
+ EXT[234]) PROG="resize2fs"; PARAMS="-f" ;;
+ REISERFS) PROG="resize_reiserfs"; PARAMS="-f" ;;
+ NTFS|HNTFS) PROG="ntfsresize"; PARAMS="<<<\"y\" -f" ;;
+ *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
+ return $? ;;
+esac
+#/// Error si el sistema de archivos está montado o bloqueado.
+if ogIsMounted $1 $2; then
+ ogRaiseError $OG_ERR_PARTITION "$1 $2" # Indicar nuevo error
+ return $?
+fi
+if ogIsLocked $1 $2; then
+ ogRaiseError $OG_ERR_LOCKED "$1 $2"
+ return $?
+fi
+#/// Redimensionar en modo uso exclusivo.
+ogLock $1 $2
+eval $PROG $PARAMS $PART
+ERRCODE=$?
+case $ERRCODE in
+ 0) ;;
+ 127) ogRaiseError $OG_ERR_NOTEXEC "$PROG" ;;
+ *) ogRaiseError $OG_ERR_PARTITION "$1 $2" ;;
+esac
+ogUnlock $1 $2
+return $ERRCODE
+}
+
+
+#/**
+# ogFormat int_ndisk int_npartition
+#@see ogFormatFs
+#*/
+function ogFormat () {
+ogFormatFs "$@"
+}
+
+
+#/**
+# ogFoarmatFs int_ndisk int_npartition [type_fstype] [str_label]
+#@brief Formatea un sistema de ficheros según el tipo de su partición.
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c int_npartition nº de orden de la partición
+#@arg \c type_fstype mnemónico de sistema de ficheros a formatear
+#@arg \c str_label etiqueta de volumen (opcional)
+#@return (por determinar)
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Partición no accesible o desconocida.
+#@note Requisitos: mkfs*
+#@warning No formatea particiones montadas ni bloqueadas.
+#@todo Definir salidas.
+#@version 0.9 - Primera versión para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-10-08
+#*/
+function ogFormatFs () {
+
+# Variables locales
+local PART ID TYPE LABEL PROG PARAMS ERRCODE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition [str_label]" \
+ "$FUNCNAME 1 1" \
+ "$FUNCNAME 1 1 EXT4" \
+ "$FUNCNAME 1 1 DATA" \
+ "$FUNCNAME 1 1 EXT4 DATA"
+ return
+fi
+#/// Error si no se reciben entre 2 y 4 parámetros.
+[ $# -ge 2 -a $# -le 4 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+#/// Obtener dispositivo y tipo de sisitema de archivos.
+PART="$(ogDiskToDev $1 $2)" || return $?
+TYPE="$(ogGetFsType $1 $2)" || return $?
+
+#/// Elegir tipo de formato segun el tipo de particion.
+case "$3" in
+ EXT2) ID=83; PROG="mkfs.ext2";;
+ EXT3) ID=83; PROG="mkfs.ext3";;
+ EXT4) ID=83; PROG="mkfs.ext4";;
+ REISERFS) ID=83; PROG="mkfs.reiserfs"; PARAMS="-f" ;;
+ REISER4) ID=83; PROG="mkfs.reiser4";;
+ XFS) ID=83; PROG="mkfs.xfs"; PARAMS="-f" ;;
+ JFS) ID=83; PROG="mkfs.jfs"; PARAMS="<<<\"y\"";;
+ NTFS) ID=7; PROG="mkntfs"; PARAMS="-f" ;;
+ HNTFS) ID=17; PROG="mkntfs"; PARAMS="-f" ;;
+ FAT32) ID=b; PROG="mkfs.vfat" ;;
+ HFAT32) ID=1b; PROG="mkfs.vfat" ;;
+ FAT16) ID=6; PROG="mkfs.msdos" ;;
+ HFAT16) ID=16; PROG="mkfs.msdos" ;;
+ *) LABEL="$3" ;;
+esac
+#/// Si no se indica explícitamente, detectar el tipo de sistema de archivos.
+if [ -z "$PROG" ]; then
+ case "$TYPE" in
+ EXT2) PROG="mkfs.ext2";;
+ EXT3) PROG="mkfs.ext3";;
+ EXT4) PROG="mkfs.ext4";;
+ REISERFS) PROG="mkfs.reiserfs"; PARAMS="-f" ;;
+ REISER4) PROG="mkfs.reiser4";;
+ XFS) PROG="mkfs.xfs"; PARAMS="-f" ;;
+ JFS) PROG="mkfs.jfs"; PARAMS="<<<\"y\"";;
+ NTFS|HNTFS) PROG="mkntfs"; PARAMS="-f" ;;
+ FAT32|HFAT32) PROG="mkfs.vfat" ;;
+ FAT16|HFAT16) PROG="mkfs.msdos" ;;
+ *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
+ return $? ;;
+ esac
+else
+ [ $TYPE == "$3" -o $ID == "$(ogGetPartitionId $1 $2)" ] || ogRaiseError $OG_ERR_PARTITION "$3 != $TYPE" || return $?
+fi
+#/// Comprobar consistencia entre id. de partición y tipo de sistema de archivos.
+[ -n "$PROG" ] || ogRaiseError $OG_ERR_PARTITION "$3 != $TYPE" || return $?
+
+#/// Etiquetas de particion.
+if [ -z "$LABEL" ]; then
+ [ "$4" != "CACHE" ] || ogRaiseError $OG_ERR_FORMAT "$MSG_RESERVEDVALUE: CACHE" || return $?
+ [ -n "$4" ] && PARAMS="$PARAMS -L $4"
+else
+ PARAMS="$PARAMS -L $LABEL"
+fi
+
+#/// Error si la particion esta montada o está bloqueada.
+if ogIsMounted $1 $2; then
+ ogRaiseError $OG_ERR_PARTITION "$1 $2" # Indicar nuevo error
+ return $?
+fi
+if ogIsLocked $1 $2; then
+ ogRaiseError $OG_ERR_LOCKED "$1 $2"
+ return $?
+fi
+#/// Formatear en modo uso exclusivo.
+ogLock $1 $2
+eval $PROG $PARAMS $PART 2>/dev/null
+ERRCODE=$?
+case $ERRCODE in
+ 0) ;;
+ 127) ogRaiseError $OG_ERR_NOTEXEC "$PROG" ;;
+ *) ogRaiseError $OG_ERR_PARTITION "$1 $2" ;;
+esac
+ogUnlock $1 $2
+return $ERRCODE
+}
+
+
+#/**
+# ogGetFsType int_ndisk int_npartition
+#@brief Devuelve el mnemonico con el tipo de sistema de archivos.
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@return Mnemonico
+#@note Mnemonico: { EXT2, EXT3, EXT4, REISERFS, LINUX-SWAP, LINUX-LVM, LINUX-RAID, FAT16, HFAT16, FAT32, HFAT32, NTFS, HNTFS, WIN-DYNAMIC, CACHE, EMPTY, EXTENDED, UNKNOWN }
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@version 0.9 - Primera adaptación para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-07-21
+#*/
+function ogGetFsType () {
+
+# Variables locales.
+local DISK ID TYPE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1 => NTFS"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Detectar id. de tipo de partición y codificar al mnemonico.
+DISK=$(ogDiskToDev $1) || return $?
+ID=$(ogGetPartitionId $1 $2) || return $?
+case "$ID" in
+ 0) TYPE="EMPTY" ;;
+ 1) TYPE="FAT12" ;;
+ 5|f) TYPE="EXTENDED" ;;
+ [6e]) TYPE="FAT16" ;;
+ 7) TYPE="NTFS" ;; # Nota: también puede ser EXFAT
+ [bc]) TYPE="FAT32" ;;
+ 11) TYPE="HFAT12" ;;
+ 12) TYPE="COMPAQDIAG" ;;
+ 1[6e]) TYPE="HFAT16" ;;
+ 17) TYPE="HNTFS" ;;
+ 1[bc]) TYPE="HFAT32" ;;
+ 42) TYPE="WIN-DYNAMIC" ;;
+ 82) TYPE="LINUX-SWAP" ;;
+ 83) TYPE="$(parted -s $DISK print | awk -v var=$2 '{if ($1==var) {print toupper($6)}}')"
+ TYPE=${TYPE:-"EXT3"}
+ ;;
+ 8e) TYPE="LINUX-LVM" ;;
+ a7) TYPE="CACHE" ;; # (compatibilidad con Brutalix)
+ bf) TYPE="SOLARIS" ;;
+ ca) TYPE="CACHE" ;;
+ fd) TYPE="LINUX-RAID" ;;
+ *) TYPE="UNKNOWN" ;;
+esac
+echo $TYPE
+}
+
+
+#/**
+# ogGetMountPoint int_ndisk int_npartition
+#@brief Devuelve el punto de montaje de un sistema de archivos.
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c int_npartition nº de orden de la partición
+#@return Punto de montaje
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@version 0.9 - Primera versión para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-10-15
+#*/
+function ogGetMountPoint () {
+
+# Variables locales
+local PART
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1 => /mnt/sda1"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+#/// Obtener partición.
+PART="$(ogDiskToDev $1 $2)" || return $?
+
+echo $(mount | awk -v P=$PART '{if ($1==P) {print $3}}')
+}
+
+
+#/**
+# ogIsMounted int_ndisk int_npartition
+#@brief Comprueba si un sistema de archivos está montado.
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c int_npartition nº de orden de la partición
+#@return Código de salida: 0 - sin montar, 1 - montado.
+#@version 0.9 - Primera versión para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-10-15
+#*/
+function ogIsMounted () {
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "if $FUNCNAME 1 1; then ... ; fi"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+test -n "$(ogGetMountPoint $1 $2)"
+}
+
+
+#/**
+# ogIsLocked int_ndisk int_npartition
+#@brief Comprueba si una partición está bloqueada por una operación de uso exclusivo.
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c int_npartition nº de orden de la partición
+#@return Código de salida: 0 - sin bloquear, 1 - bloqueada.
+#@note El fichero de bloqueo se localiza en \c /var/lock/part, siendo \c part el dispositivo de la partición, sustituyendo el carácter "/" por "-".
+#@version 0.9 - Primera versión para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-03
+#*/
+function ogIsLocked () {
+
+# Variables locales
+local PART LOCKFILE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "if $FUNCNAME 1 1; then ... ; fi"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Obtener partición.
+PART="$(ogDiskToDev $1 $2)" || return $?
+
+#/// Comprobar existencia del fichero de bloqueo.
+LOCKFILE="/var/lock/lock${PART//\//-}"
+test -f $LOCKFILE
+}
+
+
+#/**
+# ogLock int_ndisk int_npartition
+#@see ogLockPartition
+#*/
+function ogLock () {
+ogLockPartition "$@"
+}
+
+#/**
+# ogLockPartition int_ndisk int_npartition
+#@brief Genera un fichero de bloqueo para una partición en uso exlusivo.
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@return (nada)
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@note El fichero de bloqueo se localiza en \c /var/lock/part, siendo \c part el dispositivo de la partición, sustituyendo el carácter "/" por "-".
+#@version 0.1 - En pruebas para adaptarla a OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-03
+#*/
+function ogLockPartition () {
+
+# Variables locales
+local PART LOCKFILE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Obtener partición.
+PART="$(ogDiskToDev $1 $2)" || return $?
+
+#/// Crear archivo de bloqueo exclusivo.
+LOCKFILE="/var/lock/lock${PART//\//-}"
+touch $LOCKFILE
+}
+
+
+#/**
+# ogMount int_ndisk int_npartition
+#@see ogMountFs ogMountCdrom
+#*/
+function ogMount () {
+case "$*" in
+ CACHE|cache)
+ ogMountCache ;;
+ CDROM|cdrom)
+ ogMountCdrom ;;
+ *) ogMountFs "$@" ;;
+esac
+}
+
+
+#/**
+# ogMountFs int_ndisk int_npartition
+#@brief Monta un sistema de archivos.
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@return Punto de montaje
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Tipo de particion desconocido o no se puede montar.
+#@version 0.9 - Primera versión para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-28
+#*/
+function ogMountFs () {
+
+#/// Variables locales
+local PART TYPE MNTDIR MOUNT
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1 => /mnt/sda1"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Obtener partición.
+PART="$(ogDiskToDev $1 $2)" || return $?
+
+#/// Comprobar si el sistema de archivos ya está montada.
+MNTDIR="$(ogGetMountPoint $1 $2)"
+#/// Si no, montarla en un directorio de sistema
+if [ -z "$MNTDIR" ]; then
+ # Error si la particion esta bloqueada.
+ ogIsLocked $1 $2 && ogRaiseError $OG_ERR_LOCKED "$1 $2" && return $?
+ #/// Crear punto de montaje.
+ MNTDIR=${PART/dev/mnt}
+ mkdir -p $MNTDIR
+ #/// Montar según el tipo de sitema de archivos.
+ TYPE="$(ogGetFsType $1 $2)" || return $?
+ case "$TYPE" in
+ CACHE) MOUNT=mount ;;
+ EXT[234]) MOUNT=mount ;;
+ REISERFS) insmod /lib/modules/$(uname -r)/kernel/fs/reiserfs/reiserfs.ko 2>/dev/null
+ MOUNT=mount ;;
+ JFS) insmod /lib/modules/$(uname -r)/kernel/fs/jfs/jfs.ko 2>/dev/null
+ MOUNT=mount ;;
+ XFS) insmod /lib/modules/$(uname -r)/kernel/fs/xfs/xfs.ko 2>/dev/null
+ MOUNT=mount ;;
+ NTFS|HNTFS) MOUNT=ntfs-3g ;;
+ FAT16|FAT32|HFAT16|HFAT32)
+ MOUNT=mount; ARGS="-t vfat" ;;
+ *) #/// Error, si la partición no es montable.
+ rmdir $MNTDIR
+ ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE"
+ return $OG_ERR_PARTITION
+ ;;
+ esac
+ $MOUNT $ARGS $PART $MNTDIR || $MOUNT $ARGS $PART $MNTDIR -o force,remove_hiberfile || ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE" || return $?
+ # linea temporal durante desarrollo para poder usar el cliente completo nfs y testeas nuevas herramientas.
+ if grep -q nfsroot /proc/cmdline; then
+ echo "$PART $MNTDIR" >> /etc/mtab
+ fi
+ # fin linea temporal.
+fi
+echo $MNTDIR
+}
+
+
+##### PRUEBAS
+# Montar CDROM
+function ogMountCdrom () {
+local DEV MNTDIR
+DEV="/dev/cdrom" # Por defecto
+MNTDIR=$(mount | awk -v D=$DEV '{if ($1==D) {print $3}}')
+if [ -z "$MNTDIR" ]; then
+ MNTDIR=${DEV/dev/mnt}
+ mkdir -p $MNTDIR
+ mount -t iso9660 $DEV $MNTDIR || ogRaiseError $OG_ERR_PARTITION "cdrom" || return $?
+fi
+echo $MNTDIR
+}
+
+
+#/**
+# ogReduceFs int_ndisk int_npartition
+#@brief Reduce el tamaño del sistema de archivos, sin tener en cuenta el espacio libre.
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@return tamañoKB
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
+#@warning El sistema de archivos se amplía al mínimo + 1 KB.
+#@note Requisitos: *resize*
+#@version 0.1 - En pruebas para adaptarla a OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-23
+#*/
+function ogReduceFs () {
+
+# Variables locales
+local PART BLKS SIZE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Obtener partición.
+PART="$(ogDiskToDev $1 $2)" || return $?
+
+#/// Redimensionar según el tipo de particion.
+case "$(ogGetFsType $1 $2)" in
+ EXT[234])
+ ogUnmount $1 $2 >/dev/null
+ # Ext2/3/4: Tamaño de los bloques del sistema de archivos
+ BLKS=$(tune2fs -l $PART | awk '/Block size/ {print int($3/512)}')
+ # Traduce el num. en sectores de 512B a tamano en MB.
+ SIZE=$(resize2fs -P $PART 2>/dev/null | \
+ awk -v B=$BLKS '/minimum size/ {print int($7*B/2048+1000)}')
+ resize2fs -fp $PART "${SIZE}M" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
+ ;;
+ REISERFS) # Usar "resize_reiserfs"
+ ;;
+ NTFS|HNTFS)
+ rm -f $(ogGetPath $1 $2 pagefile.sys)
+ ogUnmount $1 $2 >/dev/null
+ #NTFS: Obtiene tamano minimo en MB.
+ SIZE=$(ntfsresize -fi $PART | awk '/resize at/ {print $8+1000}')
+ ntfsresize -fns "${SIZE}M" $PART >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
+ ntfsresize -fs "${SIZE}M" $PART <<<"y" >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
+ ;;
+ *) ogRaiseError $OG_ERR_PARTITION "$1,$2"
+ return $? ;;
+esac
+#/// Mostrar nuevo tamaño en KB.
+echo $[SIZE*1024]
+}
+
+
+#/**
+# ogUnlock int_ndisk int_npartition
+#@see ogUnlockPartition
+#*/
+function ogUnlock () {
+ogUnlockPartition "$@"
+}
+
+#/**
+# ogUnlockPartition int_ndisk int_npartition
+#@brief Elimina el fichero de bloqueo para una particion.
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@return (nada)
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@note El fichero de bloqueo se localiza en \c /var/lock/part, siendo \c part el dispositivo de la partición, sustituyendo el carácter "/" por "-".
+#@version 0.1 - En pruebas para adaptarla a OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-03
+#*/
+function ogUnlockPartition () {
+
+# Variables locales
+local PART LOCKFILE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 1"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Obtener partición.
+PART="$(ogDiskToDev $1 $2)" || return $?
+
+#/// Borrar archivo de bloqueo exclusivo.
+LOCKFILE="/var/lock/lock${PART//\//-}"
+rm -f $LOCKFILE
+}
+
+
+
+#/**
+# ogUnmount int_ndisk int_npartition
+#@see ogUnmountFs
+#*/
+function ogUnmount () {
+ogUnmountFs "$@"
+}
+
+#/**
+# ogUnmountFs int_ndisk int_npartition
+#@brief Desmonta un sistema de archivos.
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@return Nada
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@warning La partición no está previamente montada o no se puede desmontar.
+#@version 0.9 - Primera versión para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-28
+#*/
+function ogUnmountFs () {
+
+# Variables locales
+local PART MNTDIR
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" "$FUNCNAME 1 1"
+ return
+fi
+#/// Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Obtener partición y punto de montaje.
+PART="$(ogDiskToDev $1 $2)" || return $?
+MNTDIR="$(ogGetMountPoint $1 $2)"
+
+#/// Si está montada, desmontarla.
+if [ -n "$MNTDIR" ]; then
+ # Error si la particion esta bloqueada.
+ ogIsLocked $1 $2 && ogRaiseError $OG_ERR_LOCKED "$1 $2" && return $?
+ #/// Crear punto de montaje.
+ umount $PART 2>/dev/null && rmdir $MNTDIR || ogEcho warning "$FUNCNAME: $MSG_DONTUNMOUNT: \"$1,$2\""
+ # linea temporal durante desarrollo para testear nuevas herramientas con el cliente completo nfs
+ if grep -q nfsroot /proc/cmdline; then
+ cat /etc/mtab | grep -v $PART > /var/tmp/mtab.temporal && cp /var/tmp/mtab.temporal /var/tmp/mtab && rm /var/tmp/mtab.temporal
+ fi
+ # fin linea temporal.
+else
+ ogEcho warning "$MSG_DONTMOUNT: \"$1,$2\""
+fi
+}
+
+
+#/**
+# ogUnmountAll int_ndisk
+#@brief Desmonta todos los sistema de archivos de un disco, excepto el caché local.
+#@arg \c int_ndisk nº de orden del disco
+#@return Nada
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@warning No se desmonta la partición marcada como caché local.
+#@version 0.9 - Versión para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009/10/07
+#*/
+function ogUnmountAll () {
+
+# Variables locales
+local DISK PART
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "FUNCNAME 1"
+ return
+fi
+#/// Error si no se recibe 1 parámetro.
+[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Obtener partición y punto de montaje.
+DISK="$(ogDiskToDev $1)" || return $?
+for ((PART=1; PART<=$(ogGetPartitionsNumber $1); PART++)); do
+ case "$(ogGetFsType $1 $PART)" in
+ CACHE|LINUX-SWAP)
+ ;;
+ *)
+ ogUnmount $1 $PART ;;
+ esac
+done
+}
+
+
+function ogFindCache () {
+#/** @function ogFindCache: @brief Detecta la particion CACHE EAC seg�n tipo a7 o label CACHE sobre particion ext3.
+#@param no requiere parametros
+#@return devuelve el identificador linux de la particion CACHE.
+#@warning si no hay cache no devuelve nada
+#@attention Requisitos: la salida de fdisk de la cache a7 debe ser NeXTSTEP
+#@note Notas sin especificar
+#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
+#*/
+#
+if [ $# != 0 ]
+then
+ Msg "FindCache detecta la particion tipo a7 o aquella que tenga el label CACHE" info
+ Msg "devuelve /dev/sda3" info2
+ Msg "sintaxis: FindCache --- Ejemplo: FindCache -> /dev/sda3/ " example
+ return
+fi
+end=`ogDiskToDev | wc -w`
+unset cache
+for (( disk = 1; disk <= $end; disk++))
+do
+ disco=`ogDiskToDev $disk`
+ totalpart=`parted $disco print | egrep ^" [0123456789] " -c`
+ #echo Buscando en disco: $disco con $totalpart particiones
+ if [ `fdisk -l $disco | egrep ^/dev | grep NeXTSTEP | cut -f1 -d" "` ]
+ then
+ # echo comprobando si es particion a7
+ cache=`fdisk -l $disco | egrep ^/dev | grep NeXTSTEP | cut -f1 -d" "`
+ else
+ #echo comprobando si existe la etiqueta cache
+ if find /dev/disk | grep CACHE > /dev/null
+ then
+ devcache=`ls -ls /dev/disk/by-label/CACHE | awk -F..\/..\/ '{print $2}'`
+ cache=/dev/$devcache
+ fi
+ fi
+done
+if [ -n "$cache" ]
+then
+ echo $cache
+else
+ return 1
+fi
+}
+
+function ogMountCache () {
+#/** @function ogMountCache: @brief Monta la particion Cache y exporta la variable $OGCAC
+#@param sin parametros
+#@return Punto de montaje dentro de mnt, ejemplo con un parametro: ogMountCache => /mnt/sda3
+#@warning Salidas de errores no determinada
+#@warning
+#@attention
+#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga. Proyecto EAC
+#@note
+#*/
+CACHELINUX=`ogFindCache`
+CACHEOG=`ogDevToDisk $CACHELINUX`
+OGCAC=`ogMount $CACHEOG`
+echo $OGCAC
+export OGCAC
+}
+
+function ogUnmountCache () {
+#/** @function UmountCache: @brief Desmonta la particion Cache y elimina la variable $OGCAC
+#@param sin parametros
+#@return nada
+#@warning Salidas de errores no determinada
+#@warning
+#@attention
+#@version 1.0 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga. Proyecto EAC
+#@note
+#*/
+CACHELINUX=`ogFindCache`
+CACHEOG=`ogDevToDisk $CACHELINUX`
+#echo ogUnmountPartition $cacheeac
+ogUnmountPartition $CACHEOG
+unset OGCAC
+}
+
+
+function ogFormatCache () {
+#/** @function ogFormatCache: @brief Formatea la Cache EAC y le asigna el label CACHE
+#@param No requiere
+#@return la propia del mkfs.ext3
+#@warning
+#@attention
+#@note
+#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
+#*/
+
+if [ $# = 0 ]
+then
+ cd /
+ ogUnmountCache
+ dev=`ogFindCache`
+ Msg "Iniciando el formateo de la particion CACHE, ubicada en $dev, y asignandole el label CACHE" red
+ mkfs.ext3 $dev -L CACHE
+ ogInfoCache
+fi
+if [ $# = 1 ]
+then
+ mkfs.ext3 $1 -L CACHE
+fi
+}
diff --git a/client/engine/Image.lib b/client/engine/Image.lib
new file mode 100755
index 00000000..0821d093
--- /dev/null
+++ b/client/engine/Image.lib
@@ -0,0 +1,324 @@
+#!/bin/bash
+#/**
+#@file Image.lib
+#@brief Librería o clase Image
+#@class Image
+#@brief Funciones para creación, restauración y clonación de imágenes de sistemas.
+#@version 0.9
+#@warning License: GNU GPLv3+
+#*/
+
+
+#/**
+# ogCreateImage int_ndisk int_npartition str_repo path_image
+#@brief Crea una imagen a partir de una partición.
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@arg \c str_repo repositorio de imágenes (remoto o caché local)
+#@arg \c path_image camino completo de la imagen (sin extensión)
+#@return (nada, por determinar)
+#@note repo = { REPO, CACHE }
+#@exception OG_ERR_FORMAT formato incorrecto.
+#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
+#@exception OG_ERR_PARTITION partición no accesible o no soportada.
+#@exception OG_ERR_LOCKED particion bloqueada por otra operación.
+#@exception OG_ERR_IMAGE error al crear la imagen del sistema.
+#@warning En pruebas iniciales
+#@todo Comprobaciones, control de errores, definir parámetros, caché/repositorio, etc.
+#@version 0.9 - Versión en pruebas para OpenGNSys
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009/10/07
+#*/
+function ogCreateImage () {
+
+# Variables locales
+local PART IMGDIR IMGFILE ERRCODE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npart path_dir str_image" \
+ "$FUNCNAME 1 1 aula1 winxp"
+ return
+fi
+#/// Error si no se reciben menos de 2 parámetros.
+[ $# -lt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $?
+
+PART="$(ogDiskToDev $1 $2)" || return $?
+if ogIsLocked $1 $2; then
+ ogRaiseError $OG_ERR_LOCKED "$1,$2"
+ return $?
+fi
+IMGDIR=$(ogGetParentPath "$3" "$4")
+[ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$3 $(dirname $4)" || return $?
+IMGFILE="$IMGDIR/$(basename "$4")"
+ogUnmount $1 $2 2>/dev/null
+
+ogLock $1 $2 || return $?
+trap "ogUnlock $1 $2; rm -f $IMGFILE" 1 2 6 9
+
+TYPE="$(ogGetFsType $1 $2)"
+case "$TYPE" in
+ EXT[234]|REISERFS)
+ partimage -M -f3 -o -d -V0 -B gui=no -c -z1 save $PART "$IMGFILE"
+ ;;
+ NTFS|HNTFS)
+ partimage -M -f3 -o -d -V0 -B gui=no -c -z1 save $PART "$IMGFILE"
+ ;;
+ FAT16|FAT32|HFAT16|HFAT32)
+ partimage -M -f3 -o -d -V0 -B gui=no -c -z1 save $PART "$IMGFILE"
+ ;;
+ *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
+ return $? ;;
+esac
+
+#/// Controlar salida de error y desbloquear partición.
+ERRCODE=$?
+if [ $ERRCODE != 0] ]; then
+ ogRaiseError $OG_ERR_IMAGE "$1 $2 $IMGFILE"
+ rm -f "$IMGFILE"
+fi
+ogUnlock $1 $2
+return $ERRCODE
+}
+
+
+#/**
+# ogGetImageSize str_repo path_image
+#@brief Devuelve el tamaño del sistema de archivos almacenado en un fichero de imagen.
+#@arg \c str_repo repositorio de imágenes o caché local
+#@arg \c path_image camino de la imagen
+#@return tamaño (en KB)
+#@exception OG_ERR_FORMAT formato incorrecto.
+#@exception OG_ERR_NOTFOUND fichero de imagen no encontrado.
+#*/
+#@warning En pruebas iniciales
+#@todo Definición de parámetros y salidas.
+#@version 0.1 - Primera versión muy en pruebas para OpenGNSys
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009/09/11
+#*/
+function ogGetImageSize () {
+
+# Variables locales
+local IMGFILE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk int_npart" \
+ "$FUNCNAME aula1 winxp ==> 5642158"
+ return
+fi
+#/// Error si no se reciben menos de 2 parámetros.
+[ $# -lt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $?
+#/// Error si el fichero de imagen no es accesible.
+IMGFILE=$(ogGetPath "$1" "$2") || return $?
+[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $?
+
+#/// Devuelve el tamaño de la imagen en KB.
+partimage -B gui=no imginfo "$IMGFILE" 2>&1 | \
+ awk '/Partition size/ {sub(/\.\.+/," "); printf "%d\n",$3*1024*1024;}'
+}
+
+
+#### PRUEBAS
+# Obtener tipo de imagen
+function ogGetImageType () {
+local IMGFILE
+IMGFILE=$(ogGetPath "$1" "$2") || return $?
+[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $?
+partimage -B gui=no imginfo "$IMGFILE" 2>&1 | \
+ awk '/^Filesystem/ {sub(/\.\.+/," "); sub(/fs$/,""); print toupper($2);}'
+}
+
+
+#/**
+# ogRestoreImage str_repo path_image int_ndisk int_npartition
+#@brief Restaura una imagen de sistema de archivos en una partición.
+#@arg \c str_repo repositorio de imágenes o caché local
+#@arg \c path_image camino de la imagen
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c int_npartition nº de orden de la partición
+#@return (por determinar)
+#@exception OG_ERR_FORMAT formato incorrecto.
+#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados.
+#@exception OG_ERR_LOCKED partición bloqueada por otra operación.
+#@exception OG_ERR_IMAGE error al restaurar la imagen del sistema.
+#@warning En pruebas iniciales
+#@todo Comprobar incongruencias partición-imagen, control de errores, definir parámetros, caché/repositorio, etc.
+#@version 0.1 - Primera versión muy en pruebas para OpenGNSys
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009/09/10
+#*/
+function ogRestoreImage () {
+
+# Variables locales
+local PART IMGFILE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk int_npart" \
+ "$FUNCNAME aula1 winxp 1 1"
+ return
+fi
+#/// Error si no se reciben menos de 2 parámetros.
+[ $# -lt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $?
+
+PART="$(ogDiskToDev $3 $4)" || return $?
+IMGFILE=$(ogGetPath "$1" "$2") || return $?
+[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $?
+# Error si la imagen no cabe en la particion.
+[ $(ogGetImageSize "$1" "$2") -gt $(ogGetPartitionSize $3 $4) ] && ogRaiseError $OG_ERR_PARTITION && return $?
+
+#/// Comprobar el bloqueo de la partición, desmontarla y bloquearla.
+if ogIsLocked $3 $4; then
+ ogRaiseError $OG_ERR_LOCKED "$3,$4"
+ return $?
+fi
+ogUnmount $3 $4 >/dev/null || return $?
+ogLock $3 $4 || return $?
+trap "ogUnlock $3 $4" 1 2 3 6 9
+
+#/// Restaurar según el tipo de sistema de archivos.
+#/// Atención: no se comprueba incongruencia entre partición e imagen.
+TYPE="$(ogGetFsType $3 $4)"
+case "$TYPE" in
+ EXT[234]|REISERFS)
+ partimage -M -f3 -o -d -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE" || ogRaiseError $OG_ERR_IMAGE "$IMGFILE,$3,$4" || return $?
+ ;;
+ NTFS|HNTFS)
+ partimage -M -f3 -o -d -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE" || ogRaiseError $OG_ERR_IMAGE "$IMGFILE,$3,$4" || return $?
+ ;;
+ FAT16|FAT32|HFAT16|HFAT32)
+ partimage -M -f3 -o -d -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE" || ogRaiseError $OG_ERR_IMAGE "$IMGFILE,$3,$4" || return $?
+ ;;
+ *) ogRaiseError $OG_ERR_FORMAT
+ return $? ;;
+esac
+
+ogExtendFs $3 $4
+ogUnlock $3 $4
+}
+
+
+function ogCreateImageFromPartition () {
+#/** @function CreateImageFromPartition: @brief Crea una imagen de la particion indicada, utilizando el programa definido en las variable $CloneImageNTFS y $CloneImageEXT23
+#@param $1 int DiskEAC
+#@param $2 int_PartitionEAC
+#@param $3 str_Repositorio ......... parametro pasado a ConectToRepo, admite $REPO $CACHE str_IP_servidorAlterno
+#@param $4 str_pathbase .............. Pathbase, directorio relativo, de la imagen, en EAC, se ha definido que todo repositorio comience por hdimages, pero puede variar, para adaparse a usb, o cualquier otro almacenamiento.
+#@param $5 str_NameImage.str_compresion .......... (como compresion admite gzip y lzop)
+#@param ejemplo: CreateImageFromPartition 1 1 $IP hdimages/pruebas/ base.gzip
+#@return la propia de la herramienta de clonacion partimage o ntfsclone
+#@return genera la imagen con el nombre (imagen.compresion), y se le a?ade un guion y el numero de particion(parametro $2).
+#@return Tambien se solicita al servidor EAC, la creaci?n del fichero meta torrent, que tendra el nombre tal base.gzip-1.torrent,
+#@return Tambien se crea el fichero base.gzip-1.mcast con informacion para su uso con multicast, tal base.gzip-1.mcast
+#@warning Salidas de errores no determinada
+#@attention
+#@note Pendiente: que admita como segundo parametro el valor 0 (para que identifique el MBR del disco)
+#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
+#*/
+if [ $# != 5 ]
+then
+ echo "sintaxis: CreateImageFromPartition <ndisco> <nparticion> <iprespositorio> <pathbase> <nombreimagen.compresion>"
+ echo "ejemplo: CreateImageFromPartition 1 1 \$IP images/pruebas/ base.gzip"
+ echo " en iprepositorio admite cualquier ip de un servdior EAC, se llama a la funcion MountRepo ip"
+fi
+if [ $# = 5 ]
+then
+ CloneImageNTFS="${CLONETOOLSNTFS:-partimage}"
+ CloneImageEXT23="${CLONETOOLSEXT:-partimage}"
+ CompresionImage="${CLONETOOLSCOMPRESSOR:-gzip}"
+
+ disco=`ogDiskToDev $1 $2`
+ ogUnmountPartition $1 $2
+ fs=`ogGetFsType $1 $2`
+
+ echo determinando tipo de Sistema Operativo y consulando la variable global CloneImageNTFS: $fs
+ case $fs in
+ "NTFS")
+ case $CloneImageNTFS in
+ "ntfsclone")
+ #imaged="ntfsclone --force --save-image -O - $disco | "
+ imaged="ntfsclone --force --save-image -O - $disco"
+ program=ntfsclone
+ ;;
+ "partimage")
+ #imaged="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $disco stdout |"
+ imaged="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $disco stdout"
+ program=partimage
+ ;;
+ "partimage-ng")
+ #echo "partimage-ng"
+ #imaged="partimage-ng save $disco stdout"
+ program=partimage-ng
+ ;;
+ "partclone")
+ #echo "partclone"
+ #imaged="partclone.ntfs -c -F -s $disco | "
+ imaged="partclone.ntfs -c -F -s $disco"
+ program=partclone.ntfs
+ #zcat ~/image_sda1.pcl.gz | partclone.ext4 -r -o /dev/sda1
+ ;;
+ esac
+ ;;
+ EXT[234]|REISERFS)
+ case $CloneImageEXT23 in
+ "partimage")
+ imaged="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $disco stdout"
+ program=partimage
+ ;;
+ "partimage-ng")
+ #echo "partimage-ng"
+ imaged="partimage-ng save $disco stdout"
+ program=partimage-ng
+ ;;
+ "partclone")
+ echo "partclone"
+ imaged="partclone.ext3 -c -F -C -s $disco"
+ program=partclone.ext3
+ #zcat ~/image_sda1.pcl.gz | partclone.ext4 -r -o /dev/sda1
+ ;;
+ esac
+ ;;
+ esac
+
+ # utilizando mbuffer para reducir posibles errores de acceso a discos
+ imaged="$imaged | mbuffer -m 70%"
+ #metodo de compresion.
+ case $CompresionImage in
+ "gzip")
+ comando="$imaged | gzip -c >"
+ ;;
+ "lzop")
+ comando="$imaged | lzop >"
+ ;;
+ esac
+
+ #. determnamos el fichero donde se almacenar? la image
+ #camino=`ConnectToRepo $3 $4 $5`
+ #MkdirPath $camino
+ firstcamino=`ogNewPath $3 $4`
+ camino=$firstcamino$5
+ echo $camino
+ sleep 1
+
+ #preparamos y ejecutamos el comanod a realizar
+ echo "Creando imagen particion $disco programa $program compresion $CompresionImage en el repositorio $3 como $4 $5 - $2"
+ comando="$comando ${camino}-$2"
+ echo "comando: $comando"
+ echo $comando > /tmp/run.sh
+ sh /tmp/run.sh
+ unset comando
+
+ #iniciamos la creacion del torrent
+ echo "Iniciando la creacion del punto torrent con CreateTorrentFromImage ip=$3 path=$4 image=$5-$2" echo
+ #CreateTorrentFromImage $3 $4 $5-$2
+ # iniciacmos el putno mcast
+ echo "creando un punto mcast ${camino}-$2.mcast"
+ echo "program;$program" > ${camino}.mcast
+ echo "compresion;$CompresionImage" >> ${camino}.mcast
+ echo "fsimage;$fs" >> ${camino}.mcast
+
+ #UmountRepo $3
+fi
+}
diff --git a/client/engine/Inventory.lib b/client/engine/Inventory.lib
new file mode 100755
index 00000000..a7076fe0
--- /dev/null
+++ b/client/engine/Inventory.lib
@@ -0,0 +1,233 @@
+#!/bin/bash
+#/**
+#@file Inventory.lib
+#@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
+#@warning License: GNU GPLv3+
+#*/
+
+
+#/**
+# ogGetOsVersion int_ndisk int_npartition
+#@brief Devuelve la versión del sistema operativo instalado en un sistema de archivos.
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@return TipoSistema:Versión
+#@note TipoSistema = { Linux, Windows }
+#@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.1 - Primeras pruebas con OpenGNSys
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-15
+#*/
+function ogGetOsVersion () {
+
+# Variables locales.
+local MNTDIR TYPE VERSION FILE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME"
+ return
+fi
+#/// Error si no se reciben 2 parametros.
+[ $# = 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+# 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)"
+ FILE="$MNTDIR/etc/redhat-release"
+ [ -r $FILE ] && VERSION="$(head -1 $FILE)"
+ FILE="$MNTDIR/etc/SuSE-release"
+ [ -r $FILE ] && VERSION="$(head -1 $FILE)"
+ fi
+ [ -e $MNTDIR/lib64 ] && VERSION="$VERSION 64 bits"
+ ;;
+ NTFS | HTNFS | FAT32 | HFAT32)
+ TYPE="Windows"
+ #/// Para Windows: leer la version del registro.
+ VERSION=$(ogGetRegistryValue $MNTDIR software '\Microsoft\Windows NT\CurrentVersion\ProductName')
+ ;;
+esac
+
+#/// Mostrar resultado y salir sin errores.
+[ -n "$VERSION" ] && echo "$TYPE:$VERSION"
+return 0
+}
+
+
+#/**
+# ogListHardwareInfo
+#@brief Lista el inventario de hardware de la máquina cliente.
+#@return TipoDispositivo:Modelo (por determinar)
+#@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
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-07-28
+#*/
+function ogListHardwareInfo () {
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME"
+ return
+fi
+
+#/// Recopilación de disposibivos procesando la salida de \c lshw
+ogEcho info "$MSG_HARDWAREINVENTORY}"
+lshw | awk 'BEGIN {type="mod";}
+ /product:/ {sub(/ *product: */,""); prod=$0;}
+ /vendor:/ {sub(/ *vendor: */,""); vend=$0;}
+ /version:/ {sub(/ *version: */,"v.");vers=$0;}
+ /size:/ {sub(/ *size: */,""); size=$0;}
+ /\*-/ {if (type=="mem")
+ print type"="size;
+ else
+ if (type!="" && prod!="")
+ print type"="vend,prod,size,vers;
+ type=prod=vend=vers=size="";}
+ /-core/ {type="boa";}
+ /-firmware/ {type="bio";}
+ /-cpu/ {type="cpu";}
+ /-memory/ {type="mem";}
+ /-ide/ {type="ide";}
+ /-disk/ {type="dis";}
+ /-cdrom/ {type="cdr";}
+ /-display/ {type="vga";}
+ /-network/ {type="net";}
+ /-multimedia/ {type="mul";}
+ /-usb/ {type="usb";}
+ /-firewire/ {type="fir";}
+ /-serial/ {type="bus";}
+ END {if (type!="" && prod!="")
+ print type"="vend,prod,size,vers;}
+ '
+# */ (necesario para Doxygen)
+}
+
+
+#/**
+# ogListSoftware
+#@brief Lista el inventario de software instalado en un sistema operativo.
+#@return programa versión
+#@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
+#*/
+function ogListSoftware () {
+
+# Variables locales.
+local MNTDIR TYPE DPKGDIR RPMDIR KEYS k PROG VERS
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME 1 1"
+ return
+fi
+#/// Error si no se reciben 2 parametros.
+[ $# = 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+#/// Obtener tipo de sistema de archivos y montarlo.
+TYPE=$(ogGetFsType $1 $2) || return $?
+MNTDIR=$(ogMount $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 | \
+ # 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
+ # 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
+ ;;
+ NTFS|HNTFS|FAT32|HFAT32)
+ # Claves de registro para programas instalados: formato "{clave}".
+ KEYS=$(ogListRegistryKeys $MNTDIR software '\Microsoft\Windows\CurrentVersion\Uninstall')
+ # Mostrar los valores "DisplayName" y "DisplayVersion" para cada clave.
+ (for k in $KEYS; do
+ PROG=$(ogGetRegistryValue $MNTDIR software "\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$k\\DisplayName")
+ if [ -n "$PROG" ]; then
+ VERS=$(ogGetRegistryValue $MNTDIR software "\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$k\\DisplayVersion")
+ echo "$PROG $VERS"
+ fi
+ done) | sort | uniq
+ ;;
+ *) ogRaiseError $OG_ERR_PARTITION "$1,$2"
+ return $? ;;
+esac
+}
+
+function ogInfoCache () {
+#/** @function ogInfoCache: @brief muestra la informacion de la CACHE.
+#@param sin parametros
+#@return texto que se almacena en $IP.-InfoCache. punto_montaje, tama?oTotal, TamanioOcupado, TaminioLibre, imagenes dentro de la cahce
+#@warning Salidas de errores no determinada
+#@warning printf no soportado por busybox
+#@attention
+#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
+#*/
+if ogMountCache
+then
+ info=`df -h | grep $OGCAC`
+ infoFilesystem=`echo $info | cut -f1 -d" "`
+ infoSize=`echo $info | cut -f2 -d" "`
+ infoUsed=`echo $info | cut -f3 -d" "`
+ infoAvail=`echo $info | cut -f4 -d" "`
+ infoUsedPorcet=`echo $info | cut -f5 -d" "`
+ infoMountedOn=`echo $info | cut -f2 -d" "`
+ if `ls ${OGCAC}$OGIMG > /dev/null 2>&1`
+ then
+ cd ${OGCAC}${OPENGNSYS}
+ #content=`find images/ -type f -printf "%h/ %f %s \n"` busybox no soporta printf
+ content=`find images/ -type f`
+ cd /
+ echo $info
+ echo -ne $content
+ echo " "
+ #echo "$info" > ${OGLOG}/${IP}-InfoCache
+ #echo "$content" >> {$OGLOG}/${IP}-InfoCache
+ else
+ echo $info
+ #echo "$info" > {$OGLOG}/${IP}-InfoCache
+ fi
+ ogUnmountCache
+else
+ echo " "
+ #echo " " > {$OGLOG}/${IP}-InfoCache
+
+fi
+}
diff --git a/client/engine/README.es.txt b/client/engine/README.es.txt
new file mode 100644
index 00000000..7651e630
--- /dev/null
+++ b/client/engine/README.es.txt
@@ -0,0 +1,11 @@
+
+OpenGNSys Client Cloning Engine README
+=======================================
+
+En este directorio se incluirán las funciones del motor de clonación de
+OpenGNSys y la documentación asociada.
+
+Las funciones serán accesibles por el cliente en el directorio
+/opt/opengnsys/lib/engine/bin
+
+
diff --git a/client/engine/System.lib b/client/engine/System.lib
new file mode 100755
index 00000000..9ffbf0ab
--- /dev/null
+++ b/client/engine/System.lib
@@ -0,0 +1,115 @@
+#!/bin/bash
+#/**
+#@file System.lib
+#@brief Librería o clase System
+#@class System
+#@brief Funciones básicas del sistema.
+#@version 0.9
+#@warning License: GNU GPLv3+
+#*/
+
+
+#/**
+# ogEcho [loglevel] message...
+#@brief Muestra mensajes en consola y lo registra en fichero de incidencias.
+#@arg \c str_loglevel nivel de registro de incidencias.
+#@arg \c str_message mensaje (puede recibir más de 1 parámetro.
+#@return Mensaje mostrado.
+#@note El nivel de ayuda \c (help) no se registra en el fichero de incidencias.
+#@version 0.9 - Primera versión para OpenGNSys
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-07-23
+#*/
+function ogEcho () {
+
+# Variables locales
+local LOGLEVEL LOGFILE DATETIME
+
+#/// Selección del nivel de registro (opcional).
+case "$1" in
+ help) shift ;;
+ info) LOGLEVEL=$1; shift ;;
+ warning) LOGLEVEL=$1; shift ;;
+ error) LOGLEVEL=$1; shift ;;
+ *) ;;
+esac
+
+#/// Registro de incidencias.
+#[ -w "$OGLOGFILE" ] && LOGFILE="-f $OGLOGFILE"
+#DATETIME=$(date +"%F %T") # pendiente en cliente Initrd
+if [ -n "$LOGLEVEL" ]; then
+ logger -s -t "OpenGNSys $LOGLEVEL" $LOGFILE "$DATETIME $*"
+else
+ echo "$*"
+fi
+}
+
+
+#/**
+# ogRaiseError errcode ["errmessage" ...]
+#@brief Devuelve el mensaje y el código de error correspondiente.
+#@arg \c int_errcode código de error.
+#@arg \c str_errmessage mensajes complementarios de error.
+#@return Mensaje de error.
+#@warning No definidas
+#@note Mensajes internacionales del fichero de idiomas.
+#@version 0.9 - Primera versión para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-07-21
+#*/
+function ogRaiseError () {
+
+# Variables locales
+local MSG CODE
+
+#/// Obtener código y mensaje de error.
+CODE=$1
+case "$CODE" in
+ $OG_ERR_FORMAT) MSG="$MSG_ERR_FORMAT $*" ;;
+ $OG_ERR_NOTFOUND) MSG="$MSG_ERR_NOTFOUND \"$2\"" ;;
+ $OG_ERR_PARTITION) MSG="$MSG_ERR_PARTITION \"$2\"" ;;
+ $OG_ERR_LOCKED) MSG="$MSG_ERR_LOCKED \"$2\"" ;;
+ $OG_ERR_IMAGE) MSG="$MSG_ERR_IMAGE \"$2\"" ;;
+ $OG_ERR_NOTOS) MSG="$MSG_ERR_NOTOS \"$2\"" ;;
+ $OG_ERR_NOTEXEC) MSG="$MSG_ERR_NOTEXEC \"$2\"" ;;
+ *) MSG="$MSG_ERR_GENERIC"; CODE=$OG_ERR_GENERIC ;;
+esac
+
+#/// Mostrar mensaje de error y salir con el código indicado.
+ogEcho error "${FUNCNAME[1]}: $MSG" >&2
+return $CODE
+}
+
+
+#/**
+# ogHelp ["function" ["format" ["example" ... ]]]
+#@brief Muestra mensaje de ayuda para una función determinda.
+#@arg \c str_function Nombre de la función.
+#@arg \c str_format Formato de ejecución de la función.
+#@arg \c str_example Ejemplo de ejecución de la función.
+#@return Salida de ayuda.
+#@note Si no se indican parámetros, la función se toma de la variable \c $FUNCNAME
+#@note La descripción de la función se toma de la variable compuesta por \c MSG_FUNC_$función incluida en el fichero de idiomas.
+#@note Pueden especificarse varios mensajes con ejemplos.
+#@version 0.9 - Primera versión para OpenGNSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-07-27
+#*/
+function ogHelp () {
+
+# Variables locales.
+local FUNC MSG
+
+#/// Mostrar función, descripción y formato.
+FUNC="${1:-${FUNCNAME[${#FUNCNAME[*]}-1]}}"
+MSG="MSG_HELP_$FUNC"
+ogEcho help "$MSG_FUNCTION $FUNC: ${!MSG}"
+[ -n "$2" ] && ogEcho help " $MSG_FORMAT: $2"
+#/// Mostrar ejemplos.
+shift 2
+while [ $# -gt 0 ]; do
+ ogEcho help " $MSG_EXAMPLE: $1"
+ shift
+done
+}
+
diff --git a/client/engine/ToolsGNU.c b/client/engine/ToolsGNU.c
new file mode 100644
index 00000000..20ffff50
--- /dev/null
+++ b/client/engine/ToolsGNU.c
@@ -0,0 +1,37 @@
+#!/bin/bash
+#/**
+#@file ToolsGNU.c
+#@brief Librería o clase Tools GNU used by OpenGNSys
+#@class Tools
+#@brief Herramientas gnu utilizadas por opengnsys.
+#@version 0.9
+#@warning License: GNU GPLv3+
+#*/
+
+
+function awk () {
+}
+
+
+function parted () {
+}
+
+
+
+function fdisk () {
+}
+
+
+function egrep () {
+}
+
+function grep () {
+}
+
+
+function partprobe () {
+}
+
+function ms-sys () {
+}
+}
diff --git a/client/engine/correspondencia-api.txt b/client/engine/correspondencia-api.txt
new file mode 100644
index 00000000..e3cff0f5
--- /dev/null
+++ b/client/engine/correspondencia-api.txt
@@ -0,0 +1,227 @@
+
+OpenGNSys Client Cloning Engine API
+===================================
+
+La API está dividida en librerías de funciones C/BASH o clases C++/PHP.
+La columna de la izquierda es la propuesta de nombre para función/método y la de la derecha es la equivalencia con las actuales en UMA/US/UNIZAR.
+
+En el resto del fichero están las funciones originales que aún no he revisado.
+
+Entre el nombre de la función y sus equivalentes, se añade estado de la migración.
+ version 0.1 incorporada desde hidra, brutalix, EAC, o interfaz hidra-eac pero no compatible.
+ version 0.x proceso de migración
+ version 0.9 totalmente funcional con la estructura definida en las primeras funciones insertadas por Ramón. Un ejemplo es ogPartitionActive de la libreria Disk.lib
+
+
+PROPUESTA
+---------
+
+Librería o clase Install:
+- ogConfigureServer 0.1 (CustomEACServer, InterfazCustomEACServer)
+- ogLoadConfig (scirpt_uso)
+
+Librería o clase System:
+- ogEcho 0.9 (Msg)
+- ogRaiseError (?)
+
+Librería o clase Disk:
+- ogUpdatePartitionTable 0.1 (UpdateDisk)
+- ogDeletePartitionTable 0.1 (DeletePartitionTable, hidraDeletePartitionTable)
+- ogDevToDisk (Disk, IdPartition, hidraDisk)
+- ogDiskToDev 0.9 (DiskEAC)
+ ogDiskToRelativeDev 0.1 (IdPartition)
+- ogCreatePartitions (CreatePartitions, hidraCreatePrimaryPartitions, hidraCreateLogicalPartitions)
+- ogListPartitions (ListPartitions, hidraListPartitions, hidraListPrimaryPartitions, hidraListLogicalPartitions)
+- ogGetPartitionActive (hidraGetPartitionActive)
+- ogSetPartitionActive (SetPartitionActive, hidraSetPartitionActive)
+- ogGetPartitionId 0.9 (?)
+- ogSetPartitionId 0.1 (SetPartitionType)
+- ogGetPartitionSize 0.9 (SizePartition, hidraGetPartitionSize)
+- ogSetPartitionSize (hidraSetPartitionSize)
+ ogGetPartitionsNumber 0.1 (DetectNumberPartition)
+ ogDeletePartitionsLabels 0.1 (DeleteLABELS)
+
+
+Librería o clase FileSystem:
+- ogFormat, ogFormatFs (FormatPartition, hidraFormat)
+- ogFormatCache 0.1 (FormatCACHE, hidraFormatCache)
+- ogExtend, ogExtendFs (EnlargeFileSystem, hidraFSExtend)
+- ogReduce, ogReduceFs (ReduceFileSystem, hidraFSReduce)
+- ogGetFsType (TypeFS, hidraTypeFS)
+- ogSetFsType (SetPartitionType, hidraSetPartitionType)
+- ogFindCache 0.1 (FindCache, hidraFindCache)
+- ogIsLocked, ogIsFsLocked (hidraIsLocked)
+- ogLock, ogLockFs (hidraLock)
+- ogUnlock, ogUnlockFs (hidraUnlock)
+- ogMountFs, ogMount (MountPartition, hidraMount)
+- ogUnmountFs, ogUnmount (UmountPartition, hidraUnmount)
+- ogMountAllFs, ogMountAll (hidraMountAll)
+- ogUnmountAllFs, ogUnmountAll (hidraUnmmountAll)
+- ogMountRepo, ogMount (MountRepo, hidraMountRepo)
+- ogUnmountRepo, ogUnmount (UmountRepo, hidraUnmountRepo)
+- ogMountCache, ogMount 0.1 (MountCache, hidraMountCache)
+- ogUnmountCache, ogUnmount 0.1 (UmountCache, hidraUnmountCache)
+
+Librería o clase Image:
+- ogCreateImage (CreateImageFromPartition, hidraCreateImageFromPartition)
+- ogRestoreImage (RestorePartitionFromImage, RestorePartitionFromPartition, hidraRestorePartitionFromImage)
+- ogGetImageSize (hidraImageSize)
+- ogCreateTorrent (CreateTorrentFromImage)
+
+
+Librería o clase Boot:
+- ogBoot (HDBoot, BootLinuxEX, hidraBoot)
+- ogLinuxBootParameters (hidraLinuxBootParameters)
+- ogInstallGrub (InstallGrub)
+- ogConfigureGrub (ConfGrub)
+- ogListRegistryKeys (hidraListRegistryKeys)
+- ogGetRegistryValue (hidraGetRegistryKey)
+- ogSetRegistryValue (hidraSetRegistryKey)
+- ogGetWindowsName (hidraGetWindowsName)
+- ogSetWindowsName (hidraSetWindowsName)
+ ogNewMbrXP v0.1 (NewMbrXP)
+
+Librería o clase Inventory:
+- ogListHardwareInfo (InfoHardware, DetectDevices, hidraHardwareInfo)
+- ogGetOsVersion (hidraOSVersion)
+- ogListSoftware
+- ogListLinuxSoftware (hidraLinuxSoftware)
+- ogListWindowsSoftware (idraWindowsSoftware)
+ ogInfoCache v.0.1 (infoCache)
+
+Librería o clase File:
+- ogGetPath (ConnectToRepo, hidraPath)
+- ogIsFile (IfFileExist, IfFileNotExist)
+ ogNewPath
+
+Librería o clase String:
+
+Librería o clase ToolsGNU
+
+
+===================
+
+Funciones EAC:
+
+Referencia del Archivo ATA.lib
+
+DetectNumberPartition -> GetPartitionNumber
+NewMbrXP
+DeleteLABELS
+IsFSequalPartition -> CompareSizeFSPartition
+AmpliarFileSystemNT -> desaparece (la anterior detecta el tipo de FS)
+CrearSistemaArchivos
+ELIMINARReducirFileSystemNT
+
+Referencia del Archivo Boot.lib
+
+SetDefaultBoot
+ConvertToGrub
+InstalaGrub4dos
+moddhcpdconf
+
+Referencia del Archivo Deploy.lib
+
+SetDefaultStartpage
+DetectMethodTransfer
+GetImageFile
+UpdateCache
+CheckImage
+DetectInfoImage -> GetImageInfo
+DetectaProgramaImagen -> GetImageProgram
+DetectaFSImagen -> GetImageFS
+DetectCompresionImage -> GetImageCompression
+DeployPartitionFromImage
+OpenArchiveZIP
+OpenArchiveNT
+Synchronize
+MakeOffline
+MountChrootEACclient
+UmountChrootEACclient
+MakePhotoConsole
+BORRARCheckImageTORRENT
+
+Referencia del Archivo EACInstall.lib
+
+BuildEACOSBase
+BuildEACBootAgenPXE
+BuildEACServer
+TestPxe
+
+Referencia del Archivo FileSystem.lib
+
+SizeFileSystem
+InfoCache
+FormatToLower
+FormatToUpper
+FormatSintaxDev
+FormatSintaxSpacePath
+FormatSintaxBackSlashPath
+GetPath
+GetLastStr
+GetFirstStr
+MkdirPath
+DetectaEtiquetas
+WhatsTime
+HowLongHasWorked
+NumberRound
+
+Referencia del Archivo PostConf.lib
+
+CrearPatron
+ParseaSysprep
+NTDetect
+LoadRegistrySystem
+LoadRegistryUsers
+UpdateRegistry
+NTChangeName
+NTDrivers
+NTDrivers2
+NTSetGroupName
+NTSetOwner
+NTAutoLogon
+NTStatusRatonTeclado
+NTRunOnceMachine
+NTRunMachine
+NTRunUser
+NTPolUserOn
+NTPolUserOFF
+NTStatusBootChk
+NTNoMsgNewHardware
+ChangeName
+
+Referencia del Archivo Settings.lib
+
+IPservidor
+IfacesEACclient
+ExportEACconf
+clean
+
+Referencia del Archivo DBProcess.php
+
+ RegistryHost ($mac, $ip)
+ SetHostName ()
+ BootServer ($boot, $ip)
+ Logger ()
+ InsertClassrom ($descripcion, $subred, $netmask, $broadcast, $gateway, $repo_image, $repo_client)
+ InsertItemtoMenu ($menu, $item)
+
+
+Funciones Hidra:
+
+HIDRA (* a las que llama la web de hidra,las demás desaparecen salvo algunas que no existe en EAC)
+
+hidraClientIP
+hidraClientMAC
+hidraDeleteFile
+hidraEACServer
+hidraFSCheck
+hidraPoweroff
+hidraReboot
+hidraUpdateCache
+
+
+Funciones de configuracion Unizar
+
+eac_config_server
+opengnsys_installer
diff --git a/client/engine/loadenviron.sh b/client/engine/loadenviron.sh
new file mode 100755
index 00000000..f92d3cb2
--- /dev/null
+++ b/client/engine/loadenviron.sh
@@ -0,0 +1,89 @@
+#!/bin/bash
+#/**
+#@file loadenviron.sh
+#@brief Script de carga de la API de funciones de OpenGNSys.
+#@warning License: GNU GPLv3+
+#@version 0.9
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-09-16
+#*/
+
+# FIXME Temporal
+export LANG="${LANG:-es_ES}"
+
+#/// Directorios del projecto OpenGNSys.
+export OPENGNSYS="${OPENGNSYS:-/opt/opengnsys}"
+if [ -d $OPENGNSYS ]; then
+ export OGBIN=$OPENGNSYS/bin
+ export OGETC=$OPENGNSYS/etc
+ export OGLIB=$OPENGNSYS/lib
+ export OGAPI=$OGLIB/engine/bin
+ export OGSCRIPTS=$OPENGNSYS/scripts
+ export OGIMG=$OPENGNSYS/images
+ export OGCAC=$OPENGNSYS/cache
+ export OGLOG=$OPENGNSYS/log
+
+ export PATH=$OGBIN:$OGAPI:$OGSCRIPTS:$PATH
+ export LD_LIBRARY_PATH=$OGLIB:$LD_LIBRARY_PATH
+
+ # Para tener /bin/bash y no haya problemas
+ ln -fs $OGBIN/bash /bin/bash
+
+ # Obtener IP del servidor DHCP/NFS
+ SERVERIP=$(awk '/dhcp-server-identifier/ {sub(/;/,""); dhcp=$3}
+ END {print dhcp}' \
+ /var/lib/dhcp3/dhclient.leases)
+
+ export OGLOGFILE=$OGLOG/$OG_IP.log
+
+ # FIXME Pruebas para grupos de ordenadores
+ export OGGROUP=aula3
+
+ # Incluimos el modulo del raton
+ insmod $OGLIB/modules/psmouse.ko
+
+ # Crear directorio de bloqueos
+ mkdir -p /var/lock
+
+ # Montamos el resto de cosas necesarias
+ mount -t nfs -o nolock $SERVERIP:/opt/opengnsys/log/clients $OGLOG
+ mount -t nfs -o nolock $SERVERIP:/opt/opengnsys/images $OGIMG
+
+ #/// Cargar API de funciones y fichero de idioma.
+ for i in $OGAPI/*.lib; do
+ source $i
+ done
+ for i in $(typeset -F | cut -f3 -d" "); do
+ export -f $i
+ done
+ LANGFILE=$OGETC/lang.$LANG.conf
+ if [ -f $LANGFILE ]; then
+ source $LANGFILE
+ for i in $(grep "^[a-zA-Z].*=" $LANGFILE | cut -f1 -d=); do
+ export $i
+ done
+ fi
+
+ # FIXME Necesario temporalmente
+ mkdir -p /usr/local/Trolltech/QtEmbedded-4.5.1/lib/
+ ln -fs $OGLIB/fonts /usr/local/Trolltech/QtEmbedded-4.5.1/lib/fonts
+
+ # FIXME Datos de dispositivos PCI en /etc
+ ln -fs $OGLIB/pci.ids /etc
+
+ # Cargar paquetes udev
+ for i in $OGLIB/udeb/*.udeb; do
+ udpkg -i "$i" >/dev/null && echo "$(basename $i) $MSG_INSTALLED"
+ done
+fi
+
+#/// Declaración de códigos de error.
+export OG_ERR_FORMAT=1 # Formato de ejecución incorrecto.
+export OG_ERR_NOTFOUND=2 # Fichero o dispositivo no encontrado.
+export OG_ERR_PARTITION=3 # Error en partición de disco.
+export OG_ERR_LOCKED=4 # Partición o fichero bloqueado.
+export OG_ERR_IMAGE=5 # Error al crear o restaurar una imagen.
+export OG_ERR_NOTOS=6 # Sin sistema operativo.
+export OG_ERR_NOTEXEC=7 # Programa o función no ejecutable.
+
+