============================================================================================== = ========= ============================ ======================================== = =============== ============================ === ======================================= = =============== ============================ ==== ======================== ==== ====== = ========= === ===== === === = ======== === ==== === = ==== === == == = = ==== = == ======= = == ======= ==== == == = === ==== ====== = =========== == = == ===== == = ======= === === = == = == === ==== === = = ========= == = == === == = ======= ==== == = == = == ====== ==== === = = ======== = == = == == = == = ======= === === = == = == = === ==== === = = ========= == === === == = ======= ===== === = === ==== === == = ==============================================================================================
_________________________________________________________________________________ /* ATDT MAGAZINE ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[0x01-08]: NUMERO 0x01:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: "programemos que hace bien" por littledeath */ Dificultad: mínima Requisitos: Saber algo de bash/linux/bsd/wsl2. ,----------------, ,---------, ,-----------------------, ," ,"| ," ,"| ," ," | +-----------------------+ | ," ," | | .-----------------. | | +---------+ | | | | | | | -==----'| | | | PROGRAMEMOS, | | | | | | | | MDFK! | | |/----|`---= | | | | | | | ,/|==== ooo | ; | | | | | // |(((( [33]| ," | `-----------------' |," .;'| |(((( | ," +-----------------------+ ;; | | |," /_)______________(_/ //' | +---------+ ___________________________/___ / oooooooooooooooo .o. oooo /, / ==ooooooooooooooo==.o. ooo= // /_==__==========__==_ooo__ooo=_/' La verdad, si me pongo a pensar, escribir en una ezine en modo vieja escuela, usando un editor de texto ascii, de consola, lanzado desde un shell bash que a su vez está contenido en algo llamado Windows Terminal, que resulta que existe gracias a que finalmente Microsoft dijo "PARÁ, esta gente la tiene mega clara" (en directa referencia a la comunidad open source en general, licencias y peleitas taradas aparte) y zás, defecó Windows Subsystem for Linux, cuya versión 2 es pre-orgásmica .... [toma aire] y que en cualquier momento va a permitir codear para la UI de Windows sin tener un X 3rd party instalado... [toma mas aire]... LA VERDAD QUE TODO ES CULPA DE LOS BBS. Y saben por qué? Porque conectarme a esos mundos, porque cada BBS era y es un mundo, y en mi caso desde MS-DOS, luego Linux (historia aparte)... es sin lugar a dudas la fuente inagotable de excelentes recuerdos que hoy me empuja a escribir acá. Pero, óh, que carajo tiene eso que ver con el título del artículo? Me pa que es bastante obvio... si pasaste por ese camino. Programar, BBS, programar más, Linux, Programar hasta el infinito. Programar hace bien, si te gusta HACER que pasen cosas (con los ataques que hay hoy... eso de hacer explotar cosas por el aire te lo hace pensar dos veces, no? y mirá, en los 80s y 90s se discutia si podiamos afectar el hardware desde código [quemar pixels!]). Creeme, programar te va a hacer bien. No importa la edad que tengas ni tu background técnico (si estás leyendo esto y no sos un autodenominado nerd/geek/etc, seguro sos hij@ de uno). Pretendo escribir una serie de artículos que los introduzcan en el mundo de la programación en Python, con la mirada puesta en la nostalgia por los BBS. Vamos a hacer un BBS, desde cero. (Sin la parte de modems, but who knows?) Empezamos? [=-------------------------------------------------------------------------=] A la hora de sentarse a programar algo, yo paso por un proceso de abstracción muy particular. Básicamente, diseño todo el sistema en la cabeza. Y cuando finalmente me siento a programar, lo hago con una relativa claridad, sabiendo para que lado quiero ir, y principalmente con orden. Y por esto es que todos los grandes proyectos de software comienzan con un deseo o necesidad, luego una etapa de analisis técnico-funcional que establece las tecnologías a utilizar, metodología, etapas, procesos adicionales requeridos (por ejemplo, en el caso de una migración de datos), etc. Tratemos de hacer algo así. Un BBS es un sistema que permite al usuario: * Conectarse * Registrarse/Identificarse * Interactuar con diversos modulos como foros, correo, chat, juegos, oneliners, etc. * Subir/bajar archivos a diversas áreas (si, esto podria ser otro módulo pero como implica una interacción específica del lado del usuario, lo describo aparte) * Visualmente, soportar ANSI para colorcitos, posicionamiento del cursor, limpiado de pantalla. Adicionalmente, el operador del sistema (Sysop), debe poder: * Configurar parámetros operativos del BBS [la registracion está abierta? que nivel se le da a los nuevos usuarios? que permisos otorgan los niveles? * Comunicarse directamente con el usuario en tiempo real * Utilizar privilegios [moderación de mensajes/usuarios] * Ejecutar tareas de mantenimiento [limpieza, optimización, promoción de usuarios]. ... entre otras cosas. No todas estas funciones son deber del software principal del BBS, más adelante veremos si vale la pena programar el servidor telnet o no. Teniendo esos requerimientos en la cabeza, podemos elejir o plantear diversas tecnologías que nos pueden ayudar. El primer paso es seleccionar el o los lenguajes de programación a utilizar en base al contexto de ejecución. Al ser un BBS, asumimos que se va a ejecutar en un sistema operativo moderno, multiusuario/multitarea [a fin de cuentas, no vamos a programar para MS-DOS, aunque definitivamente seria interesante no?], que nos permita implementar el BBS en un server hogareño o incluso en la nube. * SISTEMA OPERATIVO: Linux, *BSD * TECNOLOGIAS: - No esperamos crecimiento desmedido, por lo cual multiples bases de datos sqlite podrian servir para almacenar sysops, usuarios, foros [una base por foro]. - Para la comunicación entre instancias del BBS [o sea, cada usuario conectado] podriamos utilizar algun tipo de Queue de mensajeria que soporte asincronicidad y señales. - Necesitamos soportar telnet en modo 'servidor', dado que hoy día casi todos los BBS en existencia son accesibles via telnet. * LENGUAJE DE PROGRAMACION: Python 3 (podriamos usar go, C, rust, nim también, entre decenas de otras opciones geniales. ## ### ## ## ###### ## ## ###### ##### #### ## ### ## ## ## ## ## # ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##### ##### ## ## ## ## ## ## ## ## ## ### #### ### #### #### ### #### ##### No te preocupes si algo de esto no lo conocés, vamos a ir explicando de a poco. En esta primera entrega, vamos a codear algo que, al ejecutarlo, nos muestre algun mensaje en pantalla, usando secuencias ANSI. [=-------------------------------------------------------------------------=] NOTA IMPORTANTE: Python es un lenguaje de alto nivel, hermoso, con una comunidad genial y muchisimos modulos, librerias, ejemplos y aplicativos. Lógicamente, si buscamos vamos a encontrar incluso software de BBS, servers de telnet y todo lo que necesitemos. Les dejo algunos links de ese estilo que, si ya saben python y tienen ganas de ponerse a hacer algo sin tener que ir 'de a poco', lo puedan hacer: * telserv: https://pypi.org/project/telserv/0.1/ * Guia CodeProject: https://www.codeproject.com/Articles/173416/A-Simple-Telnet-Server-in-Python * telnetlib asyncio: https://pypi.org/project/telnetlib3/ * Otra libreria de server telnet, piola: https://github.com/ianepperson/telnetsrvlib Si quieren ver como se desarrolla un BBS moderno usando Node.js por ejemplo, no dejen de revisar enigma 1/2: https://enigma-bbs.github.io/ [=-------------------------------------------------------------------------=] Comencemos por crear la base de nuestro BBS. Sugiero utilicen Linux, *BSD. En mi caso estoy usando WSL2 desde Windows 10, donde tengo un Ubuntu. --> SOURCE: bbs01.py <------------------------------------------------------ 00 #!/usr/bin/env python3 01 02 def main(): 03 print('BBS01 - Tutorial Script Python de BBS - 0x01') 04 05 06 # Ejecutar main() si este .py es ejecutado desde el shell 07 if __name__ == '__main__': 08 main() ---------------------------------------------------------------------------- Ahora desde el shell: src $ chmod +x bbs01.py src $ ./bbs01.py BBS01 - Tutorial Script Python de BBS - 0x01 src $ Como ven, súper útil. :P - Que vemos allí? a) Linea 00: El código a partir de linea 1 se interpreta por python3 en un entorno modificado (es mejor usar /usr/bin/env python3 que /usr/bin/python3 directamente). Este entorno modificado lo crea el aplicativo "env", y pueden revisar su breve página del manual con "man env". b) Linea 02: definicion de la función a la que le pusimos 'main' de nombre. Esta funcion tiene una única instrucción, que es un simple print. Nótese que hay 4 espacios (o un TAB si es que prefieren usar tabs, yo prefiero espacios). Todo lo que a partir de ese def continue con 4 espacios, (u 8, etc, ya verán) pertenece a main(). c) Linea 06: un comentario - Siempre con # al comienzo de la linea. Se pueden poner comentarios al final de una sentencia, ya veremos. d) Linea 07: se ejecutará la linea 08 (llamada a la funcion main()) siempre que la variable especial __name__ tenga el valor (tambien especial) '__main__'. - Nótese otra vez el uso de los 4 espacios en la línea 08. Es igual que cuando definimos una función, solo que en este caso en vez "def" es un if. La verdad, nuestro primer script no hace nada útil, lo que nos lleva a investigar que cosas piolas nos da el ecosistema de Python. Les dejo unos links: * Cosas que Python trae nativamente (apunto a la ultima version, pero lógico, si el python que tienen disponible es mas viejo, pueden ajustar directo desde la web). Si UNICAMENTE usasemos funcionalidad de la Libreria Estándar, no seria necesario instalar nada más. https://docs.python.org/es/3/library/ * Libreria SQLITE3, parte de la Libreria Estándar de Python: https://docs.python.org/es/3/library/sqlite3.html * Repositorio Pypi, permite buscar y con la tool pip instalar librerias adicionales, por ejemplo, alguna para servidor de telnet: https://pypi.org/search/?q=telnet+server Ahora, si nos ponemos a pensar, necesitamos verdaderamente un servidor telnet? No es un BBS simplemente un tipo de shell especial? Quizá valga la pena aprovechar alguno de los tantos telnet servers disponibles en sistemas tipo unix... Nota curiosa: Aquellos que hayan sido usuarios MP OnLine! recordarán que antes de ingresar el nombre de usuario y clave, se debia indicar el servicio, y uno ponia MP, o BBS o algo así. Esto es porque ese era un USUARIO sin clave, que ejecutaba el shell de BBS. Cuando nos podia el usuario, efectivamente ya estabamos ingresados en el sistema Unix remoto con el usuario "MP" (el del prompt Servicio:), y listo. Por tanto, y para simplificar el desarrollo y depuración, continuaremos desarrollando este script de BBS en Python asumiendo que será el SHELL con el que el o los usuarios (dependiendo del esquema de autenticación que usemos) se encontrarán al ingresar al sistema. Adicionalmente, esto nos permitiria, por ejemplo, tener un script para registración que se encuentre separado de los archivos y procesos del BBS (= usuarios registrados y autorizados). Para finalizar, modificaremos nuestro bbs01.py para que incorpore algunas secuencias ANSI: --> SOURCE: bbs01b.py <------------------------------------------------------ #!/usr/bin/env python3 def main(): print('\033[2J\033[0;0H') # limpiar pantalla print('\033[0;0H') # ir a esquina superior izquierda print('\033[1;40;32m') # Verde (32) brillante (1), negro de fondo (40) print('Bienvenido al BBS Pythonico ATDT!') print('\033[0;37m\n') # Sacar brillo (0), gris (37) # Ejecutar main() si este .py es ejecutado desde el shell if __name__ == '__main__': main() ---------------------------------------------------------------------------- Si ahora lo ejecutan, verán como se limpia la pantalla y aparece el mensaje en verde brillante. TAREA PARA EL HOGAR: Investigar como leer el contenido de un archivo y mostrarlo en pantalla. Usaremos esto para leer algún .ANS que actuará de "intro" para nuestro bbs. Invito al resto del equipo de ATDT y lectores a enviarnos intros .ans HINT: buscar ejemplos que utilicen el keyword "with" para el metodo open(). PROXIMOS TEMAS: * Librerias de templating * Librerias para manejar cursores y poder armar menues * Criptografía A programar que hace bien!!! _________________________________________________________________________________ !EOF -> atdt-zine-0x01-08.txt
© 2021