Exemple #1
0
def seleccionTipoEjercicio(usuario):
    """Muestra pantalla donde el usuario elige el tipo de ejercicios que quiere
    resolver, así como el avance"""

    #SE INSTANCIA UN OBJETO COLOR PARA DAR FORMATO AL TEXTO
    c = color.Color()
    validacion = True

    while validacion:

        subprocess.call('clear')
        logo = logoUAM.printLogo()
        print(logo)
        #SE LISTAN LOS TIPOS DE EJERCICIOS DISPONIBLES
        print(c.BOLD + f'¡Hola {usuario.username.upper()}!' + c.END + ',')
        print('A continuación puedes elegir el tipo de ejercicio a realizar.')
        print("""
            1. Prácticar comandos de Docker
            2. Troubleshooting en Docker
            3. Retos de comandos en Docker
            4. Salir 
        """)

        opcion = input(c.BOLD + 'Tu opción: ' + c.END)

        try:
            subprocess.call('clear')

            if opcion == '1':
                validacion = False
                #LANZA LA VISTA PARA PRACTICAR COMANDOS
                seleccionEjercicio(usuario, "practica")
                seleccionTipoEjercicio(usuario)

            elif opcion == '2':
                validacion = False
                #LANZA LA VISTA PARA PRACTICAR TROUBLESHOOTING
                seleccionEjercicio(usuario, "problema")
                seleccionTipoEjercicio(usuario)

            elif opcion == '3':
                validacion = False
                #LANZA LA VISTA PARA LOS RETOS DE COMANDOS
                seleccionEjercicio(usuario, "reto")
                seleccionTipoEjercicio(usuario)

            elif opcion == '4':
                #SALE DE LA APLICACIÓN
                print(c.BOLD + c.YELLOW +
                      f'\n¡Hasta luego, {usuario.username.upper()}!\n' + c.END)
                break

            else:
                #SE ATRAPA EL ERROR EN CASO DE QUE INTRODUZCAN OTRA OPCIÓN
                raise ValueError('OpcionInvalida')

        except ValueError:
            print('\n¡Opción inválida! :(, intenta otra vez.\n')
            continue
Exemple #2
0
def seleccionEjercicio(usuario, tipo):
    """Muestra los ejercicios disponibles dependiendo el tipo de ejercicio"""

    #SE INSTANCIA UN OBJETO COLOR PARA DAR FORMATO AL TEXTO
    c = color.Color()

    logo = logoUAM.printLogo()
    print(logo)
    avance = Avance_Usuario()

    #SE INSTANCIA UN OBJETO EJERCICIO
    listaEjercicios = Ejercicio()
    #SE RECUPERA LA LISTA DE EJERCICIOS EN LA BD DE ACUERDO AL TIPO DE EJERCICIO
    listaEjercicios = listaEjercicios.recuperarEjercicios(tipo)

    print('De acuerdo ' + c.BOLD + f'{usuario.username.upper()}' + c.END +
          ', vamos a realizar' + ' algunos ejercicios en el servidor Docker.')
    print('\nElige de la siguiente lista cuál quieres hacer:\n')

    #MUESTRA LA LISTA DE EJERCICIOS
    for ejercicio in enumerate(listaEjercicios, 1):
        listAvance = avance.recuperarAvance(ejercicio[1], usuario)
        print(f"\t{ejercicio[0]}. {ejercicio[1].descripcion}".ljust(40),
              end=" ")

        try:
            resuelto = listAvance.resuelto
            intentos = listAvance.intento
            #print(f"Intentos: {listAvance.intento}\tResuelto: {listAvance.resuelto}".rjust(20))
        except:
            resuelto = 'No'
            intentos = '0'

            #print("Intentos: 0\tResuelto: No".rjust(20))
        if resuelto == True:
            resuelto = 'Sí'
        elif resuelto == False:
            resuelto = 'No'

        print(f"Intentos: {intentos}\tResuelto: {resuelto}".rjust(20))

    print(f"\t{len(listaEjercicios)+1}. Regresar al menú principal")

    #SE ESPERA LA ELECCIÓN DEL USUARIO
    opcion = int(input(c.BOLD + "\nTu opción: " + c.END))

    if opcion >= 1 and opcion <= len(listaEjercicios):
        #SE OBTIENE EL EJERCICIO Y EL NOMBRE
        ejercicio = listaEjercicios[opcion - 1]

        llamarEjercicio(ejercicio, usuario)
    else:
        pass

    return True
