diff options
author | ramon <ramongomez@us.es> | 2009-10-19 09:47:15 +0000 |
---|---|---|
committer | ramon <ramongomez@us.es> | 2009-10-19 09:47:15 +0000 |
commit | 8964f9b26b06f61e20fba15bfe4fb653cc1a31b5 (patch) | |
tree | 8663353fbea6faab97ee1ac38d541d5485771018 /client/engine | |
parent | 87b02b26e403807cf587356ed77ac52c74eba3fd (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-x | client/engine/Boot.lib | 371 | ||||
-rwxr-xr-x | client/engine/Disk.lib | 591 | ||||
-rwxr-xr-x | client/engine/File.lib | 225 | ||||
-rwxr-xr-x | client/engine/FileSystem.lib | 847 | ||||
-rwxr-xr-x | client/engine/Image.lib | 324 | ||||
-rwxr-xr-x | client/engine/Inventory.lib | 233 | ||||
-rw-r--r-- | client/engine/README.es.txt | 11 | ||||
-rwxr-xr-x | client/engine/System.lib | 115 | ||||
-rw-r--r-- | client/engine/ToolsGNU.c | 37 | ||||
-rw-r--r-- | client/engine/correspondencia-api.txt | 227 | ||||
-rwxr-xr-x | client/engine/loadenviron.sh | 89 |
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. + + |