diff options
Diffstat (limited to 'client/engine/FileSystem.lib')
-rwxr-xr-x | client/engine/FileSystem.lib | 146 |
1 files changed, 64 insertions, 82 deletions
diff --git a/client/engine/FileSystem.lib b/client/engine/FileSystem.lib index 15ccb124..ef0d1a4d 100755 --- a/client/engine/FileSystem.lib +++ b/client/engine/FileSystem.lib @@ -30,7 +30,7 @@ #@version 1.0.4 - Soportar HFS/HFS+. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2012-05-21 -#@version 1.0.5 - Desmontar antes de comprobar, soportar Btrfs. +#@version 1.0.5 - Desmontar antes de comprobar, soportar Btrfs y ExFAT. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2012-09-05 #*/ ## @@ -59,11 +59,13 @@ case "$TYPE" in JFS) PROG="fsck.jfs"; CODES=(1 2) ;; XFS) PROG="fsck.xfs" ;; NTFS) PROG="ntfsfix" ;; + EXFAT) PROG="fsck.exfat" ;; FAT32) PROG="dosfsck"; PARAMS="-a"; CODES=1 ;; FAT16) PROG="dosfsck"; PARAMS="-a"; CODES=1 ;; FAT12) PROG="dosfsck"; PARAMS="-a"; CODES=1 ;; HFS) PROG="fsck.hfs" ;; HFSPLUS) PROG="fsck.hfsplus" ;; + UFS) PROG="fsck.ufs" ;; *) ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE" return $? ;; esac @@ -118,7 +120,7 @@ return $ERRCODE function ogExtendFs () { # Variables locales. -local PART TYPE PROG PARAMS ERRCODE +local PART TYPE PROG PARAMS ERRCODE DOMOUNT # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then @@ -136,19 +138,25 @@ PART="$(ogDiskToDev $1 $2)" || return $? TYPE=$(ogGetFsType $1 $2) case "$TYPE" in EXT[234]) PROG="resize2fs"; PARAMS="-f" ;; - BTRFS) PROG="btrfs"; PARAMS="filesystem resize max" ;; - REISERFS) PROG="resize_reiserfs"; PARAMS="-f" ;; + BTRFS) PROG="btrfs"; PARAMS="filesystem resize max" + DOMOUNT=1 # Debe estar montado. + ;; + REISERFS|REISER4) + PROG="resize_reiserfs"; PARAMS="-f" ;; NTFS) PROG="ntfsresize"; PARAMS="<<<\"y\" -f" ;; # FAT32|FAT16) # Usar "fatresize" *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE" return $? ;; esac -# Error si el sistema de archivos está montado o bloqueado. -ogUnmount $1 $2 2>/dev/null -if ogIsMounted $1 $2; then - ogRaiseError $OG_ERR_PARTITION "$1 $2" # Indicar nuevo error - return $? +# Error si el sistema de archivos no se queda en el estado de montaje adecuado. +if [ "$DOMOUNT" ]; then + PART=$(ogMount $1 $2) + [ -n "$PART" ] || ogRaiseError $OG_ERR_PARTITION "$1 $2" || return $? # Indicar nuevo error +else + ogUnmount $1 $2 2>/dev/null + [ ogIsMounted $1 $2 ] || ogRaiseError $OG_ERR_PARTITION "$1 $2" || return $? # Indicar nuevo error fi +# Error si el sistema de archivos está bloqueado. if ogIsLocked $1 $2; then ogRaiseError $OG_ERR_LOCKED "$1 $2" return $? @@ -188,10 +196,10 @@ esac #@brief Formatea un sistema de ficheros según el tipo de su partición. #@param int_ndisk nº de orden del disco #@param int_nfilesys nº de orden del sistema de archivos -#@param type_fstype mnemónico de sistema de ficheros a formatear +#@param type_fstype mnemónico de sistema de ficheros a formatear (opcional al reformatear) #@param str_label etiqueta de volumen (opcional) #@return (por determinar) -#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_FORMAT Formato de ejecución incorrecto. #@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. #@exception OG_ERR_PARTITION Partición no accesible o desconocida. #@note Requisitos: mkfs* @@ -203,14 +211,14 @@ esac #@version 1.0.4 - Solucionado error cuando no se detecta tipo de sistema de ficheros pero si se indica. #@author Universidad de Huelva #@date 2012-04-11 -#@version 1.0.5 - Comprobar errores al inicio y desmontar antes de formatear. +#@version 1.0.5 - Comprobar errores al inicio e independizar del tipo de tabla de particiones. #@author Universidad de Huelva -#@date 2012-12-14 +#@date 2013-05-16 #*/ ## function ogFormatFs () { # Variables locales -local PART ID TYPE LABEL PROG PARAMS ERRCODE +local PART ID TYPE LABEL PROG PARAMS LABELPARAM ERRCODE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then @@ -234,81 +242,46 @@ if ogIsLocked $1 $2; then ogRaiseError $OG_ERR_LOCKED "$1 $2" return $? fi -# Obtener tipo de sisitema de archivos. -TYPE="$(ogGetFsType $1 $2)" -if [ -z "$TYPE" ]; then - # Si no se indico ningun tipo de sistema de ficheros se retorna - if [ -z "$3" ]; then - return $? - else - # Si no se detecto, se asigna el indicado - TYPE="$3" - fi -fi +# Si no se indica el tipo de sisitema de archivos, intentar obtenerlo. +TYPE="${3:-$(ogGetFsType $1 $2)}" +# Error, si no especifica el tipo de sistema de archivos a formatear. +[ -n "$TYPE" ] || ogRaiseError $OG_ERR_FORMAT "$1 $2 ..." || return $? -# Elegir tipo de formato segun el tipo de particion. -case "$3" in - EXT2) ID=83; PROG="mkfs.ext2" ;; - EXT3) ID=83; PROG="mkfs.ext3" ;; - EXT4) ID=83; PROG="mkfs.ext4" ;; - BTRFS) ID=83; PROG="mkfs.btrfs" ;; - REISERFS) ID=83; PROG="mkfs.reiserfs"; PARAMS="-f" ;; - REISER4) ID=83; PROG="mkfs.reiser4" ;; - XFS) ID=83; PROG="mkfs.xfs"; PARAMS="-f" ;; - JFS) ID=83; PROG="mkfs.jfs"; PARAMS="<<<\"y\"";; - NTFS) ID=7; PROG="mkntfs"; PARAMS="-f" ;; - HNTFS) ID=17; PROG="mkntfs"; PARAMS="-f" ;; - FAT32) ID=b; PROG="mkdosfs"; PARAMS="-F 32" ;; - HFAT32) ID=1b; PROG="mkdosfs"; PARAMS="-F 32" ;; - FAT16) ID=6; PROG="mkdosfs"; PARAMS="-F 16" ;; - HFAT16) ID=16; PROG="mkdosfs"; PARAMS="-F 16" ;; - FAT12) ID=1; PROG="mkdosfs"; PARAMS="-F 12" ;; - HFAT12) ID=11; PROG="mkdosfs"; PARAMS="-F 12" ;; - HFS) ID=af; PROG="mkfs.hfs" ;; - HFSPLUS) ID=af; PROG="mkfs.hfsplus" ;; - UFS) ID=bf; PROG="mkfs.ufs"; PARAMS="-O 2" ;; - *) LABEL="$3" ;; +# Elegir tipo de formato. +case "$TYPE" in + EXT2) PROG="mkfs.ext2" ;; + EXT3) PROG="mkfs.ext3" ;; + EXT4) PROG="mkfs.ext4" ;; + BTRFS) PROG="mkfs.btrfs" ;; + REISERFS) PROG="mkfs.reiserfs"; PARAMS="-f"; LABELPARAM="-l" ;; + REISER4) PROG="mkfs.reiser4"; PARAMS="-fy" ;; + XFS) PROG="mkfs.xfs"; PARAMS="-f" ;; + JFS) PROG="mkfs.jfs"; PARAMS="<<<\"y\"" ;; + LINUX-SWAP) PROG="mkswap" ;; + NTFS) PROG="mkntfs"; PARAMS="-f" ;; + EXFAT) PROG="mkfs.exfat"; LABELPARAM="-n" ;; + FAT32) PROG="mkdosfs"; PARAMS="-F 32"; LABELPARAM="-n" ;; + FAT16) PROG="mkdosfs"; PARAMS="-F 16"; LABELPARAM="-n" ;; + FAT12) PROG="mkdosfs"; PARAMS="-F 12"; LABELPARAM="-n" ;; + HFS) PROG="mkfs.hfs" ;; + HFSPLUS) PROG="mkfs.hfsplus"; LABELPARAM="-v" ;; + UFS) PROG="mkfs.ufs"; PARAMS="-O 2" ;; + *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE" + return $? ;; esac -# Si no se indica explícitamente, detectar el tipo de sistema de archivos. -if [ -z "$PROG" ]; then - case "$TYPE" in - EXT2) PROG="mkfs.ext2" ;; - EXT3) PROG="mkfs.ext3" ;; - EXT4) PROG="mkfs.ext4" ;; - BTRFS) PROG="mkfs.btrfs" ;; - REISERFS) PROG="mkfs.reiserfs"; PARAMS="-f" ;; - REISER4) PROG="mkfs.reiser4" ;; - XFS) PROG="mkfs.xfs"; PARAMS="-f" ;; - JFS) PROG="mkfs.jfs"; PARAMS="<<<\"y\"" ;; - LINUX-SWAP) PROG="mkswap" ;; - NTFS) PROG="mkntfs"; PARAMS="-f" ;; - FAT32) PROG="mkdosfs"; PARAMS="-F 32" ;; - FAT16) PROG="mkdosfs"; PARAMS="-F 16" ;; - FAT12) PROG="mkdosfs"; PARAMS="-F 12" ;; - HFS) PROG="mkfs.hfs" ;; - HFSPLUS) PROG="mkfs.hfsplus" ;; - UFS) PROG="mkfs.ufs"; PARAMS="-O 2" ;; - *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE" - return $? ;; - esac -else - [ $TYPE == "$3" -o $ID == "$(ogGetPartitionId $1 $2)" ] || ogRaiseError $OG_ERR_PARTITION "$3 != $TYPE" || return $? -fi -# Comprobar consistencia entre id. de partición y tipo de sistema de archivos. -[ -n "$PROG" ] || ogRaiseError $OG_ERR_PARTITION "$3 != $TYPE" || return $? # Etiquetas de particion. if [ -z "$LABEL" ]; then [ "$4" != "CACHE" ] || ogRaiseError $OG_ERR_FORMAT "$MSG_RESERVEDVALUE: CACHE" || return $? - [ -n "$4" ] && PARAMS="$PARAMS -L $4" + [ -n "$4" ] && PARAMS="$PARAMS ${LABELPARAM:-"-L"} $4" else - PARAMS="$PARAMS -L $LABEL" + PARAMS="$PARAMS ${LABELPARAM:-"-L"} $LABEL" fi # Formatear en modo uso exclusivo (desmontar siempre). ogLock $1 $2 trap "ogUnlock $1 $2" 1 2 3 6 9 -umount $PART +umount $PART 2>/dev/null eval $PROG $PARAMS $PART 2>/dev/null ERRCODE=$? case $ERRCODE in @@ -383,7 +356,7 @@ echo ${SIZE%.0*} #@param int_ndisk nº de orden del disco #@param int_nfilesys nº de orden del sistema de archivos #@return Mnemonico -#@note Mnemonico: { EXT2, EXT3, EXT4, REISERFS, XFS, JFS, FAT16, FAT32, NTFS, CACHE } +#@note Mnemonico: { EXT2, EXT3, EXT4, BTRFS, REISERFS, XFS, JFS, FAT32, NTFS, CACHE } #@exception OG_ERR_FORMAT Formato incorrecto. #@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. #@version 0.1 - Integracion para Opengnsys - EAC: TypeFS() en ATA.lib @@ -760,10 +733,19 @@ case "$(ogGetFsType $1 $2)" in #resize2fs -fp $PART "${SIZE}M" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? resize2fs -fpM $PART &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? ;; -# BTRFS) # Usar "btrfs" -# ;; -# REISERFS) # Usar "resize_reiserfs" -# ;; + BTRFS) + MNTDIR=$(ogMount $1 $2) + # Calcular tamaño ocupado + 10%. + SIZE=$[ $(df -k $MNTDIR | awk '{getline;print $3}') * 110 / 100 ] + btrfs filesystem resize ${SIZE}k $MNTDIR + ;; + REISERFS|REISER4) + MNTDIR=$(ogMount $1 $2) + # Calcular tamaño ocupado + 10%. + SIZE=$[ $(df -k $MNTDIR | awk '{getline;print $3}') * 110 / 100 ] + ogUnmount $1 $2 2>/dev/null + resize_reiserfs -s${SIZE}K $PART + ;; NTFS) ogDeleteFile $1 $2 pagefile.sys ogDeleteFile $1 $2 hiberfil.sys |