Exemple #3
0
def vistaEjercicio(usuario):
    """Función que crea el Nivel 3 de retos"""

    #SE INSTANCIA UN OBJETO COLOR PARA DAR FORMATO AL TEXTO
    c = color.Color()

    #SE LIMPIA LA PANTALLA
    sp.run('clear')
    logo = logoUAM.printLogo()
    print(logo)

    sentencia = """
    A continuación, intenta realizar lo siguiente:
    
        ELIMINAR la imagen de ubuntu y TODOS los contenedores con UN sólo comando.
    
    IMPORTANTE: Una vez que aparezca el prompt, solo podrás introducir una línea, 
    por lo que introduce tu respuesta y da enter cuando estés seguro de que está
    correcta. Al dar enter se comenzará con la evaluación del ejercicio.
    """

    print(sentencia)

    input(c.BOLD + 'Da enter para comenzar...' + c.END)

    #SE COMIENZA A PREPARAR EL EJERCICIO
    print('\nPreparando tu escenario, espera a que aparezca el prompt.\n')

    prepararEjercicio()

    #SE CARGAN LOS CONTENEDORES PARA EL ESCENARIO
    for i in range(2):
        sp.run(['docker', 'run', '-dit', 'ubuntu'], capture_output=True)

    #SE MUESTRAN LOS CONTENEDORES ACTIVOS
    print('\n* Contenedores actualmente activos')
    sp.run(['docker', 'ps', '-a'], capture_output=False, encoding='utf-8')

    #SE MUESTRAN LAS IMAGENES CARGADAS
    print('\n* Imágenes actualmente cargadas')
    sp.run(['docker', 'images'])

    cmd = input(c.BOLD + '\n\nTuPrompt$ ' + c.END)
    #SE INTRODUCE EL COMANDO DEL USUARIO
    sp.run(cmd, capture_output=False, encoding='utf-8', shell=True)

    #SE MANDA A EVALUAR EL EJERCICIO
    resultado = evaluarEjercicio()

    resultadoEjercicio = [usuario, resultado]
    sleep(2)

    return resultadoEjercicio
Exemple #4
0
def seleccionTipoEjercicio(usuario):
    """Muestra pantalla donde el usuario elige el tipo de ejercicos que quiere
    resolver, así como el avance"""

    subprocess.call('clear')
    logo = logoUAM.printLogo()
    print(logo)
    print(f'¡Hola {usuario.nombre}!,')
    print(
        'A continuación puedes elegir el tipo de ejercicio que quieres realizar'
    )
    print("""
        1. Retos para prácticar comandos de Docker
        2. Troubleshooting en Docker
        3. Ver mis estádisticas
        4. Salir 
    """)

    opcion = input('Tu opción: ')

    #print('\nTu avance actual: ')

    try:
        subprocess.call('clear')
        tipo = tipos.Tipos()

        if int(opcion) < 1 and int(opcion) > 4:
            raise ValueError('OpcionInvalida')

        elif opcion == '1':
            tipo.practicarComandos(usuario)
            seleccionTipoEjercicio(usuario)

        elif opcion == '2':
            tipo.troubleshootingDocker(usuario)
            seleccionTipoEjercicio(usuario)

        elif opcion == '3':
            print(f'¡Vamos a ver tus estádisticas {usuario.nombre}!')
            seleccionTipoEjercicio(usuario)

        elif opcion == '4':
            print(f'¡Hasta luego, {usuario.nombre}!')

    except ValueError:
        print('\n¡Opción inválida! :(, intenta otra vez\n')
Exemple #5
0
    def practicarComandos(self, usuario):
        logo = logoUAM.printLogo()
        print(logo)
        print(f'Ok {usuario[1]}, vamos a practicar algunos comandos.')
        print('\nElige de la siguiente lista cuál quieres practicar:')

        print("""
        1. Prácticar comando <run>.
        2. Prácticar comando <rm>.
        3. Prácticar más comandos.
        4. Salir.
        """)

        opcion = input("Tu opción: ")
        opcion = opcion

        return True
