refs #1051 Revision and correction of errors in the GetConfiguration.py file
parent
b30beadba3
commit
76f373af77
|
@ -1,9 +1,9 @@
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
def poweroff():
|
def main():
|
||||||
os.system('poweroff')
|
os.system('poweroff')
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
poweroff()
|
main()
|
||||||
sys.exit(0)
|
|
||||||
|
|
|
@ -3,54 +3,60 @@ import time
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
os.environ.setdefault('MSG_INTERFACE_START', 'Inicio de la interfaz')
|
||||||
|
|
||||||
|
sys.path.append('/opt/opengnsys/lib/engine/bin')
|
||||||
|
from SystemLib import ogEcho
|
||||||
|
|
||||||
def main(script_path):
|
def main(script_path):
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
|
print(f"Ejecutando:",script_path)
|
||||||
|
|
||||||
# Load engine configurator from engine.cfg file
|
# Load engine configurator from engine.cfg file.
|
||||||
og_engine_configurate = os.getenv('OGENGINECONFIGURATE')
|
engine_config_path = '/opt/opengnsys/etc/engine.cfg'
|
||||||
if not og_engine_configurate:
|
# if 'OGENGINECONFIGURATE' not in os.environ:
|
||||||
with open('/opt/opengnsys/etc/engine.cfg') as f:
|
# with open(engine_config_path) as f:
|
||||||
exec(f.read())
|
# exec(f.read(), globals())
|
||||||
|
|
||||||
# Clear temporary file used as log track by httpdlog
|
# Clear temporary file used as log track by httpdlog
|
||||||
og_log_session = os.getenv('OGLOGSESSION')
|
with open(os.environ['OGLOGSESSION'], 'w') as f:
|
||||||
og_log_command = os.getenv('OGLOGCOMMAND')
|
f.write("")
|
||||||
if og_log_session:
|
with open(os.environ['OGLOGCOMMAND'], 'w') as f:
|
||||||
open(og_log_session, 'w').close()
|
f.write("")
|
||||||
if og_log_command:
|
|
||||||
open(og_log_command, 'w').close()
|
|
||||||
|
|
||||||
# Registro de inicio de ejecución
|
# Registro de inicio de ejecución
|
||||||
msg_interface_start = os.getenv('MSG_INTERFACE_START')
|
ogEcho('log session', f"{os.environ['MSG_INTERFACE_START']} {sys.argv[0]} {' '.join(sys.argv[1:])}")
|
||||||
og_echo('log session', f"{msg_interface_start} {sys.argv[0]} {' '.join(sys.argv[1:])}")
|
|
||||||
|
|
||||||
og_log_file = os.getenv('OGLOGFILE')
|
with open(os.environ['OGLOGFILE'], 'a') as log_file:
|
||||||
if og_log_file:
|
log_file.write("\n Instrucciones a ejecutar: *****************************\n"
|
||||||
with open(og_log_file, 'a') as log_file:
|
with open(script_path.split()[1]) as script_file: # Obtener solo el nombre del script
|
||||||
log_file.write("\n Instrucciones a ejecutar: *****************************\n")
|
log_file.write(script_file.read()) )
|
||||||
with open(script_path) as script_file:
|
|
||||||
log_file.write(script_file.read())
|
|
||||||
log_file.write("\n Salida de las instrucciones: *****************************\n")
|
|
||||||
|
|
||||||
# Execute the script
|
log_file.write("\n Salida de las instrucciones: *****************************\n")
|
||||||
os.chmod(script_path, 0o755)
|
|
||||||
retval = subprocess.call([script_path])
|
# Cambiar permisos y ejecutar el script
|
||||||
|
os.chmod(script_path.split()[1], 0o755)
|
||||||
|
result = subprocess.run([sys.executable] + script_path.split(), capture_output=True, text=True)
|
||||||
|
ret_val = result.returncode
|
||||||
|
|
||||||
|
with open(os.environ['OGLOGCOMMAND'], 'a') as log_command_file:
|
||||||
|
log_command_file.write(result.stdout)
|
||||||
|
log_command_file.write(result.stderr)
|
||||||
|
|
||||||
elapsed_time = time.time() - start_time
|
elapsed_time = time.time() - start_time
|
||||||
if retval == 0:
|
if ret_val == 0:
|
||||||
og_echo('log session', f"[100] Duracion de la operacion {int(elapsed_time // 60)}m {int(elapsed_time % 60)}s")
|
ogEcho('log session', f"[100] Duracion de la operacion {int(elapsed_time // 60)}m {int(elapsed_time % 60)}s")
|
||||||
else:
|
else:
|
||||||
og_raise_error('log session', retval)
|
ogRaiseError('log session', ret_val)
|
||||||
og_echo('log session error', "Operacion no realizada")
|
ogEcho('log session', 'error "Operacion no realizada"')
|
||||||
|
|
||||||
# Registro de fin de ejecución
|
# Registro de fin de ejecución
|
||||||
msg_interface_end = os.getenv('MSG_INTERFACE_END')
|
ogEcho('log session', f"{os.environ['MSG_INTERFACE_END']} {ret_val}")
|
||||||
og_echo('log session', f"{msg_interface_end} {retval}")
|
|
||||||
|
|
||||||
sys.exit(retval)
|
sys.exit(ret_val)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
if len(sys.argv) != 2:
|
if len(sys.argv) != 2:
|
||||||
print("Usage: python EjecutarScript.py <script_path>")
|
print("Usage: python EjecutarScript.py <script_path>")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
main(sys.argv[1])
|
main(sys.argv[1])
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
#sys.path.append('/opt/opengnsys/lib/engine/bin')
|
||||||
|
#from DiskLib import ogDiskToDev
|
||||||
|
#from InventoryLib import ogGetSerialNumber
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# No registrar los errores
|
||||||
|
os.environ["DEBUG"] = "no"
|
||||||
|
|
||||||
|
# Obtener el número de serie y configuración inicial
|
||||||
|
ser = subprocess.getoutput("ogGetSerialNumber")
|
||||||
|
cfg = ""
|
||||||
|
|
||||||
|
# Obtener el número de discos
|
||||||
|
disks = len(subprocess.getoutput("ogDiskToDev").split())
|
||||||
|
|
||||||
|
# Recorrer discos
|
||||||
|
for dsk in range(1, disks + 1):
|
||||||
|
# Número de particiones
|
||||||
|
particiones = subprocess.getoutput(f"ogGetPartitionsNumber {dsk}") or "0"
|
||||||
|
particiones = int(particiones)
|
||||||
|
|
||||||
|
# Tipo de tabla de particiones
|
||||||
|
ptt = subprocess.getoutput(f"ogGetPartitionTableType {dsk}")
|
||||||
|
ptt_mapping = {"MSDOS": 1, "GPT": 2, "LVM": 3, "ZPOOL": 4}
|
||||||
|
ptt = ptt_mapping.get(ptt, 0)
|
||||||
|
|
||||||
|
# Información de disco (partición 0)
|
||||||
|
cfg += f"{dsk}:0:{ptt}:::{subprocess.getoutput(f'ogGetDiskSize {dsk}')}:0;"
|
||||||
|
|
||||||
|
# Recorrer particiones
|
||||||
|
for par in range(1, particiones + 1):
|
||||||
|
# Código del identificador de tipo de partición
|
||||||
|
cod = subprocess.getoutput(f"ogGetPartitionId {dsk} {par} 2>/dev/null")
|
||||||
|
|
||||||
|
# Tipo del sistema de ficheros
|
||||||
|
fsi = subprocess.getoutput(f"getFsType {dsk} {par} 2>/dev/null") or "EMPTY"
|
||||||
|
|
||||||
|
# Tamaño de la partición
|
||||||
|
tam = subprocess.getoutput(f"ogGetPartitionSize {dsk} {par} 2>/dev/null") or "0"
|
||||||
|
|
||||||
|
# Sistema operativo instalado
|
||||||
|
soi = ""
|
||||||
|
uso = 0
|
||||||
|
if fsi not in ["", "EMPTY", "LINUX-SWAP", "LINUX-LVM", "ZVOL"]:
|
||||||
|
if subprocess.getoutput(f"ogMount {dsk} {par} 2>/dev/null"):
|
||||||
|
soi = subprocess.getoutput(f"getOsVersion {dsk} {par} 2>/dev/null | cut -f2 -d:")
|
||||||
|
if not soi and fsi not in ["EMPTY", "CACHE"]:
|
||||||
|
soi = "DATA"
|
||||||
|
uso = int(subprocess.getoutput(f"df $(ogGetMountPoint {dsk} {par}) | awk '{{getline; printf \"%d\",$5}}'") or "0")
|
||||||
|
|
||||||
|
cfg += f"{dsk}:{par}:{cod}:{fsi}:{soi}:{tam}:{uso};"
|
||||||
|
|
||||||
|
# Configuración por defecto para cliente sin disco
|
||||||
|
if not cfg:
|
||||||
|
cfg = "1:0:0:::0;"
|
||||||
|
|
||||||
|
# Guardar salida en fichero temporal
|
||||||
|
cfgfile = "/tmp/getconfig"
|
||||||
|
with open(cfgfile, 'w') as f:
|
||||||
|
f.write(f"{ser + ';' if ser else ''}{cfg}")
|
||||||
|
|
||||||
|
# Crear el menú por defecto desde el archivo generado
|
||||||
|
subprocess.run(["generateMenuDefault"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||||
|
|
||||||
|
# Componer salida formateada
|
||||||
|
formatted_output = []
|
||||||
|
with open(cfgfile, 'r') as f:
|
||||||
|
content = f.read().strip().split(";")
|
||||||
|
for item in content:
|
||||||
|
fields = item.split(":")
|
||||||
|
if len(fields) == 1:
|
||||||
|
formatted_output.append(f"ser={fields[0]}")
|
||||||
|
else:
|
||||||
|
formatted_output.append(
|
||||||
|
f"disk={fields[0]}\tpar={fields[1]}\tcpt={fields[2]}\tfsi={fields[3]}\tsoi={fields[4]}\ttam={fields[5]}\tuso={fields[6]}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Mostrar la salida formateada
|
||||||
|
print("\n".join(formatted_output))
|
||||||
|
|
||||||
|
# Borrar marcas de arranque de Windows
|
||||||
|
subprocess.run(["rm", "-f", "/mnt/*/ogboot.*", "/mnt/*/*/ogboot.*"])
|
||||||
|
|
||||||
|
# Volver a registrar los errores
|
||||||
|
os.environ.pop("DEBUG", None)
|
|
@ -0,0 +1,11 @@
|
||||||
|
import socket
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
def get_ip_address():
|
||||||
|
hostname = socket.gethostname()
|
||||||
|
ip_address = socket.gethostbyname(hostname)
|
||||||
|
return ip_address
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print(get_ip_address())
|
|
@ -4,4 +4,4 @@ def reboot_system():
|
||||||
os.system('reboot')
|
os.system('reboot')
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
reboot_system()
|
reboot_system()
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# Script de ejemplo para arrancar un sistema operativo instalado.
|
||||||
|
# Nota: se usa como base para el programa de arranque de OpenGnsys Admin.
|
||||||
|
|
||||||
|
def main():
|
||||||
|
prog = os.path.basename(__file__)
|
||||||
|
if len(sys.argv) < 3 or len(sys.argv) > 6:
|
||||||
|
og_raise_error(1, f"Formato: {prog} ndisco nfilesys [str_kernel str_initrd str_kernelparams]")
|
||||||
|
|
||||||
|
disk = sys.argv[1]
|
||||||
|
filesystem = sys.argv[2]
|
||||||
|
|
||||||
|
try:
|
||||||
|
part = og_disk_to_dev(disk, filesystem)
|
||||||
|
except Exception as e:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
try:
|
||||||
|
mntdir = og_mount(disk, filesystem)
|
||||||
|
except Exception as e:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print("[0] Inicio del proceso de arranque.")
|
||||||
|
|
||||||
|
mount_output = subprocess.getoutput(f"mount | grep -q '{mntdir}.*(rw'")
|
||||||
|
if mount_output:
|
||||||
|
og_echo("log", "session", "MSG_WARNING: MSG_MOUNTREADONLY")
|
||||||
|
og_unmount(disk, filesystem)
|
||||||
|
og_check_fs(disk, filesystem)
|
||||||
|
|
||||||
|
part = og_disk_to_dev(disk, filesystem)
|
||||||
|
os.makedirs(mntdir, exist_ok=True)
|
||||||
|
subprocess.run(["ntfs-3g", "-o", "remove_hiberfile", part, mntdir])
|
||||||
|
og_echo("log", "session", "Particion desbloqueada")
|
||||||
|
|
||||||
|
og_unmount(disk, filesystem)
|
||||||
|
og_mount(disk, filesystem)
|
||||||
|
|
||||||
|
if subprocess.call("which bootOsCustom", shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) == 0:
|
||||||
|
print("[10] Configuración personalizada del inicio.")
|
||||||
|
subprocess.run(["bootOsCustom"] + sys.argv[1:])
|
||||||
|
|
||||||
|
print("[70] Desmontar todos los sistemas de archivos.")
|
||||||
|
subprocess.run(["sync"])
|
||||||
|
for i in range(1, len(og_disk_to_dev(disk, filesystem).split())):
|
||||||
|
og_unmount_all(i)
|
||||||
|
|
||||||
|
print("[80] Desmontar cache local.")
|
||||||
|
og_unmount_cache()
|
||||||
|
print("[90] Arrancar sistema operativo.")
|
||||||
|
og_boot(sys.argv[1:])
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,101 @@
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
bootOsCustom
|
||||||
|
@brief Plantilla para script de configuración personalizada de sistema operativo restaurado.
|
||||||
|
@param $1 nº de disco
|
||||||
|
@param $2 nº de partición
|
||||||
|
@warning Renombrar este fichero como "bootOsCustom" para personalizar el script estándar "bootOs".
|
||||||
|
@note La partición a inicializar debe estar montada
|
||||||
|
@version 1.1.1 Soporta varios discos
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
# CONFIGURAR: Partición de datos de Windows que no queremos ocultar (valor por defecto '0' no oculta nada)
|
||||||
|
DISKDATA = 0
|
||||||
|
PARTDATA = 0
|
||||||
|
|
||||||
|
PROG = os.path.basename(__file__)
|
||||||
|
|
||||||
|
# Control de errores
|
||||||
|
if len(sys.argv) < 3:
|
||||||
|
ogRaiseError(OG_ERR_FORMAT, f"Formato: {PROG} ndisco nparticion")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Parámetros obligatorios.
|
||||||
|
DISK = sys.argv[1] # Nº de disco.
|
||||||
|
PART = sys.argv[2] # Nº de partición.
|
||||||
|
|
||||||
|
# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado).
|
||||||
|
DEVICE = ogDiskToDev(DISK, PART)
|
||||||
|
if not DEVICE:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Paso 1: Adaptar el código de ejemplo para arranque personalizado.
|
||||||
|
# Nota: el script "bootOs" llama al script "bootOsCustom" después de realizar la operaciones de inicio estándar y antes de desmontar las particiones e iniciar el sistema operativo.
|
||||||
|
|
||||||
|
MNTDIR = ogMount(DISK, PART)
|
||||||
|
if not MNTDIR:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
NAME = ogGetHostname()
|
||||||
|
NAME = NAME if NAME else "pc"
|
||||||
|
OSTYPE = ogGetOsType(DISK, PART)
|
||||||
|
|
||||||
|
if OSTYPE == "Windows":
|
||||||
|
# Mostrar las particiones NTFS de sistema (dos opciones)
|
||||||
|
# Opción 1: SIN ocultar las demás.
|
||||||
|
# ogEcho log session "[40] Mostrar y activar particion de Windows {PART}."
|
||||||
|
# if ogGetPartitionType(DISK, PART) in ["HNTFS", "WIN-RESERV"]:
|
||||||
|
# ogUnhidePartition(DISK, PART)
|
||||||
|
|
||||||
|
# Recorremos los distintos discos
|
||||||
|
# for DEVICE in ogDiskToDev():
|
||||||
|
# d = ogDevToDisk(DEVICE)
|
||||||
|
|
||||||
|
# # Mostrar las particiones NTFS de sistema (dos opciones)
|
||||||
|
# # Opción 2: Ocultamos las demás.
|
||||||
|
# ogEcho log session "[40] Activar particion de Windows {PART} y ocultar las demás."
|
||||||
|
# for i in range(1, ogGetPartitionsNumber(d) + 1):
|
||||||
|
# if (d == DISK and i == PART) or (d == DISKDATA and i == PARTDATA):
|
||||||
|
# if ogGetPartitionType(d, i) in ["HNTFS", "WIN-RESERV"]:
|
||||||
|
# ogUnhidePartition(d, i)
|
||||||
|
# else:
|
||||||
|
# if ogGetPartitionType(d, i) in ["NTFS", "WINDOWS"]:
|
||||||
|
# ogHidePartition(d, i)
|
||||||
|
|
||||||
|
# # Borrar marcas de arrranque de todos los Windows instalados en el disco.
|
||||||
|
# ogEcho log session "[30] Borrar marcas de arrranque de todos los Windows instalados en el disco."
|
||||||
|
# for i in range(1, ogGetPartitionsNumber(d) + 1):
|
||||||
|
# if ogGetOsType(d, i) == "Windows":
|
||||||
|
# ogMount(d, i)
|
||||||
|
# os.system("rm -f /mnt/*/ogboot.*")
|
||||||
|
|
||||||
|
elif OSTYPE == "Linux":
|
||||||
|
# Modificar el nombre del equipo
|
||||||
|
# ogEcho log session "[30] Asignar nombre Linux \"{NAME}\"."
|
||||||
|
# ETC = ogGetPath(DISK, PART, "/etc")
|
||||||
|
# if os.path.isdir(ETC):
|
||||||
|
# with open(os.path.join(ETC, "hostname"), "w") as f:
|
||||||
|
# f.write(NAME)
|
||||||
|
|
||||||
|
# Sustituir UUID o LABEL por su dispositivo en definición de sistema de archivo raíz.
|
||||||
|
# if os.path.isfile(os.path.join(ETC, "fstab")):
|
||||||
|
# ogEcho log session "[40] Actualizar fstab con particion raíz \"{PART}\"."
|
||||||
|
# with open(os.path.join(ETC, "fstab"), "r") as f:
|
||||||
|
# lines = f.readlines()
|
||||||
|
# with open("/tmp/fstab", "w") as f:
|
||||||
|
# for line in lines:
|
||||||
|
# if line.split()[1] == "/" and not line.startswith("#"):
|
||||||
|
# line = line.replace(line.split()[0], PART)
|
||||||
|
# f.write(line)
|
||||||
|
# os.replace("/tmp/fstab", os.path.join(ETC, "fstab"))
|
||||||
|
|
||||||
|
# Cambiar claves usuarios, copiando fichero /etc/passwd
|
||||||
|
# En el servidor el nuevo fichero debe situarse en el directorio del grupo:
|
||||||
|
# /opt/opengnsys/images/groups/nombre_aula
|
||||||
|
# if os.path.isfile(os.path.join(ogGetGroupDir(), "passwd")):
|
||||||
|
# ogEcho log session "[65] Cambiar claves de usuarios."
|
||||||
|
# os.system(f"cp {os.path.join(ogGetGroupDir(), 'passwd')} {os.path.join(MNTDIR, 'etc')}")
|
|
@ -0,0 +1,65 @@
|
||||||
|
import sys
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
"""
|
||||||
|
BuildToOrder
|
||||||
|
@brief Script de ejemplo para realizar una configuracion del sistema operativo antes de generar imagen o de restaurado.
|
||||||
|
@brief Activa el uso de los contralodres de disco más usados en windows 7.
|
||||||
|
@brief (puede usarse como complemento para el programa de creación de imágenes o de restauración).
|
||||||
|
@param 1 disco
|
||||||
|
@param 2 particion
|
||||||
|
@return
|
||||||
|
@TODO
|
||||||
|
@exception
|
||||||
|
@version 1.0.4 - Discos ide + SATA.
|
||||||
|
@date 2012-10-05
|
||||||
|
@version 1.1.1b - Funciona para Windows8 y Windows 10. Si la clave no existe (tiene valor vacío) se crea.
|
||||||
|
@date 2020-05-04
|
||||||
|
"""
|
||||||
|
|
||||||
|
def main():
|
||||||
|
PROG = sys.argv[0]
|
||||||
|
if len(sys.argv) != 3:
|
||||||
|
ogRaiseError("OG_ERR_FORMAT", f"Formato: {PROG} ndisco nparticion")
|
||||||
|
|
||||||
|
disk = sys.argv[1]
|
||||||
|
partition = sys.argv[2]
|
||||||
|
|
||||||
|
MNTDIR = ogMount(disk, partition)
|
||||||
|
OSTYPE = ogGetOsType(disk, partition)
|
||||||
|
|
||||||
|
if OSTYPE == "Windows":
|
||||||
|
print("Filtro versión de sistema operativo windows.")
|
||||||
|
TYPE = ogGetOsVersion(disk, partition)
|
||||||
|
if "Windows XP" in TYPE:
|
||||||
|
print("Versión de sistema operativo Windows XP no soportado")
|
||||||
|
sys.exit()
|
||||||
|
elif "Windows 7" in TYPE:
|
||||||
|
KEYS = ["intelide", "pciide", "msahci", "iaStorV", "iaStor", "LSI_SAS"]
|
||||||
|
elif "Windows 8" in TYPE or "Windows 10" in TYPE:
|
||||||
|
KEYS = ["intelide", "pciide", "storahci", "iaStorV", "iaStorAC", "iaStorAVC", "LSI_SAS"]
|
||||||
|
else:
|
||||||
|
KEYS = []
|
||||||
|
|
||||||
|
print(TYPE)
|
||||||
|
CONTROLSET = ["ControlSet001", "ControlSet002"]
|
||||||
|
for C in CONTROLSET:
|
||||||
|
if ogListRegistryKeys(MNTDIR, "SYSTEM", f'\\{C}') == "":
|
||||||
|
continue
|
||||||
|
|
||||||
|
for K in KEYS:
|
||||||
|
FULLK = f'\\{C}\\Services\\{K}\\Start'
|
||||||
|
VALUE = ogGetRegistryValue(MNTDIR, "SYSTEM", FULLK)
|
||||||
|
if VALUE == "":
|
||||||
|
ogDeleteRegistryValue(MNTDIR, "SYSTEM", FULLK)
|
||||||
|
ogAddRegistryValue(MNTDIR, "SYSTEM", FULLK, "DWORD")
|
||||||
|
ogSetRegistryValue(MNTDIR, "SYSTEM", FULLK, '0')
|
||||||
|
print(f" * {C} {K} enabled")
|
||||||
|
elif OSTYPE == "Linux":
|
||||||
|
print("Versión de Sistema Operativo GNU/Linux no soportado")
|
||||||
|
else:
|
||||||
|
print("Sistema Operativo no soportado")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,78 @@
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
configureOsCustom
|
||||||
|
@brief Plantilla para script de configuración personalizada de sistema operativo restaurado.
|
||||||
|
@param $1 nº de disco
|
||||||
|
@param $2 nº de partición
|
||||||
|
@param $3 Repositorio: CACHE, REPO o dirección IP (opcional)
|
||||||
|
@param $4 Nombre canónico de la imagen sin extensión (opcional)
|
||||||
|
@warning Renombrar este fichero como "configureOsCustom" para sustituir al script estándar "configureOs".
|
||||||
|
@note Los parámetros disco y partición son obligatorios y opcionalmente puede recibir también el repositorio y la imagen usada para en el despliegue.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) not in [3, 5]:
|
||||||
|
og_raise_error("OG_ERR_FORMAT", "Usage: configureOsCustom int_ndisc int_npart [str_repo str_imgname]")
|
||||||
|
|
||||||
|
disk = sys.argv[1]
|
||||||
|
part = sys.argv[2]
|
||||||
|
repo = sys.argv[3].upper() if len(sys.argv) > 3 else None
|
||||||
|
imgname = sys.argv[4] if len(sys.argv) > 4 else None
|
||||||
|
|
||||||
|
# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado).
|
||||||
|
|
||||||
|
# Paso 1: Adaptar el código de ejemplo para postconfiguración personalizada.
|
||||||
|
configure_os(disk, part)
|
||||||
|
|
||||||
|
ostype = og_get_os_type(disk, part)
|
||||||
|
if ostype == "Windows":
|
||||||
|
# Postconfiguración de Windows.
|
||||||
|
pass
|
||||||
|
# Descomentar la siguiente línea para cambiar usuario de inicio.
|
||||||
|
# subprocess.run(["ogSetWinlogonUser", disk, part, " "], check=True)
|
||||||
|
# OPCIONAL: desactivar el chkdisk de windows tras la restauracion. Requiere configuracion previa en el engine.cfg
|
||||||
|
# subprocess.run(["ogLoadHiveWindows", disk, part], check=True)
|
||||||
|
# subprocess.run(["ogSetWindowsChkdisk", "OGWINCHKDISK"], check=True)
|
||||||
|
# subprocess.run(["ogUpdateHiveWindows"], check=True)
|
||||||
|
elif ostype == "Linux":
|
||||||
|
# Postconfiguración de GNU/Linux.
|
||||||
|
pass
|
||||||
|
# OPCIONAL Para UEFI: cambia el UUID de la partición (para tener dos linux en un equipo)
|
||||||
|
# subprocess.run(["ogUuidChange", disk, part], check=True)
|
||||||
|
# OPCIONAL Limpiar dispositivos reconocidos previamente
|
||||||
|
# subprocess.run(["ogCleanLinuxDevices", disk, part], check=True)
|
||||||
|
# Instala (no configura) el codigo de arranque del Grub en la partición (no lo configura, se mantiene el original de la imagen)
|
||||||
|
# subprocess.run(["ogGrubInstallPartition", disk, part], check=True)
|
||||||
|
# OPCIONAL: instala y configura el codigo de arranque del Grub en el MBR (no lo configura, se mantiene el original de la imagen)
|
||||||
|
# subprocess.run(["ogGrubInstallMbr", disk, part], check=True)
|
||||||
|
# OPCIONAL: Instala y configura el Grub en el MBR y lo autoconfigura, entradas para los sistemas operativos, además al linux restaurado le añade los parámetros indicados.
|
||||||
|
# subprocess.run(["ogGrubInstallMbr", disk, part, "TRUE", "irqpoll pci=noacpi noresume quiet splash"], check=True)
|
||||||
|
elif ostype == "MacOS":
|
||||||
|
# Postconfiguración de Mac OS X.
|
||||||
|
with open(f"/mnt/{disk}/{part}/var/root/postconfd.sh", "a") as f:
|
||||||
|
f.write("""
|
||||||
|
### NOTA: descomentar las opciones deseadas.
|
||||||
|
# Activar Journaling en HFS+ (no usar si el cliente continua en OpenGnsys).
|
||||||
|
#diskutil enableJournal disk$[$1-1]s$2
|
||||||
|
# Pedir usuario y clave en pantalla de conexión.
|
||||||
|
#defaults write /Library/Preferences/com.apple.loginwindow SHOWFULLNAME -bool yes
|
||||||
|
# No mostrar botón de cambio rápido de usuario.
|
||||||
|
#defaults write /Library/Preferences/.GlobalPreferences MultipleSessionEnabled -bool NO
|
||||||
|
# Bloquear escritorio, fondo, dock, etc del usuario "usuario".
|
||||||
|
#chflags uchange /Users/usuario/Library/Preferences/com.apple.desktop.plist
|
||||||
|
#chflags uchange /Users/usuario/Library/Preferences/com.apple.dock.plist
|
||||||
|
#chflags uchange /Users/usuario/Desktop
|
||||||
|
# Añadir usuario "usuario" a la lista de desarrolladores de Xcode.
|
||||||
|
#DevToolsSecurity --enable
|
||||||
|
#dscl . -append /Groups/_developer GroupMembership usuario
|
||||||
|
# Bajar volumen (valor entre 0 y 7).
|
||||||
|
#osascript -e 'set volume 1'
|
||||||
|
""")
|
||||||
|
|
||||||
|
# Paso 2: Incluir código genérico de postconfiguración.
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,27 @@
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Control de parámetros.
|
||||||
|
if len(sys.argv) != 5:
|
||||||
|
ogRaiseError(os.getenv('OG_ERR_FORMAT', 1), "createImageCustom int_ndisc int_npart str_repo str_imgname")
|
||||||
|
|
||||||
|
# Toma de parámetros.
|
||||||
|
DISK = sys.argv[1] # Nº de disco.
|
||||||
|
PART = sys.argv[2] # Nº de partición.
|
||||||
|
REPO = sys.argv[3].upper() # Repositorio (en mayúsculas).
|
||||||
|
IMGNAME = sys.argv[4] # Nombre canónico de imagen (sin extensión).
|
||||||
|
|
||||||
|
# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado).
|
||||||
|
|
||||||
|
# Paso 1: Añadir aquí el código para el proceso previo antes de la creación de la imagen en el equipo modelo (opcional).
|
||||||
|
|
||||||
|
# Paso 2: Sustituir, si se desea, la llamada al proceso estándar de creación de imagen por código personalizado.
|
||||||
|
createImage(DISK, PART, REPO, IMGNAME)
|
||||||
|
|
||||||
|
# Paso 3: Añadir aquí el código para el proceso posterior tras la creación de la imagen (opcional).
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1 @@
|
||||||
|
#!/usr/bin/env python3
|
|
@ -0,0 +1,5 @@
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
result = og_create_partitions(sys.argv[1:])
|
||||||
|
sys.exit(result.returncode)
|
|
@ -0,0 +1,139 @@
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
def main():
|
||||||
|
PROG = os.path.basename(__file__)
|
||||||
|
if len(sys.argv) < 5:
|
||||||
|
ogRaiseError("session", OG_ERR_FORMAT, f"{MSG_FORMAT}: {PROG} REPO imagen ndisco nparticion [ UNICAST-DIRECT|UNICAST|UNICAST-CACHE|MULTICAST-DIRECT|MULTICAST|MULTICAST-CACHE|TORRENT [opciones protocolo] ]")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
TIME1 = time.time()
|
||||||
|
REPO = sys.argv[1].upper() or "REPO"
|
||||||
|
IMGNAME = sys.argv[2]
|
||||||
|
DISK = sys.argv[3]
|
||||||
|
PART = sys.argv[4]
|
||||||
|
PROTO = (sys.argv[5].upper() if len(sys.argv) > 5 else "UNICAST")
|
||||||
|
PROTOOPT = sys.argv[6] if len(sys.argv) > 6 else ""
|
||||||
|
OGUNIT = os.getenv("ogunit", "")
|
||||||
|
|
||||||
|
if not OGENGINECONFIGURATE:
|
||||||
|
exec(open("/opt/opengnsys/etc/engine.cfg").read())
|
||||||
|
|
||||||
|
with open(OGLOGCOMMAND, 'w') as f:
|
||||||
|
f.write(" ")
|
||||||
|
if ogGetCaller() != "EjecutarScript":
|
||||||
|
with open(OGLOGSESSION, 'w') as f:
|
||||||
|
f.write("")
|
||||||
|
|
||||||
|
ogEcho("log", "session", f"[1] {MSG_SCRIPTS_START} {PROG} {' '.join(sys.argv)}")
|
||||||
|
|
||||||
|
if ogIsLocked(DISK, PART):
|
||||||
|
sys.exit(ogRaiseError("session", OG_ERR_LOCKED, f"{MSG_PARTITION}, {DISK} {PART}"))
|
||||||
|
|
||||||
|
ogEcho("log", "session", f"{MSG_HELP_ogUnmount} {DISK} {PART}")
|
||||||
|
ogUnmount(DISK, PART)
|
||||||
|
|
||||||
|
if REPO == ogGetIpAddress() or REPO == "CACHE":
|
||||||
|
MODE = "CACHE"
|
||||||
|
else:
|
||||||
|
if ogCheckIpAddress(REPO) == 0 or REPO == "REPO":
|
||||||
|
if not ogChangeRepo(REPO, OGUNIT):
|
||||||
|
sys.exit(ogRaiseError(OG_ERR_NOTFOUND, f"{REPO} {OGUNIT}"))
|
||||||
|
MODE = "REPO"
|
||||||
|
|
||||||
|
IMGOS = ogGetImageInfo(ogGetPath(MODE, f"{IMGNAME}.img"))
|
||||||
|
if IMGOS == 1:
|
||||||
|
sys.exit(ogRaiseError("session", OG_ERR_NOTFOUND, f"{REPO} {IMGNAME}"))
|
||||||
|
elif IMGOS == 5:
|
||||||
|
sys.exit(ogRaiseError("session", OG_ERR_IMAGEFILE, f"{REPO} {IMGNAME}"))
|
||||||
|
elif IMGOS != 0:
|
||||||
|
sys.exit(ogRaiseError("session", OG_ERR_GENERIC))
|
||||||
|
|
||||||
|
IMGSIZE = os.path.getsize(ogGetPath(MODE, f"{IMGNAME}.img")) // 1024
|
||||||
|
ogEcho("log", "session", f"[1] REPO={REPO} IMG-FILE={IMGNAME}.img SIZE={IMGSIZE} (KB) METADATA={IMGOS}")
|
||||||
|
|
||||||
|
if MODE == "CACHE":
|
||||||
|
NEXTOPERATION = "CACHE"
|
||||||
|
elif MODE == "REPO":
|
||||||
|
if PROTO in ["MULTICAST-DIRECT", "UNICAST-DIRECT"]:
|
||||||
|
NEXTOPERATION = PROTO.split('-')[0]
|
||||||
|
elif PROTO in ["TORRENT", "TORRENT-CACHE", "MULTICAST", "MULTICAST-CACHE", "UNICAST", "UNICAST-CACHE"]:
|
||||||
|
PROTO = PROTO.split('-')[0]
|
||||||
|
ogEcho("log", "session", f"[2] updateCache {REPO} /{IMGNAME}.img {PROTO} {PROTOOPT}")
|
||||||
|
TIME2 = time.time()
|
||||||
|
RETVAL = updateCache(REPO, f"/{IMGNAME}.img", PROTO, PROTOOPT)
|
||||||
|
TIME2 = time.time() - TIME2
|
||||||
|
ogEcho("log", "session", f" [ ] {MSG_SCRIPTS_TIME_PARTIAL} updateCache {TIME2 // 60}m {TIME2 % 60}s")
|
||||||
|
if RETVAL == 0:
|
||||||
|
ogEcho("log", "session", "[50] updateCache (OK)")
|
||||||
|
NEXTOPERATION = "CACHE"
|
||||||
|
elif RETVAL in [15, 16]:
|
||||||
|
ogEcho("log", "session", f"[50] {MSG_ERR_NOTCACHE} ; {MSG_ERR_CACHESIZE}")
|
||||||
|
ogEcho("log", "session", f"[50] {MSG_SCRIPTS_CHECK_ENGINE}: RESTOREPROTOCOLNOTCACHE={RESTOREPROTOCOLNOTCACHE}")
|
||||||
|
if RESTOREPROTOCOLNOTCACHE == "MULTICAST":
|
||||||
|
NEXTOPERATION = "MULTICAST" if PROTO == "MULTICAST" else "UNICAST"
|
||||||
|
elif RESTOREPROTOCOLNOTCACHE == "UNICAST":
|
||||||
|
NEXTOPERATION = "UNICAST"
|
||||||
|
elif RESTOREPROTOCOLNOTCACHE == "NONE":
|
||||||
|
if RETVAL == 15:
|
||||||
|
ogEcho("log", "session", f"[100] {MSG_ERR_NOTCACHE}")
|
||||||
|
sys.exit(ogRaiseError("session", OG_ERR_NOTCACHE, "NOT CACHE"))
|
||||||
|
elif RETVAL == 16:
|
||||||
|
ogEcho("log", "session", f"[100] {MSG_ERR_CACHESIZE}")
|
||||||
|
sys.exit(ogRaiseError("session", OG_ERR_CACHESIZE, "CACHE FULL"))
|
||||||
|
elif RETVAL in [57, 60]:
|
||||||
|
sys.exit(RETVAL)
|
||||||
|
else:
|
||||||
|
sys.exit(RETVAL)
|
||||||
|
else:
|
||||||
|
sys.exit(ogRaiseError("session", OG_ERR_FORMAT, f"{MSG_ERR_FORMAT}, {PROTO}"))
|
||||||
|
else:
|
||||||
|
sys.exit(ogRaiseError("session", OG_ERR_FORMAT, f"{MSG_ERR_FORMAT}, {REPO}"))
|
||||||
|
|
||||||
|
TIME3 = time.time()
|
||||||
|
|
||||||
|
if NEXTOPERATION == "CACHE":
|
||||||
|
PARAMS = f"CACHE {IMGNAME} {DISK} {PART}"
|
||||||
|
elif NEXTOPERATION == "UNICAST":
|
||||||
|
PARAMS = f"{REPO} {IMGNAME} {DISK} {PART}"
|
||||||
|
elif NEXTOPERATION == "MULTICAST":
|
||||||
|
PARAMS = f"{REPO} {IMGNAME} {DISK} {PART} {PROTO} {PROTOOPT}"
|
||||||
|
|
||||||
|
if os.system("which restoreImageCustom") == 0:
|
||||||
|
ogEcho("log", "session", f"[55] {MSG_HELP_ogRestoreImage}: restoreImageCustom {PARAMS}")
|
||||||
|
os.system(f"restoreImageCustom {PARAMS}")
|
||||||
|
else:
|
||||||
|
ogEcho("log", "session", f"[55] {MSG_HELP_ogRestoreImage}: restoreImage {PARAMS}")
|
||||||
|
os.system(f"restoreImage {PARAMS}")
|
||||||
|
RETVAL = os.system(f"restoreImage {PARAMS}")
|
||||||
|
|
||||||
|
RESUMERESTOREIMAGE = os.popen(f"grep -m 1 'Total Time:' {OGLOGCOMMAND}").read()
|
||||||
|
ogEcho("log", "session", f" [ ] {RESUMERESTOREIMAGE}")
|
||||||
|
if RETVAL != 0:
|
||||||
|
ogRaiseError("session", OG_ERR_IMAGE, f"{REPO} {IMGNAME}")
|
||||||
|
if ogGetCaller() != "EjecutarScript":
|
||||||
|
ogEcho("log", "session", f"{MSG_INTERFACE_END} {OG_ERR_IMAGE}")
|
||||||
|
sys.exit(OG_ERR_IMAGE)
|
||||||
|
|
||||||
|
TIME3 = time.time() - TIME3
|
||||||
|
ogEcho("log", "session", f" [ ] {MSG_SCRIPTS_TIME_PARTIAL} : {TIME3 // 60}m {TIME3 % 60}s")
|
||||||
|
|
||||||
|
if os.system("which configureOsCustom") == 0:
|
||||||
|
ogEcho("log", "session", "[90] configureOsCustom")
|
||||||
|
os.system(f"configureOsCustom {DISK} {PART} {REPO} {IMGNAME}")
|
||||||
|
else:
|
||||||
|
ogEcho("log", "session", f"[90] {MSG_SCRIPTS_OS_CONFIGURE}")
|
||||||
|
os.system(f"configureOs {DISK} {PART}")
|
||||||
|
|
||||||
|
TIME = time.time() - TIME1
|
||||||
|
ogEcho("log", "session", f"[100] {MSG_SCRIPTS_TIME_TOTAL} {TIME // 60}m {TIME % 60}s")
|
||||||
|
|
||||||
|
if ogGetCaller() != "EjecutarScript":
|
||||||
|
ogEcho("log", "session", f"{MSG_INTERFACE_END} {RETVAL}")
|
||||||
|
sys.exit(RETVAL)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,30 @@
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# Script de ejemplo para formatear un sistema de archivos.
|
||||||
|
# Nota: se usa como base para el programa de formateo de OpenGnsys Admin.
|
||||||
|
|
||||||
|
def main():
|
||||||
|
start_time = time.time()
|
||||||
|
prog = sys.argv[0]
|
||||||
|
|
||||||
|
if len(sys.argv) != 3:
|
||||||
|
ogRaiseError(1, f"{prog} ndisco nparticion")
|
||||||
|
|
||||||
|
disk = sys.argv[1]
|
||||||
|
partition = sys.argv[2]
|
||||||
|
|
||||||
|
# Desmontar y formatear el sistema de archivos.
|
||||||
|
print("[5] Desmontando sistema de archivos")
|
||||||
|
ogUnmountFs(disk, partition)
|
||||||
|
print("[20] Formateando sistema de archivos")
|
||||||
|
ogFormatFs(disk, partition)
|
||||||
|
|
||||||
|
elapsed_time = time.time() - start_time
|
||||||
|
minutes, seconds = divmod(int(elapsed_time), 60)
|
||||||
|
print(f"[100] Duración de la operación {minutes}m {seconds}s")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,92 @@
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# generateMenuDefault - Crea fichero con la página web de inicio del cliente
|
||||||
|
# con información de red y de los sistemas operativos instalados,
|
||||||
|
# crea fichero con información del contenido de la caché local.
|
||||||
|
|
||||||
|
|
||||||
|
DEVICE = os.getenv('DEVICE', 'eth0')
|
||||||
|
with open(f'/tmp/net-{DEVICE}.conf') as f:
|
||||||
|
exec(f.read())
|
||||||
|
|
||||||
|
FILEINFOHTML = f"{os.getenv('OGLOG')}/{subprocess.getoutput('ogGetIpAddress')}.info.html"
|
||||||
|
FILEINFOCACHE = f"{os.getenv('OGLOG')}/{subprocess.getoutput('ogGetIpAddress')}.cache.txt"
|
||||||
|
subprocess.run(['ogMountCache'], stderr=subprocess.DEVNULL)
|
||||||
|
CACHECONTENIDO = f"ls -m {os.getenv('OGCAC')}/{os.getenv('OGIMG')} 2>/dev/null"
|
||||||
|
|
||||||
|
SPEED = subprocess.getoutput(f"LANG=C ethtool {DEVICE} 2>/dev/null | awk '$1~/Speed/ {{print $2}}'")
|
||||||
|
SPEED = SPEED.lower()
|
||||||
|
if SPEED == "1000mb/s":
|
||||||
|
pass
|
||||||
|
elif SPEED == "100mb/s":
|
||||||
|
SPEED = f"<font color=\"blue\">{SPEED}</font>"
|
||||||
|
elif SPEED == "10mb/s":
|
||||||
|
SPEED = f"<font color=\"grey\">{SPEED}</font>"
|
||||||
|
else:
|
||||||
|
SPEED = f"<font color=\"red\">{SPEED}</font>"
|
||||||
|
|
||||||
|
DUPLEX = subprocess.getoutput(f"LANG=C ethtool {DEVICE} 2>/dev/null | awk '$1~/Duplex/ {{print $2}}'")
|
||||||
|
DUPLEX = DUPLEX.lower()
|
||||||
|
if DUPLEX == "full":
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
DUPLEX = f"<font color=\"red\">{DUPLEX}</font>"
|
||||||
|
|
||||||
|
CACHESIZEFREE = int(subprocess.getoutput('ogGetFreeSize $(ogFindCache)'))
|
||||||
|
with open(FILEINFOCACHE, 'w') as f:
|
||||||
|
if CACHESIZEFREE == 0:
|
||||||
|
f.write('0.MB,')
|
||||||
|
else:
|
||||||
|
f.write(f"{CACHESIZEFREE // 1024}.MB,")
|
||||||
|
|
||||||
|
# Crear menú por defecto.
|
||||||
|
with open(FILEINFOHTML, 'w') as f:
|
||||||
|
f.write(f"""
|
||||||
|
<div align="center" style="font-family: Arial, Helvetica, sans-serif;">
|
||||||
|
<p style="color:#999999; font-size: 16px; margin: 2em;">
|
||||||
|
|
||||||
|
<table border="1" width="100%">
|
||||||
|
<tr>
|
||||||
|
<td rowspan="2"><p align="left"><img border="0" src="../images/iconos/logoopengnsys.png"><p> </td>
|
||||||
|
<td> {os.getenv('MSG_HOSTNAME')} </td> <td> {os.getenv('MSG_IPADDR')} </td> <td> {os.getenv('MSG_MACADDR')} </td> <td> {os.getenv('MSG_SPEED')} </td> <td> {os.getenv('MSG_DUPLEX')} </td> </tr>
|
||||||
|
<tr> <td>{os.getenv('HOSTNAME')} </td> <td> {subprocess.getoutput('ogGetIpAddress')} </td> <td> {subprocess.getoutput('ogGetMacAddress')} </td> <td> {SPEED} </td> <td> {DUPLEX} </td> </tr>
|
||||||
|
</table>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h1>{os.getenv('MSG_MENUTITLE')}</h1>
|
||||||
|
""")
|
||||||
|
|
||||||
|
# Si existe el fichero de configuración creado por el script getConfiguration, ...
|
||||||
|
cfgfile = '/tmp/getconfig'
|
||||||
|
if os.path.isfile(cfgfile):
|
||||||
|
# Tomar los datos del fichero.
|
||||||
|
with open(cfgfile) as f_cfg, open(FILEINFOHTML, 'a') as f_html:
|
||||||
|
for line in f_cfg:
|
||||||
|
sep = line.split(';')
|
||||||
|
for item in sep:
|
||||||
|
dua = item.split(':')
|
||||||
|
if len(dua) > 4 and dua[4] and dua[4] != "DATA":
|
||||||
|
f_html.write(f"<p><a href=\"command:bootOs {dua[0]} {dua[1]}\">{os.getenv('MSG_BOOT')} {dua[4]} ({dua[0]}, {dua[1]})</a></p>\n")
|
||||||
|
else:
|
||||||
|
# Si no, obtener los datos de los discos.
|
||||||
|
num_disks = int(subprocess.getoutput('ogDiskToDev | wc -w'))
|
||||||
|
with open(FILEINFOHTML, 'a') as f_html:
|
||||||
|
for d in range(1, num_disks + 1):
|
||||||
|
num_partitions = int(subprocess.getoutput(f'ogGetPartitionsNumber {d}'))
|
||||||
|
for p in range(1, num_partitions + 1):
|
||||||
|
version = subprocess.getoutput(f'ogGetOsVersion {d} {p} 2>/dev/null').split(':')[1]
|
||||||
|
if version:
|
||||||
|
f_html.write(f"<p><a href=\"command:bootOs {d} {p}\">{os.getenv('MSG_BOOT')} {version} ({d}, {p})</a></p>\n")
|
||||||
|
|
||||||
|
# Añadir opción de apagado.
|
||||||
|
with open(FILEINFOHTML, 'a') as f:
|
||||||
|
f.write(f"""
|
||||||
|
<p><a href="command:poweroff">{os.getenv('MSG_POWEROFF')}</a></p>
|
||||||
|
</div>
|
||||||
|
""")
|
||||||
|
|
||||||
|
# Crear contenido de la caché.
|
||||||
|
with open(FILEINFOCACHE, 'a') as f:
|
||||||
|
f.write(subprocess.getoutput(CACHECONTENIDO))
|
|
@ -0,0 +1,5 @@
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
output = ogGetFsType(sys.argv[1:])
|
||||||
|
print(output)
|
|
@ -0,0 +1,6 @@
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
args = sys.argv[1:]
|
||||||
|
output = ogGetIpAddress(args)
|
||||||
|
print(output)
|
|
@ -0,0 +1,12 @@
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def main():
|
||||||
|
try:
|
||||||
|
subprocess.run(["ogGetOsVersion"] + sys.argv[1:], check=True)
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print(f"An error occurred: {e}", file=sys.stderr)
|
||||||
|
sys.exit(e.returncode)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,196 @@
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
def run_command(command):
|
||||||
|
result = subprocess.run(command, shell=True, capture_output=True, text=True)
|
||||||
|
return result.stdout.strip()
|
||||||
|
|
||||||
|
def copy_files(src, dest):
|
||||||
|
if os.path.exists(src):
|
||||||
|
subprocess.run(f"cp -r {src} {dest}", shell=True)
|
||||||
|
|
||||||
|
def prepare_grub_to_access_device(device):
|
||||||
|
loop_file = None
|
||||||
|
if device.startswith("/dev/loop"):
|
||||||
|
grub_loop_device = device.split('/')[-1]
|
||||||
|
loop_file = run_command(f"losetup {device} | sed -e 's/^[^(]*(\\([^)]\\+\\)).*/\\1/'")
|
||||||
|
if not loop_file.startswith("/dev"):
|
||||||
|
loop_device = device
|
||||||
|
device = run_command(f"{grub_probe} --target=device {loop_file}")
|
||||||
|
|
||||||
|
if "crypt" in run_command(f"dmsetup status {device}"):
|
||||||
|
print(f"{device} is a crypto device, which GRUB cannot read directly.")
|
||||||
|
return
|
||||||
|
|
||||||
|
abstraction = run_command(f"{grub_probe} --device {device} --target=abstraction")
|
||||||
|
for module in abstraction.split():
|
||||||
|
print(f"insmod {module}")
|
||||||
|
|
||||||
|
partmap = run_command(f"{grub_probe} --device {device} --target=partmap")
|
||||||
|
for module in partmap.split():
|
||||||
|
if module in ["netbsd", "openbsd"]:
|
||||||
|
print("insmod part_bsd")
|
||||||
|
else:
|
||||||
|
print(f"insmod part_{module}")
|
||||||
|
|
||||||
|
fs = run_command(f"{grub_probe} --device {device} --target=fs")
|
||||||
|
for module in fs.split():
|
||||||
|
print(f"insmod {module}")
|
||||||
|
|
||||||
|
if "nvme" in device:
|
||||||
|
d, p = ogDevToDisk(device)
|
||||||
|
if ogGetPartitionTableType(d) == "GPT":
|
||||||
|
nvme_device = f"hd{d-1},gpt{p}"
|
||||||
|
else:
|
||||||
|
nvme_device = f"hd{d-1},{p-1}"
|
||||||
|
print(f"set root='{nvme_device}'")
|
||||||
|
else:
|
||||||
|
print(f"set root='{run_command(f'{grub_probe} --device {device} --target=drive')}'")
|
||||||
|
|
||||||
|
if loop_file:
|
||||||
|
loop_mountpoint = run_command(f"awk '{loop_file} ~ \"^\"$2 && $2 != \"/\" {{ print $2 }}' /proc/mounts | tail -n1")
|
||||||
|
if loop_mountpoint:
|
||||||
|
print(f"loopback {grub_loop_device} {loop_file[len(loop_mountpoint):]}")
|
||||||
|
print(f"set root=({grub_loop_device})")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
disk = part = kernel_param = None
|
||||||
|
if len(sys.argv) == 4:
|
||||||
|
disk, part, kernel_param = sys.argv[1:4]
|
||||||
|
elif len(sys.argv) == 3:
|
||||||
|
disk, part = sys.argv[1:3]
|
||||||
|
elif len(sys.argv) == 2:
|
||||||
|
kernel_param = sys.argv[1]
|
||||||
|
|
||||||
|
grub_probe = os.getenv("grub_probe", f"{os.getenv('OGBIN')}/grub-probe1.99_{os.uname().machine}")
|
||||||
|
|
||||||
|
if "1.99" in run_command("grub-install --version"):
|
||||||
|
copy_files("/opt/opengnsys/lib/os-probes/*", "/usr/lib/os-probes/")
|
||||||
|
else:
|
||||||
|
osprobe_ms_part = "/opt/opengnsys/lib/os-probes/mounted/efi/31part-x-y"
|
||||||
|
if os.path.isfile(osprobe_ms_part):
|
||||||
|
copy_files(osprobe_ms_part, "/usr/lib/os-probes/mounted/efi")
|
||||||
|
|
||||||
|
if os.path.exists(f"/opt/opengnsys/cache/boot/{oglivedir}/ogvmlinuz"):
|
||||||
|
subprocess.run(f"sed -i 's|/boot/{{oglivedir}}/ogvmlinuz |/vmlinuz |i' /usr/lib/linux-boot-probes/mounted/90fallback", shell=True)
|
||||||
|
subprocess.run(f"sed -i 's|/vmlinuz |/vmlinuz /boot/{{oglivedir}}/ogvmlinuz |1' /usr/lib/linux-boot-probes/mounted/90fallback", shell=True)
|
||||||
|
os.makedirs("/opt/opengnsys/cache/etc/", exist_ok=True)
|
||||||
|
with open("/opt/opengnsys/cache/etc/lsb-release", "w") as f:
|
||||||
|
f.write("DISTRIB_ID=Ubuntu\n")
|
||||||
|
f.write("DISTRIB_RELEASE= \n")
|
||||||
|
f.write(f"DISTRIB_CODENAME={oglivedir.split('-')[1]}\n")
|
||||||
|
f.write("DISTRIB_DESCRIPTION=OpenGnsys Live\n")
|
||||||
|
|
||||||
|
if disk:
|
||||||
|
os_search = ogDiskToDev(disk, part)
|
||||||
|
os_probed = run_command(f"os-prober | grep {os_search} | tr ' ' '^' | paste -s -d ' '")
|
||||||
|
else:
|
||||||
|
os_probed = run_command("os-prober | tr ' ' '^' | paste -s -d ' '")
|
||||||
|
|
||||||
|
if not os_probed:
|
||||||
|
adjust_timeout()
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
for os_entry in os_probed.split():
|
||||||
|
device, longname, label, boot = os_entry.split(':')
|
||||||
|
longname = longname.replace('^', ' ')
|
||||||
|
label = label.replace('^', ' ')
|
||||||
|
if not longname:
|
||||||
|
longname = label
|
||||||
|
|
||||||
|
print(f"Found {longname} on {device}", file=sys.stderr)
|
||||||
|
|
||||||
|
if boot == "chain":
|
||||||
|
if "Windows" in longname:
|
||||||
|
if not wubi:
|
||||||
|
if os.path.exists("/usr/share/lupin-support/grub-mkimage") and run_command("/usr/share/lupin-support/grub-mkimage --test"):
|
||||||
|
wubi = "yes"
|
||||||
|
else:
|
||||||
|
wubi = "no"
|
||||||
|
if wubi == "yes":
|
||||||
|
print(f"Skipping {longname} on Wubi system", file=sys.stderr)
|
||||||
|
continue
|
||||||
|
|
||||||
|
label_class = ''.join(longname.lower().split()[:2])
|
||||||
|
print(f"menuentry \"{longname} (on {device})\" --class {label_class} --class windows {{")
|
||||||
|
save_default_entry()
|
||||||
|
prepare_grub_to_access_device(device)
|
||||||
|
if "Windows Vista" in longname or "Windows 7" in longname or "Windows Server 2008" in longname:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
print("chainloader +1")
|
||||||
|
print("}")
|
||||||
|
|
||||||
|
elif boot == "efi":
|
||||||
|
efipath = device.split('@')[1]
|
||||||
|
device = device.split('@')[0]
|
||||||
|
onstr = f"(on {device})"
|
||||||
|
print(f"menuentry '{longname} {onstr}' --class windows --class os {{")
|
||||||
|
save_default_entry()
|
||||||
|
prepare_grub_to_access_device(device)
|
||||||
|
print(f"chainloader {efipath}")
|
||||||
|
print("}")
|
||||||
|
|
||||||
|
elif boot == "linux":
|
||||||
|
linux_probed = run_command(f"linux-boot-prober {device} 2> /dev/null | tr ' ' '^' | paste -s -d ' '")
|
||||||
|
linux_probed = linux_probed.split()[0]
|
||||||
|
prepare_boot_cache = None
|
||||||
|
for linux_entry in linux_probed.split():
|
||||||
|
lroot, lboot, llabel, lkernel, linitrd, lparams = linux_entry.split(':')
|
||||||
|
llabel = llabel.replace('^', ' ')
|
||||||
|
lparams = lparams.replace('^', ' ')
|
||||||
|
uuid = run_command(f"blkid -s UUID -o value {lroot}")
|
||||||
|
lparams = lparams.replace(f"UUID={uuid}", lroot)
|
||||||
|
if not llabel:
|
||||||
|
llabel = longname
|
||||||
|
if lroot != lboot:
|
||||||
|
lkernel = lkernel.replace('/boot', '')
|
||||||
|
linitrd = linitrd.replace('/boot', '')
|
||||||
|
label_class = llabel.split()[0].lower()
|
||||||
|
print(f"menuentry \"{llabel} (on {device})\" --class {label_class} --class linux --class os {{")
|
||||||
|
save_default_entry()
|
||||||
|
if not prepare_boot_cache:
|
||||||
|
prepare_boot_cache = prepare_grub_to_access_device(lboot)
|
||||||
|
print(prepare_boot_cache)
|
||||||
|
if label_class == "opengnsys":
|
||||||
|
kernel_param = run_command("cat /proc/cmdline")
|
||||||
|
print(f"linux {lkernel} {lparams} {kernel_param}")
|
||||||
|
if linitrd:
|
||||||
|
print(f"initrd {linitrd}")
|
||||||
|
print("}")
|
||||||
|
|
||||||
|
elif boot == "macosx":
|
||||||
|
osx_uuid = run_command(f"grub-probe --target=fs_uuid --device {device} 2> /dev/null")
|
||||||
|
osx_entry("xnu_kernel", 32, device, longname, osx_uuid)
|
||||||
|
osx_entry("xnu_kernel64", 64, device, longname, osx_uuid)
|
||||||
|
|
||||||
|
elif boot == "hurd":
|
||||||
|
print(f"menuentry \"{longname} (on {device})\" --class hurd --class gnu --class os {{")
|
||||||
|
save_default_entry()
|
||||||
|
prepare_grub_to_access_device(device)
|
||||||
|
grub_device = run_command(f"{grub_probe} --device {device} --target=drive")
|
||||||
|
mach_device = grub_device.replace("(hd", "").replace(",msdos", "s")
|
||||||
|
grub_fs = run_command(f"{grub_probe} --device {device} --target=fs")
|
||||||
|
hurd_fs = grub_fs if grub_fs.endswith("fs") else f"{grub_fs}fs"
|
||||||
|
print(f"multiboot /boot/gnumach.gz root=device:{mach_device}")
|
||||||
|
print(f"module /hurd/{hurd_fs}.static {hurd_fs} --readonly \\")
|
||||||
|
print(f" --multiboot-command-line='{{kernel-command-line}}' \\")
|
||||||
|
print(f" --host-priv-port='{{host-port}}' \\")
|
||||||
|
print(f" --device-master-port='{{device-port}}' \\")
|
||||||
|
print(f" --exec-server-task='{{exec-task}}' -T typed '{{root}}' \\")
|
||||||
|
print(f" '{{task-create}}' '{{task-resume}}'")
|
||||||
|
print(f"module /lib/ld.so.1 exec /hurd/exec '{{exec-task=task-create}}'")
|
||||||
|
print("}")
|
||||||
|
|
||||||
|
else:
|
||||||
|
print(f" {longname} is not yet supported by grub-mkconfig.", file=sys.stderr)
|
||||||
|
|
||||||
|
adjust_timeout()
|
||||||
|
os.remove("/opt/opengnsys/cache/etc/lsb-release")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,90 @@
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
def main():
|
||||||
|
TIME1 = time.time()
|
||||||
|
PROG = sys.argv[0]
|
||||||
|
EXECFORMAT = f"{PROG} [int_ndisk [int_npart]] {{-1 | 0 | int_size}} [NOMOUNT]"
|
||||||
|
|
||||||
|
args = sys.argv[1:]
|
||||||
|
if args and args[-1].upper() == "NOMOUNT":
|
||||||
|
MOUNT = 0
|
||||||
|
args = args[:-1]
|
||||||
|
else:
|
||||||
|
MOUNT = 1
|
||||||
|
|
||||||
|
PARAMS = len(args)
|
||||||
|
if PARAMS == 1:
|
||||||
|
NDISK = 1
|
||||||
|
NPART = 4
|
||||||
|
SIZE = int(args[0])
|
||||||
|
elif PARAMS == 2:
|
||||||
|
NDISK = int(args[0])
|
||||||
|
NPART = 4
|
||||||
|
SIZE = int(args[1])
|
||||||
|
elif PARAMS == 3:
|
||||||
|
NDISK = int(args[0])
|
||||||
|
NPART = int(args[1])
|
||||||
|
SIZE = int(args[2])
|
||||||
|
else:
|
||||||
|
ogRaiseError("OG_ERR_FORMAT", f"{EXECFORMAT}")
|
||||||
|
|
||||||
|
if NDISK < 1 or NPART < 1:
|
||||||
|
ogRaiseError("OG_ERR_FORMAT", f"{EXECFORMAT}")
|
||||||
|
|
||||||
|
if SIZE < -1:
|
||||||
|
ogRaiseError("OG_ERR_FORMAT", f"{EXECFORMAT}")
|
||||||
|
|
||||||
|
if SIZE == 0:
|
||||||
|
print("No modificar la caché local.")
|
||||||
|
return
|
||||||
|
|
||||||
|
if SIZE == -1:
|
||||||
|
print("[10] Trabajar sin caché local.")
|
||||||
|
ogUnmountCache()
|
||||||
|
ogDeleteCache()
|
||||||
|
else:
|
||||||
|
current_cache = ogFindCache()
|
||||||
|
if current_cache and f"{NDISK} {NPART}" != current_cache:
|
||||||
|
print("[10] Detectada otra caché, eliminarla")
|
||||||
|
ogUnmountCache()
|
||||||
|
ogDeleteCache()
|
||||||
|
|
||||||
|
try:
|
||||||
|
OLDSIZE = ogGetCacheSize()
|
||||||
|
except ValueError:
|
||||||
|
OLDSIZE = 0
|
||||||
|
|
||||||
|
if SIZE <= 0:
|
||||||
|
ogRaiseError("OG_ERR_FORMAT", f"!({SIZE}>0)")
|
||||||
|
|
||||||
|
if SIZE != OLDSIZE:
|
||||||
|
print("[10] Crear partición de caché local.")
|
||||||
|
ogUnmountCache()
|
||||||
|
ogCreateCache(NDISK, NPART, SIZE)
|
||||||
|
ogUpdatePartitionTable(NDISK)
|
||||||
|
|
||||||
|
cache = ogFindCache()
|
||||||
|
if not ogIsFormated(cache) or SIZE != OLDSIZE:
|
||||||
|
print("[50] Formatear caché local.")
|
||||||
|
ogFormatCache()
|
||||||
|
|
||||||
|
print("[70] Comprobar montaje de caché local.")
|
||||||
|
if ogMountCache() != 0:
|
||||||
|
print("[80] Comprobar consistencia y volver a montar caché local.")
|
||||||
|
ogCheckFs(cache)
|
||||||
|
if ogMountCache() != 0:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if MOUNT == 0:
|
||||||
|
print("[90] Dejar desmontada la caché local.")
|
||||||
|
ogUnmountCache()
|
||||||
|
|
||||||
|
TIME = time.time() - TIME1
|
||||||
|
print(f"[100] Duración de la operación {int(TIME // 60)}m {int(TIME % 60)}s")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,80 @@
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
"""
|
||||||
|
installOfflineMode
|
||||||
|
Prepara el equipo cliente para el modo offline.
|
||||||
|
|
||||||
|
@exception OG_ERR_NOTFOUND Fichero o dispositivo no encontrado.
|
||||||
|
@exception OG_ERR_NOTCACHE No existe cache.
|
||||||
|
@author Irina Gomez. ETSII. Universidad de Sevilla
|
||||||
|
@date 2013/12/5
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
PROG = os.path.basename(__file__)
|
||||||
|
|
||||||
|
if len(sys.argv) > 1 and sys.argv[1] == "help":
|
||||||
|
og_help()
|
||||||
|
|
||||||
|
og_echo("log", "session $MSG_HELP_installOfflineMode")
|
||||||
|
|
||||||
|
# Cargamos las variables de entorno.
|
||||||
|
OGENGINECONFIGURATE = os.getenv('OGENGINECONFIGURATE')
|
||||||
|
if not OGENGINECONFIGURATE:
|
||||||
|
exec(open('/opt/opengnsys/etc/engine.cfg').read())
|
||||||
|
|
||||||
|
DIRTFTP = "/opt/oglive/tftpboot"
|
||||||
|
DIROGCLIENT = os.path.join(DIRTFTP, "ogclient")
|
||||||
|
|
||||||
|
# Comprobamos que el DIROGCLIENT esta montado desde repo
|
||||||
|
repo_ip = og_get_repo_ip()
|
||||||
|
result = subprocess.run(['df'], capture_output=True, text=True)
|
||||||
|
if f"{repo_ip} {DIRTFTP}" not in result.stdout:
|
||||||
|
og_raise_error("OG_ERR_NOTFOUND", "REPO OGclient")
|
||||||
|
|
||||||
|
# Copiamos el kernel y el initrd.
|
||||||
|
og_echo("log", "session [10] updateBootCache")
|
||||||
|
if not update_boot_cache():
|
||||||
|
og_raise_error("OG_ERR_NOTCACHE", "")
|
||||||
|
|
||||||
|
# Creamos los dir necesarios.
|
||||||
|
OGCAC = "/path/to/ogcac" # Placeholder for OGCAC path
|
||||||
|
og_echo("log", f"session [40] mkdir -p {OGCAC}/{{ogclient, menus, log}}.")
|
||||||
|
os.makedirs(os.path.join(OGCAC, "menus/images/iconos"), exist_ok=True)
|
||||||
|
os.makedirs(os.path.join(OGCAC, "ogclient"), exist_ok=True)
|
||||||
|
os.makedirs(os.path.join(OGCAC, "log"), exist_ok=True)
|
||||||
|
os.makedirs(os.path.join(OGCAC, "opt/opengnsys/images"), exist_ok=True)
|
||||||
|
|
||||||
|
# Comparamos el cliente en el server y en cache
|
||||||
|
og_echo("log", f"session [60] cp {DIROGCLIENT}/ogclient.sqfs {OGCAC}/ogclient/")
|
||||||
|
try:
|
||||||
|
with open(os.path.join(DIROGCLIENT, "ogclient.sqfs.sum"), 'r') as f:
|
||||||
|
SERVEROGCLIENT = f.read().strip()
|
||||||
|
except FileNotFoundError:
|
||||||
|
SERVEROGCLIENT = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(os.path.join(OGCAC, "ogclient/ogclient.sqfs.sum"), 'r') as f:
|
||||||
|
CACHEOGCLIENT = f.read().strip()
|
||||||
|
except FileNotFoundError:
|
||||||
|
CACHEOGCLIENT = None
|
||||||
|
|
||||||
|
if CACHEOGCLIENT != SERVEROGCLIENT:
|
||||||
|
subprocess.run(['cp', os.path.join(DIROGCLIENT, "ogclient.sqfs"), os.path.join(OGCAC, "ogclient/")])
|
||||||
|
subprocess.run(['cp', os.path.join(DIROGCLIENT, "ogclient.sqfs.sum"), os.path.join(OGCAC, "ogclient/")])
|
||||||
|
|
||||||
|
# Si se ha generado el menu de inicio lo copiamos a cache.
|
||||||
|
IPCLIENT = og_get_ip_address()
|
||||||
|
MENU = os.path.join("/path/to/oglog", f"{IPCLIENT}.info.html") # Placeholder for OGLOG path
|
||||||
|
ICONO = "images/iconos/logoopengnsys.png"
|
||||||
|
if not os.path.isfile(MENU):
|
||||||
|
generate_menu_default()
|
||||||
|
|
||||||
|
og_echo("log", f"session [90] cp {MENU} {OGCAC}/menus/{IPCLIENT}.html")
|
||||||
|
subprocess.run(['cp', MENU, os.path.join(OGCAC, f"menus/{IPCLIENT}.html")])
|
||||||
|
subprocess.run(['sed', '-i', 's/"../images"/"images"/g', os.path.join(OGCAC, f"menus/{IPCLIENT}.html")])
|
||||||
|
subprocess.run(['wget', '--no-check-certificate', f"https://{og_get_repo_ip()}/opengnsys/{ICONO}", '-O', os.path.join(OGCAC, f"menus/{ICONO}")])
|
|
@ -0,0 +1,147 @@
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
import json
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
def download_file(url, output):
|
||||||
|
try:
|
||||||
|
if subprocess.call(['which', 'curl'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) == 0:
|
||||||
|
subprocess.check_call(['curl', '-k', '-f', '--connect-timeout', '1', '-o', output, url])
|
||||||
|
else:
|
||||||
|
subprocess.check_call(['wget', '--no-check-certificate', '-T', '1', '-O', output, url])
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def main():
|
||||||
|
prog = os.path.basename(__file__)
|
||||||
|
if len(sys.argv) == 2 and sys.argv[1] == "help":
|
||||||
|
show_help(prog)
|
||||||
|
|
||||||
|
if not callable(globals().get('ogRaiseError')):
|
||||||
|
raise_error(f"{prog}: it can only be executed by an ogLive client.")
|
||||||
|
|
||||||
|
if len(sys.argv) not in [3, 4]:
|
||||||
|
raise_error(f"{prog} ndisk npart [adminuser]")
|
||||||
|
|
||||||
|
ndisk, npart = sys.argv[1], sys.argv[2]
|
||||||
|
windowsadmin = sys.argv[3] if len(sys.argv) == 4 else None
|
||||||
|
|
||||||
|
mntdir = ogMount(ndisk, npart)
|
||||||
|
if not mntdir:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
ogversion = None
|
||||||
|
try:
|
||||||
|
response = subprocess.check_output(['curl', '-k', '-f', '--connect-timeout', '1', '-o', '-', f'https://{ogGetServerIp()}/opengnsys/rest/info'])
|
||||||
|
ogversion = json.loads(response).get('version')
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if not ogversion:
|
||||||
|
raise_error(f"GET /rest/info")
|
||||||
|
|
||||||
|
os_type = ogGetOsType(ndisk, npart)
|
||||||
|
if os_type == "Windows":
|
||||||
|
hive = ogGetHivePath(mntdir, windowsadmin)
|
||||||
|
if not hive:
|
||||||
|
raise_error(f"{ndisk} {npart} {windowsadmin}/NTUSER.DAT")
|
||||||
|
|
||||||
|
ogagentfile = f"OGAgentSetup-{ogversion.replace('pre', '')}.exe"
|
||||||
|
tmpdir = ogGetPath(f"{mntdir}/Windows/Temp")
|
||||||
|
if "opengnsys agent" in ogListSoftware(ndisk, npart).lower():
|
||||||
|
print("OGAgent for Windows is already installed, you need to uninstall it before re-install.")
|
||||||
|
else:
|
||||||
|
if download_file(f"https://{ogGetServerIp()}/opengnsys/descargas/{ogagentfile}", f"{tmpdir}/{ogagentfile}"):
|
||||||
|
try:
|
||||||
|
subprocess.check_call(['hivexsh', '-w'], input=f"""
|
||||||
|
load {hive}
|
||||||
|
cd \\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce
|
||||||
|
setval 1
|
||||||
|
Install OGAgent
|
||||||
|
string:C:\\Windows\\Temp\\{ogagentfile} /S /server {ogGetServerIp()}
|
||||||
|
commit
|
||||||
|
close
|
||||||
|
exit
|
||||||
|
""".encode())
|
||||||
|
print(f'Scheduled OGAgent installation after "{windowsadmin}" logon')
|
||||||
|
print(" (for connection problems, check configuration file).")
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
raise_error(f"{ndisk} {npart} .../{windowsadmin}/NTUSER.DAT")
|
||||||
|
else:
|
||||||
|
raise_error(f"{ndisk} {npart} /Windows/Temp/{ogagentfile}")
|
||||||
|
|
||||||
|
elif os_type == "Linux":
|
||||||
|
if "ogagent" in ogListSoftware(ndisk, npart).lower():
|
||||||
|
print("OGAgent for Linux is already installed, you need to uninstall it before re-install.")
|
||||||
|
else:
|
||||||
|
systemddir = f"{mntdir}/lib/systemd"
|
||||||
|
if not (os.path.isdir(systemddir) and os.path.isdir(systemddir.replace('/lib', '/etc'))):
|
||||||
|
raise_error(f"{ndisk} {npart} systemd")
|
||||||
|
|
||||||
|
ogagentfile = None
|
||||||
|
code = None
|
||||||
|
if os.path.exists(f"{mntdir}/etc/debian_version"):
|
||||||
|
ogagentfile = f"ogagent_{ogversion.replace('pre', '')}_all.deb"
|
||||||
|
code = f"if ! dpkg -l ogagent &>/dev/null && [ -f /var/tmp/{ogagentfile} ]; then apt-get update; apt-get install -y /var/tmp/{ogagentfile}; fi"
|
||||||
|
elif os.path.exists(f"{mntdir}/etc/redhat-release"):
|
||||||
|
ogagentfile = f"ogagent-{ogversion.replace('pre', '')}-1.noarch.rpm"
|
||||||
|
code = f"if ! rpm -q ogagent &>/dev/null && [ -f /var/tmp/{ogagentfile} ]; then yum install -y /var/tmp/{ogagentfile}; fi"
|
||||||
|
|
||||||
|
if not ogagentfile:
|
||||||
|
raise_error(f"{ndisk} {npart} ogagent")
|
||||||
|
|
||||||
|
tmpdir = f"{mntdir}/var/tmp"
|
||||||
|
if download_file(f"https://{ogGetServerIp()}/opengnsys/descargas/{ogagentfile}", f"{tmpdir}/{ogagentfile}"):
|
||||||
|
with open(f"{systemddir}/systemd-launchogagent", 'w') as f:
|
||||||
|
f.write(f"""#!/bin/bash
|
||||||
|
[ $EUID = 0 ] || exit 4
|
||||||
|
start() {{
|
||||||
|
{code}
|
||||||
|
sed -i "0,/remote=/ s,remote=.*,remote=https://{ogGetServerIp()}/opengnsys/rest/," /usr/share/OGAgent/cfg/ogagent.cfg
|
||||||
|
service ogagent start
|
||||||
|
}}
|
||||||
|
restart() {{
|
||||||
|
service ogagent stop
|
||||||
|
if [ -f /var/tmp/{ogagentfile} ]; then
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y --reinstall /var/tmp/{ogagentfile}
|
||||||
|
fi
|
||||||
|
sed -i "0,/remote=/ s,remote=.*,remote=https://{ogGetServerIp()}/opengnsys/rest/," /usr/share/OGAgent/cfg/ogagent.cfg
|
||||||
|
service ogagent start
|
||||||
|
}}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start|restart) "$1" ;;
|
||||||
|
esac
|
||||||
|
""")
|
||||||
|
os.chmod(f"{systemddir}/systemd-launchogagent", 0o755)
|
||||||
|
|
||||||
|
with open(f"{systemddir}/system/launchogagent.service", 'w') as f:
|
||||||
|
f.write(f"""[Unit]
|
||||||
|
Description=Installing and configuring OGAgent
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart=/lib/systemd/systemd-launchogagent start
|
||||||
|
TimeoutStartSec=5min
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
""")
|
||||||
|
os.symlink(f"/lib/systemd/system/launchogagent.service", f"{systemddir.replace('/lib', '/etc')}/system/multi-user.target.wants")
|
||||||
|
print("Scheduled OGAgent installation at next boot")
|
||||||
|
print(" (process will be executed in the background, do not shutdown until finish).")
|
||||||
|
else:
|
||||||
|
raise_error(f"{ndisk} {npart} /var/tmp/{ogagentfile}")
|
||||||
|
|
||||||
|
elif os_type == "MacOS":
|
||||||
|
print("OGAgent installer for macOS is not implemented yet.")
|
||||||
|
else:
|
||||||
|
raise_error(f"{ndisk} {npart}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,36 @@
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
def main():
|
||||||
|
PROG = os.path.basename(__file__)
|
||||||
|
if len(sys.argv) != 1:
|
||||||
|
og_raise_error(os.getenv('OG_ERR_FORMAT'), f"{os.getenv('MSG_FORMAT')}: {PROG}")
|
||||||
|
|
||||||
|
# Directory of the server where log files are exported
|
||||||
|
OGLOG = os.getenv('OGLOG')
|
||||||
|
SERVERLOGDIR = None
|
||||||
|
mount_output = subprocess.check_output(['mount']).decode('utf-8')
|
||||||
|
for line in mount_output.splitlines():
|
||||||
|
parts = line.split()
|
||||||
|
if len(parts) > 3 and parts[3] == OGLOG:
|
||||||
|
SERVERLOGDIR = parts[1]
|
||||||
|
break
|
||||||
|
|
||||||
|
# List file: hard-IP
|
||||||
|
HARDFILE = f"hard-{og_get_ip_address()}"
|
||||||
|
# Redirect output to the list file
|
||||||
|
try:
|
||||||
|
with open(f"{OGLOG}/{HARDFILE}", 'w') as f:
|
||||||
|
f.write(og_list_hardware_info())
|
||||||
|
except Exception as e:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Output: path of the list file in the repository server
|
||||||
|
# print(f"{SERVERLOGDIR}/{HARDFILE}")
|
||||||
|
print(f"{OGLOG}/{HARDFILE}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,11 @@
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def list_partitions(*args):
|
||||||
|
result = subprocess.run(['ogListPartitions'] + list(args), capture_output=True, text=True)
|
||||||
|
output = result.stdout
|
||||||
|
cleaned_output = output.rstrip('EMPTY:0 ')
|
||||||
|
print(cleaned_output)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
list_partitions(*sys.argv[1:])
|
|
@ -0,0 +1,13 @@
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
def og_list_primary_partitions(args):
|
||||||
|
try:
|
||||||
|
result = subprocess.run(['ogListPrimaryPartitions'] + args, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
print(result.stdout.decode())
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print(f"Error: {e.stderr.decode()}", file=sys.stderr)
|
||||||
|
sys.exit(e.returncode)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
og_list_primary_partitions(sys.argv[1:])
|
|
@ -0,0 +1,56 @@
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
def main():
|
||||||
|
PROG = os.path.basename(__file__)
|
||||||
|
REDUCED = "no"
|
||||||
|
|
||||||
|
if len(sys.argv) > 1 and sys.argv[1] == "-r":
|
||||||
|
REDUCED = "yes"
|
||||||
|
sys.argv.pop(1)
|
||||||
|
|
||||||
|
if len(sys.argv) != 3:
|
||||||
|
og_raise_error(1, f"Usage: {PROG} [-r] ndisk npart")
|
||||||
|
|
||||||
|
ndisk = sys.argv[1]
|
||||||
|
npart = sys.argv[2]
|
||||||
|
|
||||||
|
OGLOG = "/path/to/log" # Replace with actual log path
|
||||||
|
SERVERLOGDIR = None
|
||||||
|
|
||||||
|
# Simulate the mount command and awk processing
|
||||||
|
mounts = subprocess.check_output(['mount']).decode('utf-8')
|
||||||
|
for line in mounts.splitlines():
|
||||||
|
parts = line.split()
|
||||||
|
if len(parts) > 3 and parts[2] == OGLOG:
|
||||||
|
SERVERLOGDIR = parts[1]
|
||||||
|
break
|
||||||
|
|
||||||
|
if SERVERLOGDIR is None:
|
||||||
|
og_raise_error(1, "Could not determine server log directory")
|
||||||
|
|
||||||
|
SOFTFILE = f"soft-{og_get_ip_address()}-{ndisk}-{npart}"
|
||||||
|
softfile_path = os.path.join(OGLOG, SOFTFILE)
|
||||||
|
|
||||||
|
try:
|
||||||
|
if REDUCED == "no":
|
||||||
|
software_list = og_list_software(ndisk, npart)
|
||||||
|
else:
|
||||||
|
software_list = "\n".join(
|
||||||
|
line for line in og_list_software(ndisk, npart).splitlines()
|
||||||
|
if not re.search(r"\(KB[0-9]{6}\)", line)
|
||||||
|
)
|
||||||
|
|
||||||
|
with open(softfile_path, 'w') as f:
|
||||||
|
f.write(software_list)
|
||||||
|
except Exception as e:
|
||||||
|
og_raise_error(1, str(e))
|
||||||
|
|
||||||
|
print(softfile_path)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,16 @@
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
def main():
|
||||||
|
PROG = os.path.basename(__file__)
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
og_raise_error(os.getenv('OG_ERR_FORMAT', 1), f"{os.getenv('MSG_FORMAT', 'Usage')}: {PROG} urlmenu")
|
||||||
|
|
||||||
|
url = sys.argv[1]
|
||||||
|
subprocess.run(['browser', '-qws', url])
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,34 @@
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
restoreImageCustom
|
||||||
|
@brief Plantilla para script de restauración personalizada de imagen.
|
||||||
|
@param $1 nº de disco
|
||||||
|
@param $2 nº de partición
|
||||||
|
@param $3 Repositorio: CACHE, REPO o dirección IP
|
||||||
|
@param $4 Nombre canónico de la imagen sin extensión
|
||||||
|
@warning Renombrar este fichero como "restoreImageCustom" para sustituir al script estándar "restoreImage".
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Control de parámetros.
|
||||||
|
if not (4 <= len(sys.argv) <= 6):
|
||||||
|
ogRaiseError(os.getenv('OG_ERR_FORMAT'), "restoreImageCustom str_repo str_imagen int_ndisco int_npart [ str_proto [\"str_opciones\"] ]")
|
||||||
|
|
||||||
|
# Toma de parámetros.
|
||||||
|
REPO = sys.argv[1].upper() # Repositorio (en mayúsculas).
|
||||||
|
IMGNAME = sys.argv[2] # Nombre canónico de imagen (sin extensión).
|
||||||
|
DISK = sys.argv[3] # Nº de disco.
|
||||||
|
PART = sys.argv[4] # Nº de partición.
|
||||||
|
PROTO = sys.argv[5].upper() if len(sys.argv) > 5 else "UNICAST" # Protocolo de comunicaciones (por defecto, UNICAST).
|
||||||
|
PROTOOPT = sys.argv[6] if len(sys.argv) > 6 else "" # Opciones del protocolo separadas por ":" (opcional).
|
||||||
|
|
||||||
|
# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado).
|
||||||
|
|
||||||
|
# Paso 1: Añadir aquí el código para el proceso previo antes de la restauración de la imagen en los equipos (opcional).
|
||||||
|
|
||||||
|
# Paso 2: Sustituir, si se desea, la llamada al proceso estándar de restauración de imagen por código personalizado.
|
||||||
|
restoreImage(*sys.argv[1:])
|
||||||
|
|
||||||
|
# Aviso: editar la plantilla "configureOsCustom" para añadir el código personalizado para el proceso de postconfiguración de los clientes (no incluir aquí dicho código).
|
|
@ -0,0 +1,18 @@
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
|
||||||
|
def start_xvesa():
|
||||||
|
subprocess.Popen(['/usr/X11R6/bin/Xvesa', ':0', '-ac', '-shadow', '-screen', '1024x768x24', '-br', '-mouse', '/dev/input/mice'])
|
||||||
|
time.sleep(0.1)
|
||||||
|
os.environ['DISPLAY'] = ':0'
|
||||||
|
|
||||||
|
def start_roxterm():
|
||||||
|
subprocess.Popen(['/usr/bin/roxterm'])
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
start_xvesa()
|
||||||
|
start_roxterm()
|
|
@ -0,0 +1,38 @@
|
||||||
|
import shutil
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Copy lighttpd.conf
|
||||||
|
shutil.copy('/etc/lighttpd/lighttpd.conf', '/etc/lighttpd/lighttpd.conf.back')
|
||||||
|
shutil.copy('/opt/opengnsys/lib/httpd/lighttpd.conf', '/etc/lighttpd/')
|
||||||
|
|
||||||
|
# Copy 10-cgi.conf
|
||||||
|
shutil.copy('/etc/lighttpd/conf-enabled/10-cgi.conf', '/etc/lighttpd/conf-enabled/10-cgi.conf.back')
|
||||||
|
shutil.copy('/opt/opengnsys/lib/httpd/10-cgi.conf', '/etc/lighttpd/conf-enabled/')
|
||||||
|
|
||||||
|
# Start lighttpd service
|
||||||
|
subprocess.run(['/etc/init.d/lighttpd', 'start'])
|
||||||
|
|
||||||
|
# Change permissions and create directories
|
||||||
|
os.chmod('/opt', 0o755)
|
||||||
|
os.makedirs('/usr/lib/cgi-bin', exist_ok=True)
|
||||||
|
|
||||||
|
# Copy files to /usr/lib/cgi-bin
|
||||||
|
for filename in os.listdir('/opt/opengnsys/lib/httpd/'):
|
||||||
|
full_file_name = os.path.join('/opt/opengnsys/lib/httpd/', filename)
|
||||||
|
if os.path.isfile(full_file_name):
|
||||||
|
shutil.copy(full_file_name, '/usr/lib/cgi-bin')
|
||||||
|
|
||||||
|
# Run dstat command
|
||||||
|
with open('/tmp/bandwidth', 'w') as f:
|
||||||
|
subprocess.Popen(['dstat', '-dn', '10'], stdout=f)
|
||||||
|
|
||||||
|
# Append "WAITING" to OGLOGSESSION
|
||||||
|
oglogsession = os.getenv('OGLOGSESSION')
|
||||||
|
if oglogsession:
|
||||||
|
with open(oglogsession, 'a') as f:
|
||||||
|
f.write("WAITING\n")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in New Issue