refs #1166 add ogGetPartitionActive()

pull/1/head
Natalia Serrano 2024-11-21 16:31:19 +01:00
parent 8ba0913684
commit 4be9f566a6
1 changed files with 262 additions and 18 deletions

View File

@ -1,3 +1,12 @@
#/**
#@file Disk.lib
#@brief Librería o clase Disk
#@class Disk
#@brief Funciones para gestión de discos y particiones.
#@version 1.1.1
#@warning License: GNU GPLv3+
#*/
import filecmp
import subprocess
import shutil
@ -10,6 +19,7 @@ import SystemLib
import CacheLib
import FileSystemLib
# Función ficticia para lanzar parted con timeout, evitando cuelgues del programa.
def parted(*args):
parted_path = shutil.which("parted")
if parted_path:
@ -26,6 +36,23 @@ def parted(*args):
else:
return "Error: 'parted' command not found"
#/**
# ogCreatePartitions int_ndisk str_parttype:int_partsize ...
#@brief Define el conjunto de particiones de un disco.
#@param int_ndisk nº de orden del disco
#@param str_parttype mnemónico del tipo de partición
#@param int_partsize tamaño de la partición (en KB)
#@return (nada, por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND disco o partición no detectado (no es un dispositivo).
#@exception OG_ERR_PARTITION error en partición o en tabla de particiones.
#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
#@attention Pueden definirse particiones vacías de tipo \c EMPTY
#@attention No puede definirse partición de cache y no se modifica si existe.
#@note Requisitos: sfdisk, parted, partprobe, awk
#@todo Definir atributos (arranque, oculta) y tamaños en MB, GB, etc.
#*/ ##
def ogCreatePartitions(*args):
# Variables locales
ND = DISK = PTTYPE = PART = SECTORS = START = SIZE = TYPE = CACHEPART = None
@ -123,6 +150,23 @@ def ogCreatePartitions(*args):
CacheLib.ogMountCache()
return 0
#/**
# ogCreateGptPartitions int_ndisk str_parttype:int_partsize ...
#@brief Define el conjunto de particiones de un disco GPT
#@param int_ndisk nº de orden del disco
#@param str_parttype mnemónico del tipo de partición
#@param int_partsize tamaño de la partición (en KB)
#@return (nada, por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND disco o partición no detectado (no es un dispositivo).
#@exception OG_ERR_PARTITION error en partición o en tabla de particiones.
#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
#@attention Pueden definirse particiones vacías de tipo \c EMPTY
#@attention No puede definirse partición de caché y no se modifica si existe.
#@note Requisitos: sfdisk, parted, partprobe, awk
#@todo Definir atributos (arranque, oculta) y tamaños en MB, GB, etc.
#*/ ##
def ogCreateGptPartitions(*args):
# Variables locales
ND = DISK = PART = SECTORS = ALIGN = START = SIZE = TYPE = CACHEPART = CACHESIZE = DELOPTIONS = OPTIONS = None
@ -214,6 +258,18 @@ def ogCreateGptPartitions(*args):
CacheLib.ogMountCache()
return 0
#/**
# ogCreatePartitionTable int_ndisk [str_tabletype]
#@brief Genera una tabla de particiones en caso de que no sea valida, si es valida no hace nada.
#@param int_ndisk nº de orden del disco
#@param str_tabletype tipo de tabla de particiones (opcional)
#@return (por determinar)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@note tabletype: { MSDOS, GPT }, MSDOS por defecto
#@note Requisitos: fdisk, gdisk, parted
#*/ ##
def ogCreatePartitionTable(*args):
# Variables locales
DISK = PTTYPE = CREATE = CREATEPTT = None
@ -281,6 +337,13 @@ def ogCreatePartitionTable(*args):
subprocess.run(["partprobe", DISK], stderr=subprocess.DEVNULL)
return
#/**
# ogDeletePartitionTable ndisk
#@brief Borra la tabla de particiones del disco.
#@param int_ndisk nº de orden del disco
#@return la informacion propia del fdisk
#*/ ##
def ogDeletePartitionTable(*args):
# Variables locales
DISK = None
@ -546,6 +609,16 @@ def ogDiskToDev (arg_disk=None, arg_part=None):
return part
#/**
# ogGetDiskSize int_ndisk
#@brief Muestra el tamaño en KB de un disco.
#@param int_ndisk nº de orden del disco
#@return int_size - Tamaño en KB del disco.
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
#@note Requisitos: sfdisk, awk
#*/ ##
def ogGetDiskSize(*args):
# Variables locales
DISK = SIZE = None
@ -571,6 +644,15 @@ def ogGetDiskSize(*args):
print(SIZE)
return
#/**
# ogGetDiskType path_device
#@brief Muestra el tipo de disco (real, RAID, meta-disco, USB, etc.).
#@param path_device Dispositivo
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND disco no detectado o no es un dispositivo de bloques.
#@note Requisitos: udevadm
#*/ ##
def ogGetDiskType(*args):
# Variables locales
DEV = MAJOR = TYPE = None
@ -629,6 +711,17 @@ def ogGetEsp():
return PART
return None
#/**
# ogGetLastSector int_ndisk [int_npart]
#@brief Devuelve el último sector usable del disco o de una partición.
#@param int_ndisk nº de orden del disco
#@param int_npart nº de orden de la partición (opcional)
#@return Último sector usable.
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o partición no corresponde con un dispositivo.
#@note Requisitos: sfdisk, sgdisk
#*/ ##
def ogGetLastSector(*args):
# Variables locales
DISK = None
@ -663,27 +756,39 @@ def ogGetLastSector(*args):
print(LASTSECTOR)
return
def ogGetPartitionActive(*args):
# Variables locales
DISK = None
# Si se solicita, mostrar ayuda.
if len(args) == 1 and args[0] == "help":
SystemLib.ogHelp('ogGetPartitionActive', 'ogGetPartitionActive int_ndisk', 'ogGetPartitionActive 1 => 1')
return
#/**
# ogGetPartitionActive int_ndisk
#@brief Muestra que particion de un disco esta marcada como de activa.
#@param int_ndisk nº de orden del disco
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@note Requisitos: parted
#@todo Queda definir formato para atributos (arranque, oculta, ...).
#*/ ##
def ogGetPartitionActive (disk):
DISK = ogDiskToDev (disk)
if DISK is None: return
# Error si no se recibe 1 parámetro.
if len(args) != 1:
SystemLib.ogRaiseError(OG_ERR_FORMAT)
return
if 'LANG' in os.environ:
lang = os.environ['LANG']
# Comprobar que el disco existe y listar su partición activa.
DISK = ogDiskToDev(args[0])
if DISK is None:
return
output = subprocess.getoutput(f"parted -sm {DISK} print 2>/dev/null | awk -F: '$7~/boot/ {{print $1}}'")
print(output)
return
ret = None
os.environ['LANG'] = 'C'
lines = subprocess.run (['parted', '--script', '--machine', DISK, 'print'], capture_output=True, text=True).stdout.splitlines()
for line in lines:
parts = line.split (':')
if len (parts) < 6: continue
if 'boot' in parts[6]:
ret = parts[0]
break
if lang is None:
del os.environ['LANG']
else:
os.environ['LAMG'] = lang
return ret
#/**
@ -743,6 +848,16 @@ def ogGetPartitionSize (disk, par):
return FileSystemLib.ogGetFsSize (disk, par)
#/**
# ogGetPartitionsNumber int_ndisk
#@brief Detecta el numero de particiones del disco duro indicado.
#@param int_ndisk nº de orden del disco
#@return Devuelve el numero paritiones del disco duro indicado
#@warning Salidas de errores no determinada
#@attention Requisitos: parted
#@note Notas sin especificar
#*/ ##
def ogGetPartitionsNumber(*args):
# Variables locales
DISK = None
@ -845,6 +960,17 @@ def ogGetPartitionType(*args):
print(TYPE)
return
#/**
# ogHidePartition int_ndisk int_npartition
#@brief Oculta un apartición visible.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
#@exception OG_ERR_PARTITION tipo de partición no reconocido.
#*/ ##
def ogHidePartition(*args):
# Variables locales
PART = None
@ -886,6 +1012,14 @@ def ogHidePartition(*args):
ogSetPartitionType(args[0], args[1], NEWTYPE)
return
#/**
# ogIdToType int_idpart
#@brief Devuelve el identificador correspondiente a un tipo de partición.
#@param int_idpart identificador de tipo de partición.
#@return str_parttype mnemónico de tipo de partición.
#@exception OG_ERR_FORMAT Formato incorrecto.
#*/ ##
def ogIdToType(ID):
# Obtener valor hexadecimal de 4 caracteres rellenado con 0 por delante.
ID = ID.zfill(4)
@ -985,6 +1119,13 @@ def ogIdToType(ID):
return TYPE
# ogIsDiskLocked int_ndisk
#@brief Comprueba si un disco está bloqueado por una operación de uso exclusivo.
#@param int_ndisk nº de orden del disco
#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error.
#@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 "-".
#*/ ##
def ogIsDiskLocked(*args):
# Variables locales
DISK = None
@ -1006,6 +1147,18 @@ def ogIsDiskLocked(*args):
LOCKFILE = f"/var/lock/lock{DISK.replace('/', '-')}"
return os.path.isfile(LOCKFILE)
#/**
# ogListPartitions int_ndisk
#@brief Lista las particiones definidas en un disco.
#@param int_ndisk nº de orden del disco
#@return str_parttype:int_partsize ...
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
#@note Requisitos: \c parted \c awk
#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
#@attention Las tuplas de valores están separadas por espacios.
#*/ ##
def ogListPartitions(*args):
# Variables locales
DISK = None
@ -1036,6 +1189,13 @@ def ogListPartitions(*args):
print()
return
#/**
# ogListPrimaryPartitions int_ndisk
#@brief Metafunción que lista las particiones primarias no vacías de un disco.
#@param int_ndisk nº de orden del disco
#@see ogListPartitions
#*/ ##
def ogListPrimaryPartitions(*args):
# Variables locales
PTTYPE = None
@ -1059,6 +1219,13 @@ def ogListPrimaryPartitions(*args):
print(PARTS.split(" ")[0:4])
return
#/**
# ogListLogicalPartitions int_ndisk
#@brief Metafunción que lista las particiones lógicas de una tabla tipo MSDOS.
#@param int_ndisk nº de orden del disco
#@see ogListPartitions
#*/ ##
def ogListLogicalPartitions(*args):
# Variables locales
PTTYPE = None
@ -1078,6 +1245,16 @@ def ogListLogicalPartitions(*args):
return PARTS.split(" ")[4:]
#/**
# ogLockDisk int_ndisk
#@brief Genera un fichero de bloqueo para un disco en uso exlusivo.
#@param int_ndisk nº de orden del disco
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@note El fichero de bloqueo se localiza en \c /var/lock/disk, siendo \c disk el dispositivo del disco, sustituyendo el carácter "/" por "-".
#*/ ##
def ogLockDisk(*args):
# Variables locales
DISK = None
@ -1102,6 +1279,17 @@ def ogLockDisk(*args):
LOCKFILE = f"/var/lock/lock{DISK.replace('/', '-')}"
open(LOCKFILE, 'a').close()
#/**
# ogSetPartitionActive int_ndisk int_npartition
#@brief Establece cual es la partición activa de un disco.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@return (nada).
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo.
#@note Requisitos: parted
#*/ ##
def ogSetPartitionActive(*args):
# Variables locales
DISK = None
@ -1127,6 +1315,20 @@ def ogSetPartitionActive(*args):
subprocess.run(["parted", "-s", DISK, "set", args[1], "boot", "on"], stderr=subprocess.DEVNULL)
return
#/**
# ogSetPartitionId int_ndisk int_npartition hex_partid
#@brief Cambia el identificador de la partición.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@param hex_partid identificador de tipo de partición
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo.
#@exception OG_ERR_OUTOFLIMIT Valor no válido.
#@exception OG_ERR_PARTITION Error al cambiar el id. de partición.
#@attention Requisitos: fdisk, sgdisk
#*/ ##
def ogSetPartitionId(*args):
# Variables locales
DISK = None
@ -1174,6 +1376,19 @@ def ogSetPartitionId(*args):
SystemLib.ogRaiseError(OG_ERR_PARTITION, f"{args[0]},{args[1]},{args[2]}")
return
#/**
# ogSetPartitionSize int_ndisk int_npartition int_size
#@brief Muestra el tamano en KB de una particion determinada.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@param int_size tamaño de la partición (en KB)
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
#@note Requisitos: sfdisk, awk
#@todo Compruebar que el tamaño sea numérico positivo y evitar que pueda solaparse con la siguiente partición.
#*/ ##
def ogSetPartitionSize(*args):
# Variables locales
DISK = None
@ -1204,6 +1419,16 @@ def ogSetPartitionSize(*args):
subprocess.run(["partprobe", DISK], stderr=subprocess.DEVNULL)
return
#/**
# ogSetPartitionType int_ndisk int_npartition str_type
#@brief Cambia el identificador de la partición.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@param str_type mnemónico de tipo de partición
#@return (nada)
#@attention Requisitos: fdisk, sgdisk
#*/ ##
def ogSetPartitionType(*args):
# Variables locales
DISK = None
@ -1399,6 +1624,16 @@ def ogUnhidePartition(*args):
ogSetPartitionType(args[0], args[1], NEWTYPE)
return
#/**
# ogUnlockDisk int_ndisk
#@brief Elimina el fichero de bloqueo para un disco.
#@param int_ndisk nº de orden del disco
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@note El fichero de bloqueo se localiza en \c /var/lock/disk, siendo \c disk el dispositivo del disco, sustituyendo el carácter "/" por "-".
#*/ ##
def ogUnlockDisk(*args):
# Variables locales
DISK = None
@ -1424,6 +1659,15 @@ def ogUnlockDisk(*args):
os.remove(LOCKFILE)
return
#/**
# ogUpdatePartitionTable
#@brief Fuerza al kernel releer la tabla de particiones de los discos duros
#@param no requiere
#@return informacion propia de la herramienta
#@note Requisitos: \c partprobe
#@warning pendiente estructurar la funcion a opengnsys
#*/ ##
def ogUpdatePartitionTable():
for disk in ogDiskToDev():
subprocess.run(["partprobe", disk])