Exemple #6
0
def vistaEjercicio(usuario):

    #SE INSTANCIA UN OBJETO COLOR PARA DAR FORMATO AL TEXTO
    c = color.Color()

    subprocess.run('clear')

    logo = logoUAM.printLogo()
    print(logo)
    sentencia = """
    Uamito tiene que levantar un contenedor usando la imagen de python con el
    tag 3.6-slim-stretch, con el nombre "PythonTest", en modo DETACH y que ejecute
    el comando "sleep 5", pero tiene problemas para lograrlo. Ayuda a Uamito a 
    levantar su Docker.

    Una vez que el contenedor con las características mencionadas se haya 
    ejecutado, se dará como bueno el ejercicio.

    Escribe 'exit' cuando hayas finalizado o en cualquier otro momento para 
    regresar a la aplicación principal.
    """
    print(sentencia)

    input(c.BOLD + 'Da enter para comenzar...' + c.END)
    
    #SE COMIENZA A PREPARAR EL EJERCICIO
    print('\nPreparando tu escenario, espera a que aparezca el prompt.\n')

    #SE LLAMA A LA FUNCIÓN PARA PREPARAR EL EJERCICIO
    prepararEjercicio()
    
    #ENTRANDO A KORN SHELL
    print(c.YELLOW + c.BOLD +'\nAhora estás en KornShell' + c.END)
    subprocess.call('ksh')

    #UNA VEZ QUE EL USUARIO ENTRA EXIT EN LA TERMINAL, SE EVALUA EL EJERCICIO
    print(c.CYAN + c.BOLD + '\nEvaluando el ejercicio...' + c.END)
    resultado = evaluarEjercicio()

    limpiarEscenario()
    
    resultadoEjercicio = [usuario, resultado]
    sleep(2)

    return resultadoEjercicio
Exemple #7
0
def inicio():
    """Muestra pantalla de bienvenida a los usuarios para iniciar sesión
        o registrase en la aplicación
        """

    subprocess.call('clear')
    logo = logoUAM.printLogo()
    print(logo)
    print(' ¡Hola, bienvenid@!')
    print(' Elige la opción que deseas para ingresar a la aplicación:')
    print("""
        1. Iniciar sesión
        2. Registrarse
        3. Salir
    """)
    opcion = input(' Tu opción: ')

    return opcion
    def iniciarSesion(self):
        """Método para el inicio de sesión de los usuarios"""

        #SE INSTANCIA UN OBJETO COLOR PARA DAR FORMATO AL TEXTO
        c = color.Color()

        #VALIDA EL INGRESO DE DATOS CORRECTOS POR EL USUARIO
        validacion = True
        #SE INCREMENTA CUANDO EL USUARIO INGRASA UN DATO ERRÓNEO
        intento = 0

        while validacion:

            subprocess.call('clear')
            logo = logoUAM.printLogo()
            print(logo)
            print(c.BOLD + ' INICIO DE SESIÓN.' + c.END)
            #PIDEO LOS DATOS DE INICIO DE SESIÓN
            if intento == 0:
                print(' Ingresa tu Usuario y Password para accesar.\n')
            #MUESTRA QUE LOS DATOS INGRESADOS ESTÁN MAL
            else:
                print(
                    ' Datos incorrectos, verifica el Usuario y/o Password.\n')

            try:
                username = input('  Usuario: ')
                password = getpass(prompt='  Password: '******' Datos incorrectos, inténtalo de nuevo.')
                intento = intento + 1
Exemple #9
0
    def iniciarSesion(self):
        """Método para el inicio de sesión de los usuarios"""

        validacion = True
        intento = 0

        while validacion:
        
            subprocess.call('clear')
            logo = logoUAM.printLogo()
            print(logo)
            print(' INICIO DE SESIÓN.')
            if intento == 0:
                print(' Ingresa tu usuario y password para accesar:\n')
            else:
                print(' Datos incorrectos, verifica el usuario y/o contraseña.\n')

            try:
                username = input('  Usuario: ')
                password = getpass(prompt = '  Password: '******'',
                    username = username,
                    password = password
                    )

                login = usuario.identificarseBD()

                #Valida que los datos del usuario coninciden en la BD
                if username == login.username:
                    print(login.username)
                    print(f'\n¡Bienvenid@ {login.nombre}!, {login.username}')
                    print(f'\n¡Haz iniciado sesión como {username} y contraseña'
                                + f' {password}!\n')
                    validacion = False
                
                    return login

            #Regresa un dato None cuando los datos no hacen match en la BD
            except:
                print(' Datos incorrectos, inténtalo de nuevo')
                intento = intento + 1
