source: client/engine/FileSystem.lib @ ef5025f

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 ef5025f was cade8c0, checked in by ramon <ramongomez@…>, 7 years ago

#730: Revisar funciones del motor de clonación sin mensajes de ayuda.

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

  • Property mode set to 100755
File size: 38.0 KB
Line 
1#!/bin/bash
2#/**
3#@file    FileSystem.lib
4#@brief   Librería o clase FileSystem
5#@class   FileSystem
6#@brief   Funciones para gestión de sistemas de archivos.
7#@version 1.1.0
8#@warning License: GNU GPLv3+
9#*/
10
11
12#/**
13#         ogCheckFs int_ndisk int_nfilesys
14#@brief   Comprueba el estado de un sistema de archivos.
15#@param   int_ndisk      nº de orden del disco
16#@param   int_nfilesys   nº de orden del sistema de archivos
17#@return  (nada)
18#@exception OG_ERR_FORMAT    Formato incorrecto.
19#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
20#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
21#@note    Requisitos: *fsck*
22#@warning No se comprueban sistemas de archivos montados o bloqueados.
23#@todo    Definir salidas.
24#@version 0.9 - Primera adaptación para OpenGnSys.
25#@author  Ramon Gomez, ETSII Universidad de Sevilla
26#@date    2009-10-07
27#@version 1.0.2 - Ignorar códigos de salida de comprobación (no erróneos).
28#@author  Ramon Gomez, ETSII Universidad de Sevilla
29#@date    2011-09-23
30#@version 1.0.4 - Soportar HFS/HFS+.
31#@author  Ramon Gomez, ETSII Universidad de Sevilla
32#@date    2012-05-21
33#@version 1.0.5 - Desmontar antes de comprobar, soportar Btrfs y ExFAT.
34#@author  Ramon Gomez, ETSII Universidad de Sevilla
35#@date    2012-09-05
36#@version 1.1.0 - Soportar F2FS.
37#@author  Ramon Gomez, ETSII Universidad de Sevilla
38#@date    2016-05-03
39#*/ ##
40function ogCheckFs ()
41{
42# Variables locales.
43local PART TYPE PROG PARAMS CODES ERRCODE
44# Si se solicita, mostrar ayuda.
45if [ "$*" == "help" ]; then
46    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
47           "$FUNCNAME 1 1"
48    return
49fi
50
51# Error si no se reciben 2 parámetros.
52[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
53# Obtener partición.
54PART="$(ogDiskToDev $1 $2)" || return $?
55
56TYPE=$(ogGetFsType $1 $2)
57case "$TYPE" in
58    EXT[234])     PROG="e2fsck"; PARAMS="-y"; CODES=(1 2) ;;
59    BTRFS)        PROG="btrfsck"; CODES=1 ;;
60    REISERFS)     PROG="fsck.reiserfs"; PARAMS="<<<\"Yes\""; CODES=(1 2) ;;
61    REISER4)      PROG="fsck.reiser4"; PARAMS="-ay" ;;
62    JFS)          PROG="fsck.jfs"; CODES=(1 2) ;;
63    XFS)          PROG="xfs_repair" ;;
64    F2FS)         PROG="fsck.f2fs" ;;
65    NTFS)         PROG="ntfsfix" ;;
66    EXFAT)        PROG="fsck.exfat" ;;
67    FAT32)        PROG="dosfsck"; PARAMS="-a"; CODES=1 ;;
68    FAT16)        PROG="dosfsck"; PARAMS="-a"; CODES=1 ;;
69    FAT12)        PROG="dosfsck"; PARAMS="-a"; CODES=1 ;;
70    HFS)          PROG="fsck.hfs"; PARAMS="-f" ;;
71    HFSPLUS)      PROG="fsck.hfs"; PARAMS="-f" ;;
72    UFS)          PROG="fsck.ufs" ;;
73    ZFS)          PROG="fsck.zfs" ;;
74    *)            ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE"
75                  return $? ;;
76esac
77# Error si el sistema de archivos esta montado o bloqueado.
78ogUnmount $1 $2
79if ogIsMounted $1 $2; then
80    ogRaiseError $OG_ERR_PARTITION "$1 $2"       # Indicar nuevo error
81    return $?
82fi
83if ogIsLocked $1 $2; then
84    ogRaiseError $OG_ERR_LOCKED "$1 $2"
85    return $?
86fi
87# Comprobar en modo uso exclusivo.
88ogLock $1 $2
89trap "ogUnlock $1 $2" 1 2 3 6 9
90eval $PROG $PARAMS $PART
91ERRCODE=$?
92case $ERRCODE in
93    0|${CODES[*]})
94            ERRCODE=0 ;;
95    127)    ogRaiseError $OG_ERR_NOTEXEC "$PROG"
96            ERRCODE=$OG_ERR_NOTEXEC ;;
97    *)      ogRaiseError $OG_ERR_PARTITION "$1 $2"
98            ERRCODE=$OG_ERR_PARTITION ;;
99esac
100ogUnlock $1 $2
101return $ERRCODE
102}
103
104
105#/**
106#         ogExtendFs int_ndisk int_nfilesys
107#@brief   Extiende un sistema de archivos al tamaño de su partición.
108#@param   int_ndisk      nº de orden del disco
109#@param   int_nfilesys   nº de orden del sistema de archivos
110#@return  (nada)
111#@exception OG_ERR_FORMAT   Formato incorrecto.
112#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
113#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
114#@note    Requisitos: *resize*
115#@version 0.1 -  Integracion para Opengnsys  -  EAC:   EnlargeFileSystem() en ATA.lib
116#@author  Antonio J. Doblas Viso. Universidad de Malaga
117#@date    2008-10-27
118#@version 0.9 - Primera adaptacion para OpenGnSys.
119#@author  Ramon Gomez, ETSII Universidad de Sevilla
120#@date    2009-09-23
121#@version 1.0.5 - Soporte para BTRFS.
122#@author  Ramon Gomez, ETSII Universidad de Sevilla
123#@date    2012-06-28
124#*/ ##
125function ogExtendFs ()
126{
127# Variables locales.
128local PART TYPE PROG PARAMS ERRCODE DOMOUNT
129
130# Si se solicita, mostrar ayuda.
131if [ "$*" == "help" ]; then
132    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
133           "$FUNCNAME 1 1"
134    return
135fi
136# Error si no se reciben 2 parámetros.
137[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
138
139# Obtener partición.
140PART="$(ogDiskToDev $1 $2)" || return $?
141
142# Redimensionar al tamano máximo según el tipo de partición.
143TYPE=$(ogGetFsType $1 $2)
144case "$TYPE" in
145    EXT[234])   PROG="resize2fs"; PARAMS="-f" ;;
146    BTRFS)      PROG="btrfs"; PARAMS="filesystem resize max"
147                DOMOUNT=1     # Debe estar montado.
148                ;;
149    REISERFS|REISER4)
150                PROG="resize_reiserfs"; PARAMS="-f" ;;
151    F2FS)       ;;            # No se reduce (por el momento).
152    JFS)        ;;            # No se reduce (por el momento).
153    NILFS2)     ;;            # No se reduce (probar "nilfs-resize").
154    XFS)        ;;            # No se reduce (por el momento).
155    NTFS)       PROG="ntfsresize"; PARAMS="<<<\"y\" -f" ;;
156    EXFAT)      ;;            # No se reduce (por el momento).
157    FAT32|FAT16)  ;;          # No se reduce (probar "fatresize").
158    HFS|HFSPLUS)  ;;          # No se reduce (por el momento).
159    UFS)        ;;            # No se reduce (por el momento).
160    *)          ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
161                return $? ;;
162esac
163# Salida normal si no se va a aplicar la operación.
164[ -z "$PROG" ] && return
165# Error si el sistema de archivos no se queda en el estado de montaje adecuado.
166if [ "$DOMOUNT" ]; then
167    PART=$(ogMount $1 $2) || return $?                      # Indicar nuevo error
168else
169    ogUnmount $1 $2 2>/dev/null
170    if ogIsMounted $1 $2; then
171         ogRaiseError $OG_ERR_PARTITION "$1 $2"             # Indicar nuevo error
172         return $?
173    fi
174fi
175# Error si el sistema de archivos está bloqueado.
176if ogIsLocked $1 $2; then
177    ogRaiseError $OG_ERR_LOCKED "$1 $2"
178    return $?
179fi
180# Redimensionar en modo uso exclusivo.
181ogLock $1 $2
182trap "ogUnlock $1 $2" 1 2 3 6 9
183eval $PROG $PARAMS $PART &>/dev/null
184ERRCODE=$?
185case $ERRCODE in
186    0)    ;;
187    127)  ogRaiseError $OG_ERR_NOTEXEC "$PROG"
188          ERRCODE=$OG_ERR_NOTEXEC ;;
189    *)    ogRaiseError $OG_ERR_PARTITION "$1 $2"
190          ERRCODE=$OG_ERR_PARTITION ;;
191esac
192ogUnlock $1 $2
193return $ERRCODE
194}
195
196
197#/**
198#         ogFormat int_ndisk int_nfilesys | CACHE
199#@see     ogFormatFs ogFormatCache
200#*/ ##
201function ogFormat ()
202{
203case "$*" in
204    CACHE|cache)  ogFormatCache ;;
205    *)            ogFormatFs "$@" ;;
206esac
207}
208
209
210#/**
211#         ogFormatFs int_ndisk int_nfilesys [type_fstype] [str_label]
212#@brief   Formatea un sistema de ficheros según el tipo de su partición.
213#@param   int_ndisk      nº de orden del disco
214#@param   int_nfilesys   nº de orden del sistema de archivos
215#@param   type_fstype    mnemónico de sistema de ficheros a formatear (opcional al reformatear)
216#@param   str_label      etiqueta de volumen (opcional)
217#@return  (por determinar)
218#@exception OG_ERR_FORMAT    Formato de ejecución incorrecto.
219#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
220#@exception OG_ERR_PARTITION Partición no accesible o desconocida.
221#@note    Requisitos:   mkfs*
222#@warning No formatea particiones montadas ni bloqueadas.
223#@todo    Definir salidas.
224#@version 0.9 - Primera versión para OpenGnSys.
225#@author  Ramon Gomez, ETSII Universidad de Sevilla
226#@date    2009-10-08
227#@version 1.0.4 - Solucionado error cuando no se detecta tipo de sistema de ficheros pero si se indica.
228#@author  Universidad de Huelva
229#@date    2012-04-11
230#@version 1.0.5 - Comprobar errores al inicio e independizar del tipo de tabla de particiones.
231#@author  Universidad de Huelva
232#@date    2013-05-16
233#@version 1.1.0 - Soportar F2FS y NILFS.
234#@author  Ramon Gomez, ETSII Universidad de Sevilla
235#@date    2016-05-03
236#*/ ##
237function ogFormatFs ()
238{
239# Variables locales
240local PART ID TYPE LABEL PROG PARAMS LABELPARAM ERRCODE
241
242# Si se solicita, mostrar ayuda.
243if [ "$*" == "help" ]; then
244    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys [str_label]" \
245           "$FUNCNAME 1 1" \
246           "$FUNCNAME 1 1 EXT4" \
247           "$FUNCNAME 1 1 \"DATA\"" \
248           "$FUNCNAME 1 1 EXT4 \"DATA\""
249    return
250fi
251# Error si no se reciben entre 2 y 4 parámetros.
252[ $# -ge 2 -a $# -le 4 ] || ogRaiseError $OG_ERR_FORMAT || return $?
253# Obtener fichero de dispositivo.
254PART="$(ogDiskToDev $1 $2)" || return $?
255# Error si la partición está montada o bloqueada.
256if ogIsMounted $1 $2; then
257    ogRaiseError $OG_ERR_DONTFORMAT "$MSG_MOUNT: $1 $2"
258    return $?
259fi
260if ogIsLocked $1 $2; then
261    ogRaiseError $OG_ERR_LOCKED "$1 $2"
262    return $?
263fi
264# Si no se indica el tipo de sisitema de archivos, intentar obtenerlo.
265TYPE="${3:-$(ogGetFsType $1 $2)}"
266# Error, si no especifica el tipo de sistema de archivos a formatear.
267[ -n "$TYPE" ] || ogRaiseError $OG_ERR_FORMAT "$1 $2 ..." || return $?
268
269# Elegir tipo de formato.
270case "$TYPE" in
271    EXT2)         PROG="mkfs.ext2"; PARAMS="-F" ;;
272    EXT3)         PROG="mkfs.ext3"; PARAMS="-F" ;;
273    EXT4)         PROG="mkfs.ext4"; PARAMS="-F" ;;
274    BTRFS)        PROG="mkfs.btrfs"; PARAMS="-f" ;;
275    REISERFS)     PROG="mkfs.reiserfs"; PARAMS="-f"; LABELPARAM="-l" ;;
276    REISER4)      PROG="mkfs.reiser4"; PARAMS="-f <<<\"y\"" ;;
277    XFS)          PROG="mkfs.xfs"; PARAMS="-f" ;;
278    JFS)          PROG="mkfs.jfs"; PARAMS="<<<\"y\"" ;;
279    F2FS)         PROG="mkfs.f2fs"; LABELPARAM="-l" ;;
280    NILFS2)       PROG="mkfs.nilfs2"; PARAMS="-f" ;;
281    LINUX-SWAP)   PROG="mkswap" ;;
282    NTFS)         PROG="mkntfs"; PARAMS="-f" ;;
283    EXFAT)        PROG="mkfs.exfat"; LABELPARAM="-n" ;;
284    FAT32)        PROG="mkdosfs"; PARAMS="-F 32"; LABELPARAM="-n" ;;
285    FAT16)        PROG="mkdosfs"; PARAMS="-F 16"; LABELPARAM="-n" ;;
286    FAT12)        PROG="mkdosfs"; PARAMS="-F 12"; LABELPARAM="-n" ;;
287    HFS)          PROG="mkfs.hfs" ;;
288    HFSPLUS)      PROG="mkfs.hfsplus"; LABELPARAM="-v" ;;
289    UFS)          PROG="mkfs.ufs"; PARAMS="-O 2" ;;
290    *)            ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
291                  return $? ;;
292esac
293
294# Etiquetas de particion.
295if [ -z "$LABEL" ]; then
296    [ "$4" != "CACHE" ] || ogRaiseError $OG_ERR_FORMAT "$MSG_RESERVEDVALUE: CACHE" || return $?
297    [ -n "$4" ] && PARAMS="$PARAMS ${LABELPARAM:-"-L"} $4"
298else
299    PARAMS="$PARAMS ${LABELPARAM:-"-L"} $LABEL"
300fi
301
302# Formatear en modo uso exclusivo (desmontar siempre).
303ogLock $1 $2
304trap "ogUnlock $1 $2" 1 2 3 6 9
305umount $PART 2>/dev/null
306eval $PROG $PARAMS $PART 2>/dev/null
307ERRCODE=$?
308case $ERRCODE in
309    0)    ;;
310    127)  ogRaiseError $OG_ERR_NOTEXEC "$PROG" ;;
311    *)    ogRaiseError $OG_ERR_PARTITION "$1 $2" ;;
312esac
313ogUnlock $1 $2
314return $ERRCODE
315}
316
317
318#/**
319#         ogGetFsSize int_ndisk int_npartition [str_unit]
320#@brief Muestra el tamanio del sistema de archivos indicado, permite definir la unidad de medida, por defecto GB
321#@param   int_ndisk      nº de orden del disco
322#@param   int_npartition nº de orden de la partición
323#@param   str_unit       unidad (opcional, por defecto: KB)
324#@return  float_size - Tamaño del sistema de archivos
325#@note    str_unit = { KB, MB, GB, TB }
326#@exception OG_ERR_FORMAT   Formato incorrecto.
327#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo.
328#@version 0.1 -  Integracion para Opengnsys  -  EAC:  SizeFileSystem() en FileSystem.lib
329#@author  Antonio J. Doblas Viso. Universidad de Malaga
330#@date    2008-10-27
331#@version 1.0.4 - Adaptación de las salidas.
332#@author  Ramon Gomez, ETSII Universidad de Sevilla
333#@date    2012-06-18
334#*/ ##
335function ogGetFsSize ()
336{
337# Variables locales.
338local MNTDIR UNIT VALUE FACTOR SIZE
339# Si se solicita, mostrar ayuda.
340if [ "$*" == "help" ]; then
341    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition [str_unit]" \
342           "$FUNCNAME 1 1  =>  15624188" \
343           "$FUNCNAME 1 1 KB  =>  15624188"
344    return
345fi
346# Error si no se reciben 2 o 3 parámetros.
347[ $# == 2 ] || [ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
348# Obtener unidad y factor de medida.
349UNIT="$3"
350UNIT=${UNIT:-"KB"}
351case "$UNIT" in
352    [kK]B)
353        FACTOR=1 ;;
354    MB) FACTOR=1024 ;;
355    GB) FACTOR=$[1024*1024] ;;
356    TB) FACTOR=$[1024*1024*1024] ;;
357    *)  ogRaiseError $OG_ERR_FORMAT "$3 != { KB, MB, GB, TB }"
358        return $? ;;
359esac
360
361# Obtener el tamaño del sistema de archivo (si no está formateado; tamaño = 0).
362MNTDIR="$(ogMount $1 $2 2>/dev/null)"
363if [ -n "$MNTDIR" ]; then
364    VALUE=$(df -BK "$MNTDIR" | awk '{getline; print $2}')
365    SIZE=$(echo "$VALUE $FACTOR" | awk '{printf "%f\n", $1/$2}')
366else
367    SIZE=0
368fi
369# Devolver el tamaño (quitar decimales si son 0).
370echo ${SIZE%.0*}
371}
372
373
374#/**
375#         ogGetFsType int_ndisk int_nfilesys
376#@brief   Devuelve el mnemonico con el tipo de sistema de archivos.
377#@param   int_ndisk      nº de orden del disco
378#@param   int_nfilesys   nº de orden del sistema de archivos
379#@return  Mnemonico
380#@note    Mnemonico: { EXT2, EXT3, EXT4, BTRFS, REISERFS, XFS, JFS, FAT12, FAT16, FAT32, NTFS, LINUX-SWAP, LINUX-LVM, LINUX-RAID, HFS, HFSPLUS, CACHE }
381#@exception OG_ERR_FORMAT   Formato incorrecto.
382#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
383#@version 0.1 -  Integracion para Opengnsys  -  EAC:   TypeFS() en ATA.lib
384#@author  Antonio J. Doblas Viso. Universidad de Malaga
385#@date    2008-10-27
386#@version 0.9 - Primera adaptacion para OpenGnSys.
387#@author  Ramon Gomez, ETSII Universidad de Sevilla
388#@date    2009-07-21
389#@version 1.0.2 - Obtención de datos reales de sistemas de ficheros.
390#@author  Ramon Gomez, ETSII Universidad de Sevilla
391#@date    2011-12-02
392#@version 1.0.5 - Usar "blkid" para detectar tipo de sistema de archivo.
393#@author  Ramon Gomez, ETSII Universidad de Sevilla
394#@date    2014-06-10
395#@version 1.1.0 - Detectar volumen ZFS.
396#@author  Ramon Gomez, ETSII Universidad de Sevilla
397#@date    2014-11-14
398#*/ ##
399function ogGetFsType ()
400{
401# Variables locales.
402local PART ID TYPE
403# Si se solicita, mostrar ayuda.
404if [ "$*" == "help" ]; then
405    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
406           "$FUNCNAME 1 1  =>  NTFS"
407    return
408fi
409# Error si no se reciben 2 parámetros.
410[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
411
412# Detectar tipo de sistema de archivo (independientemente del tipo de partición).
413PART=$(ogDiskToDev "$1" "$2") || return $?
414if [[ "$PART" =~ ^/ ]]; then
415    TYPE=$(blkid -o export $PART | awk -F= '$1~/^TYPE/ { print toupper($2) }')
416else
417    zfs mount $PART 2>/dev/null
418    TYPE=$(mount | awk "\$1==\"$PART\" { print toupper(\$5) }")
419fi
420
421# Componer valores correctos.
422case "$TYPE" in
423    EXT4)      # Comprobar si es caché o Ext4.
424               if [ "$1 $2" == "$(ogFindCache)" ]; then
425                   ogIsFormated $1 $2 2>/dev/null && TYPE="CACHE"
426               fi
427               ;;
428    VFAT)      TYPE="$(blkid -po export $PART | awk -F= '$1~/^VERSION$/ { print toupper($2) }')" ;;
429    SWAP)      TYPE="LINUX-SWAP" ;;
430    LVM*)      TYPE="LINUX-LVM" ;;
431    *RAID*)    TYPE="LINUX-RAID" ;;
432    ZFS_MEMBER) TYPE="ZVOL" ;;
433    *_MEMBER)  TYPE="${TYPE/_MEMBER/}" ;;
434esac
435
436[ -n "$TYPE" ] && echo "$TYPE"
437}
438
439
440#/**
441#         ogGetMountPoint int_ndisk int_nfilesys
442#@brief   Devuelve el punto de montaje de un sistema de archivos.
443#@param   int_ndisk      nº de orden del disco
444#@param   int_nfilesys   nº de orden del sistema de archivos
445#@return  Punto de montaje
446#@exception OG_ERR_FORMAT    Formato incorrecto.
447#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
448#@note    Requisitos: \c mount* \c awk
449#@version 0.9 - Primera versión para OpenGnSys.
450#@author  Ramon Gomez, ETSII Universidad de Sevilla
451#@date    2009-10-15
452#@version 1.0.6 - Usar comando findmnt.
453#@author  Ramon Gomez, ETSII Universidad de Sevilla
454#@date    2014-09-04
455#*/ ##
456function ogGetMountPoint ()
457{
458# Variables locales
459local PART
460# Si se solicita, mostrar ayuda.
461if [ "$*" == "help" ]; then
462    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
463           "$FUNCNAME 1 1  =>  /mnt/sda1"
464    return
465fi
466# Error si no se reciben 2 parámetros.
467[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
468# Obtener partición.
469PART="$(ogDiskToDev $1 $2)" || return $?
470
471# Devolver punto de montaje.
472findmnt -n -o TARGET $PART
473}
474
475
476#/**
477#         ogIsFormated int_ndisk int_nfilesys
478#@brief   Comprueba si un sistema de archivos está formateado.
479#@param   int_ndisk      nº de orden del disco o volumen.
480#@param   int_nfilesys   nº de orden del sistema de archivos
481#@return  Código de salida: 0 - formateado, 1 - sin formato o error.
482#@version 0.91 - Adaptación inicial para comprobar que existe caché.
483#@author  Ramon Gomez, ETSII Universidad de Sevilla
484#@date    2010-03-18
485#@version 1.0.1 - Devolver falso en caso de error.
486#@author  Ramon Gomez, ETSII Universidad de Sevilla
487#@date    2011-05-18
488#@version 1.0.5 - Dejar de usar "parted".
489#@author  Ramon Gomez, ETSII Universidad de Sevilla
490#@date    2012-09-04
491#@version 1.1.0 - Comprobar sin montar el sistema de ficheros.
492#@author  Ramon Gomez, ETSII Universidad de Sevilla
493#@date    2016-01-21
494#*/ ##
495function ogIsFormated ()
496{
497# Variables locales
498local PART
499if [ "$*" == "help" ]; then
500    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
501           "if $FUNCNAME 1 1; then ... ; fi"
502    return
503fi
504# Falso, en caso de error.
505[ $# == 2 ] || return 1
506PART="$(ogDiskToDev $1 $2 2>/dev/null)" || return 1
507
508# Revisar tipo de sistema de ficheros.
509if [[ "$PART" =~ ^/ ]]; then
510    # Sistemas de ficheros genéricos.
511    test -n "$(blkid -s TYPE $PART | egrep -vi "swap|_member")"
512else
513    # ZFS.
514    test "$(zfs list -Hp -o canmount $PART 2>/dev/null)" = "on"
515fi
516}
517
518
519#/**
520#         ogIsLocked int_ndisk int_npartition
521#@see     ogIsPartitionLocked
522#*/
523function ogIsLocked ()
524{
525ogIsPartitionLocked "$@"
526}
527
528#/**
529#         ogIsPartitionLocked int_ndisk int_npartition
530#@brief   Comprueba si una partición o su disco están bloqueados por una operación de uso exclusivo.
531#@param   int_ndisk      nº de orden del disco
532#@param   int_npartition nº de orden de la partición
533#@return  Código de salida: 0 - bloqueado, 1 - sin bloquear o error.
534#@note    Los ficheros de bloqueo se localizan en \c /var/lock/dev, siendo \c dev el dispositivo de la partición o de su disco, sustituyendo el carácter "/" por "-".
535#@version 0.9 - Primera versión para OpenGnSys.
536#@author  Ramon Gomez, ETSII Universidad de Sevilla
537#@date    2009-09-03
538#@version 1.0.1 - Devolver falso en caso de error.
539#@author  Ramon Gomez, ETSII Universidad de Sevilla
540#@date    2011-05-18
541#@version 1.1.0 - Comprobar si el disco está también bloqueado.
542#@author  Ramon Gomez, ETSII Universidad de Sevilla
543#@date    2016-04-08
544#*/ ##
545function ogIsPartitionLocked ()
546{
547# Variables locales
548local DISK PART LOCKDISK LOCKPART
549
550# Si se solicita, mostrar ayuda.
551if [ "$*" == "help" ]; then
552    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
553           "if $FUNCNAME 1 1; then ... ; fi"
554    return
555fi
556# Falso, en caso de error.
557[ $# == 2 ] || return 1
558PART="$(ogDiskToDev $1 $2 2>/dev/null)" || return 1
559DISK="$(ogDiskToDev $1)"
560
561# Comprobar existencia de fichero de bloqueo de la partición o de su disco.
562LOCKDISK="/var/lock/lock${DISK//\//-}"
563LOCKPART="/var/lock/lock${PART//\//-}"
564test -f $LOCKDISK -o -f $LOCKPART
565}
566
567
568#/**
569#         ogIsMounted int_ndisk int_nfilesys
570#@brief   Comprueba si un sistema de archivos está montado.
571#@param   int_ndisk      nº de orden del disco
572#@param   int_nfilesys   nº de orden del sistema de archivos
573#@return  Código de salida: 0 - montado, 1 - sin montar o error.
574#@version 0.9 - Primera versión para OpenGnSys.
575#@author  Ramon Gomez, ETSII Universidad de Sevilla
576#@date    2009-10-15
577#@version 1.0.1 - Devolver falso en caso de error.
578#@author  Ramon Gomez, ETSII Universidad de Sevilla
579#@date    2011-05-18
580#*/ ##
581function ogIsMounted ()
582{
583# Si se solicita, mostrar ayuda.
584if [ "$*" == "help" ]; then
585    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
586           "if $FUNCNAME 1 1; then ... ; fi"
587    return
588fi
589# Falso, en caso de error.
590[ $# == 2 ] || return 1
591
592test -n "$(ogGetMountPoint $1 $2)"
593}
594
595
596#/**
597#         ogIsReadonly int_ndisk int_nfilesys
598#@brief   Comprueba si un sistema de archivos está montado solo de lectura.
599#@param   int_ndisk      nº de orden del disco
600#@param   int_nfilesys   nº de orden del sistema de archivos
601#@return  Código de salida: 0 - montado solo de lectura, 1 - con escritura o no montado.
602#@version 1.1.0 - Primera versión para OpenGnsys.
603#@author  Ramon Gomez, ETSII Universidad de Sevilla
604#@date    2016-01-20
605#/**
606function ogIsReadonly ()
607{
608# Variables locales
609local PART
610
611# Si se solicita, mostrar ayuda.
612if [ "$*" == "help" ]; then
613    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys" \
614           "if $FUNCNAME 1 1; then ... ; fi"
615    return
616fi
617# Falso, en caso de error.
618[ $# == 2 ] || return 1
619PART="$(ogDiskToDev $1 $2 2>/dev/null)" || return 1
620
621test -n "$(findmnt -n -o OPTIONS $PART | awk 'BEGIN {RS=","} /^ro$/ {print}')"
622}
623
624
625#/**
626#         ogIsWritable int_ndisk int_nfilesys
627#@brief   Comprueba si un sistema de archivos está montado de lectura y escritura.
628#@param   int_ndisk      nº de orden del disco
629#@param   int_nfilesys   nº de orden del sistema de archivos
630#@return  Código de salida: 0 - lectura y escritura, 1 - solo lectura o no montado.
631#@version 1.0.5 - Primera versión para OpenGnSys.
632#@author  Ramon Gomez, ETSII Universidad de Sevilla
633#@date    2013-10-09
634#/**
635function ogIsWritable ()
636{
637# Variables locales
638local PART
639
640# Si se solicita, mostrar ayuda.
641if [ "$*" == "help" ]; then
642    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys" \
643           "if $FUNCNAME 1 1; then ... ; fi"
644    return
645fi
646# Falso, en caso de error.
647[ $# == 2 ] || return 1
648PART="$(ogDiskToDev $1 $2 2>/dev/null)" || return 1
649
650test -n "$(findmnt -n -o OPTIONS $PART | awk 'BEGIN {RS=","} /^rw$/ {print}')"
651}
652
653
654#/**
655#         ogLock int_ndisk int_npartition
656#@see     ogLockPartition
657#*/
658function ogLock ()
659{
660ogLockPartition "$@"
661}
662
663#/**
664#         ogLockPartition int_ndisk int_npartition
665#@brief   Genera un fichero de bloqueo para una partición en uso exlusivo.
666#@param   int_ndisk      nº de orden del disco
667#@param   int_npartition nº de orden de la partición
668#@return  (nada)
669#@exception OG_ERR_FORMAT    Formato incorrecto.
670#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
671#@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 "-".
672#@version 0.9 - Primera versión para OpenGnSys.
673#@author  Ramon Gomez, ETSII Universidad de Sevilla
674#@date    2009-09-03
675#*/ ##
676function ogLockPartition ()
677{
678# Variables locales
679local PART LOCKFILE
680
681# Si se solicita, mostrar ayuda.
682if [ "$*" == "help" ]; then
683    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
684           "$FUNCNAME 1 1"
685    return
686fi
687# Error si no se reciben 2 parámetros.
688[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
689
690# Obtener partición.
691PART="$(ogDiskToDev $1 $2)" || return $?
692
693# Crear archivo de bloqueo exclusivo.
694LOCKFILE="/var/lock/lock${PART//\//-}"
695touch $LOCKFILE
696}
697
698
699#/**
700#         ogMount int_ndisk int_nfilesys
701#@see     ogMountFs ogMountCache ogMountCdrom
702#*/ ##
703function ogMount ()
704{
705case "$*" in
706    CACHE|cache)
707        ogMountCache ;;
708    CDROM|cdrom)
709        ogMountCdrom ;;
710    *)  ogMountFs "$@" ;;
711esac
712}
713
714
715#/**
716#         ogMountFs int_ndisk int_nfilesys
717#@brief   Monta un sistema de archivos.
718#@param   int_ndisk      nº de orden del disco
719#@param   int_nfilesys   nº de orden del sistema de archivos
720#@return  Punto de montaje
721#@exception OG_ERR_FORMAT    Formato incorrecto.
722#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
723#@exception OG_ERR_PARTITION Tipo de particion desconocido o no se puede montar.
724#@version 0.1 -  Integracion para Opengnsys  -  EAC:   MountPartition() en FileSystem.lib
725#@author  Antonio J. Doblas Viso. Universidad de Malaga
726#@date    2008-10-27
727#@version 0.9 - Primera version para OpenGnSys.
728#@author  Ramon Gomez, ETSII Universidad de Sevilla
729#@date    2009-09-28
730#@version 1.0.5 - Independiente del tipo de sistema de ficheros.
731#@author  Ramon Gomez, ETSII Universidad de Sevilla
732#@date    2012-09-04
733#@version 1.1.0 - Montar sistema de archivos ZFS y NTFS hibernado.
734#@author  Ramon Gomez, ETSII Universidad de Sevilla
735#@date    2016-09-19
736#*/ ##
737function ogMountFs ()
738{
739# Variables locales
740local PART MNTDIR
741
742# Si se solicita, mostrar ayuda.
743if [ "$*" == "help" ]; then
744    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
745           "$FUNCNAME 1 1  =>  /mnt/sda1"
746    return
747fi
748# Error si no se reciben 2 parámetros.
749[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
750
751# Obtener partición.
752PART="$(ogDiskToDev "$1" "$2")" || return $?
753
754# Comprobar si el sistema de archivos ya está montada.
755MNTDIR="$(ogGetMountPoint $1 $2)"
756# Si no, montarlo en un directorio de sistema.
757if [ -z "$MNTDIR" ]; then
758    # Error si la particion esta bloqueada.
759    if ogIsLocked $1 $2; then
760        ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION, $1 $2"
761        return $?
762    fi
763    # El camino de un dispositivo normal comienza por el carácter "/".
764    if [[ "$PART" =~ ^/ ]]; then
765        # Crear punto de montaje o enlace simbólico para caché local.
766        MNTDIR=${PART/dev/mnt}
767        DEBUG="no"
768        if [ "$(ogFindCache)" == "$1 $2" -a -n "$OGCAC" ]; then
769            mkdir -p $OGCAC
770            ln -fs $OGCAC $MNTDIR
771        else
772            mkdir -p $MNTDIR
773        fi
774        unset DEBUG
775        # Montar sistema de archivos.
776        mount $PART $MNTDIR &>/dev/null || \
777                    mount $PART $MNTDIR -o force,remove_hiberfile &>/dev/null
778        case $? in
779            0)  # Correcto.
780                ;;
781            14) # Intentar limpiar hibernación NTFS y montar.
782                ntfsfix -d $PART &>/dev/null && mount $PART $MNTDIR &>/dev/null || \
783                        ogRaiseError $OG_ERR_PARTITION "$1, $2" || return $?
784                ;;
785            *)  # Probar montaje de solo lectura.
786                mount $PART $MNTDIR -o ro &>/dev/null || \
787                        ogRaiseError $OG_ERR_PARTITION "$1, $2" || return $?
788                ;;
789        esac
790        # Aviso de montaje de solo lectura.
791        if ogIsReadonly $1 $2; then
792            ogEcho warning "$FUNCNAME: $MSG_MOUNTREADONLY: \"$1, $2\""
793        fi
794    else
795        # Montar sistema de archivos ZFS (un ZPOOL no comienza por "/").
796        zfs mount $PART 2>/dev/null
797    fi
798fi
799echo "$MNTDIR"
800}
801
802
803#/**
804#         ogMountCdrom
805#@brief   Monta dispositivo óptico por defecto
806#@return  Punto de montaje
807#@exception OG_ERR_FORMAT    Formato incorrecto.
808#@exception OG_ERR_PARTITION Tipo de particion desconocido o no se puede montar.
809#@version
810#@author 
811#@date   
812#*/ ##
813function ogMountCdrom ()
814{
815local DEV MNTDIR
816# Si se solicita, mostrar ayuda.
817if [ "$*" == "help" ]; then
818    ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME"
819    return
820fi
821# Error si se reciben parámetros.
822[ $# == 0 ] || ogRaiseError $OG_ERR_FORMAT || return $?
823DEV="/dev/cdrom"            # Por defecto
824MNTDIR=$(mount | awk -v D=$DEV '{if ($1==D) {print $3}}')
825if [ -z "$MNTDIR" ]; then
826    MNTDIR=${DEV/dev/mnt}
827    mkdir -p $MNTDIR
828    mount -t iso9660 $DEV $MNTDIR || ogRaiseError $OG_ERR_PARTITION "cdrom" || return $?
829fi
830echo $MNTDIR
831}
832
833
834#/**
835#         ogReduceFs int_ndisk int_nfilesys
836#@brief   Reduce el tamaño del sistema de archivos, sin tener en cuenta el espacio libre.
837#@param   int_ndisk      nº de orden del disco
838#@param   int_nfilesys   nº de orden del sistema de archivos
839#@return  int_tamañoKB - tamaño en KB
840#@exception OG_ERR_FORMAT    Formato incorrecto.
841#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
842#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
843#@warning En Windows, se borran los ficheros de hiberanción y de paginación.
844#@warning El sistema de archivos se amplía al mínimo + 10%.
845#@note    Requisitos:   *resize*
846#@version 0.1 -  Integracion para Opengnsys  -  EAC:   ReduceFileSystem() en ATA.lib
847#@author  Antonio J. Doblas Viso. Universidad de Malaga
848#@date    2008-10-27
849#@version 0.9 - Primera version para OpenGnSys.
850#@author  Ramon Gomez, ETSII Universidad de Sevilla
851#@date    2009-09-23
852#@version 0.9.2 - Añadir un 10% al tamaño mínimo requerido.
853#@author  Ramon Gomez, ETSII Universidad de Sevilla
854#@date    2010-09-27
855#@version 1.0 -  Deteccion automatica del tamaño minimo adecuado
856#@author  Antonio J. Doblas Viso. Universidad de Malaga
857#@date    2011-02-24
858#@version 1.0.6 - Integrar código de antigua función "ogReduceFsCheck".
859#@author  Ramon Gomez, ETSII Universidad de Sevilla
860#@date    2014-10-28
861#*/ ##
862function ogReduceFs ()
863{
864# Variables locales
865local PART BLKS SIZE MAXSIZE EXTRASIZE=0 RETVAL
866
867# Si se solicita, mostrar ayuda.
868if [ "$*" == "help" ]; then
869    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
870           "$FUNCNAME 1 1"
871    return
872fi
873# Error si no se reciben 2 parámetros.
874[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
875
876# Obtener partición.
877PART="$(ogDiskToDev $1 $2)" || return $?
878
879# Redimensionar según el tipo de particion.
880case "$(ogGetFsType $1 $2)" in
881    EXT[234])
882        ogUnmount $1 $2 2>/dev/null
883        # Ext2/3/4: Tamaño de los bloques del sistema de archivos
884        BLKS=$(tune2fs -l $PART | awk '/Block size/ {print int($3/512)}')
885        # Traduce el num. en sectores de 512B a tamano en MB.
886        #SIZE=$(resize2fs -P $PART 2>/dev/null | \
887                #       awk -v B=$BLKS '/minimum size/ {print int($7*1.1*B/2048)}')
888        #resize2fs -fp $PART "${SIZE}M" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
889        resize2fs -fpM $PART  &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
890        ;;
891
892    BTRFS)
893        MNTDIR=$(ogMount $1 $2)
894        # Calcular tamaño ocupado + 10%, redondeado + 1 (incluyendo letra de unidad).
895        SIZE=$(btrfs filesystem show $MNTDIR | awk -v P=$PART '{ if ($8==P) printf ("%d%s", $6*1.1+1, substr($6,match($6,/[A-Z]/),1)) }')
896        btrfs filesystem resize ${SIZE} $MNTDIR 2>/dev/null
897        ;;
898    REISERFS|REISER4)
899        # Calcular tamaño ocupado + 10%.
900        MNTDIR=$(ogMount $1 $2)
901        SIZE=$[ $(df -k $MNTDIR | awk '{getline;print $3}') * 110 / 100 ]
902        ogUnmount $1 $2 2>/dev/null
903        resize_reiserfs -s${SIZE}K $PART <<<"y"
904        ;;
905
906    F2FS)   ;;          # No se reduce (por el momento).
907    JFS)    ;;          # No se reduce (por el momento).
908    NILFS2) ;;          # No se reduce (probar "nilfs-resize").
909    XFS)    ;;          # No se reduce (por el momento).
910
911    NTFS)
912        # Calcular tamaño ocupado + 10%.
913        ogUnmount $1 $2 &>/dev/null
914        read -e MAXSIZE SIZE <<<$(ntfsresize -fi $PART | \
915                                  awk '/device size/ {d=$4}
916                                       /resize at/ {r=int($5*1.1/1024+1)*1024}
917                                       END { print d,r}')
918        # Error si no puede obtenerse el tamaño máximo del volumen.
919        [ -n "$MAXSIZE" -a -n "$SIZE" ] || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
920        # Simular la redimensión y comprobar si es necesario ampliarala.
921        RETVAL=1
922        while [ $RETVAL != 0 -a $[ SIZE+=EXTRASIZE ] -lt $MAXSIZE ]; do
923            # Obtener espacio de relocalización y devolver código de salida
924            # (ntfsresize devuelve 0 si no necesita relocalizar).
925            EXTRASIZE=$(ntfsresize -fns $SIZE $PART 2>/dev/null | \
926                        awk '/Needed relocations/ {print int($4*1.1/1024+1)*1024}'
927                        exit ${PIPESTATUS[0]})
928            RETVAL=$?
929        done
930        # Redimensionar solo si hace falta.
931        if [ $SIZE -lt $MAXSIZE ]; then
932            ntfsresize -fs $SIZE $PART <<<"y" >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
933        fi
934        ;;
935
936    EXFAT)  ;;          # No se reduce (por el momento).
937    FAT32|FAT16)  ;;    # No se reduce (probar "fatresize").
938    HFS|HFSPLUS)  ;;    # No se reduce (por el momento).
939    UFS)    ;;          # No se reduce (por el momento).
940
941    *)  ogRaiseError $OG_ERR_PARTITION "$1,$2"
942        return $? ;;
943esac
944
945# Devuelve tamaño del sistema de ficheros.
946ogGetFsSize $1 $2
947}
948
949
950#/**
951#         ogUnlock int_ndisk int_npartition
952#@see     ogUnlockPartition
953#*/ ##
954function ogUnlock ()
955{
956ogUnlockPartition "$@"
957}
958
959#/**
960#         ogUnlockPartition int_ndisk int_npartition
961#@brief   Elimina el fichero de bloqueo para una particion.
962#@param   int_ndisk      nº de orden del disco
963#@param   int_npartition nº de orden de la partición
964#@return  (nada)
965#@exception OG_ERR_FORMAT    Formato incorrecto.
966#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
967#@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 "-".
968#@version 0.9 - Primera versión para OpenGnSys.
969#@author  Ramon Gomez, ETSII Universidad de Sevilla
970#@date    2009-09-03
971#*/ ##
972function ogUnlockPartition ()
973{
974# Variables locales
975local PART LOCKFILE
976
977# Si se solicita, mostrar ayuda.
978if [ "$*" == "help" ]; then
979    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
980           "$FUNCNAME 1 1"
981    return
982fi
983# Error si no se reciben 2 parámetros.
984[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
985
986# Obtener partición.
987PART="$(ogDiskToDev $1 $2)" || return $?
988
989# Borrar archivo de bloqueo exclusivo.
990LOCKFILE="/var/lock/lock${PART//\//-}"
991rm -f $LOCKFILE
992}
993
994
995#/**
996#         ogUnmount int_ndisk int_npartition
997#@see     ogUnmountFs
998#*/ ##
999function ogUnmount ()
1000{
1001ogUnmountFs "$@"
1002}
1003
1004#/**
1005#         ogUnmountFs int_ndisk int_nfilesys
1006#@brief   Desmonta un sistema de archivos.
1007#@param   int_ndisk      nº de orden del disco
1008#@param   int_nfilesys   nº de orden del sistema de archivos
1009#@return  Nada
1010#@exception OG_ERR_FORMAT    Formato incorrecto.
1011#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
1012#@warning La partición no está previamente montada o no se puede desmontar.
1013#@version 0.1 -  Integracion para Opengnsys  -  EAC:  UmountPartition() en FileSystem.lib
1014#@author  Antonio J. Doblas Viso. Universidad de Malaga
1015#@date    2008-10-27
1016#@version 0.9 - Primera version para OpenGnSys.
1017#@author  Ramon Gomez, ETSII Universidad de Sevilla
1018#@date    2009-09-28
1019#*/ ##
1020function ogUnmountFs ()
1021{
1022# Variables locales
1023local PART MNTDIR
1024
1025# Si se solicita, mostrar ayuda.
1026if [ "$*" == "help" ]; then
1027    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" "$FUNCNAME 1 1"
1028    return
1029fi
1030# Error si no se reciben 2 parámetros.
1031[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
1032
1033# Obtener partición y punto de montaje.
1034PART="$(ogDiskToDev $1 $2)" || return $?
1035MNTDIR="$(ogGetMountPoint $1 $2)"
1036
1037# Si está montada, desmontarla.
1038if [ -n "$MNTDIR" ]; then
1039    # Error si la particion está bloqueada.
1040    if ogIsLocked $1 $2; then
1041        ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $1, $2"
1042        return $?
1043    fi
1044    # Desmontar y borrar punto de montaje.
1045    umount $PART 2>/dev/null || ogEcho warning "$FUNCNAME: $MSG_DONTUNMOUNT: \"$1, $2\""
1046    rmdir $MNTDIR 2>/dev/null || rm -f $MNTDIR 2>/dev/null
1047else
1048    ogEcho warning "$MSG_DONTMOUNT: \"$1,$2\""
1049fi
1050}
1051
1052
1053#/**
1054#         ogUnmountAll int_ndisk
1055#@brief   Desmonta todos los sistema de archivos de un disco, excepto el caché local.
1056#@param   int_ndisk      nº de orden del disco
1057#@return  Nada
1058#@exception OG_ERR_FORMAT    Formato incorrecto.
1059#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
1060#@warning No se desmonta la partición marcada como caché local.
1061#@version 0.9 - Versión para OpenGnSys.
1062#@author  Ramon Gomez, ETSII Universidad de Sevilla
1063#@date    2009/10/07
1064#*/ ##
1065function ogUnmountAll ()
1066{
1067# Variables locales
1068local DISK PART
1069# Si se solicita, mostrar ayuda.
1070if [ "$*" == "help" ]; then
1071    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "FUNCNAME 1"
1072    return
1073fi
1074# Error si no se recibe 1 parámetro.
1075[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
1076
1077# Obtener partición y punto de montaje.
1078DISK="$(ogDiskToDev $1)" || return $?
1079for ((PART=1; PART<=$(ogGetPartitionsNumber $1); PART++)); do
1080    case "$(ogGetFsType $1 $PART)" in
1081        CACHE) ;;
1082        *)     ogUnmount $1 $PART 2>/dev/null ;;
1083    esac
1084done
1085}
1086
1087#/**
1088#         ogUnsetDirtyBit int_ndisk int_npart
1089#@brief   Inhabilita el Dirty Bit del sistema de ficheros NTFS para evitar un CHKDSK en el primer arranque
1090#@param   int_ndisk      nº de orden del disco
1091#@param   int_npart      nº de orden de partición
1092#@return  Nada
1093#@exception OG_ERR_FORMAT    Formato incorrecto.
1094#@version 0.1 - Versión para OpenGnSys.
1095#@author  Carmelo Cabezuelo, ASIC Universidad Politécnica de Valencia
1096#@date    2016/04/20
1097#*/ ##
1098function ogUnsetDirtyBit ()
1099{
1100# Variables locales
1101local PART
1102# Si se solicita, mostrar ayuda.
1103if [ "$*" == "help" ]; then
1104    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "FUNCNAME 1"
1105    return
1106fi
1107# Error si no se reciben 2 parámetros.
1108[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
1109
1110# Obtener partición y punto de montaje.
1111case "$(ogGetFsType $1 $2)" in
1112    NTFS)
1113        ogUnmount $1 $2 2>/dev/null
1114        PART="$(ogDiskToDev $1 $2)" || return $?
1115        ntfsfix -d $PART ;;
1116    *) ;;
1117esac
1118}
1119
1120# AVISO:  Componer corretcamente esta función.
1121function ogGetFreeSize () {
1122local particion unit factor valor
1123if [ $# = 0 ]
1124then
1125        echo "sintaxis: ogGetFreeSize int_disco int_partition str_SizeOutput [ kB MB GB -default GB]-]" red
1126        echo "devuelve int_size : int_data : int_free" red
1127return
1128fi
1129if [ $# -ge 2 ]
1130then
1131        particion=`ogMount $1 $2 ` #1>/dev/null 2>&1
1132        if [ -z $3 ]
1133                then
1134                        unit=kB  # s B kB MB GB TB %
1135                else
1136                        unit=$3
1137        fi
1138        case $unit in
1139                kB)
1140                        factor="1.024";
1141                        #valor=`df | grep  $particion | awk -F" " '{size=$2*1.024; used=$3*1.024; free=$4*1.024; printf "%d:%d:%d", size,used,free}'`
1142                        valor=`df | grep  $particion | awk -F" " '{size=$2*1.024; used=$3*1.024; free=$4*1.024; printf "%d", free}'`
1143                        ;;
1144                MB)
1145                        factor="1.024/1000";
1146                        valor=`df | grep  $particion | awk -F" " '{size=$2*1.024/1000; used=$3*1.024/1000; free=$4*1.024/1000; printf "%d:%d:%d", size,used,free}'`
1147                ;;
1148                GB)
1149                        factor="1.024/1000000";
1150                        valor=`df | grep $particion | awk -F" " '{size=$2*1.024/1000000; used=$3*1.024/1000000; free=$4*1.024/1000000; printf "%f:%f:%f", size,used,free}'`
1151                ;;
1152        esac
1153        #echo $valor
1154        #NumberRound $valor
1155        #valor=`NumberRound $valor`;
1156        echo $valor
1157fi
1158}
1159
Note: See TracBrowser for help on using the repository browser.