source: client/engine/File.lib @ a6d6d6f

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 a6d6d6f was 5f5b18a, checked in by adv <adv@…>, 10 years ago

#626 integrar modificaciones en file.lib. Nueva funcion ogCalculateFullChecksum()

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

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