source: client/engine/File.lib @ 0a735488

918-git-images-111dconfigfileconfigure-oglivegit-imageslgromero-new-oglivemainmaint-cronmount-efivarfsmultivmmultivm-ogboot-installerogClonningEngineogboot-installer-jenkinsoglive-ipv6test-python-scriptsticket-301ticket-50ticket-50-oldticket-577ticket-585ticket-611ticket-612ticket-693ticket-700ubu24tplunification2use-local-agent-oglivevarios-instalacionwebconsole3
Last change on this file since 0a735488 was ad051cc, checked in by irina <irinagomez@…>, 10 years ago

ogGetPath: Vuelve a directorio inicial en caso de error.

git-svn-id: https://opengnsys.es/svn/branches/version1.0@4428 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100755
File size: 12.8 KB
RevLine 
[4c63eb9]1#!/bin/bash
2#/**
3#@file    File.lib
4#@brief   Librería o clase File
5#@class   File
6#@brief   Funciones para gestión de archivos y directorios.
[acf04d3]7#@version 1.0.4
[4c63eb9]8#@warning License: GNU GPLv3+
9#*/
10
11
[55ad138c]12#/**
[95e48e1]13#         ogCalculateChecksum [ str_repo | int_ndisk int_npart ] path_filepath
14#@brief   Devuelve la suma de comprobación (checksum) de un fichero.
15#@param   path_filepath     camino del fichero (independiente de mayúsculas)
16#@param   str_repo          repositorio de ficheros
17#@param   int_ndisk         nº de orden del disco
18#@param   int_npartition    nº de orden de la partición
19#@return  hex_checksum      Checksum del fichero
20#@version 0.9.2 - Primera versión para OpenGnSys.
21#@author  Ramon Gomez, ETSII Universidad de Sevilla
22#@date    2010-07-24
[12e8e382]23#@version 1.0.4 - Calcula solo el checksum del último MB del fichero.
24#@author  Ramon Gomez, ETSII Universidad de Sevilla
25#@date    2012-03-16
[95e48e1]26#*/ ##
27function ogCalculateChecksum ()
28{
29# Variables locales.
30local FILE
31if [ "$*" == "help" ]; then
32    ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \
[cbbb046]33           "$FUNCNAME REPO ubuntu.img  ==>  ef899299caf8b517ce36f1157a93d8bf"
[95e48e1]34    return
35fi
36
37# Comprobar que existe el fichero y devolver sus datos.
38FILE=$(ogGetPath "$@")
39[ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
[12e8e382]40tail -c1M "$FILE" | md5sum -b 2>&1 | cut -f1 -d" "
[95e48e1]41}
42
43
44#/**
45#         ogCompareChecksumFiles [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
46#@brief   Metafunción que compara las sumas de comprobación almacenadas de 2 ficheros.
47#@return  bool_compare   Valor de comparación.
48#@warning No es necesario especificar la extensión ".sum".
49#@version 0.9.2 - Primera versión para OpenGnSys.
50#@author  Ramon Gomez, ETSII Universidad de Sevilla
51#@date    2010-07-24
52#*/ ##
53function ogCompareChecksumFiles ()
54{
55# Variables locales.
56local ARGS SOURCE TARGET
57if [ "$*" == "help" ]; then
58    ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \
[cbbb046]59           "if $FUNCNAME REPO ubuntu.img CACHE ubuntu.img; then ...;  fi"
[95e48e1]60    return
61fi
62
63ARGS="$@"
64case "$1" in
65    /*)     # Camino completo.          */ (Comentrio Doxygen)
66        SOURCE=$(ogGetPath "$1")
67        shift ;;
68    [1-9]*) # ndisco npartición.
69        SOURCE=$(ogGetPath "$1" "$2" "$3")
70        shift 3 ;;
71    *)      # Otros: repo, cache, cdrom (no se permiten caminos relativos).
72        SOURCE=$(ogGetPath "$1" "$2")
73        shift 2 ;;
74esac
75TARGET=$(ogGetPath "$@")
76
77# Comparar los ficheros de checksum.
78test "$(cat "$SOURCE.sum" 2>/dev/null)" == "$(cat "$TARGET.sum" 2>/dev/null)"
79}
80
81
82#/**
[e42f34e]83#         ogCopyFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
[9eefff4]84#@brief   Metafunción para copiar un fichero de sistema OpenGnSys a un directorio.
[55ad138c]85#@see     ogGetPath
[acf04d3]86#@return  Progreso de la copia.
[55ad138c]87#@warning Deben existir tanto el fichero origen como el directorio destino.
[9eefff4]88#@version 0.9 - Pruebas con OpenGnSys.
[55ad138c]89#@author  Ramon Gomez, ETSII Universidad de Sevilla
90#@date    2009-10-20
[acf04d3]91#@version 1.0.4 - Copiar usando rsync.
92#@author  Universidad de Huelva
93#@date    2012-07-06
[1e7eaab]94#*/ ##
[42669ebf]95function ogCopyFile ()
96{
[55ad138c]97# Variables locales.
[e42f34e]98local ARGS SOURCE TARGET
[cbbb046]99if [ "$*" == "help" ]; then
100    ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_source [ str_repo | int_ndisk int_npartition ] path_target" \
101           "$FUNCNAME REPO newfile.txt 1 2 /tmp/newfile.txt"
102    return
103fi
[55ad138c]104
[e42f34e]105ARGS="$@"
[c40a6b4]106case "$1" in
[1e7eaab]107    /*)     # Camino completo.          */ (Comentrio Doxygen)
[3915005]108        SOURCE="$(ogGetPath "$1")"
[e42f34e]109        shift ;;
110    [1-9]*) # ndisco npartición.
[3915005]111        SOURCE="$(ogGetPath "$1" "$2" "$3")"
[e42f34e]112        shift 3 ;;
113    *)      # Otros: repo, cache, cdrom (no se permiten caminos relativos).
[3915005]114        SOURCE="$(ogGetPath "$1" "$2")"
[e42f34e]115        shift 2 ;;
[c40a6b4]116esac
[1e7eaab]117# Comprobar fichero origen y directorio destino.
[e42f34e]118[ -n "$SOURCE" ] || ogRaiseError $OG_ERR_NOTFOUND "${ARGS% $*}" || return $?
[3915005]119TARGET="$(ogGetPath "$@")"
[9965062]120[ -n "$TARGET" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
[a14f9e0]121# Copiar fichero (para evitar problemas de comunicaciones las copias se hacen con rsync en vez de cp).
[16ec9e4]122rsync --progress --inplace -avh "$SOURCE" "$TARGET"
[c40a6b4]123}
124
125
[4c63eb9]126#/**
[c7d9af7]127#         ogDeleteFile [ str_repo | int_ndisk int_npartition ] path_filepath
128#@brief   Metafunción que borra un fichero de un dispositivo.
129#@see     ogGetPath
[9eefff4]130#@version 0.9 - Pruebas con OpenGnSys.
[c7d9af7]131#@author  Ramon Gomez, ETSII Universidad de Sevilla
132#@date    2009-09-29
[1e7eaab]133#*/ ##
[42669ebf]134function ogDeleteFile ()
135{
[c7d9af7]136# Variables locales.
137local FILE
[cbbb046]138if [ "$*" == "help" ]; then
139    ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_file" \
140           "$FUNCNAME 1 2 /tmp/newfile.txt"
141    return
142fi
143
[1e7eaab]144# Comprobar que existe el fichero y borrarlo.
[3915005]145FILE="$(ogGetPath "$@")"
[a3fb8b2]146[ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
147rm -f "$FILE" || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
[c7d9af7]148}
149
150
151#/**
[3543b3e]152#         ogDeleteTree [ str_repo | int_ndisk int_npartition ] path_dirpath
153#@brief   Metafunción que borra todo un subárbol de directorios de un dispositivo.
154#@see     ogGetPath
[9eefff4]155#@version 0.9 - Pruebas con OpenGnSys.
[3543b3e]156#@author  Ramon Gomez, ETSII Universidad de Sevilla
157#@date    2009-09-29
[1e7eaab]158#*/ ##
[42669ebf]159function ogDeleteTree ()
160{
[c7d9af7]161# Variables locales.
[3543b3e]162local DIR
[cbbb046]163if [ "$*" == "help" ]; then
164    ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_dir" \
165           "$FUNCNAME 1 2 /tmp/newdir"
166    return
167fi
168
[1e7eaab]169# Comprobar que existe el directorio y borrarlo con su contenido.
[3915005]170DIR="$(ogGetPath "$@")"
[a3fb8b2]171[ -n "$DIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
172rm -fr "$DIR" || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
[3543b3e]173}
174
175
176#/**
[1d531f9]177#         ogGetPath [ str_repo | int_ndisk int_npartition ] path_filepath
[4c63eb9]178#@brief   Inicia el proceso de arranque de un sistema de archivos.
[42669ebf]179#@param   path_filepath   camino del fichero (independiente de mayúsculas)
180#@param   str_repo        repositorio de ficheros
181#@param   int_ndisk       nº de orden del disco
182#@param   int_npartition  nº de orden de la partición
[4c63eb9]183#@return  path_file - camino completo real del fichero.
[55ad138c]184#@note    repo = { REPO, CACHE, CDROM }
[1d531f9]185#@note    Requisitos: \c grep \c sed
[4c63eb9]186#@exception OG_ERR_FORMAT    Formato incorrecto.
[ebf06c7]187#@exception OG_ERR_NOTFOUND  Fichero o dispositivo no encontrado.
[4c63eb9]188#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
[cfeabbf]189#@warning En caso de error, sólo devuelve el código y no da mensajes.
[4c63eb9]190#@todo    Terminar de definir parámetros para acceso a repositorios.
[985bef0]191#@version 0.1 -  Integracion para Opengnsys  -  HIDRA: CaminoWindows.sh; EAC: GetPath(), FormatSintaxSpacePath(), FormatSintaxBackSlashPath (),  en FileSystem.lib
192#@author Ramon Gomez, ETSII Universidad de Sevilla
193#@Date    2008/10/10
194#@author  Antonio J. Doblas Viso. Universidad de Malaga
195#@date    2008/10/27
[9eefff4]196#@version 0.9 - Pruebas con OpenGnSys.
[4c63eb9]197#@author  Ramon Gomez, ETSII Universidad de Sevilla
198#@date    2009-09-15
[1e7eaab]199#*/ ##
[42669ebf]200function ogGetPath ()
201{
[4c63eb9]202# Variables locales.
203local MNTDIR FILE PREVFILE FILEPATH CURRENTDIR
204
[1e7eaab]205# Si se solicita, mostrar ayuda.
[4c63eb9]206if [ "$*" == "help" ]; then
[4edc0b0]207    ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \
[d071d9b]208           "$FUNCNAME \"/mnt/sda1/windows/system32\"  ==>  /mnt/sda1/WINDOWS/System32" \
209           "$FUNCNAME REPO /etc/fstab  ==>  /opt/opengnsys/images/etc/fstab" \
[4c63eb9]210           "$FUNCNAME 1 1 \"/windows/system32\"  ==>  /mnt/sda1/WINDOWS/System32"
211    return
212fi
213
[1e7eaab]214# Procesar camino según el número de parámetros.
[4c63eb9]215case $# in
[9139a5f]216    1)  FILE="$1" ;;
[1a42974]217    2)  case "${1^^}" in
[c82725c]218            REPO)
[39277f4]219                FILE="$OGIMG/$2" ;;
[c82725c]220            CACHE)
221                MNTDIR="$(ogMountCache)" || return $?
222                FILE="$MNTDIR/$OGIMG/$2" ;;
223            CDROM)
224                MNTDIR="$(ogMountCdrom)" || return $?
225                FILE="$MNTDIR/$2" ;;
[39277f4]226            *)  ogRaiseError $OG_ERR_FORMAT
227                return $? ;;
[a2336d6]228        esac ;;
[9139a5f]229    3)  MNTDIR="$(ogMount $1 $2)" || return $?
230        FILE="$MNTDIR/$3" ;;
231    *)  ogRaiseError $OG_ERR_FORMAT
[c40a6b4]232        return $? ;;
[4c63eb9]233esac
234
[ad051cc]235# Volver a directorio inicial en caso de error.
[4c63eb9]236CURRENTDIR="$PWD"
[ad051cc]237trap "cd $CURRENTDIR" RETURN
238
239# Eliminar caracteres \c / iniciales, finales y duplicados.
[1e7eaab]240        # /* (comentario Doxygen)
[4c63eb9]241FILE="$(echo $FILE|sed -e 's/\(\/\)*\1/\//g' -e 's/^\///' -e 's/\/$//')"
242PREVFILE=""
243FILEPATH="/"
244while [ "$FILE" != "$PREVFILE" ]; do
[1e7eaab]245    # Busca el nombre correcto en el directorio actual.
[df1ffe5]246    cd "$FILEPATH" 2>/dev/null || FILE=""
247    FILEPATH="${FILEPATH}/$(ls -A 2>/dev/null | grep -i -m1 "^${FILE%%/*}$")" || return $?
[4c63eb9]248    PREVFILE="$FILE"
249    FILE="${FILE#*/}"
250done
[1e7eaab]251        # (comentario Doxygen) */
252# Muestra el camino Linux, quitando el / inicial duplicado.
[4c63eb9]253[ "$FILEPATH" != "/" ] && echo ${FILEPATH#/}
254}
255
[a2336d6]256
[23c6c40]257#/**
258#         ogGetParentPath [ str_repo | int_ndisk int_npartition ] path_filepath
259#@brief   Metafunción que devuelve el camino del directorio padre.
260#@see     ogGetPath
[9eefff4]261#@version 0.9 - Pruebas con OpenGnSys.
[23c6c40]262#@author  Ramon Gomez, ETSII Universidad de Sevilla
263#@date    2009-09-29
[1e7eaab]264#*/ ##
[42669ebf]265function ogGetParentPath ()
266{
[ebf06c7]267local PARENT
[4edc0b0]268if [ "$*" == "help" ]; then
269    ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \
270           "$FUNCNAME \"/mnt/sda1/windows/system32\"  ==>  /mnt/sda1/WINDOWS" \
271           "$FUNCNAME REPO /etc/fstab  ==>  /opt/opengnsys/images/etc" \
272           "$FUNCNAME 1 1 \"/windows/system32\"  ==>  /mnt/sda1/WINDOWS"
273    return
274fi
275
[ebf06c7]276case $# in
[3915005]277    1)  PARENT="$(dirname "$1")" ;;
[a3fb8b2]278    2)  PARENT="$1 $(dirname "/$2")" ;;
279    3)  PARENT="$1 $2 $(dirname "/$3")" ;;
[ebf06c7]280    *)  ogRaiseError $OG_ERR_FORMAT
[cfeabbf]281        return $? ;;
[ebf06c7]282esac
[f81a4deb]283ogGetPath $PARENT
[ebf06c7]284}
285
286
[23c6c40]287#/**
[9eefff4]288#         ogIsNewerFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
289#@brief   Metafunción que indica se un fichero es más nuevo que otro.
290#@see     ogGetPath
[7685100]291#@return  Código de salida: 0 - nuevo, 1 - antiguo o error
[9eefff4]292#@warning Deben existir tanto el fichero origen como el destino.
293#@version 0.9.2 - Primera versión para OpenGnSys.
294#@author  Ramon Gomez, ETSII Universidad de Sevilla
295#@date    2010-07-24
[7685100]296#@version 1.0.1 - Devolver falso en caso de error.
297#@author  Ramon Gomez, ETSII Universidad de Sevilla
298#@date    2011-05-18
[9eefff4]299#*/ ##
300function ogIsNewerFile ()
301{
302# Variables locales.
303local ARGS SOURCE TARGET
304# Si se solicita, mostrar ayuda.
305if [ "$*" == "help" ]; then
306    ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_source [ str_repo | int_ndisk int_npartition ] path_target" \
307           "if $FUNCNAME REPO ubuntu.img CACHE ubuntu.img; then ...  fi"
308    return
309fi
310
311ARGS="$@"
312case "$1" in
313    /*)     # Camino completo.          */ (Comentrio Doxygen)
[3915005]314        SOURCE="$(ogGetPath "$1")"
[9eefff4]315        shift ;;
316    [1-9]*) # ndisco npartición.
[3915005]317        SOURCE="$(ogGetPath "$1" "$2" "$3")"
[9eefff4]318        shift 3 ;;
319    *)      # Otros: repo, cache, cdrom (no se permiten caminos relativos).
[3915005]320        SOURCE="$(ogGetPath "$1" "$2")"
[9eefff4]321        shift 2 ;;
322esac
323# Comprobar que existen los ficheros origen y destino.
[7685100]324[ -n "$SOURCE" ] || ogRaiseError $OG_ERR_NOTFOUND "${ARGS% $*}" || return 1
[9eefff4]325TARGET=$(ogGetPath "$@")
[9965062]326[ -n "$TARGET" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return 1
[9eefff4]327# Devolver si el primer fichero se ha modificado después que el segundo.
328test "$SOURCE" -nt "$TARGET"
329}
330
331
332#/**
[95e48e1]333#         ogMakeChecksumFile [ str_repo | int_ndisk int_npart ] path_filepath
334#@brief   Metafunción que guarda el valor de comprobación de un fichero.
335#@see     ogCalculateChecksum
336#@warning Genera un fichero con extensión ".sum".
337#@version 0.9.2 - Primera versión para OpenGnSys.
338#@author  Ramon Gomez, ETSII Universidad de Sevilla
339#@date    2010-07-24
340#*/ ##
341function ogMakeChecksumFile ()
342{
343# Variables locales.
[3915005]344local FILE
[95e48e1]345if [ "$*" == "help" ]; then
346    ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \
347           "$FUNCNAME REPO ubuntu.img"
348    return
349fi
350
351# Comprobar que existe el fichero y guardar su checksum.
[3915005]352FILE="$(ogGetPath "$@")"
[95e48e1]353[ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
354ogCalculateChecksum "$FILE" > "$FILE.sum"
355}
356
357
358#/**
[23c6c40]359#         ogMakeDir [ str_repo | int_ndisk int_npartition ] path_dirpath
360#@brief   Metafunción que crea un subdirectorio vacío en un dispositivo.
361#@see     ogGetParentPath
[985bef0]362#@version 0.1 -  Integracion para Opengnsys  -   HIDRA: CrearDirectorio.sh, EAC: MkdirPath() en FileSystem.lib
363#@author Ramon Gomez, ETSII Universidad de Sevilla
364#@Date    2008/10/10
365#@author  Antonio J. Doblas Viso. Universidad de Malaga
366#@date    2008/10/27
[9eefff4]367#@version 0.9 - Pruebas con OpenGnSys.
[23c6c40]368#@author  Ramon Gomez, ETSII Universidad de Sevilla
369#@date    2009-09-29
[1e7eaab]370#*/ ##
[42669ebf]371function ogMakeDir ()
372{
[ebf06c7]373local PARENT DIR
[cbbb046]374if [ "$*" == "help" ]; then
375    ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_dir" \
376           "$FUNCNAME 1 2 /tmp/newdir"
377    return
378fi
379
[3915005]380PARENT="$(ogGetParentPath "$@")" || return $?
[23c6c40]381DIR="$(basename "${!#}")"
[a3fb8b2]382mkdir -p "$PARENT/$DIR" || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
[ebf06c7]383}
384 
Note: See TracBrowser for help on using the repository browser.