summaryrefslogtreecommitdiffstats
path: root/client/engine/File.lib
blob: f009c26121198970d2375885400278c643e9c41b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
#!/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 
#         ogCopyFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
function ogCopyFile () {
local ARGS SOURCE TARGET
ARGS="$@"
case "$1" in
    /*)     # Camino completo.          */ (necesario Doxygen)
        SOURCE=$(ogGetPath "$1")
        shift ;;
    [1-9]*) # ndisco npartición.
        SOURCE=$(ogGetPath "$1" "$2" "$3")
        shift 3 ;;
    *)      # Otros: repo, cache, cdrom (no se permiten caminos relativos).
        SOURCE=$(ogGetPath "$1" "$2")
        shift 2 ;;
esac
#/// Comprobar fichero origen y directorio destino.
[ -n "$SOURCE" ] || ogRaiseError $OG_ERR_NOTFOUND "${ARGS% $*}" || return $?
TARGET=$(ogGetPath "$@")
[ -n "$TARGET" ] || ogRaiseError $OG_ERR_NOTFOUND "$@" || return $?
#/// Copiar fichero.
cp "$SOURCE" "$TARGET"                      # (definir posible error)
}


#/**
#         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 $?
}


#/**
#         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="$(ogMountCdrom)/$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
           # */ (necesario Doxygen)
#/// 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 $?
}


#/**
#         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
}