#!/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 1.1.0 #@warning License: GNU GPLv3+ #*/ #/** # ogCreateImageSyntax path_device path_filename [str_tool] [str_compressionlevel] #@brief Genera una cadena de texto con la instrucción para crear un fichero imagen #@param path_device dispositivo Linux del sistema de archivos #@param path_fileneme path absoluto del fichero imagen #@param [opcional] str_tool herrmaienta de clonacion [partimage, partclone, ntfsclone] #@param [opcional] str_compressionlevel nivel de compresion. [0 -none-, 1-lzop-, 2-gzip] #@return str_command - cadena con el comando que se debe ejecutar. #@warning Salida nula si se producen errores. #@TODO introducir las herramientas fsarchiver, dd #@version 1.0 - Primeras pruebas #@author Antonio J. Doblas Viso. Universidad de Málaga #@date 2010/02/08 #@version 1.0.5 - Incrustar códico de antigua función ogPartcloneSyntax #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2012/09/14 #*/ ## function ogCreateImageSyntax() { local FS TOOL LEVEL DEV IMGFILE BUFFER PARAM1 PARAM2 PARAM3 # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME path_device path_imagefile [str_tool] [str_compressionlevel]" \ "$FUNCNAME /dev/sda1 /opt/opengnsys/images/prueba.img partclone lzop" \ "$FUNCNAME /dev/sda1 /opt/opengnsys/images/prueba.img" return fi # Error si no se reciben entre 2 y 4 parámetros. [ $# -ge 2 -a $# -le 4 ] || ogRaiseError $OG_ERR_FORMAT "$*" || return $? # Asignación de parámetros. DEV="$1" IMGFILE="$2" case "$#" in 2) # Sintaxis por defecto OG DEV IMGFILE TOOL="partclone" LEVEL="gzip" ;; 4) # Sintaxis condicionada. TOOL="${3,,}" LEVEL="${4,,}" ;; esac case "$TOOL" in ntfsclone) PARAM1="ntfsclone --force --save-image -O - $DEV" ;; partimage|default) PARAM1="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $DEV stdout" ;; partclone) FS="$(ogGetFsType $(ogDevToDisk $DEV 2>/dev/null) 2>/dev/null)" case "$FS" in EXT[234]) PARAM1="partclone.extfs" ;; BTRFS) PARAM1="partclone.btrfs" ;; REISERFS) PARAM1="partclone.reiserfs" ;; REISER4) PARAM1="partclone.reiser4" ;; JFS) PARAM1="partclone.jfs" ;; XFS) PARAM1="partclone.xfs" ;; F2FS) PARAM1="partclone.f2fs" ;; NILFS2) PARAM1="partclone.nilfs2" ;; NTFS) PARAM1="partclone.ntfs" ;; EXFAT) PARAM1="partclone.exfat" ;; FAT16|FAT32) PARAM1="partclone.fat" ;; HFS|HFSPLUS) PARAM1="partclone.hfsp" ;; UFS) PARAM1="partclone.ufs" ;; VMFS) PARAM1="partclone.vmfs" ;; *) PARAM1="partclone.imager" ;; esac # Por compatibilidad, si no existe el ejecutable usar por defecto "parclone.dd". which $PARAM1 &>/dev/null || PARAM1="partclone.dd" PARAM1="$PARAM1 -d0 -F -c -s $DEV" # Algunas versiones de partclone.dd no tienen opción "-c". [ -z "$(eval ${PARAM1%% *} --help 2>&1 | grep -- -c)" ] && PARAM1="${PARAM1/ -c / }" ;; esac # Comprobar que existe mbuffer. which mbuffer &>/dev/null && PARAM2="| mbuffer -q -m 40M " || PARAM2=" " # Nivel de compresion. case "$LEVEL" in 0|none) PARAM3=" > " ;; 1|lzop) PARAM3=" | lzop > " ;; 2|gzip) PARAM3=" | gzip -c > " ;; 3|bzip) PARAM3=" | bzip -c > " ;; esac # Sintaxis final. [ -n "$PARAM1" ] && echo "$PARAM1 $PARAM2 $PARAM3 $IMGFILE" } function ogTiptorrentGet () { local MAXTRIES err i=0 MAXTRIES=3 while [ "$i" -lt $MAXTRIES ] do wget --spider -q "$ogrepo:9999/$1" && break i=$(( i + 1 )) done if [ $i -eq 3 ]; then ogRaiseError "$OG_ERR_NOTFOUND" "Error checking $1" return $? fi pushd /opt/opengnsys/cache/opt/opengnsys/images > /dev/null || return 1 /opt/opengnsys/bin/tiptorrent-client "$ogrepo" "$1" > /dev/null err=$? popd > /dev/null || return 1 if [ $err -ne 0 ]; then ogRaiseError "$OG_ERR_NOTFOUND" "Error downloading $1 image, tiptorrent-client failed. See /var/log/syslog on the client for details." fi return $err } function ogTiptorrentGetToCache () { local MAXTRIES MD5FILE MD5IMG if ! wget -qO "$1".full.sum "$ogrepo:9999/$2.full.sum"; then ogRaiseError "$OG_ERR_NOTFOUND" "Error downloading $2 checksum" return $? fi MD5FILE=$(cat "$1".full.sum) if ! ogTiptorrentGet "$2"; then return 1; fi MD5IMG=$(md5sum "$IMGPATH" | cut -f1 -d " ") if [ "$MD5IMG" != "$MD5FILE" ]; then ogRaiseError "$OG_ERR_NOTFOUND" "Error downloading $2, checksum mismatch" return $? fi return 0 } #/** # ogRestoreImageSyntax path_filename path_device [str_tools] [str_compressionlevel] #@brief Genera una cadena de texto con la instrucción para crear un fichero imagen #@param path_device dispositivo Linux del sistema de archivos #@param path_fileneme path absoluto del fichero imagen #@param [opcional] str_tools herrmaienta de clonacion [partimage, partclone, ntfsclone] #@param [opcional] str_compressionlevel nivel de compresion. [0 -none-, 1-lzop-, 2-gzip] #@return cadena con el comando que se debe ejecutar. #@exception OG_ERR_FORMAT formato incorrecto. #@warning En pruebas iniciales #@TODO introducir las herramientas fsarchiver, dd #@TODO introducir el nivel de compresion gzip #@version 1.0 - Primeras pruebas #@author Antonio J. Doblas Viso. Universidad de Málaga #@date 2010/02/08 #*/ ## function ogRestoreImageSyntax () { local TOOL COMPRESSOR LEVEL PART IMGFILE FILEHEAD INFOIMG IMGPATH IMGCACHEDIR local MD5FILE MD5WGET # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME filename partition [tool] [levelcompresor]" \ "$FUNCNAME /opt/opengnsys/images/prueba.img /dev/sda1 [partclone] [lzop]" return fi # Error si no se reciben entre 2 y 5 parámetros. [ $# -ge 2 -a $# -le 5 ] || ogRaiseError $OG_ERR_FORMAT "$*" || return $? # controlamos que el parametro 1 (imagen) es tipo file. [ -f $1 ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $? # Si 2 parametros (file-origen-, device-destino-) = ogGetImageFull($1) if [ "$#" -eq 2 ]; then IMGFILE=$1 PART=$2 INFOIMG=$(ogGetImageInfo $IMGFILE) || ogRaiseError $OG_ERR_NOTFOUND "No Image $1" || return $? TOOL=`echo $INFOIMG | cut -f1 -d:` COMPRESSOR=`echo $INFOIMG | cut -f2 -d:` ogRestoreImageSyntax $IMGFILE $PART $TOOL $COMPRESSOR fi # Si cuatro parametros genera sintaxis if [ "$#" -eq 4 ] || [ "$#" -eq 5 ]; then IMGFILE=$1 PART=$2 # comprobamos parametro herramienta compresion. TOOL=$(echo $3 | tr [A-Z] [a-z]) #ogCheckProgram $TOOL #comprobar parámetro compresor. LEVEL=$(echo $4 | tr [A-Z] [a-z]) #ogCheckProgram $LEVEL case "$LEVEL" in "0"|"none") COMPRESSOR=" " ;; "1"|"lzop" | "LZOP") COMPRESSOR=" lzop -dc " ;; "2"|"gzip" | "GZIP") COMPRESSOR=" gzip -dc " ;; "3"|"bzip" | "BZIP" ) COMPRESSOR=" bzip -dc " ;; *) ogRaiseError $OG_ERR_NOTFOUND "Compressor no valid $TOOL" || return $? ;; esac #comprobar mbuffer which mbuffer > /dev/null && MBUFFER="| mbuffer -q -m 40M " || MBUFFER=" " case "${TOOL,,}" in ntfsclone) TOOL="| ntfsclone --restore-image --overwrite $PART -" ;; partimage) TOOL="| partimage -f3 -B gui=no restore $PART stdin" ;; partclone*) # -C para que no compruebe tamaños TOOL="| partclone.restore -d0 -C -I -o $PART" ;; dd) TOOL="| pv | dd conv=sync,noerror bs=1M of=$PART" ;; *) ogRaiseError $OG_ERR_NOTFOUND "Tools imaging no valid $TOOL" || return $? ;; esac if [ "$5" == "true" ]; then IMGFILE=${1/\/opt\/opengnsys\/images\//} if ogFindCache &>/dev/null; then IMGCACHEDIR=$(ogGetMountPoint $(ogFindCache))/opt/opengnsys/images IMGPATH="$IMGCACHEDIR/$IMGFILE" if [ -f "$IMGPATH" ]; then MD5FILE=$(md5sum "$IMGPATH" | cut -f1 -d " ") MD5WGET=$(wget -qO - "$ogrepo:9999/$IMGFILE.full.sum") if [ "$MD5FILE" != "$MD5WGET" ]; then ogTiptorrentGetToCache "$IMGPATH" "$IMGFILE" fi else mkdir -p "$IMGCACHEDIR" ogTiptorrentGetToCache "$IMGPATH" "$IMGFILE" fi if [ $? -ne 0 ]; then ogRaiseError "$OG_ERR_NOTFOUND" "Failed tiptorrent to cache $TOOL" return $? fi CAT="cat $IMGPATH |" COMPRESSOR="$COMPRESSOR -" echo "$CAT $COMPRESSOR $MBUFFER $TOOL" else ogRaiseError "$OG_ERR_NOTFOUND" "Tiptorrent needs cache $TOOL" return $? fi else echo "$COMPRESSOR $IMGFILE $MBUFFER $TOOL" fi fi } #/** # ogCreateDiskImage int_ndisk str_repo path_image [str_tools] [str_compressionlevel] #@brief Crea una imagen (copia de seguridad) de un disco completo. #@param int_ndisk nº de orden del disco #@param str_repo repositorio de imágenes (remoto o caché local) #@param path_image camino de la imagen (sin extensión) #@return (nada, por determinar) #@note repo = { REPO, CACHE } #@note Esta primera versión crea imágenes con dd comprimidas con gzip. #@exception OG_ERR_FORMAT formato incorrecto. #@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. #@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 Gestión de bloqueos de disco #@todo Comprobar si debe desmontarse la caché local #@todo Comprobar que no se crea la imagen en el propio disco #@version 1.1.0 - Primera versión para OpenGnsys con herramientas prefijadas. #@author Ramon Gomez, ETSII Universidad de Sevilla #@Date 2016/04/08 #*/ ## function ogCreateDiskImage () { # Variables locales local DISK PROGRAM IMGDIR IMGFILE IMGTYPE ERRCODE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_repo path_image" \ "$FUNCNAME 1 REPO /disk1" return fi # Error si no se reciben entre 3 y 5 parámetros. [ $# -ge 3 -a $# -le 5 ] || ogRaiseError $OG_ERR_FORMAT "$*" || return $? # Comprobar que no está bloqueada ni la partición, ni la imagen. DISK="$(ogDiskToDev $1)" || return $? if ogIsDiskLocked $1; then ogRaiseError $OG_ERR_LOCKED "$MSG_LOCKED $1" return $? fi IMGTYPE="dsk" # Extensión genérica de imágenes de disco. IMGDIR=$(ogGetParentPath "$2" "$3") [ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$2 $(dirname $3)" || return $? IMGFILE="$IMGDIR/$(basename "$3").$IMGTYPE" if ogIsImageLocked "$IMGFILE"; then ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $3, $4" return $? fi # No guardar imagen en el propio disco (disco no incluido en el camino del repositorio). if [[ $(ogGetPath "$2" /) =~ ^$DISK ]]; then ogRaiseError $OG_ERR_IMAGE "$2 = $DISK" return $? fi # Generar la instruccion a ejecutar antes de aplicar los bloqueos. PROGRAM=$(ogCreateImageSyntax $DISK $IMGFILE) # Desmontar todos los sistemas de archivos del disco, bloquear disco e imagen. ogUnmountAll $1 2>/dev/null ogLockDisk $1 || return $? ogLockImage "$2" "$3.$IMGTYPE" || return $? # Crear Imagen. trap "ogUnlockDisk $1; ogUnlockImage "$3" "$4.$IMGTYPE"; rm -f $IMGFILE" 1 2 3 6 9 eval $PROGRAM # Controlar salida de error, crear fichero de información y desbloquear partición. ERRCODE=$? if [ $ERRCODE == 0 ]; then echo "$(ogGetImageInfo $IMGFILE):$(ogGetHostname)" > $IMGFILE.info else ogRaiseError $OG_ERR_IMAGE "$1 $2 $IMGFILE" rm -f "$IMGFILE" fi # Desbloquear disco e imagen. ogUnlockDisk $1 ogUnlockImage "$2" "$3.$IMGTYPE" return $ERRCODE } #/** # ogCreateImage int_ndisk int_npartition str_repo path_image [str_tools] [str_compressionlevel] #@brief Crea una imagen a partir de una partición. #@param int_ndisk nº de orden del disco #@param int_npartition nº de orden de la partición #@param str_repo repositorio de imágenes (remoto o caché local) #@param path_image camino de la imagen (sin extensión) #@param [opcional] str_tools herrmaienta de clonacion [partimage, partclone, ntfsclone] #@param [opcional] str_compressionlevel nivel de compresion. [0 -none-, 1-lzop-, 2-gzip] #@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. #@todo Comprobaciones, control de errores, definir parámetros, etc. #@version 0.1 - Integracion para Opengnsys - HIDRA:CrearImagen{EXT3, NTFS}.sh; EAC: CreateImageFromPartition () en Deploy.lib #@author Ramon Gomez, ETSII Universidad de Sevilla #@Date 2008/05/13 #@author Antonio J. Doblas Viso. Universidad de Malaga #@date 2008/10/27 #@version 0.9 - Versión en pruebas para OpenGnSys #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009/10/07 #@version 1.0 - Llama a función ogCreateImageSyntax para generar la llamada al comando. #@author Antonio J. Doblas Viso. Universidad de Málaga #@date 2010/02/08 #*/ ## function ogCreateImage () { # Variables locales local PART PROGRAM IMGDIR IMGFILE IMGTYPE ERRCODE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npart str_repo path_image" \ "$FUNCNAME 1 1 REPO /aula1/win7" return fi # Error si no se reciben entre 4 y 6 parámetros. [ $# -ge 4 -a $# -le 6 ] || ogRaiseError $OG_ERR_FORMAT "$*" || return $? # Comprobar que no está bloqueada ni la partición, ni la imagen. PART="$(ogDiskToDev $1 $2)" || return $? if ogIsLocked $1 $2; then ogRaiseError $OG_ERR_LOCKED "$MSG_LOCKED $1, $2" return $? fi IMGTYPE="img" # Extensión genérica de imágenes. IMGDIR=$(ogGetParentPath "$3" "$4") [ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$3 $(dirname $4)" || return $? IMGFILE="$IMGDIR/$(basename "$4").$IMGTYPE" if ogIsImageLocked "$IMGFILE"; then ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $3, $4" return $? fi # Generar la instruccion a ejecutar antes de aplicar los bloqueos. PROGRAM=$(ogCreateImageSyntax $PART $IMGFILE $5 $6) # Desmontar partición, bloquear partición e imagen. ogUnmount $1 $2 2>/dev/null ogLock $1 $2 || return $? ogLockImage "$3" "$4.$IMGTYPE" || return $? # Crear Imagen. trap "ogUnlock $1 $2; ogUnlockImage "$3" "$4.$IMGTYPE"; rm -f $IMGFILE" 1 2 3 6 9 eval $PROGRAM # Controlar salida de error, crear fichero de información y desbloquear partición. ERRCODE=$? if [ $ERRCODE == 0 ]; then echo "$(ogGetImageInfo $IMGFILE):$(ogGetHostname)" > $IMGFILE.info cp -f $IMGFILE.info /tmp/image.info md5sum "$IMGFILE" | cut -f1 -d " " > "$IMGFILE".full.sum else ogRaiseError $OG_ERR_IMAGE "$1 $2 $IMGFILE" rm -f "$IMGFILE" fi # Desbloquear partición e imagen. ogUnlock $1 $2 ogUnlockImage "$3" "$4.$IMGTYPE" return $ERRCODE } #/** # ogCreateMbrImage int_ndisk str_repo path_image #@brief Crea una imagen a partir del sector de arranque de un disco. #@param int_ndisk nº de orden del disco #@param str_repo repositorio de imágenes (remoto o caché local) #@param path_image camino 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_IMAGE error al crear la imagen del sistema. #@version 0.9 - Versión en pruebas para OpenGNSys #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2010/01/12 #@version 1.0 - Adaptación a OpenGnSys 1.0 #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2011/03/10 #*/ ## function ogCreateMbrImage () { # Variables locales local DISK IMGDIR IMGFILE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_repo path_image" \ "$FUNCNAME 1 REPO /aula1/mbr" return fi # Error si no se reciben 3 parámetros. [ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? DISK=$(ogDiskToDev "$1") || return $? IMGDIR=$(ogGetParentPath "$2" "$3") [ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$2 $(dirname $3)" || return $? IMGFILE="$IMGDIR/$(basename "$3").mbr" # Crear imagen del MBR. dd if="$DISK" of="$IMGFILE" bs=512 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $? } #/** # ogCreateBootLoaderImage int_ndisk str_repo path_image #@brief Crea una imagen del boot loader a partir del sector de arranque de un disco. #@param int_ndisk nº de orden del disco #@param str_repo repositorio de imágenes (remoto o caché local) #@param path_image camino 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_IMAGE error al crear la imagen del sistema. #@version 1.0 - Adaptacion de ogCreateMbrImage para guardar solo el Boot Loader #@author Juan Carlos Xifre, SICUZ Universidad de Zaragoza #@date 2011/03/21 #*/ ## function ogCreateBootLoaderImage () { # Variables locales local DISK IMGDIR IMGFILE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_repo path_image" \ "$FUNCNAME 1 REPO /aula1/mbr" return fi # Error si no se reciben 3 parámetros. [ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? DISK=$(ogDiskToDev "$1") || return $? IMGDIR=$(ogGetParentPath "$2" "$3") [ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$2 $(dirname $3)" || return $? IMGFILE="$IMGDIR/$(basename "$3").mbr" # Crear imagen del Boot Loader dentro del MBR. dd if="$DISK" of="$IMGFILE" bs=446 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $? } #/** # ogGetSizeParameters int_num_disk int_num_part str_repo [monolit|sync|diff] #@brief Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido. #@param int_disk numero de disco #@param int_part numero de particion #@param str_repo repositorio de imágenes { REPO, CACHE } #@param str_imageName Nombre de la imagen #@param str_imageType Tipo de imagen: monolit (por defecto), sync o diff. (parametro opcional) #@return SIZEDATA SIZEREQUIRED SIZEFREE ISENOUGHSPACE #@note si str_imageType= diff necesario /tmp/ogimg.info, que es creado por ogCreateInfoImage. #@note para el tamaño de la imagen no sigue enlaces simbólicos. #@exception OG_ERR_FORMAT formato incorrecto. #@author Irina Gomez, ETSII Universidad de Sevilla #@date 2014/10/24 #@version 1.1.0 - En la salida se incluye el espacio disponible en el repositorio (ticket #771) #@author Irina Gomez - ETSII Universidad de Sevilla #@date 2017-03-28 #@version 1.1.0 - Si la imagen ya existe en el REPO se suma su tamaño al espacio libre #@author Irina Gomez - ETSII Universidad de Sevilla #@date 2017-11-08 #*/ ## function ogGetSizeParameters () { local REPO MNTDIR SIZEDATA KERNELVERSION SIZEREQUIRED FACTORGZIP FACTORLZOP FACTORSYNC SIZEFREE local IMGTYPE IMGDIR IMGFILE IMGEXT IMGSIZE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME num_disk num_part str_repo path_imgname [monolit|sync|diff]" \ "if $FUNCNAME 1 2 REPO Windows10 sync ; then ...; fi" \ "if $FUNCNAME 1 6 Ubuntu16 CACHE ; then ...; fi" return fi # Error si no se reciben 1 o 2 parámetros. [ $# -lt 4 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ndisco nparticion REPO|CACHE imgname [monolit|sync|diff]" ; echo $?) # Recogemos parametros REPO=${3^^} IMGTYPE="_${5^^}_" MNTDIR=$(ogMount $1 $2) if [ "$MNTDIR" == "" ]; then ogRaiseError $OG_ERR_PARTITION "$1 $2" return $? fi # Datos contenidos en la particion o en la lista de archivos de contiene la diferencial. if [ "$IMGTYPE" == "_DIFF_" ]; then [ -r /tmp/ogimg.info ] || return $(ogRaiseError session $OG_ERR_NOTFOUND "/tmp/ogimg.info"; echo $?) cd $MNTDIR SIZEDATA=$(grep -v "\/$" /tmp/ogimg.info | tr '\n' '\0'| du -x -c --files0-from=- 2>/dev/null|tail -n1 |cut -f1) cd / else SIZEDATA=$(df -k | grep $MNTDIR\$ | awk '{print $3}') fi #Aplicar factor de compresion if [ "$IMGTYPE" == "_SYNC_" -o "$IMGTYPE" == "_DIFF_" ]; then # Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}') [ $KERNELVERSION \< 3.07 ] && IMGFS="EXT4" || IMGFS=${IMGFS:-"BTRFS"} FACTORSYNC=${FACTORSYNC:-"130"} # Si IMGFS="BTRFS" la compresion es mayor. [ $IMGFS == "BTRFS" ] && let FACTORSYNC=$FACTORSYNC-20 let SIZEREQUIRED=$SIZEDATA*$FACTORSYNC/100 # El tamaño mínimo del sistema de ficheros btrfs es 250M, ponemos 300 [ $SIZEREQUIRED -lt 300000 ] && SIZEREQUIRED=300000 else FACTORGZIP=55/100 FACTORLZOP=65/100 let SIZEREQUIRED=$SIZEDATA*$FACTORLZOP fi #Comprobar espacio libre en el contenedor. [ "$REPO" == "CACHE" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`) [ "$REPO" == "REPO" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $4}') # Comprobamos si existe una imagen con el mismo nombre en $REPO # En sincronizadas restamos tamaño de la imagen y en monoloticas de la .ant case "${IMGTYPE}" in _DIFF_) IMGEXT="img.diff" ;; _SYNC_) IMGEXT="img" ;; *) IMGEXT="img.ant" ;; esac IMGDIR=$(ogGetParentPath "$REPO" "/$4") IMGFILE=$(ogGetPath "$IMGDIR/$(basename "/$4").$IMGEXT") if [ -z "$IMGFILE" ]; then IMGSIZE=0 else IMGSIZE=$(ls -s "$IMGFILE" | cut -f1 -d" ") fi let SIZEFREE=$SIZEFREE+$IMGSIZE [ "$SIZEREQUIRED" -lt "$SIZEFREE" ] && ISENOUGHSPACE=TRUE || ISENOUGHSPACE=FALSE echo $SIZEDATA $SIZEREQUIRED $SIZEFREE $ISENOUGHSPACE } #/** # ogIsImageLocked [str_repo] path_image #@brief Comprueba si una imagen está bloqueada para uso exclusivo. #@param str_repo repositorio de imágenes (opcional) #@param path_image camino de la imagen (sin extensión) #@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error. #@note repo = { REPO, CACHE } #@exception OG_ERR_FORMAT formato incorrecto. #@version 1.0 - Adaptación a OpenGnSys 1.0 #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2011/03/10 #@version 1.0.1 - Devolver falso en caso de error. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2011-05-18 #*/ ## function ogIsImageLocked () { # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ "if $FUNCNAME /opt/opengnsys/images/aula1/win7.img; then ...; fi" \ "if $FUNCNAME REPO /aula1/win7.img; then ...; fi" return fi # Error si no se reciben 1 o 2 parámetros. [ $# -lt 1 -o $# -gt 2 ] && return 1 # Comprobar si existe el fichero de bloqueo. test -n "$(ogGetPath $@.lock)" } #/** # ogLockImage [str_repo] path_image #@brief Bloquea una imagen para uso exclusivo. #@param str_repo repositorio de imágenes (opcional) #@param path_image camino de la imagen (sin extensión) #@return Nada. #@note Se genera un fichero con extensión .lock #@note repo = { REPO, CACHE } #@exception OG_ERR_FORMAT formato incorrecto. #@version 1.0 - Adaptación a OpenGnSys 1.0 #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2011/03/10 #*/ ## function ogLockImage () { # Variables locales local IMGDIR # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ "$FUNCNAME /opt/opengnsys/images/aula1/win7.img" \ "$FUNCNAME REPO /aula1/win7.img" return fi # Error si no se reciben 1 o 2 parámetros. [ $# == 1 -o $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? # Comprobar que existe directorio de imagen IMGDIR=$(ogGetParentPath $@) || return $? # Crear fichero de bloqueo. touch $IMGDIR/$(basename "${!#}").lock 2>/dev/null || ogRaiseError $OG_ERR_NOTWRITE "$*" || return $? } #/** # ogRestoreDiskImage str_repo path_image int_npartition #@brief Restaura (recupera) una imagen de un disco completo. #@param str_repo repositorio de imágenes o caché local #@param path_image camino de la imagen #@param int_ndisk nº de orden del disco #@return (por determinar) #@warning Primera versión en pruebas #@todo Gestionar bloqueos de disco #@todo Comprobar que no se intenta restaurar de la caché sobre el mismo disco #@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. #@exception OG_ERR_IMGSIZEPARTITION Tamaño de la particion es menor al tamaño de la imagen. #@version 1.1.0 - Primera versión para OpenGnsys. #@author Ramon Gomez, ETSII Universidad de Sevilla #@Date 2016/04/08 #*/ ## function ogRestoreDiskImage () { # Variables locales local DISK DISKSIZE IMGFILE IMGTYPE IMGSIZE PROGRAM ERRCODE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image int_ndisk" \ "$FUNCNAME REPO /aula1/win7 1" return fi # Error si no se reciben 4 parámetros. [ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? # Procesar parámetros. DISK="$(ogDiskToDev $3)" || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?) IMGTYPE="dsk" IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE") [ -r "$IMGFILE" ] || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?) # comprobamos consistencia de la imagen ogGetImageInfo $IMGFILE >/dev/null || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?) #/* (Comienzo comentario Doxygen) # Error si la imagen no cabe en la particion. #IMGSIZE=$(ogGetImageSize "$1" "$2") || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?) #DISKSIZE=$(ogGetDiskSize $3) #if [ $IMGSIZE -gt $DISKSIZE ]; then # ogRaiseError $OG_ERR_IMGSIZEPARTITION "$DISKSIZE < $IMGSIZE" # return $? #fi #*/ (Fin comentario Doxygen) # Comprobar el bloqueo de la imagen y de la partición. if ogIsImageLocked "$IMGFILE"; then ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $1, $2.$IMGTYPE" return $? fi if ogIsDiskLocked $3; then ogRaiseError $OG_ERR_LOCKED "$MSG_DISK $3" return $? fi # Solicitamos la generación de la instruccion a ejecutar PROGRAM=$(ogRestoreImageSyntax $IMGFILE $DISK) # Bloquear el disco ogLockDisk $3 || return $? trap "ogUnlockDisk $3" 1 2 3 6 9 # Ejecutar restauración según el tipo de imagen. eval $PROGRAM ERRCODE=$? if [ $ERRCODE != 0 ]; then ogRaiseError $OG_ERR_IMAGE "$IMGFILE, $3, $4" fi ogUnlockDisk $3 $4 return $ERRCODE } #/** # ogRestoreImage str_repo path_image int_ndisk int_npartition #@brief Restaura una imagen de sistema de archivos en una partición. #@param str_repo repositorio de imágenes o caché local #@param path_image camino de la imagen #@param int_ndisk nº de orden del disco #@param int_npartition nº de orden de la partición #@return (por determinar) #@exception OG_ERR_FORMAT 1 formato incorrecto. #@exception OG_ERR_NOTFOUND 2 fichero de imagen o partición no detectados. #@exception OG_ERR_PARTITION 3 # Error en partición de disco. #@exception OG_ERR_LOCKED 4 partición bloqueada por otra operación. #@exception OG_ERR_IMAGE 5 error al restaurar la imagen del sistema. #@exception OG_ERR_IMGSIZEPARTITION 30 Tamaño de la particion es menor al tamaño de la imagen. #@todo Comprobar incongruencias partición-imagen, control de errores, definir parámetros, caché/repositorio, etc. #@version 0.1 - Integracion para Opengnsys - HIDRA:RestaurarImagen{EXT3, NTFS}.sh; EAC: RestorePartitionFromImage() en Deploy.lib #@author Ramon Gomez, ETSII Universidad de Sevilla #@Date 2008/05/13 #@author Antonio J. Doblas Viso. Universidad de Malaga #@date 2008/10/27 #@version 0.9 - Primera version muy en pruebas para OpenGnSys #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009/09/10 #@version 1.0 - generacion sintaxis de restauracion #@author Antonio J. Doblas Viso, Universidad de Malaga #@date 2011/02/01 #@version 1.0.1 - Control errores, tamaño particion, fichero-imagen #@author Antonio J. Doblas Viso, Universidad de Malaga #@date 2011/05/11 #*/ ## function ogRestoreImage () { # Variables locales local PART PARTSIZE IMGFILE IMGTYPE IMGSIZE FSTYPE PROGRAM ERRCODE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image int_ndisk int_npart" \ "$FUNCNAME REPO /aula1/win7 1 1" return fi # Error si no se reciben 4 parámetros. [ $# == 4 ] || [ $# == 5 ] || ogRaiseError $OG_ERR_FORMAT || return $? # Procesar parámetros. PART="$(ogDiskToDev $3 $4)" || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?) #IMGTYPE=$(ogGetImageType "$1" "$2") IMGTYPE=img IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE") [ -r "$IMGFILE" ] || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?) # comprobamos consistencia de la imagen ogGetImageInfo $IMGFILE >/dev/null || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?) # Error si la imagen no cabe en la particion. IMGSIZE=$(ogGetImageSize "$1" "$2") || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?) #TODO: #Si la particion no esta formateado o tiene problemas formateamos ogMount $3 $4 || ogFormat $3 $4 PARTSIZE=$(ogGetPartitionSize $3 $4) if [ $IMGSIZE -gt $PARTSIZE ]; then ogRaiseError $OG_ERR_IMGSIZEPARTITION " $PARTSIZE < $IMGSIZE" return $? fi # Comprobar el bloqueo de la imagen y de la partición. if ogIsImageLocked "$IMGFILE"; then ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $1, $2.$IMGTYPE" return $? fi if ogIsLocked $3 $4; then ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $3, $4" return $? fi # Solicitamos la generación de la instruccion a ejecutar # Atención: no se comprueba el tipo de sistema de archivos. # Atención: no se comprueba incongruencia entre partición e imagen. INFOIMG=$(ogGetImageInfo $IMGFILE) || ogRaiseError $OG_ERR_NOTFOUND "No Image $1" || return $? TOOL=`echo $INFOIMG | cut -f1 -d:` COMPRESSOR=`echo $INFOIMG | cut -f2 -d:` PROGRAM=`ogRestoreImageSyntax $IMGFILE $PART $TOOL $COMPRESSOR $5` echo PROGRAMA echo "$PROGRAM" # Desmontar y bloquear partición. ogUnmount $3 $4 2>/dev/null || return $(ogRaiseError $OG_ERR_PARTITION " $3 $4"; echo $?) ogLock $3 $4 || return $? trap "ogUnlock $3 $4" 1 2 3 6 9 # Ejecutar restauración según el tipo de imagen. eval $PROGRAM ERRCODE=$? if [ $ERRCODE != 0 ]; then ogRaiseError $OG_ERR_IMAGE "$IMGFILE, $3, $4" fi ogUnlock $3 $4 return $ERRCODE } #/** # ogRestoreMbrImage str_repo path_image int_ndisk #@brief Restaura la imagen del sector de arranque de un disco. #@param str_repo repositorio de imágenes o caché local #@param path_image camino de la imagen #@param int_ndisk nº de orden del disco #@return (por determinar) #@exception OG_ERR_FORMAT formato incorrecto. #@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados. #@exception OG_ERR_IMAGE error al restaurar la imagen del sistema. #@version 0.9 - Primera versión en pruebas. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2010/01/12 #@version 1.0 - Adaptación a OpenGnSys 1.0 #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2011/03/10 #*/ ## function ogRestoreMbrImage () { # Variables locales local DISK IMGFILE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image int_ndisk" \ "$FUNCNAME REPO /aula1/mbr 1" return fi # Error si no se reciben 3 parámetros. [ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? # Procesar parámetros. DISK=$(ogDiskToDev "$3") || return $? IMGFILE=$(ogGetPath "$1" "$2.mbr") [ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? # Restaurar imagen del MBR. dd if="$IMGFILE" of="$DISK" bs=512 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $? } #/** # ogRestoreBootLoaderImage str_repo path_image int_ndisk #@brief Restaura la imagen del boot loader del sector de arranque de un disco. #@param str_repo repositorio de imágenes o caché local #@param path_image camino de la imagen #@param int_ndisk nº de orden del disco #@return (por determinar) #@exception OG_ERR_FORMAT formato incorrecto. #@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados. #@exception OG_ERR_IMAGE error al restaurar la imagen del sistema. #@version 1.0 - Adaptacion de ogRestoreMbrImage para restaurar solo el Boot Loader #@author Juan Carlos Xifre, SICUZ Universidad de Zaragoza #@date 2011/03/21 #*/ ## function ogRestoreBootLoaderImage () { # Variables locales local DISK IMGFILE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image int_ndisk" \ "$FUNCNAME REPO /aula1/mbr 1" return fi # Error si no se reciben 3 parámetros. [ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? # Procesar parámetros. DISK=$(ogDiskToDev "$3") || return $? IMGFILE=$(ogGetPath "$1" "$2.mbr") [ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? # Restaurar imagen del MBR. dd if="$IMGFILE" of="$DISK" bs=446 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $? } #/** # ogUnlockImage [str_repo] path_image #@brief Desbloquea una imagen con uso exclusivo. #@param str_repo repositorio de imágenes (opcional) #@param path_image camino de la imagen (sin extensión) #@return Nada. #@note repo = { REPO, CACHE } #@note Se elimina el fichero de bloqueo con extensión .lock #@exception OG_ERR_FORMAT formato incorrecto. #@version 1.0 - Adaptación a OpenGnSys 1.0 #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2011/03/10 #*/ ## function ogUnlockImage () { # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ "$FUNCNAME /opt/opengnsys/images/aula1/win7.img" \ "$FUNCNAME REPO /aula1/win7.img" return fi # Error si no se reciben 1 o 2 parámetros. [ $# == 1 -o $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? # Borrar fichero de bloqueo para la imagen. rm -f $(ogGetPath $@.lock) } #/** # ogGetImageInfo filename #@brief muestra información sobre la imagen monolitica. #@param 1 filename path absoluto del fichero imagen #@return cadena compuesta por clonacion:compresor:sistemaarchivos:tamañoKB #@exception OG_ERR_FORMAT formato incorrecto. #@exception OG_ERR_NOTFOUND fichero no encontrado. #@exception OG_ERR_IMAGE "Image format is not valid $IMGFILE" #@warning En pruebas iniciales #@TODO Definir sintaxis de salida (herramienta y compresor en minuscula) #@TODO Arreglar loop para ntfsclone #@TODO insertar parametros entrada tipo OG #@version 1.0 - Primeras pruebas #@author Antonio J. Doblas Viso. Universidad de Málaga #@date 2010/02/08 #*/ ## function ogGetImageInfo () { # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME path_filename" \ "$FUNCNAME /opt/opengnsys/images/prueba.img ==> PARTCLONE:LZOP:NTFS:5642158" return fi # Error si no se recibe 1 parámetro. [ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? #comprobando que el parametro uno es un file. [ -f $1 ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $? local TOOLS COMPRESSOR IMGFILE FILEHEAD FS FSPLUS SIZE SIZEFACTOR PARTIMAGEINFO PARTCLONEINFO NTFSCLONEINFO IMGDETECT IMGDETECT="FALSE" IMGFILE=$1 FILEHEAD=/tmp/`basename $IMGFILE`.infohead COMPRESSOR=`file $IMGFILE | awk '{print $2}'` ogCheckStringInGroup "$COMPRESSOR" "gzip lzop" || ogRaiseError $OG_ERR_IMAGE "Image format is not valid $IMGFILE" || return $? $($COMPRESSOR -dc $IMGFILE 2>/dev/null | head -n 40 > $FILEHEAD) || ogRaiseError $OG_ERR_IMAGE "Image format is not valid $IMGFILE" || return $? ## buscando Primera opción. if [ "$IMGDETECT" == "FALSE" ] then PARTCLONEINFO=$(LC_ALL=C partclone.info $FILEHEAD 2>&1) if `echo $PARTCLONEINFO | grep size > /dev/null` then TOOLS=PARTCLONE FS=$(echo $PARTCLONEINFO | awk '{gsub(/: /,"\n"); print toupper($8);}') if [[ "$FS" == "HFS" || "$FS" == "HFSPLUS" || "$FS" == "FAT32" ]]; then FSPLUS=$(echo $PARTCLONEINFO | awk '{gsub(/: /,"\n"); print toupper($9);}') echo $PARTCLONEINFO | grep GB > /dev/null && SIZEFACTOR=1000000 || SIZEFACTOR=1024 if [ "$FSPLUS" == "PLUS" ]; then FS=$FS$FSPLUS SIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{printf "%d\n", $17*FACTOR;}') else SIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{printf "%d\n", $16*FACTOR;}') fi else echo $PARTCLONEINFO | grep GB > /dev/null && SIZEFACTOR=1000000 || SIZEFACTOR=1024 SIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{gsub(/: /,"\n"); printf "%d\n", $11*FACTOR;}') fi IMGDETECT="TRUE" fi fi #buscando segunda opcion. if [ "$IMGDETECT" == "FALSE" -a ! -f /dev/loop2 ] then cat $FILEHEAD | grep -w ntfsclone-image > /dev/null && NTFSCLONEINFO=$(cat $FILEHEAD | ntfsclone --restore --overwrite /dev/loop2 - 2>&1) if `echo $NTFSCLONEINFO | grep ntfsclone > /dev/null` then TOOLS=NTFSCLONE SIZE=$(echo $NTFSCLONEINFO | awk '{gsub(/\(|\)|\./,""); printf "%d\n",$17/1000;}') FS=NTFS IMGDETECT="TRUE" fi fi ## buscando Tercer opción. if [ "$IMGDETECT" == "FALSE" ] then PARTIMAGEINFO=$(partimage -B gui=no imginfo "$FILEHEAD" 2>&1) if `echo $PARTIMAGEINFO | grep Partition > /dev/null` then TOOLS=PARTIMAGE FS=$(echo $PARTIMAGEINFO | awk '{gsub(/ /,"\n"); print $17;}' | awk '{sub(/\.\.+/," "); print toupper($2)}') SIZE=$( echo $PARTIMAGEINFO | awk '{gsub(/ /,"\n"); print $36;}' | awk '{sub(/\.\.+/," "); printf "%d\n",$2*1024*1024;}') IMGDETECT="TRUE" fi if file $FILEHEAD 2> /dev/null | grep -q "boot sector"; then TOOLS="partclone.dd" FS= SIZE= IMGDETECT="TRUE" fi fi #comprobamos valores #Chequeamos los valores devueltos. if [ -z "$TOOLS" -o -z "$COMPRESSOR" -o "$IMGDETECT" == "FALSE" ] then ogRaiseError $OG_ERR_IMAGE "Image format is not valid $IMGFILE" || return $? else COMPRESSOR=$(echo $COMPRESSOR | tr [a-z] [A-Z]) echo $TOOLS:$COMPRESSOR:$FS:$SIZE fi } #/** # ogGetImageProgram str_REPO str_imagen #@brief muestra información sobre la imagen monolitica. #@see ogGetImageInfo #@param 1 REPO o CACHE contenedor de la imagen #@param 2 filename nombre de la imagen sin extension #@return nombre del programa usado para generar la imagen #@exception OG_ERR_FORMAT formato incorrecto. #@exception OG_ERR_NOTFOUND fichero no encontrado. #@note ogGetImageProgram REPO imagenA -> partclone #@version 1.0 - Primeras pruebas #@author Antonio J. Doblas Viso. Universidad de Málaga #@date 2010/02/08 #*/ ## function ogGetImageProgram () { local IMGFILE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image" \ "$FUNCNAME REPO prueba ==> PARTCLONE" return fi # Error si no se reciben 2 parámetros. [ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? IMGFILE=$(ogGetPath "$1" "$2.img") [ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? ogGetImageInfo $IMGFILE | awk -F: '{print $1}' } #/** # ogGetImageCompressor str_REPO str_imagen #@brief muestra información sobre la imagen monolitica. #@see ogGetImageInfo #@param 1 REPO o CACHE contenedor de la imagen #@param 2 filename nombre de la imagen sin extension #@return tipo de compresión usada al generar la imagen #@exception OG_ERR_FORMAT formato incorrecto. #@exception OG_ERR_NOTFOUND fichero no encontrado. #@note ogGetImageCompressor REPO imagenA -> lzop #@version 1.0 - Primeras pruebas #@author Antonio J. Doblas Viso. Universidad de Málaga #@date 2010/02/08 #*/ ## function ogGetImageCompressor () { local IMGFILE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image" \ "$FUNCNAME REPO prueba ==> LZOP" return fi # Error si no se reciben 2 parámetros. [ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? IMGFILE=$(ogGetPath "$1" "$2.img") [ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? ogGetImageInfo $IMGFILE | awk -F: '{print $2}' } #/** # ogGetImageType str_REPO str_imagen #@brief muestra información sobre el sistema de archivos de imagen monolitica. #@see ogGetImageInfo #@param 1 REPO o CACHE contenedor de la imagen #@param 2 filename nombre de la imagen sin extension #@return tipo de compresión usada al generar la imagen #@exception OG_ERR_FORMAT formato incorrecto. #@exception OG_ERR_NOTFOUND fichero no encontrado. #@note ogGetImageType REPO imagenA -> NTFS #@version 1.0 - Primeras pruebas #@author Antonio J. Doblas Viso. Universidad de Málaga #@date 2010/02/08 #*/ ## function ogGetImageType () { local IMGFILE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image" \ "$FUNCNAME REPO prueba ==> NTFS" return fi # Error si no se reciben 2 parámetros. [ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? IMGFILE=$(ogGetPath "$1" "$2.img") [ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? ogGetImageInfo $IMGFILE | awk -F: '{print $3}' } #/** # ogGetImageSize str_REPO str_imagen #@brief muestra información sobre el tamaño (KB) del sistema de archivos de imagen monolitica. #@see ogGetImageInfo #@param 1 REPO o CACHE contenedor de la imagen #@param 2 filename nombre de la imagen sin extension #@return tipo de compresión usada al generar la imagen #@exception OG_ERR_FORMAT formato incorrecto. #@exception OG_ERR_NOTFOUND fichero no encontrado. #@note ogGetImagesize REPO imagenA -> 56432234 > Kb #@version 1.0 - Primeras pruebas #@author Antonio J. Doblas Viso. Universidad de Málaga #@date 2010/02/08 #*/ ## function ogGetImageSize () { # Variables locales local IMGFILE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME str repo path_image" \ "$FUNCNAME REPO prueba ==> 5642158" return fi # Error si no se reciben 2 parámetros. [ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? # Error si el fichero de imagen no es accesible. IMGFILE=$(ogGetPath "$1" "$2.img") [ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? # Devuelve el tamaño de la imagen en KB. ogGetImageInfo $IMGFILE | awk -F: '{print $4}' } #/** # ogCreateGptImage int_ndisk str_repo path_image #@brief Crea una imagen de la tabla de particiones GPT de un disco. #@param int_ndisk nº de orden del disco #@param str_repo repositorio de imágenes (remoto o caché local) #@param path_image camino 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_IMAGE error al crear la imagen del sistema. #@version 1.1 - Adaptación a OpenGnSys 1.1 #@author Juan Carlos Garcia. Universidad de Zaragoza #@date 2017/03/29 #*/ ## function ogCreateGptImage () { # Variables locales local DISK IMGDIR IMGFILE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk path_dir str_image" \ "$FUNCNAME 1 REPO /aula1/gpt" return fi # Error si no se reciben 3 parámetros. [ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? DISK=$(ogDiskToDev "$1") || return $? IMGDIR=$(ogGetParentPath "$2" "$3") [ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$2 $(dirname $3)" || return $? IMGFILE="$IMGDIR/$(basename "$3").gpt" # Crear imagen de la tabla GPT. sgdisk -b="$IMGFILE" "$DISK" || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $? } #/** # ogRestoreGptImage str_repo path_image int_ndisk #@brief Restaura la imagen de la tabla de particiones GPT de un disco. #@param str_repo repositorio de imágenes o caché local #@param path_image camino de la imagen #@param int_ndisk nº de orden del disco #@return (por determinar) #@exception OG_ERR_FORMAT formato incorrecto. #@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados. #@exception OG_ERR_IMAGE error al restaurar la imagen del sistema. #@version 1.1 - Adaptación a OpenGnSys 1.1 #@author Juan Carlos Garcia, Universidad de Zaragoza #@date 2017/03/29 #*/ ## function ogRestoreGptImage () { # Variables locales local DISK IMGFILE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk" \ "$FUNCNAME REPO /aula1/gpt 1" return fi # Error si no se reciben 3 parámetros. [ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? # Procesar parámetros. DISK=$(ogDiskToDev "$3") || return $? IMGFILE=$(ogGetPath "$1" "$2.gpt") [ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? # Restaurar tabla GPT del disco. sgdisk -l="$IMGFILE" "$DISK" || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $? }