def vistaEjercicio(usuario):

    #SE INSTANCIA UN OBJETO COLOR PARA DAR FORMATO AL TEXTO
    c = color.Color()

    sp.run('clear')

    logo = logoUAM.printLogo()
    print(logo)
    sentencia = """
    Levanta un contenedor usando una imagen de Ubuntu llamado "MiNetwork" en 
    modo DETACH y con la terminal interactiva, con una IP 10.172.14.1 del 
    segmento 10.172.14.0/29 de una red que se llame "miRed", el gateway de
    la red debe ser la IP 10.172.14.6. Mapear el puerto 443 del host al puerto 
    443 del contenedor.

    Escribe 'exit' cuando hayas finalizado o en cualquier otro momento para 
    regresar a la aplicación principal.
    """
    print(sentencia)

    input(c.BOLD + 'Da enter para comenzar...' + c.END)

    #SE COMIENZA A PREPARAR EL EJERCICIO
    print('\nPreparando tu escenario, espera a que aparezca el prompt.\n')

    #SE LLAMA A LA FUNCIÓN PARA PREPARAR EL EJERCICIO
    prepararEjercicio()

    #ENTRANDO A KORN SHELL
    print(c.YELLOW + c.BOLD + '\nAhora estás en KornShell' + c.END)
    sp.call('ksh')

    #UNA VEZ QUE EL USUARIO ENTRA EXIT EN LA TERMINAL, SE EVALUA EL EJERCICIO
    print(c.CYAN + c.BOLD + '\nEvaluando el ejercicio...' + c.END)

    resultado = evaluarEjercicio()

    resultadoEjercicio = [usuario, resultado]
    sleep(2)

    return resultadoEjercicio
def vistaEjercicio(usuario):

    #SE INSTANCIA UN OBJETO COLOR PARA DAR FORMATO AL TEXTO
    c = color.Color()

    sp.run('clear')

    logo = logoUAM.printLogo()
    print(logo)
    sentencia = """
    Levanta un contenedor usando una imagen de Debian llamado "MiTimeZone" en
    modo DETACH y con la terminal interactiva, con zona horaria de la Ciudad 
    de México (America/Mexico_City) y con una política de reinicio hasta que 
    alguien lo detenga. Mapea el puerto 80 del host al puerto 80 del contenedor. 
    El hostname del contenedor debe ser "iot".

    Escribe 'exit' cuando hayas finalizado o en cualquier otro momento para 
    regresar a la aplicación principal.
    """
    print(sentencia)

    input(c.BOLD + 'Da enter para comenzar...' + c.END)

    print('\nPreparando tu escenario, espera a que aparezca el prompt.\n')

    #SE LLAMA A LA FUNCIÓN PARA PREPARAR EL EJERCICIO
    prepararEjercicio()

    #ENTRANDO A KORN SHELL
    print(c.YELLOW + c.BOLD + '\nAhora estás en KornShell' + c.END)
    sp.call('ksh')

    #UNA VEZ QUE EL USUARIO ENTRA EXIT EN LA TERMINAL, SE EVALUA EL EJERCICIO
    print(c.CYAN + c.BOLD + '\nEvaluando el ejercicio...' + c.END)

    resultado = evaluarEjercicio()

    #SE DECLARA LA LISTA CON EL USUARIO Y EL RESULTADO
    resultadoEjercicio = [usuario, resultado]
    sleep(2)

    return resultadoEjercicio
    def registrarse(self):
        """Método para registro de nuevos usuarios en la aplicación"""

        #SE INSTANCIA UN OBJETO COLOR PARA DAR FORMATO AL TEXTO
        c = color.Color()

        #VALIDA QUE EL USUARIO NO EXISTA YA EN LA BASE DE DATOS
        validacion = True
        #SE INCREMENTA CUANDO FALLA EL REGISTRO DE UN NUEVO USUARIO
        intento = 0

        #SE EJECUTARÁ EL WHILE SIEMPRE QUE SE INGRESE UN USUARIO YA EXISTENTE
        while validacion:

            subprocess.call('clear')
            logo = logoUAM.printLogo()
            print(logo)
            print(c.BOLD + ' REGISTRO.' + c.END)
            #PIDE LOS DATOS DE NUEVO USUARIO
            if intento == 0:
                print(' A continuación se te solicitará Usuario y Password' +
                      ' para completar tu registro.\n')
            #MUESTRA QUE EL USUARIO YA ESTA EN LA BASE DE DATOS
            else:
                print(' ¡El usuario ingresado ya existe!, intenta con otro.\n')

            username = input('  Usuario: ')
            password = getpass(prompt='  Password: ')

            #SE CREA UNA INSTANCIA DE USUARIO
            usuario = user.Usuario(username=username, password=password)

            #LLAMA AL METODO USUARIO PARA INSERTARLO EN LA BASE DE DATOS
            registro = usuario.insercionBD()

            if registro >= 1:
                validacion = False
                return usuario

            else:
                intento = intento + 1
