Refs #401 fixed function for net interfaces

ogboot_installer
qindel 2024-05-29 06:10:07 +00:00
parent 9b4a218c84
commit e275dcb6a4
1 changed files with 198 additions and 150 deletions

View File

@ -10,7 +10,7 @@ import platform, os, sys, subprocess, datetime, shutil, argparse, time, pwd
global UBUNTU_OS_VERSION, OPENGNGYS_VERSION, PYTHON_VERSION_LAST, PYTHON_VERSION, DEPENDENCIES2, INSTALL_OGBOOT_TARGET, WORK_DIR, LOG_FILE, CHECKPKG, INSTALLPKG, PATH, PROGRAM_DIR, OPENGNSYS_SERVER, UPDATEPKGLIST
UPDATEPKGLIST = ""
UBUNTU_OS_VERSION = "22"
UBUNTU_OS_VERSION = "18"
OPENGNGYS_VERSION = "1.2.0"
PYTHON_VERSION = 3
PYTHON_VERSION_LAST = 0
@ -24,6 +24,13 @@ PROGRAM_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
PROGRAM_NAME = os.path.basename(sys.argv[0])
OPENGNSYS_SERVER = "opengnsys.es"
CHECKPKG=""
DEFAULTDEV = ""
DEVICE = []
SERVERIP = []
NETIP = []
NETMASK = []
NETBROAD = []
ROUTERIP = []
WORKDIR="/tmp/ogboot_installer"
BRANCH = sys.argv[1] if len(sys.argv) > 1 else "main"
TFTPSERV = "tftpd-hpa" # Define the TFTPSERV variable with the appropriate value
@ -285,65 +292,73 @@ def generate_config_url():
return f"https://dl.cloudsmith.io/public/isc/kea-2-0/config.deb.txt?distro=ubuntu&codename={codename}&version={version}&arch={arch}"
def create_ogboot_project(path_opengnsys_base):
# Verificar si el usuario 'ogboot' ya existe
try:
pwd.getpwnam('ogboot')
print("El usuario 'ogboot' ya existe")
except KeyError:
subprocess.run(["sudo", "useradd", "-m", "ogboot"])
# Verificar si el usuario 'ogboot' ya existe
try:
pwd.getpwnam('ogboot')
print("El usuario 'ogboot' ya existe")
except KeyError:
subprocess.run(["sudo", "useradd", "-m", "ogboot"])
# Verificar si el directorio ya existe
if os.path.exists(path_opengnsys_base):
if not os.path.isdir(path_opengnsys_base):
raise NotADirectoryError(f"{path_opengnsys_base} existe y no es un directorio.")
else:
print(f"El directorio {path_opengnsys_base} ya existe.")
else:
os.makedirs(path_opengnsys_base)
# Cambiar el propietario del directorio a 'ogboot' si se creó por primera vez
subprocess.run(["sudo", "chown", "-R", "ogboot:ogboot", path_opengnsys_base])
# Verificar si el directorio ya existe
if os.path.exists(path_opengnsys_base):
if not os.path.isdir(path_opengnsys_base):
raise NotADirectoryError(f"{path_opengnsys_base} existe y no es un directorio.")
else:
print(f"El directorio {path_opengnsys_base} ya existe.")
else:
os.makedirs(path_opengnsys_base)
# Cambiar el propietario del directorio a 'ogboot' si se creó por primera vez
subprocess.run(["sudo", "chown", "-R", "ogboot:ogboot", path_opengnsys_base])
# Copiar los archivos .env y composer.json primero
shutil.copy(f"{WORKDIR}/ogboot/.env", os.path.join(path_opengnsys_base, ".env"))
shutil.copy(f"{WORKDIR}/ogboot/composer.json", os.path.join(path_opengnsys_base, "composer.json"))
print(".env y composer.json copiados a", path_opengnsys_base)
bin_source = os.path.join(WORKDIR, "ogboot/bin")
bin_dest = os.path.join(path_opengnsys_base, "bin")
src_source = os.path.join(WORKDIR, "ogboot/src")
src_dest = os.path.join(path_opengnsys_base, "src")
config_source = os.path.join(WORKDIR, "ogboot/config")
config_dest = os.path.join(path_opengnsys_base, "config")
if os.path.exists(bin_dest):
shutil.rmtree(bin_dest)
shutil.copytree(bin_source, bin_dest)
# Verificar si la entrada "opengnsys" existe en /etc/hosts
with open('/etc/hosts', 'r') as hosts_file:
hosts_content = hosts_file.read()
if 'opengnsys' not in hosts_content:
# Agregar la entrada "opengnsys" con la IP SERVER_OPENGNSYS
with open('/etc/hosts', 'a') as hosts_file:
hosts_file.write('172.17.8.82 opengnsys\n')
print("Entrada 'opengnsys' agregada a /etc/hosts")
if os.path.exists(src_dest):
shutil.rmtree(src_dest)
shutil.copytree(src_source, src_dest)
if os.path.exists(config_dest):
shutil.rmtree(config_dest)
shutil.copytree(config_source, config_dest)
# Copiar los archivos .env y composer.json primero
shutil.copy(f"{WORKDIR}/ogboot/.env", os.path.join(path_opengnsys_base, ".env"))
shutil.copy(f"{WORKDIR}/ogboot/composer.json", os.path.join(path_opengnsys_base, "composer.json"))
print(".env y composer.json copiados a", path_opengnsys_base)
bin_source = os.path.join(WORKDIR, "ogboot/bin")
bin_dest = os.path.join(path_opengnsys_base, "bin")
src_source = os.path.join(WORKDIR, "ogboot/src")
src_dest = os.path.join(path_opengnsys_base, "src")
config_source = os.path.join(WORKDIR, "ogboot/config")
config_dest = os.path.join(path_opengnsys_base, "config")
if os.path.exists(bin_dest):
shutil.rmtree(bin_dest)
shutil.copytree(bin_source, bin_dest)
subprocess.run(["sudo", "chmod", "-R", "755", path_opengnsys_base])
subprocess.run(["sudo", "chown", "-R", "ogboot:ogboot", path_opengnsys_base])
print("Esperando 20 segundos...")
time.sleep(20)
# Ejecutar Composer como el usuario 'ogboot' para instalar el proyecto Symfony
result = subprocess.run(["sudo", "-u", "ogboot", "composer", "install", "--no-interaction", "--working-dir", path_opengnsys_base])
if result.returncode != 0:
print("Error al crear el proyecto Symfony usando Composer")
return
if os.path.exists(src_dest):
shutil.rmtree(src_dest)
shutil.copytree(src_source, src_dest)
if os.path.exists(config_dest):
shutil.rmtree(config_dest)
shutil.copytree(config_source, config_dest)
os.chdir(path_opengnsys_base)
subprocess.run(["sudo", "chmod", "-R", "755", path_opengnsys_base])
subprocess.run(["sudo", "chown", "-R", "ogboot:ogboot", path_opengnsys_base])
# Eliminar composer.lock si existe
composer_lock_path = os.path.join(path_opengnsys_base, "composer.lock")
if os.path.exists(composer_lock_path):
os.remove(composer_lock_path)
# Ejecutar Composer como el usuario 'ogboot' para instalar el proyecto Symfony
result = subprocess.run(["sudo", "-u", "ogboot", "composer", "install", "--no-interaction", "--working-dir", path_opengnsys_base])
if result.returncode != 0:
print("Error al crear el proyecto Symfony usando Composer")
return
print("Esqueleto de la aplicación creado y archivo composer.lock eliminado.")
os.chdir(path_opengnsys_base)
# Eliminar composer.lock si existe
composer_lock_path = os.path.join(path_opengnsys_base, "composer.lock")
if os.path.exists(composer_lock_path):
os.remove(composer_lock_path)
print("Esqueleto de la aplicación creado y archivo composer.lock eliminado.")
def createDirs(INSTALL_TARGET):
@ -440,12 +455,12 @@ def isc_keaDhcpConfigure():
errcode = 0
i = 0
interfaces = "["
DEVICE = ["eth0", "eth1"] # Define the DEVICE variable with appropriate values
NETMASK = "255.255.255.0" # Replace with the actual value of NETMASK
NETIP = "192.168.0.1" # Replace with the actual value of NETIP
ROUTERIP = "192.168.0.1" # Replace with the actual value of ROUTERIP
#DEVICE = ["eth0", "eth1"] # Define the DEVICE variable with appropriate values
#NETMASK = "255.255.255.0" # Replace with the actual value of NETMASK
#NETIP = "192.168.0.1" # Replace with the actual value of NETIP
#ROUTERIP = "192.168.0.1" # Replace with the actual value of ROUTERIP
DNSIP = "192.168.0.1" # Replace with the actual value of DNSIP
SERVERIP = "192.168.0.1" # Replace with the actual value of SERVERIP
#SERVERIP = "192.168.0.1" # Replace with the actual value of SERVERIP
# Rest of the code...
@ -533,22 +548,19 @@ def tftpConfigure():
# time.sleep(1)
# testPxe()
def servicesCompilation():
hayErrores = 0
# Compilar OpenGnsys Client
echoAndLog(f"{servicesCompilation.__name__}(): Compiling OpenGnsys Admin Client")
subprocess.run(["make"], cwd=f"{WORKDIR}/ogboot/sources/clients/ogAdmClient")
subprocess.run(["mv", f"{WORKDIR}/ogboot/sources/clients/ogAdmClient/ogAdmClient", f"{WORKDIR}/client/shared/bin"])
subprocess.run(["mv", f"{WORKDIR}/ogboot/sources/clients/ogAdmClient/ogAdmClient", f"{WORKDIR}/ogboot/client/shared/bin"])
if subprocess.returncode != 0:
echoAndLog(f"{servicesCompilation.__name__}(): error while compiling OpenGnsys Admin Client")
hayErrores = 1
return hayErrores
# Copiar carpeta de Interface
def copyInterfaceAdm():
hayErrores = 0
@ -607,6 +619,7 @@ def mask2cidr(mask):
# Obtener los parámetros de red de la interfaz por defecto.
def getNetworkSettings():
DHCPNET = "127.0.0.1"
# Arrays globales definidas:
# - DEVICE: nombres de dispositivos de red activos.
# - SERVERIP: IPs locales del servidor.
@ -618,66 +631,82 @@ def getNetworkSettings():
# - DEFAULTDEV: dispositivo de red por defecto.
# - DNSIP: IP del servidor DNS principal.
DEVICE = []
SERVERIP = []
NETIP = []
NETMASK = []
NETBROAD = []
ROUTERIP = []
#DEVICE = []
print("getNetworkSettings(): Detecting network parameters.")
output = subprocess.check_output(["ip", "-o", "link", "show", "up"]).decode("utf-8")
lines = output.strip().split("\n")
for line in lines:
dev = line.split(":")[1].split("@")[0].strip()
print("DEV:", dev)
output = subprocess.check_output(["ip", "-o", "addr", "show", "dev", dev]).decode("utf-8")
addr_lines = output.strip().split("\n")
for addr_line in addr_lines:
addr_parts = addr_line.split()
cidr_netmask = addr_parts[3].split("/")[1]
cidr_netmask = int(cidr_netmask)
if cidr_netmask < 0 or cidr_netmask > 32:
print("")
else:
#print("*** Interface:", dev)
#print("*** IP Address", addr_parts[3].split("/")[0])
netmask = ".".join([str((0xffffffff << (32 - cidr_netmask) >> i) & 0xff) for i in [24, 16, 8, 0]])
#print("*** Netmask:", netmask)
#print("*** Broadcast:", addr_parts[5])
#print("*** Router IP:", subprocess.check_output(["ip", "route", "list", "default"]).decode("utf-8").split()[2])
# Por aquí revisar lógica en caso de que haya una interfaz de red sin IP para que no reviente
if len(addr_parts) >= 4 and addr_parts[2] == "inet":
if addr_parts[2] == "inet":
DEVICE.append(dev)
SERVERIP.append(addr_parts[3].split("/")[0])
NETMASK.append(cidr2mask(int(addr_parts[3].split("/")[1])))
NETMASK.append(netmask)
NETBROAD.append(addr_parts[5])
NETIP.append(subprocess.check_output(["ip", "route", "list", "proto", "kernel"]).decode("utf-8").split()[0])
print("NETIP:", NETIP[-1])
NETIP.append(addr_parts[3].split("/")[0])
ROUTERIP.append(subprocess.check_output(["ip", "route", "list", "default"]).decode("utf-8").split()[2])
#print ("====== SERVERIP_:", SERVERIP[-1])
#print ("====== SERVERIP:", SERVERIP[0])
#print ("====== NETIP:", NETIP[-1])
#print ("====== DHCPNET:", DHCPNET)
if DHCPNET == NETIP[-1]:
print("DHCPNET:", NETIP[-1], "if yes")
#print("DHCPNET:", NETIP[-1], "if yes")
DEFAULTDEV = dev
else:
print("DHCPNET:", NETIP[-1], "if no")
#print("DHCPNET:", NETIP[-1], "if no")
DEFAULTDEV = DEFAULTDEV if "DEFAULTDEV" in locals() else dev
# Habria que añadir logica para el caso en el que no este systemd-resolve para que a continuación busque en /etc/resolv.conf
# output = subprocess.check_output(["systemd-resolve", "--status"]).decode("utf-8")
# dns_servers = output.split("DNS Servers:")[1].split()[0]
# DNSIP = dns_servers if dns_servers else open("/etc/resolv.conf").read().splitlines()[0].split()[1]
if not NETIP or not NETMASK:
print("Error: Network not detected.")
exit(1)
print("getNetworkSettings(): Default network device:", DEFAULTDEV)
#print ("NETIP:", NETIP)
#print ("NETMASK:", NETMASK)
num_elements = len(NETIP)
#print("Number of elements in NETIP:", num_elements)
if len(NETIP) == 0 or len(NETMASK) == 0:
#print ("getNetworkSettings(): [ RETURN 1 ]Error: No network devices detected.")
return 1
else:
#print("getNetworkSettings(): [ RETURN 0 ]Default network device:", DEFAULTDEV)
return 0
# Print variable names and values
print("DEVICE:", DEVICE)
print("SERVERIP:", SERVERIP)
print("NETIP:", NETIP)
print("NETMASK:", NETMASK)
print("NETBROAD:", NETBROAD)
print("ROUTERIP:", ROUTERIP)
print("DEFAULTDEV:", DEFAULTDEV)
#print("DEVICE:", DEVICE)
#print("SERVERIP:", SERVERIP)
#print("NETIP:", NETIP)
#print("NETMASK:", NETMASK)
#print("NETBROAD:", NETBROAD)
#print("ROUTERIP:", ROUTERIP)
#print("DEFAULTDEV:", DEFAULTDEV)
# print("DNSIP:", DNSIP)
def openGnsysConfigure():
DEVICE = []
SERVERIP = []
DEFAULTDEV = ""
APACHE_RUN_USER = ""
APACHE_RUN_GROUP = ""
OPENGNSYS_CONSOLEURL = ""
#DEVICE = []
#SERVERIP = []
#APACHE_RUN_USER = ""
#APACHE_RUN_GROUP = ""
#OPENGNSYS_CONSOLEURL = ""
i = 0
dev = ""
@ -686,20 +715,25 @@ def openGnsysConfigure():
# Mientras networkConfigure no funcione, utilizar una variable global que apunte al servidor Opengnsys
# Para nuetra demo 172.17.8.82
print(f"{openGnsysConfigure.__name__}(): Creating OpenGnsys config files.")
for dev in DEVICE:
if SERVERIP[i]:
CONSOLEURL = f"https://{SERVERIP[i]}/opengnsys"
with open(f"{WORKDIR}/opengnsys/admin/Sources/Clients/ogAdmClient/ogAdmClient.cfg") as file:
content = file.read()
content = content.replace("SERVERIP", SERVERIP[i])
content = content.replace("OPENGNSYSURL", CONSOLEURL.replace("/", "\\/"))
with open(f"{INSTALL_TARGET}/client/etc/ogAdmClient-{dev}.cfg", "w") as outfile:
outfile.write(content)
if dev == DEFAULTDEV:
OPENGNSYS_CONSOLEURL = CONSOLEURL
i += 1
os.link(f"{INSTALL_TARGET}/client/etc/ogAdmClient-{DEFAULTDEV}.cfg", f"{INSTALL_TARGET}/client/etc/ogAdmClient.cfg")
for dev in DEVICE:
if dev:
if SERVERIP[i]:
CONSOLEURL = f"https://{SERVERIP[i]}/opengnsys"
with open(f"{WORKDIR}/opengnsys/admin/Sources/Clients/ogAdmClient/ogAdmClient.cfg") as file:
content = file.read()
content = content.replace("SERVERIP", SERVERIP[i])
content = content.replace("OPENGNSYSURL", CONSOLEURL.replace("/", "\\/"))
with open(f"{INSTALL_TARGET}/client/etc/ogAdmClient-{dev}.cfg", "w") as outfile:
outfile.write(content)
if dev == DEFAULTDEV:
OPENGNSYS_CONSOLEURL = CONSOLEURL
i += 1
if DEFAULTDEV:
os.link(f"{INSTALL_TARGET}/client/etc/ogAdmClient-{DEFAULTDEV}.cfg", f"{INSTALL_TARGET}/client/etc/ogAdmClient.cfg")
else:
print("Error: No se ha detectado la interfaz de red por defecto.")
exit(1)
TZ = subprocess.check_output(["timedatectl", "status"]).decode().split("\n")[2].split(":")[1].strip()
with open(f"{INSTALL_TARGET}/client/etc/engine.cfg", "a") as file:
@ -837,6 +871,17 @@ autoConfigure()
Missing = get_missing_packages (required_packages_18)
install_packages(Missing)
SERVER_OPENGNSYS = "172.17.8.82"
# Verificar si la entrada "opengnsys" existe en /etc/hosts
with open('/etc/hosts', 'r') as hosts_file:
hosts_content = hosts_file.read()
if f'{SERVER_OPENGNSYS} opengnsys' not in hosts_content:
with open('/etc/hosts', 'a') as hosts_file:
hosts_file.write(f'{SERVER_OPENGNSYS} opengnsys\n')
print("Entrada 'opengnsys' agregada a /etc/hosts")
else:
print(f"La entrada '{SERVER_OPENGNSYS} opengnsys' ya existe en /etc/hosts" )
# Detectar parámetros de red y comprobar si hay conexión.
if getNetworkSettings() != 0:
errorAndLog("Error reading default network settings.")
@ -848,6 +893,7 @@ if REMOTE == 1:
errorAndLog("Error while getting code from the repository")
exit(1)
else:
# WAR: Crea un link recursivo en el ogboot
if not os.path.exists("ogboot"):
os.symlink(os.path.dirname(PROGRAM_DIR), "ogboot")
@ -883,6 +929,8 @@ if subprocess.run(["echo", "$?"]).returncode != 0:
generate_ipxe_script()
openGnsysConfigure()
# Montar sistema NFS.
mount_NFS()
@ -896,49 +944,49 @@ if subprocess.run(["echo", "$?"]).returncode != 0:
###############################################################################
###:::::::::::::::::::::::::::::::: DHCP :::::::::::::::::::::::::::::::::::###
###############################################################################
parser = argparse.ArgumentParser(description='Instalación de ogBoot', formatter_class=argparse.RawTextHelpFormatter)
help_text_dhcp = """
install\t\tInstala la versión de DHCP seleccionada con dhcp-version,
configure\tConfigura dhcp sobre un servicio previamente instalado,
none\t\tNo instala ni configura DHCP
"""
help_text_dhcp_version = """
isc\t\tInstala la versión de DHCP isc-kea-dhcp, para Ubuntu 18.04
kea\t\tInstala la versión de DHCP kea-dhcp, para Ubuntu 20.04
none\t\tNo instala ni configura DHCP
"""
parser.add_argument('--dhcp', choices=['install', 'configure', 'none'], default='none', help=help_text_dhcp)
parser.add_argument('--dhcp-version', choices=['isc', 'kea', 'none'], default='none', help=help_text_dhcp_version)
# parser = argparse.ArgumentParser(description='Instalación de ogBoot', formatter_class=argparse.RawTextHelpFormatter)
# help_text_dhcp = """
# install\t\tInstala la versión de DHCP seleccionada con dhcp-version,
# configure\tConfigura dhcp sobre un servicio previamente instalado,
# none\t\tNo instala ni configura DHCP
# """
# help_text_dhcp_version = """
# isc\t\tInstala la versión de DHCP isc-kea-dhcp, para Ubuntu 18.04
# kea\t\tInstala la versión de DHCP kea-dhcp, para Ubuntu 20.04
# none\t\tNo instala ni configura DHCP
# """
# parser.add_argument('--dhcp', choices=['install', 'configure', 'none'], default='none', help=help_text_dhcp)
# parser.add_argument('--dhcp-version', choices=['isc', 'kea', 'none'], default='none', help=help_text_dhcp_version)
args = parser.parse_args()
# args = parser.parse_args()
if args.dhcp == 'install':
if args.dhcp_version == 'isc':
print("Instalando isc-kea-dhcp")
install_isc_kea()
isc_keaDhcpConfigure()
pass
elif args.dhcp_version == 'kea':
print("Instalando kea-dhcp")
install_kea()
pass
elif args.dhcp_version == 'none':
print("No se ha seleccionado ninguna versión de DHCP, utilice --dhcp-version para seleccionar una versión")
pass
pass
elif args.dhcp == 'configure':
print("Configurando DHCP")
if args.dhcp_version == 'isc':
isc_keaDhcpConfigure()
pass
elif args.dhcp_version == 'kea':
print("Configurando kea-dhcp")
#keaDhcpConfigure()
pass
elif args.dhcp_version == 'none':
print("No se ha seleccionado ninguna versión de DHCP, utilice --dhcp-version para seleccionar una versión")
pass
pass
elif args.dhcp == 'none':
print("DHCP no será instalado ni configurado")
pass
# if args.dhcp == 'install':
# if args.dhcp_version == 'isc':
# print("Instalando isc-kea-dhcp")
# install_isc_kea()
# isc_keaDhcpConfigure()
# pass
# elif args.dhcp_version == 'kea':
# print("Instalando kea-dhcp")
# install_kea()
# pass
# elif args.dhcp_version == 'none':
# print("No se ha seleccionado ninguna versión de DHCP, utilice --dhcp-version para seleccionar una versión")
# pass
# pass
# elif args.dhcp == 'configure':
# print("Configurando DHCP")
# if args.dhcp_version == 'isc':
# isc_keaDhcpConfigure()
# pass
# elif args.dhcp_version == 'kea':
# print("Configurando kea-dhcp")
# #keaDhcpConfigure()
# pass
# elif args.dhcp_version == 'none':
# print("No se ha seleccionado ninguna versión de DHCP, utilice --dhcp-version para seleccionar una versión")
# pass
# pass
# elif args.dhcp == 'none':
# print("DHCP no será instalado ni configurado")
# pass