ogclone-engine/client/lib/engine/bin/FileSystemLib.py

831 lines
28 KiB
Python

import subprocess
import sys
from SystemLib import *
from DiskLib import *
from CacheLib import *
print (">>>>>>>>>>>>>>>>>>>> Load ", __name__, " <<<<<<<<<<<<<<<<<<<<<<")
def ogCheckFs(int_ndisk, int_nfilesys):
# Si se solicita, mostrar ayuda.
if int_ndisk == "help":
ogHelp("ogCheckFs", "ogCheckFs int_ndisk int_nfilesys", "ogCheckFs 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición.
PART = ogDiskToDev(int_ndisk, int_nfilesys)
if not PART:
return
TYPE = ogGetFsType(int_ndisk, int_nfilesys)
if TYPE == "EXT[234]" or TYPE == "CACHE":
PROG = "e2fsck"
PARAMS = "-y"
CODES = [1, 2]
elif TYPE == "BTRFS":
PROG = "btrfsck"
CODES = [1]
elif TYPE == "REISERFS":
PROG = "fsck.reiserfs"
PARAMS = "<<<\"Yes\""
CODES = [1, 2]
elif TYPE == "REISER4":
PROG = "fsck.reiser4"
PARAMS = "-ay"
elif TYPE == "JFS":
PROG = "fsck.jfs"
CODES = [1, 2]
elif TYPE == "XFS":
PROG = "xfs_repair"
elif TYPE == "F2FS":
PROG = "fsck.f2fs"
elif TYPE == "NTFS":
PROG = "ntfsfix"
elif TYPE == "EXFAT":
PROG = "fsck.exfat"
elif TYPE == "FAT32":
PROG = "dosfsck"
PARAMS = "-a"
CODES = [1]
elif TYPE == "FAT16":
PROG = "dosfsck"
PARAMS = "-a"
CODES = [1]
elif TYPE == "FAT12":
PROG = "dosfsck"
PARAMS = "-a"
CODES = [1]
elif TYPE == "HFS":
PROG = "fsck.hfs"
PARAMS = "-f"
elif TYPE == "HFSPLUS":
PROG = "fsck.hfs"
PARAMS = "-f"
elif TYPE == "UFS":
PROG = "fsck.ufs"
elif TYPE == "ZFS":
PROG = "fsck.zfs"
else:
ogRaiseError(OG_ERR_PARTITION, f"{int_ndisk}, {int_nfilesys}")
return
# Error si el sistema de archivos esta montado o bloqueado.
ogUnmount(int_ndisk, int_nfilesys)
if ogIsMounted(int_ndisk, int_nfilesys):
ogRaiseError(OG_ERR_PARTITION, f"{int_ndisk} {int_nfilesys}")
return
if ogIsLocked(int_ndisk, int_nfilesys):
ogRaiseError(OG_ERR_LOCKED, f"{int_ndisk} {int_nfilesys}")
return
# Comprobar en modo uso exclusivo.
ogLock(int_ndisk, int_nfilesys)
try:
result = subprocess.run([PROG, PARAMS, PART], capture_output=True)
ERRCODE = result.returncode
except FileNotFoundError:
ogRaiseError(OG_ERR_NOTEXEC, PROG)
ERRCODE = OG_ERR_NOTEXEC
except:
ogRaiseError(OG_ERR_PARTITION, f"{int_ndisk} {int_nfilesys}")
ERRCODE = OG_ERR_PARTITION
ogUnlock(int_ndisk, int_nfilesys)
return ERRCODE
def ogExtendFs():
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 2 and sys.argv[1] == "help":
ogHelp("ogExtendFs", "ogExtendFs int_ndisk int_nfilesys", "ogExtendFs 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición.
PART = ogDiskToDev(int(sys.argv[1]), int(sys.argv[2]))
if not PART:
return
# Redimensionar al tamaño máximo según el tipo de partición.
TYPE = ogGetFsType(int(sys.argv[1]), int(sys.argv[2]))
if TYPE == "EXT[234]":
PROG = "resize2fs"
PARAMS = "-f"
elif TYPE == "BTRFS":
PROG = "btrfs"
PARAMS = "filesystem resize max"
DOMOUNT = True # Debe estar montado.
elif TYPE == "REISERFS" or TYPE == "REISER4":
PROG = "resize_reiserfs"
PARAMS = "-f"
elif TYPE == "F2FS" or TYPE == "JFS" or TYPE == "NILFS2" or TYPE == "XFS" or TYPE == "EXFAT" or TYPE == "FAT32" or TYPE == "FAT16" or TYPE == "HFS" or TYPE == "HFSPLUS" or TYPE == "UFS":
return # No se reduce (por el momento).
elif TYPE == "NTFS":
PROG = "ntfsresize"
PARAMS = "<<<\"y\" -f"
else:
ogRaiseError(OG_ERR_PARTITION, f"{int(sys.argv[1])} {int(sys.argv[2])} {TYPE}")
return
# Salida normal si no se va a aplicar la operación.
if not PROG:
return
# Error si el sistema de archivos no se queda en el estado de montaje adecuado.
if DOMOUNT:
PART = ogMount(int(sys.argv[1]), int(sys.argv[2]))
if not PART:
return
else:
ogUnmount(int(sys.argv[1]), int(sys.argv[2]))
if ogIsMounted(int(sys.argv[1]), int(sys.argv[2])):
ogRaiseError(OG_ERR_PARTITION, f"{int(sys.argv[1])} {int(sys.argv[2])}")
return
# Error si el sistema de archivos está bloqueado.
if ogIsLocked(int(sys.argv[1]), int(sys.argv[2])):
ogRaiseError(OG_ERR_LOCKED, f"{int(sys.argv[1])} {int(sys.argv[2])}")
return
# Redimensionar en modo uso exclusivo.
ogLock(int(sys.argv[1]), int(sys.argv[2]))
try:
subprocess.run([PROG, PARAMS, PART], capture_output=True)
ERRCODE = 0
except FileNotFoundError:
ogRaiseError(OG_ERR_NOTEXEC, PROG)
ERRCODE = OG_ERR_NOTEXEC
except:
ogRaiseError(OG_ERR_PARTITION, f"{int(sys.argv[1])} {int(sys.argv[2])}")
ERRCODE = OG_ERR_PARTITION
ogUnlock(int(sys.argv[1]), int(sys.argv[2]))
return ERRCODE
def ogFormat(int_ndisk, int_nfilesys):
if int_nfilesys.lower() == "cache":
ogFormatCache()
else:
ogFormatFs(int_ndisk, int_nfilesys)
def ogFormatFs(int_ndisk, int_nfilesys, str_label=None):
# Si se solicita, mostrar ayuda.
if str_label == "help":
ogHelp("ogFormatFs", "ogFormatFs int_ndisk int_nfilesys [str_label]", "ogFormatFs 1 1", "ogFormatFs 1 1 EXT4", "ogFormatFs 1 1 \"DATA\"", "ogFormatFs 1 1 EXT4 \"DATA\"")
return
# Error si no se reciben entre 2 y 4 parámetros.
if not (2 <= len(sys.argv) <= 4):
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener fichero de dispositivo.
PART = ogDiskToDev(int_ndisk, int_nfilesys)
if not PART:
return
# Error si la partición está montada o bloqueada.
if ogIsMounted(int_ndisk, int_nfilesys):
ogRaiseError(OG_ERR_DONTFORMAT, f"{MSG_MOUNT}: {int_ndisk} {int_nfilesys}")
return
if ogIsLocked(int_ndisk, int_nfilesys):
ogRaiseError(OG_ERR_LOCKED, f"{int_ndisk} {int_nfilesys}")
return
# Si no se indica el tipo de sistema de archivos, intentar obtenerlo.
TYPE = ogGetFsType(int_ndisk, int_nfilesys)
if not TYPE:
TYPE = sys.argv[3]
# Error, si no especifica el tipo de sistema de archivos a formatear.
if not TYPE:
ogRaiseError(OG_ERR_FORMAT, f"{int_ndisk} {int_nfilesys} ...")
return
# Elegir tipo de formato.
if TYPE == "EXT2":
PROG = "mkfs.ext2"
PARAMS = "-F"
elif TYPE == "EXT3":
PROG = "mkfs.ext3"
PARAMS = "-F"
elif TYPE == "EXT4":
PROG = "mkfs.ext4"
PARAMS = "-F"
elif TYPE == "BTRFS":
PROG = "mkfs.btrfs"
PARAMS = "-f"
elif TYPE == "REISERFS":
PROG = "mkfs.reiserfs"
PARAMS = "-f"
LABELPARAM = "-l"
elif TYPE == "REISER4":
PROG = "mkfs.reiser4"
PARAMS = "-f <<<\"y\""
elif TYPE == "XFS":
PROG = "mkfs.xfs"
PARAMS = "-f"
elif TYPE == "JFS":
PROG = "mkfs.jfs"
PARAMS = "<<<\"y\""
elif TYPE == "F2FS":
PROG = "mkfs.f2fs"
LABELPARAM = "-l"
elif TYPE == "NILFS2":
PROG = "mkfs.nilfs2"
PARAMS = "-f"
elif TYPE == "LINUX-SWAP":
PROG = "mkswap"
elif TYPE == "NTFS":
PROG = "mkntfs"
PARAMS = "-f"
elif TYPE == "EXFAT":
PROG = "mkfs.exfat"
LABELPARAM = "-n"
elif TYPE == "FAT32":
PROG = "mkdosfs"
PARAMS = "-F 32"
LABELPARAM = "-n"
elif TYPE == "FAT16":
PROG = "mkdosfs"
PARAMS = "-F 16"
LABELPARAM = "-n"
elif TYPE == "FAT12":
PROG = "mkdosfs"
PARAMS = "-F 12"
LABELPARAM = "-n"
elif TYPE == "HFS":
PROG = "mkfs.hfs"
elif TYPE == "HFSPLUS":
PROG = "mkfs.hfsplus"
LABELPARAM = "-v"
elif TYPE == "UFS":
PROG = "mkfs.ufs"
PARAMS = "-O 2"
else:
ogRaiseError(OG_ERR_PARTITION, f"{int_ndisk} {int_nfilesys} {TYPE}")
return
# Etiquetas de particion.
if not str_label:
if sys.argv[4] == "CACHE":
ogRaiseError(OG_ERR_FORMAT, f"{MSG_RESERVEDVALUE}: CACHE")
return
if len(sys.argv) >= 4:
PARAMS = f"{PARAMS} {LABELPARAM or '-L'} {sys.argv[4]}"
else:
PARAMS = f"{PARAMS} {LABELPARAM or '-L'} {str_label}"
# Formatear en modo uso exclusivo (desmontar siempre).
ogLock(int_ndisk, int_nfilesys)
try:
subprocess.run([PROG, PARAMS, PART], capture_output=True)
ERRCODE = 0
except FileNotFoundError:
ogRaiseError(OG_ERR_NOTEXEC, PROG)
ERRCODE = OG_ERR_NOTEXEC
except:
ogRaiseError(OG_ERR_PARTITION, f"{int_ndisk} {int_nfilesys}")
ERRCODE = OG_ERR_PARTITION
ogUnlock(int_ndisk, int_nfilesys)
return ERRCODE
def ogGetFsSize(int_ndisk, int_npartition, str_unit=None):
# Si se solicita, mostrar ayuda.
if str_unit == "help":
ogHelp("ogGetFsSize", "ogGetFsSize int_ndisk int_npartition [str_unit]", "ogGetFsSize 1 1", "ogGetFsSize 1 1 KB")
return
# Error si no se reciben 2 o 3 parámetros.
if not (2 <= len(sys.argv) <= 3):
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener unidad y factor de medida.
UNIT = str_unit or "KB"
FACTOR = 1
if UNIT.upper() == "MB":
FACTOR = 1024
elif UNIT.upper() == "GB":
FACTOR = 1024 * 1024
elif UNIT.upper() == "TB":
FACTOR = 1024 * 1024 * 1024
elif UNIT.upper() != "KB":
ogRaiseError(OG_ERR_FORMAT, f"{UNIT} != {{ KB, MB, GB, TB }}")
return
# Obtener el tamaño del sistema de archivo (si no está formateado; tamaño = 0).
MNTDIR = ogMount(int_ndisk, int_npartition)
if MNTDIR:
result = subprocess.run(["df", "-BK", MNTDIR], capture_output=True, text=True)
VALUE = result.stdout.split("\n")[1].split()[1]
SIZE = float(VALUE) / FACTOR
else:
SIZE = 0
# Devolver el tamaño (quitar decimales si son 0).
return int(SIZE) if SIZE.is_integer() else SIZE
def ogGetFsType(int_ndisk, int_nfilesys):
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogGetFsType", "ogGetFsType int_ndisk int_nfilesys", "ogGetFsType 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición.
PART = ogDiskToDev(int_ndisk, int_nfilesys)
if not PART:
return
# Detectar tipo de sistema de archivo (independientemente del tipo de partición).
if PART.startswith("/"):
result = subprocess.run(["blkid", "-o", "export", PART], capture_output=True, text=True)
TYPE = ""
for line in result.stdout.split("\n"):
if line.startswith("TYPE="):
TYPE = line.split("=")[1].upper()
break
else:
subprocess.run(["zfs", "mount", PART], stderr=subprocess.DEVNULL)
result = subprocess.run(["mount"], capture_output=True, text=True)
TYPE = ""
for line in result.stdout.split("\n"):
if line.startswith(PART):
TYPE = line.split()[4].upper()
break
# Componer valores correctos.
if TYPE == "EXT4":
if f"{int_ndisk} {int_nfilesys}" == ogFindCache():
if ogIsFormated(int_ndisk, int_nfilesys):
TYPE = "CACHE"
elif TYPE == "VFAT":
result = subprocess.run(["blkid", "-po", "export", PART], capture_output=True, text=True)
for line in result.stdout.split("\n"):
if line.startswith("VERSION="):
TYPE = line.split("=")[1].upper()
break
elif TYPE == "SWAP":
TYPE = "LINUX-SWAP"
elif TYPE.startswith("LVM"):
TYPE = "LINUX-LVM"
elif "RAID" in TYPE:
TYPE = "LINUX-RAID"
elif TYPE == "ZFS_MEMBER":
TYPE = "ZVOL"
elif "_MEMBER" in TYPE:
TYPE = TYPE.replace("_MEMBER", "")
if TYPE:
return TYPE
def ogGetMountPoint(int_ndisk, int_nfilesys):
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogGetMountPoint", "ogGetMountPoint int_ndisk int_nfilesys", "ogGetMountPoint 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición.
PART = ogDiskToDev(int_ndisk, int_nfilesys)
if not PART:
return
# Devolver punto de montaje.
result = subprocess.run(["findmnt", "-n", "-o", "TARGET", PART], capture_output=True, text=True)
return result.stdout.strip()
def ogIsFormated(int_ndisk, int_nfilesys):
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogIsFormated", "ogIsFormated int_ndisk int_nfilesys", "ogIsFormated 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición.
PART = ogDiskToDev(int_ndisk, int_nfilesys)
if not PART:
return
# Revisar tipo de sistema de archivos.
if PART.startswith("/"):
result = subprocess.run(["blkid", "-s", "TYPE", PART], capture_output=True, text=True)
return bool(result.stdout.strip())
else:
result = subprocess.run(["zfs", "list", "-Hp", "-o", "canmount", PART], capture_output=True, text=True)
return result.stdout.strip() == "on"
def ogIsLocked(int_ndisk, int_nfilesys):
return ogIsPartitionLocked(int_ndisk, int_nfilesys)
def ogIsPartitionLocked(int_ndisk, int_npartition):
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogIsPartitionLocked", "ogIsPartitionLocked int_ndisk int_npartition", "ogIsPartitionLocked 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición.
PART = ogDiskToDev(int_ndisk, int_npartition)
if not PART:
return
# Comprobar existencia de fichero de bloqueo de la partición o de su disco.
LOCKDISK = f"/var/lock/lock{ogDiskToDev(int_ndisk).replace('/', '-')}"
LOCKPART = f"/var/lock/lock{PART.replace('/', '-')}"
return os.path.isfile(LOCKDISK) or os.path.isfile(LOCKPART)
def ogIsMounted(int_ndisk, int_nfilesys):
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogIsMounted", "ogIsMounted int_ndisk int_nfilesys", "ogIsMounted 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener punto de montaje.
MNTDIR = ogGetMountPoint(int_ndisk, int_nfilesys)
return bool(MNTDIR)
def ogIsReadonly(int_ndisk, int_nfilesys):
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogIsReadonly", "ogIsReadonly int_ndisk int_nfilesys", "ogIsReadonly 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición.
PART = ogDiskToDev(int_ndisk, int_nfilesys)
if not PART:
return
# Comprobar si la partición está montada en modo de solo lectura.
result = subprocess.run(["findmnt", "-n", "-o", "OPTIONS", PART], capture_output=True, text=True)
options = result.stdout.strip().split(",")
return "ro" in options
def ogIsWritable(int_ndisk, int_nfilesys):
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogIsWritable", "ogIsWritable int_ndisk int_nfilesys", "ogIsWritable 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición.
PART = ogDiskToDev(int_ndisk, int_nfilesys)
if not PART:
return
# Comprobar si la partición está montada en modo de escritura.
result = subprocess.run(["findmnt", "-n", "-o", "OPTIONS", PART], capture_output=True, text=True)
options = result.stdout.strip().split(",")
return "rw" in options
def ogLock(int_ndisk, int_nfilesys):
ogLockPartition(int_ndisk, int_nfilesys)
def ogLockPartition(int_ndisk, int_npartition):
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogLockPartition", "ogLockPartition int_ndisk int_npartition", "ogLockPartition 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición.
PART = ogDiskToDev(int_ndisk, int_npartition)
if not PART:
return
# Crear archivo de bloqueo exclusivo.
LOCKFILE = f"/var/lock/lock{PART.replace('/', '-')}"
open(LOCKFILE, 'a').close()
def ogMount():
args = sys.argv[2:]
if args == ["CACHE"] or args == ["cache"]:
ogMountCache()
elif args == ["CDROM"] or args == ["cdrom"]:
ogMountCdrom()
else:
ogMountFs(*args)
def ogMountFirstFs(int_ndisk):
# Obtener número de particiones del disco.
NPARTS = ogGetPartitionsNumber(int_ndisk)
for PART in range(1, NPARTS + 1):
MNTDIR = ogMount(int_ndisk, PART)
if MNTDIR:
return MNTDIR
ogRaiseError(OG_ERR_NOTFOUND, int_ndisk)
return OG_ERR_NOTFOUND
def ogMountFs(int_ndisk, int_nfilesys):
FUNCNAME = ogExecAndLog.__name__
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp(f"{FUNCNAME}", "{FUNCNAME} int_ndisk int_nfilesys", "{FUNCNAME} 1 1 => /mnt/sda1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición.
PART = ogDiskToDev(int_ndisk, int_nfilesys)
if not PART:
return
# Comprobar si el sistema de archivos ya está montada.
MNTDIR = ogGetMountPoint(int_ndisk, int_nfilesys)
# Si no, montarlo en un directorio de sistema.
if not MNTDIR:
# Error si la particion esta bloqueada.
if ogIsLocked(int_ndisk, int_nfilesys):
ogRaiseError(OG_ERR_LOCKED, f"{MSG_PARTITION}, {int_ndisk} {int_nfilesys}")
return
# El camino de un dispositivo normal comienza por el carácter "/".
if PART.startswith("/"):
# Crear punto de montaje o enlace simbólico para caché local.
MNTDIR = PART.replace("/dev", "/mnt")
DEBUG = "no"
if f"{int_ndisk} {int_nfilesys}" == ogFindCache() and OGCAC:
os.makedirs(OGCAC, exist_ok=True)
os.symlink(OGCAC, MNTDIR)
else:
os.makedirs(MNTDIR, exist_ok=True)
del DEBUG
# Montar sistema de archivos.
try:
subprocess.run(["mount", PART, MNTDIR], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
except subprocess.CalledProcessError:
try:
subprocess.run(["mount", PART, MNTDIR, "-o", "force,remove_hiberfile"], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
except subprocess.CalledProcessError:
ogRaiseError(OG_ERR_PARTITION, f"{int_ndisk}, {int_nfilesys}")
return
# Aviso de montaje de solo lectura.
if ogIsReadonly(int_ndisk, int_nfilesys):
ogEcho("warning", f"{FUNCNAME}: {MSG_MOUNTREADONLY}: \"{int_ndisk}, {int_nfilesys}\"")
else:
# Montar sistema de archivos ZFS (un ZPOOL no comienza por "/").
try:
subprocess.run(["zfs", "mount", PART], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
except subprocess.CalledProcessError:
pass
return MNTDIR
def ogMountCdrom():
DEV = "/dev/cdrom" # Por defecto
MNTDIR = subprocess.run(["mount", "-l", "-t", "iso9660", DEV], capture_output=True, text=True)
MNTDIR = MNTDIR.stdout.strip().split(" ")[2]
if not MNTDIR:
MNTDIR = DEV.replace("/dev", "/mnt")
os.makedirs(MNTDIR, exist_ok=True)
try:
subprocess.run(["mount", "-t", "iso9660", DEV, MNTDIR], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
except subprocess.CalledProcessError:
ogRaiseError(OG_ERR_PARTITION, "cdrom")
return
return MNTDIR
def ogReduceFs(int_ndisk, int_nfilesys):
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogReduceFs", "ogReduceFs int_ndisk int_nfilesys", "ogReduceFs 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición.
PART = ogDiskToDev(int_ndisk, int_nfilesys)
if not PART:
return
# Redimensionar según el tipo de partición.
TYPE = ogGetFsType(int_ndisk, int_nfilesys)
if TYPE == "EXT4":
ogUnmount(int_ndisk, int_nfilesys)
subprocess.run(["resize2fs", "-fpM", PART], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
elif TYPE == "BTRFS":
MNTDIR = ogMount(int_ndisk, int_nfilesys)
SIZE = subprocess.run(["btrfs", "filesystem", "show", MNTDIR], capture_output=True, text=True)
SIZE = SIZE.stdout.strip().split(" ")[6]
SIZE = int(float(SIZE) * 1.1 + 1)
subprocess.run(["btrfs", "filesystem", "resize", str(SIZE), MNTDIR], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
elif TYPE in ["REISERFS", "REISER4"]:
MNTDIR = ogMount(int_ndisk, int_nfilesys)
SIZE = int(subprocess.run(["df", "-k", MNTDIR], capture_output=True, text=True).stdout.strip().split("\n")[1].split()[2])
SIZE = SIZE * 110 // 100
ogUnmount(int_ndisk, int_nfilesys)
subprocess.run(["resize_reiserfs", "-s" + str(SIZE) + "K", PART], input="y\n", stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
elif TYPE == "NTFS":
ogUnmount(int_ndisk, int_nfilesys)
MAXSIZE, SIZE = subprocess.run(["ntfsresize", "-fi", PART], capture_output=True, text=True)
MAXSIZE = MAXSIZE.strip().split(" ")[3]
SIZE = SIZE.strip().split(" ")[4]
SIZE = int(float(SIZE) * 1.1 / 1024 + 1) * 1024
RETVAL = 1
while RETVAL != 0 and SIZE + EXTRASIZE < MAXSIZE:
EXTRASIZE = subprocess.run(["ntfsresize", "-fns", str(SIZE), PART], capture_output=True, text=True)
EXTRASIZE = int(EXTRASIZE.stdout.strip()) if EXTRASIZE.stdout.strip() else 0
RETVAL = EXTRASIZE != 0
SIZE += EXTRASIZE
if SIZE < MAXSIZE:
subprocess.run(["ntfsresize", "-fs", str(SIZE), PART], input="y\n", stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
elif TYPE in ["FAT32", "FAT16"]:
# No se reduce (por el momento).
pass
elif TYPE == "HFS" or TYPE == "HFSPLUS":
# No se reduce (por el momento).
pass
elif TYPE == "UFS":
# No se reduce (por el momento).
pass
else:
ogRaiseError(OG_ERR_PARTITION, f"{int_ndisk}, {int_nfilesys}")
# Devuelve tamaño del sistema de ficheros.
return ogGetFsSize(int_ndisk, int_nfilesys)
def ogUnlock(int_ndisk, int_npartition):
ogUnlockPartition(int_ndisk, int_npartition)
def ogUnlockPartition(int_ndisk, int_npartition):
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogUnlockPartition", "ogUnlockPartition int_ndisk int_npartition", "ogUnlockPartition 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición.
PART = ogDiskToDev(int_ndisk, int_npartition)
if not PART:
return
# Borrar archivo de bloqueo exclusivo.
LOCKFILE = f"/var/lock/lock{PART.replace('/', '-')}"
os.remove(LOCKFILE)
def ogUnmount():
ogUnmountFs(*sys.argv[2:])
def ogUnmountFs(int_ndisk, int_npartition):
FUNCNAME = ogUnmountFs.__name__
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogUnmountFs", "ogUnmountFs int_ndisk int_npartition", "ogUnmountFs 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición y punto de montaje.
PART = ogDiskToDev(int_ndisk, int_npartition)
MNTDIR = ogGetMountPoint(int_ndisk, int_npartition)
# Si está montada, desmontarla.
if MNTDIR:
# Error si la particion está bloqueada.
if ogIsPartitionLocked(int_ndisk, int_npartition):
ogRaiseError(OG_ERR_LOCKED, f"{MSG_PARTITION}, {int_ndisk} {int_npartition}")
return
# Desmontar y borrar punto de montaje.
try:
subprocess.run(["umount", PART], check=True, stderr=subprocess.DEVNULL)
except subprocess.CalledProcessError:
ogEcho("warning", f"{FUNCNAME}: {MSG_DONTUNMOUNT}: \"{int_ndisk}, {int_npartition}\"")
try:
os.rmdir(MNTDIR)
except OSError:
os.remove(MNTDIR)
else:
ogEcho("warning", f"{MSG_DONTMOUNT}: \"{int_ndisk},{int_npartition}\"")
ogUnmountFs(int_ndisk, int_npartition)
def ogUnmountAll(int_ndisk):
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogUnmountAll", "ogUnmountAll int_ndisk", "ogUnmountAll 1")
return
# Error si no se recibe 1 parámetro.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición y punto de montaje.
DISK = ogDiskToDev(int_ndisk)
for PART in range(1, ogGetPartitionsNumber(int_ndisk) + 1):
if ogGetFsType(int_ndisk, PART) != "CACHE":
ogUnmount(int_ndisk, PART)
def ogUnsetDirtyBit(int_ndisk, int_nfilesys):
# Si se solicita, mostrar ayuda.
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogUnsetDirtyBit", "ogUnsetDirtyBit int_ndisk int_nfilesys", "ogUnsetDirtyBit 1 1")
return
# Error si no se reciben 2 parámetros.
if len(sys.argv) != 3:
ogRaiseError(OG_ERR_FORMAT)
return
# Obtener partición y punto de montaje.
PART = ogDiskToDev(int_ndisk, int_nfilesys)
if not PART:
return
# Realizar acciones específicas según el tipo de sistema de archivos.
TYPE = ogGetFsType(int_ndisk, int_nfilesys)
if TYPE == "NTFS":
ogUnmount(int_ndisk, int_nfilesys)
subprocess.run(["ntfsfix", "-d", PART], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
else:
pass # Add more specific actions for other file systems if needed.
def ogGetFreeSize(int_ndisk, int_npartition, str_SizeOutput):
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogGetFreeSize", "ogGetFreeSize int_ndisk int_npartition str_SizeOutput", "ogGetFreeSize 1 1 GB")
return
if len(sys.argv) < 3:
ogRaiseError(OG_ERR_FORMAT)
return
PART = ogDiskToDev(int_ndisk, int_npartition)
if not PART:
return
unit = str_SizeOutput
if not unit:
unit = "GB"
factor = 1.024 / 1000000
if unit == "kB":
factor = 1.024
elif unit == "MB":
factor = 1.024 / 1000
result = subprocess.run(["df", PART], capture_output=True, text=True)
output = result.stdout.strip().split("\n")[1].split()
size = float(output[1]) * factor
used = float(output[2]) * factor
free = float(output[3]) * factor
return free