Exemple #13
0
def inicio():
    """Muestra pantalla de bienvenida a los usuarios para iniciar sesión
    o registrase en la aplicación"""

    #SE INSTANCIA UN OBJETO COLOR PARA DAR FORMATO AL TEXTO
    c = color.Color()
    #LIMPIA TERMINAL Y MUESTRA CABECERA
    subprocess.call('clear')
    logo = logoUAM.printLogo()
    print(logo)
    print(c.BOLD + ' ¡Hola, bienvenid@!' + c.END)
    print(' Elige la opción que deseas para ingresar a la aplicación.')
    print("""
        1. Iniciar sesión
        2. Registrarse
        3. Salir
    """)
    opcion = input(c.BOLD + ' Tu opción: ' + c.END)

    #REGRESA LA OPCIÓN ELEGIDA POR EL USUARIO
    return opcion
Exemple #14
0
    def registrarse(self):
        """Método para registro de nuevos usuarios en la aplicación"""
        
        #VALIDA QUE EL USUARIO NO EXISTA YA EN LA B.D.
        validacion = True
        #MOSTRARÁ MENSAJE DE QUE EL USUARIO YA EXISTE
        intento = 0

        #SE EJECUTARÁ EL WHILE SIEMPRE QUE SE INGRESE UN USUARIO EXISTENTE
        while validacion:

            subprocess.call('clear')
            logo = logoUAM.printLogo()
            print(logo)
            print(' REGISTRO.')
            if intento == 0 :
                print(' A continuación se te solicitará Nombre, Username y Password' 
                +' para completar tu registro:\n')
            else:
                print(' ¡El usuario ingresado ya existe!, intenta con otro.\n')

            nombre = input('  Nombre: ')
            username = input('  Usuario: ')
            password = getpass(prompt = '  Password: ')

            #SE CREA UNA INSTANCIA DE USUARIO Y SE GUARDA EN LA B.D.
            usuario = user.Usuario(
                nombre = nombre,
                username = username,
                password = password
                )
            registro = usuario.insercionBD()

            if registro >= 1:
                validacion = False
                return usuario

            else:
                intento = intento + 1
Exemple #15
0
    def troubleshootingDocker(self, usuario):
        logo = logoUAM.printLogo()
        print(logo)

        print(f'Ok {usuario.nombre}, vamos a realizar algunos ejercicios de' +
              ' troubleshooting')
        print('\nElige de la siguiente lista cuál quieres hacer:')

        print("""
        1. Problema para levantar contenedores.
        2. Segundo problema.
        3. Tercer problema.
        4. Salir.
        """)

        opcion = input("Tu opción: ")

        if opcion == '1':
            resultado = ejercicios.levantarDocker.vistaLevantarDocker(usuario)
            print(f'Tu resultado es el siguiente {resultado}')

        return True
def vistaEjercicio(usuario):

    #SE INSTANCIA UN OBJETO COLOR PARA DAR FORMATO AL TEXTO
    c = color.Color()

    sp.run('clear')

    logo = logoUAM.printLogo()
    print(logo)
    sentencia = """
    Uamito tienen problemas para levantar su contenedor. El contenedor debe 
    utilizar la imagen myturtle y debe llamarse "MiTortuga", SIN utilizar
    el modo DETACH. Ayuda a Uamito a levantar su contendor.

    Escribe 'exit' cuando hayas finalizado o en cualquier otro momento para 
    regresar a la aplicación principal.
    """
    print(sentencia)

    input(c.BOLD + 'Da enter para comenzar...' + c.END)

    print('\nPreparando tu escenario, espera a que aparezca el prompt.\n')

    #SE LLAMA A LA FUNCIÓN PARA PREPARAR EL EJERCICIO
    prepararEjercicio()

    #ENTRANDO A KORN SHELL
    print(c.YELLOW + c.BOLD + '\nAhora estás en KornShell' + c.END)
    sp.call('ksh')

    #UNA VEZ QUE EL USUARIO ENTRA EXIT EN LA TERMINAL, SE EVALUA EL EJERCICIO
    print(c.CYAN + c.BOLD + '\nEvaluando el ejercicio...' + c.END)

    resultado = evaluarEjercicio()

    resultadoEjercicio = [usuario, resultado]
    sleep(2)

    return resultadoEjercicio
