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
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
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
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')
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
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
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
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
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
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
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
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)
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