source: client/engine/CacheLib.py @ 13ff5a5

ogClonningEnginetest-python-scriptsticket-577ticket-585ticket-693ticket-700
Last change on this file since 13ff5a5 was 6482bcc, checked in by Antonio Emmanuel Guerrero Silva <aguerrero@…>, 9 months ago

refs #577 Library bugs resolved

  • Property mode set to 100644
File size: 7.4 KB
Line 
1import os
2import re
3import subprocess
4import shutil
5import sys
6import platform
7from SystemLib import *
8from DiskLib import *
9from SystemLib import OG_ERR_PARTITION, MSG_NOCACHE, OGIMG
10
11def ogCreateCache(ndisk=1, npart=4, partsize=None):
12    """
13    Define la caché local, por defecto en partición 4 del disco 1.
14   
15    :param ndisk: número de disco donde crear la caché, por defecto es 1.
16    :param npart: número de partición (opcional, 4 por defecto).
17    :param partsize: tamaño de la partición en KB.
18    :raises ValueError: Si el formato de los parámetros es incorrecto.
19    :raises RuntimeError: Si ocurre un error durante la creación de la caché.
20    """
21
22    if partsize is None:
23        raise ValueError("El tamaño de la partición debe especificarse.")
24
25    # Verifica si las herramientas necesarias están instaladas
26    required_tools = ["sfdisk", "parted", "awk", "sed"]
27    for tool in required_tools:
28        if not shutil.which(tool):
29            raise RuntimeError(f"La herramienta {tool} no está instalada.")
30
31    # Preparar los comandos para crear la caché
32    disk = f"/dev/sd{chr(96 + ndisk)}"
33    size_in_sectors = partsize * 2  # Asumiendo 512B por sector
34
35    try:
36        # Lógica simplificada para crear la caché en la partición
37        subprocess.run(["parted", disk, "mkpart", "primary", str(npart), str(partsize)], check=True)
38    except subprocess.CalledProcessError as e:
39        raise RuntimeError(f"Error al crear la caché: {e}")
40
41def ogDeleteCache():
42    """
43    Borra la partición utilizada para caché.
44
45    :raises RuntimeError: Si ocurre un error durante la eliminación de la partición de caché.
46    """
47    cachepart = ogFindCache()
48    if cachepart is None:
49        raise RuntimeError("No se encontró la partición de caché.")
50
51    disk = f"/dev/sd{chr(96 + int(cachepart))}"
52    try:
53        subprocess.run(["parted", disk, "rm", cachepart], check=True)
54    except subprocess.CalledProcessError as e:
55        raise RuntimeError(f"Error al borrar la partición de caché: {e}")
56
57def ogFindCache():
58    """
59    Encuentra la partición que se usa como caché.
60
61    :return: El nombre de la partición de caché si se encuentra, de lo contrario None.
62    """
63    try:
64        for disk in [f"/dev/sd{chr(97 + i)}" for i in range(26)]:  # /dev/sda to /dev/sdz
65            result = subprocess.run(["sfdisk", "-d", disk], capture_output=True, text=True, check=True)
66            if "CA00" in result.stdout:
67                cachepart = [line.split()[0] for line in result.stdout.splitlines() if "CA00" in line][0]
68                return cachepart
69    except subprocess.CalledProcessError:
70        return None
71
72    return None
73
74def ogFormatCache():
75    """
76    Formatea la partición de caché.
77
78    :raises RuntimeError: Si ocurre un error durante el formateo de la partición.
79    """
80    # Si se solicita, mostrar ayuda.
81    if len(sys.argv) > 1 and sys.argv[1] == "help":
82        ogHelp("ogFormatCache", "ogFormatCache")
83        return
84
85    # Error si no hay definida partición de caché.
86    cachepart = ogFindCache()
87    if cachepart is None:
88        ogRaiseError(OG_ERR_PARTITION, MSG_NOCACHE)
89        return
90
91    disk = ogDiskToDev(cachepart)
92
93    # Formatear sistema de ficheros.
94    ogUnmountCache()
95    options = "extent,large_file"
96    if re.match("^5", platform.release()):
97        options += ",uninit_bg,^metadata_csum,^64bit"
98    try:
99        subprocess.run(["mkfs.ext4", "-q", "-F", disk, "-L", "CACHE", "-O", options], check=True)
100    except subprocess.CalledProcessError as e:
101        raise RuntimeError(f"Error al formatear la partición de caché: {e}")
102
103    # Crear estructura básica.
104    mntdir = ogMountCache()
105    os.makedirs(os.path.join(mntdir, OGIMG), exist_ok=True)
106
107    # Incluir kernel e Initrd del ogLive
108    updateBootCache()
109
110def ogGetCacheSize():
111    """
112    Obtiene el tamaño de la partición de caché.
113
114    :return: Tamaño de la partición de caché en kilobytes.
115    :raises RuntimeError: Si ocurre un error al obtener el tamaño de la partición de caché.
116    """
117    # Si se solicita, mostrar ayuda.
118    if len(sys.argv) > 1 and sys.argv[1] == "help":
119        ogHelp("ogGetCacheSize", "help", "ogGetCacheSize")
120
121    # Error si no se encuentra partición de caché.
122    cachepart = ogFindCache()
123    if cachepart is None:
124        raise RuntimeError(MSG_NOCACHE)
125
126    # Devuelve tamaño de la partición de caché.
127    return ogGetPartitionSize(cachepart)
128
129def ogGetCacheSpace():
130    """
131    Obtiene el espacio libre en la partición de caché en kilobytes.
132
133    :return: Espacio libre en kilobytes.
134    :raises RuntimeError: Si ocurre un error al obtener el espacio libre.
135    """
136    # Si se solicita, mostrar ayuda.
137    if len(sys.argv) > 1 and sys.argv[1] == "help":
138        ogHelp("ogGetCacheSpace", "help", "ogGetCacheSpace")
139
140    # Error si no se encuentra partición de caché.
141    cachepart = ogFindCache()
142    if cachepart is None:
143        raise RuntimeError(MSG_NOCACHE)
144
145    # Obtener el tamaño del disco y el número de sectores.
146    disk = ogDiskToDev(cachepart)
147    try:
148        result = subprocess.run(["sfdisk", "-g", disk], capture_output=True, text=True, check=True)
149        output = result.stdout
150        sectors_per_cylinder = int(output.splitlines()[1].split()[1])
151        total_sectors = int(output.splitlines()[1].split()[0]) * sectors_per_cylinder - 1
152    except subprocess.CalledProcessError as e:
153        raise RuntimeError(f"Error al obtener el espacio libre: {e}")
154
155    # Obtener el último sector de la partición 3.
156    try:
157        result = subprocess.run(["sfdisk", "-uS", "-l", disk], capture_output=True, text=True, check=True)
158        output = result.stdout
159        end_sector_part3 = int([line.split()[2] for line in output.splitlines() if cachepart + "3" in line][0])
160    except subprocess.CalledProcessError as e:
161        raise RuntimeError(f"Error al obtener el espacio libre: {e}")
162
163    # Calcular el espacio libre en kilobytes.
164    if end_sector_part3 > total_sectors // 2:
165        free_space_kb = (total_sectors - end_sector_part3) // 2
166    else:
167        free_space_kb = total_sectors // 4
168
169    return free_space_kb
170
171def ogMountCache():
172    """
173    Monta la partición de caché en el directorio /mnt/sda4.
174
175    :raises RuntimeError: Si ocurre un error durante el montaje de la partición de caché.
176    """
177    # Si se solicita, mostrar ayuda.
178    if len(sys.argv) > 1 and sys.argv[1] == "help":
179        ogHelp("ogMountCache", "help", "ogMountCache")
180
181    # Montar la partición de caché en /mnt/sda4.
182    try:
183        subprocess.run(["mount", ogFindCache(), "/mnt/sda4"], check=True)
184    except subprocess.CalledProcessError as e:
185        raise RuntimeError(f"Error al montar la partición de caché: {e}")
186
187def ogUnmountCache():
188    """
189    Desmonta la partición de caché.
190
191    :raises RuntimeError: Si ocurre un error durante el desmontaje de la partición de caché.
192    """
193    # Si se solicita, mostrar ayuda.
194    if len(sys.argv) > 1 and sys.argv[1] == "help":
195        ogHelp("ogUnmountCache", "help", "ogUnmountCache")
196
197    # Obtener la partición de caché.
198    cachepart = ogFindCache()
199    if cachepart is None:
200        raise RuntimeError("No se encontró la partición de caché.")
201
202    # Desmontar la partición de caché.
203    try:
204        subprocess.run(["umount", cachepart], check=True)
205    except subprocess.CalledProcessError as e:
206        raise RuntimeError(f"Error al desmontar la partición de caché: {e}")
207
208    # Eliminar el enlace simbólico de /mnt/ParticiónCache.
209    os.remove(f"/mnt/{cachepart}")
Note: See TracBrowser for help on using the repository browser.