Exemple #17
0
def vistaLevantarDocker(usuario):
    subprocess.run('clear')

    logo = logoUAM.printLogo()
    print(logo)
    sentencia = """
    Pete tiene que levantar un Docker de python con el nombre "PythonTest"
    en modo DETACH y que ejecute el comando "sleep 5", pero tiene problemas
    para lograrlo. Ayuda a Pete a levantar su Docker. Una vez que el contendor
    con las características mencionadas se haya ejecutado se dará como bueno
    el ejercicio.

    Escribe 'exit' cuando hayas finalizado o en cualquier momento para regresar 
    a la aplicación principal.
    """
    print(sentencia)

    input('Da enter para comenzar...')

    #SE LLAMA A LA FUNCIÓN PARA PREPARAR EL EJERCICIO
    prepararEjercicio()

    #ENTRANDO A KORN SHELL
    print('\nAhora estás en KornShell')
    subprocess.call('ksh')

    #UNA VEZ QUE EL USUARIO ENTRA EXIT EN LA TERMINAL, SE EVALUA EL EJERCICIO
    print('\nEvaluando ejercicio...')
    sleep(1)
    resultado = evaluarEjercicio()

    resultadoEjercicio = [usuario, resultado]
    sleep(2)
    input('\nDa enter para continuar.\n')

    return (resultadoEjercicio)
Exemple #18
0
def mostrarAyuda(ejercicio, usuario):
    """Muestra las opciones de ayuda y resultado cuando el resultado es 
    incorrecto"""

    #SE INSTANCIA UN OBJETO COLOR PARA DAR FORMATO AL TEXTO
    c = color.Color()

    validacion = True
    logo = logoUAM.printLogo()

    #SE OBTIENE EL NOMBRE DEL EJERCICIO
    nombreEjercicio = ejercicio.nombre

    while validacion:
        #SE MUESTRAN LAS OPCIONES CUANDO EL EJERCICIO ES INCORRECTO
        subprocess.call('clear')
        print(logo)
        print(c.BOLD + '¡Tu resultado es ' + c.YELLOW + 'INCORRECTO' + c.END +
              c.BOLD + '!\n' + c.END)
        print(
            """¿Necesitas ayuda? A continuación puedes elegir entre las siguientes opciones.
    
        1. Mostrar ayuda
        2. Ver respuesta
        3. Intentar de nuevo
        4. Regresar al menú principal
        """)

        opcion = input(c.BOLD + "Tu opción: " + c.END)

        try:
            subprocess.call('clear')

            #SE MUESTRA LA AYUDA PARA EL EJERCICIO
            if opcion == '1':
                validacion = False
                subprocess.call('clear')
                print(logo)
                print("Aquí tienes una pequeña ayuda:\n")
                print(eval(f"ejercicios.{nombreEjercicio}.ayudaEjercicio()"))
                #SE PREGUNTA SI SE QUIERE INTENTAR NUEVAMENTE
                reintento = input(c.BOLD +
                                  "\n¿Quieres intentar de nuevo? [s/n]: " +
                                  c.END)

                if reintento == 's':
                    llamarEjercicio(ejercicio, usuario)
                elif reintento == 'n':
                    continue

                return True

            #SE MUESTRA EL RESULTADO DEL EJERCICIO
            elif opcion == '2':
                validacion = False
                subprocess.call('clear')
                print(logo)
                print(
                    eval(f"ejercicios.{nombreEjercicio}.respuestaEjercicio()"))
                #SE PREGUNTA SI SE QUIERE INTENTAR NUEVAMENTE EL EJERCICIO
                reintento = input(c.BOLD +
                                  "\n¿Quieres intentar de nuevo? [s/n]: " +
                                  c.END)

                if reintento == 's':
                    llamarEjercicio(ejercicio, usuario)
                elif reintento == 'n':
                    continue

                return True

            #SE LLAMA DE NUEVO EL EJERCICIO
            elif opcion == '3':
                validacion = False
                llamarEjercicio(ejercicio, usuario)

            #REGRESA AL MENÚ PRINCIPAL
            elif opcion == '4':
                validacion = False

            else:
                raise ValueError('OpcionInvalida')

        except ValueError:
            print('\n¡Opción inválida! :(, intenta otra vez.\n')
            continue

    return True