Ultra Tesla: Crear redes distribuidas de servicios, fácil, rápido y seguro

  • 6 Respuestas
  • 711 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Conectado DtxdF

  • *
  • Moderador Global
  • Mensajes: 801
  • Actividad:
    80%
  • Reputación 16
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email
Ultra Tesla es un proyecto de código abierto para crear redes distribuidas de servicios fácil, rápido y seguro, usando el poder de computo de múltiples ordenadores. El proyecto permite unificar los distintos servidores en una única interfaz que es proporcionada para el mismo usuario creando una sensación de transparencia.


Mi primer "Hello World":

Ultra Tesla utiliza servicios, que son básicamente mini-programas que se adhieren a la ejecución del servidor, siguiendo una sintaxis en HTTP como la siguiente: <scheme>://<netloc>/<Service>/<Sub-Service>/<...>

Donde <scheme> es 'http' o 'https' según la configuración del servidor; <netloc> es básicamente la dirección del servidor; <Service> es el nombre del servicio, que para este ejemplo será "hello_world" y los demás que son <Sub-Service> y <...> son básicamente otros mini-programas que se tendrán que usar anteponiendo el nombre del servicio anterior, por ejemplo, <Service>/<Sub-Service>/<Sub-Service 1>/<Sub-Service 2>/<...> y así según lo que el administrador haya propuesto.


Código: Python
  1. class Handler:
  2.     async def get(self):
  3.        await self.write('Hello World!')

Un ejemplo real con el servicio nombrado como complements/hello_world.py en una URL se vería como lo siguiente (suponiendo que la dirección del servidor sea localhost): You are not allowed to view links. Register or Login

Contactando al servidor:

Lo siguiente es un script simple para poder contactarse con el servidor y obtener la salida del servicio 'hello_world'

Código: Python
  1. import asyncio
  2.  
  3. from modules.Infrastructure import client
  4.  
  5. async def main():
  6.     UTeslaClient = client.UTeslaClient('<Nombre de usuario>')
  7.     await UTeslaClient.set_server_key('<Clave pública del servidor>')
  8.     await UTeslaClient.set_user_keys('<Clave pública del usuario>', '<Clave privada del usuario>')
  9.  
  10.     cmd = {
  11.         'token' : '<Token de acceso>'
  12.  
  13.     }
  14.  
  15.     Response = await UTeslaClient.fetch(
  16.         'http://localhost:17000/hello_world',
  17.         cmd,
  18.         method='GET'
  19.  
  20.     )
  21.  
  22.     dec_body = UTeslaClient.get_message(Response.body)
  23.  
  24.     print(dec_body)
  25.  
  26. if __name__ == '__main__':
  27.     asyncio.run(main())

Deberíamos obtener la siguiente respuesta:

Código: Text
  1. Hello World!

Creando un usuario:

El administrador será el encargado de crear los usuarios, aunque perfectamente se podría automatizar como un sistema de registro cualquiera con una interfaz de usuario cualquiera, para este ejemplo se usará el plugin 'add' de UTeslaCLI.

Código: Bash
  1. # Para requerir ayuda
  2. ./UTeslaCLI add --help
  3. # Creamos el usuario
  4. ./UTeslaCLI add -u <Nombre de usuario> -p <Contraseña> -i <Ruta de la clave pública>

Creación del par de claves:

Tanto el servidor como el usuario deben tener sus par de claves para que la comunicación sea satisfactoria. Esto es un proceso inicial que deben hacer antes de hacer cualquier cosa (independientemente de si es un usuario o el administrador del servidor).

En el cliente:

El cliente va a requerir usar el plugin 'generate_keys' para la creación del par de claves

Código: Bash
  1. # Para requerir ayuda
  2. ./UTeslaCLI generate_keys --help
  3. # Generamos el par de claves
  4. ./UTeslaCLI generate_keys -bit_size <Tamaño del par de claves en bits> -out-public-key <Nombre del archivo de la clave pública> -out-private-key <Nombre del archivo de la clave privada>

Si se ejecuta sin parámetros se generará con un tamaño de claves por defecto de 3072 bit's y las claves se mostrarán en la salida. Lo recomendable sería dejar el tamaño de claves pre-determinado y guardar el par de claves en un lugar seguro.

Ahora lo que tendría que hacer el usuario que desea registrarse es enviar la clave pública al administrador del servidor para que éste lo registre satisfactoriamente.


En el servidor:

El proceso para generar el par de claves en el lado del servidor será mucho más simple; se hará automáticamente cuando se ejecute.

Código: Bash
  1. ./UTesla

El tamaño del par de claves estará definido en UTesla.ini, en la sección 'Crypt Limits' y en la clave 'rsa_key_length'.


Lo recomendable es dejar el tamaño de claves pre-determinado tanto del lado del cliente y del servidor, y se debe tener en cuenta que el tamaño de claves debe ser igual o equivalente en las dos partes.

Creación del token de acceso:

UTesla requiere de un token de acceso para realizar la mayoría de acciones, en este caso el cliente deseoso por obtener su token tiene que usar el plugin 'generate_token'

Código: Bash
  1. ./UTeslaCLI generate_token <La URL del servidor> -u <El nombre de usuario> -p <La contraseña del usuario> -s <La clave pública del servidor> -i <La clave pública del usuario> -I <La clave privada del usuario>

Una vez hecho lo anterior y la petición haya sido satisfactoria, se mostrará el token de acceso, el cual debe ser almacenado en un lugar seguro para su posterior uso.

Uso de la distribución de servicios:

Supongamos que en el mundo haya dos servidores y los administradores se conozcan, uno de éstos contiene uno o más servicios que otro no tiene, pero un cliente que requiera el uso de ese servicio usando la URL del primer servidor (por ejemplo) no tendría ningún inconveniente, ya que si el servicio deseado no se encuentra en el primer servidor, éste hará una búsqueda en la red y determinará qué servidor es el que contiene ese servicio, posteriormente obtendría una respuesta como si fuera el mismo cliente y luego la redirige hacia el cliente mismo, por lo que todo sería transparente.

Lo anterior es muy útil si se desea separar ciertos servicios entre servidores, por cuestiones económicas, de recursos, una mejoría en la implementación o cualquier cosa que se desee, al fin y al cabo, el usuario es el que lo decide.

Para estos ejemplos el primer servidor será 'You are not allowed to view links. Register or Login' y el segundo 'You are not allowed to view links. Register or Login'. El segundo tiene un servicio llamado 'hello_friend', pero nosotros "los clientes" vamos a creer que el servicio está en el primer servidor, por lo cual lo usaremos para interactuar con éste.


complements/hello_friend.py:
Código: Python
  1. class handler:
  2.     async def get(self):
  3.         await self.write('hello friend!')

Por diseño, el administrador del segundo servidor debe crear un usuario como si fuera cualquier otro. Por lo que debe saber cómo crearlo, cosa que ya se hablo en anteriores secciones. En este caso nosotros lo llamaremos 'utesla'.

Además, como ya se aclaró en anteriores secciones, la mayoría de operaciones requieren de un token de acceso, por lo se va a suponer que se tiene hecho este paso para el nuevo usuario utesla.

Una vez aclarado todo lo que se tiene que hacer, vamos un paso más allá y obtengamos los servicios del segundo servidor (You are not allowed to view links. Register or Login) para el primer servidor (You are not allowed to view links. Register or Login)


Código: Bash
  1. ./UTeslaCLI add_network http://localhost:17001 -s <Clave pública del segundo servidor> -p keys/key.pub -P keys/key.priv -u utesla -t <Token de acceso>

Como esto es un ejemplo, se usan las claves que por defecto se almacenan en la carpeta 'keys' del primer servidor; se usa el usuario 'utesla' que ya debe estar creado en el segundo servidor y nos contactamos con el servidor 'You are not allowed to view links. Register or Login' para obtener sus servicios.

Como paso final, el cliente desea obtener el servicio 'hello_friend' y si todo ha salido bien, obtendrá su posterior salida, aunque lo peculiar de todo esto es que el cliente hará una petición al primer servidor en vez de al segundo.

Lo siguiente será muy parecido a lo que se observó en anteriores secciones, pero lo único que cambió es el nombre del servicio:


Código: Python
  1. import asyncio
  2.  
  3. from modules.Infrastructure import client
  4.  
  5. async def main():
  6.     UTeslaClient = client.UTeslaClient('<Nombre de usuario>')
  7.     await UTeslaClient.set_server_key('<Clave pública del servidor>')
  8.     await UTeslaClient.set_user_keys('<Clave pública del usuario>', '<Clave privada del usuario>')
  9.  
  10.     cmd = {
  11.         'token' : '<Token de acceso>'
  12.  
  13.     }
  14.  
  15.     Response = await UTeslaClient.fetch(
  16.         'http://localhost:17000/hello_friend',
  17.         cmd,
  18.         method='GET'
  19.  
  20.     )
  21.  
  22.     dec_body = UTeslaClient.get_message(Response.body)
  23.  
  24.     print(dec_body)
  25.  
  26. if __name__ == '__main__':
  27.     asyncio.run(main())

Deberíamos obtener la siguiente respuesta:

Código: Text
  1. Hello Friend!

Como se puede apreciar, es un proceso muy sencillo y lo mejor, es transparente para el usuario.

Sub servicios:

Ya se ha explicado anteriormente qué son los sub servicios, pero no se han explicado cómo crearlos. Al igual que la creación de plugins y servicios es muy sencillo.

Lo primero que hay que hacer es crear un servicio, como 'greeting' (complements/greeting.py).


Código: Python
  1. class Handler:
  2.     pass

Se pueden colocar los métodos HTTP si se desea, pero para este caso no lo necesitamos

Ahora para la creación de sub servicios simplemente se crea una carpeta en 'complements' con el mismo nombre del servicio mas '-folder'.


Código: Bash
  1. mkdir complements/greeting-folder

En esa carpeta se tienen que agregar más archivos que sigan una estructura similar a la del servicio padre, como por ejemplo:

complements/greeting-folder/hello_friend.py:
Código: Python
  1. class Handler:
  2.     async def get(self):
  3.         await self.write('Hello Friend!')

Ahora un cliente puede hacer una petición usando una URL parecida a: <Scheme>://<netloc>/greeting/hello_friend y obtendría:

Código: Text
  1. Hello Friend!

Adentro de esa carpeta se crean más carpetas (si se desea), pero lo peculiar de todo esto es que no necesitan usar una sintaxis similar a "<Nombre del servicio>-folder", simplemente creando una carpeta e insertando nuevos servicios que sigan una estructura similar a los anteriores es más que suficiente.

Código: Bash
  1. mkdir complements/greeting-folder/farewell

complements/greeting-folder/farewell/bye.py:
Código: Python
  1. class Handler:
  2.     async def get(self):
  3.         await self.write('Bye!')

Y el cliente puede usar una estructura similar a: <scheme>://<netloc>/greeting/farewell/bye

Módulos:

Los módulos son muy útiles en caso de que se necesite integrar ficheros de python a los complementos, para que la escritura sea más limpia y siga mejores prácticas.

Para crear un módulo es necesario crear primero un servicio, en este caso 'math' (complements/math.py)


Código: Python
  1. class Handler:
  2.     async def post(self):
  3.         sum = self.modules.get('sum')
  4.         num1 = self.get_argument('num1', 0)
  5.         num2 = self.get_argument('num2', 0)
  6.  
  7.         await self.write('Result:' + str(sum.calculate(num1, num2)))

Ahora se debe crear una carpeta con el nombre del servicio mas '-modules' y ahí se agregan ficheros de python como cualquier otro; siguiendo lo que necesita el código anterior:

complements/math-modules/sum.py:

Código: Python
  1. def calculate(x, y):
  2.     return x + y

Eso sería todo, muy sencillo y más modular.

Instalación:

Código: Bash
  1. git clone --recursive https://github.com/UltraTesla/UTesla.git
  2. cd UTesla

Arch Linux:

Código: Bash
  1. sudo pacman -S mariadb

Debian:

Código: Bash
  1. sudo apt-get install mariadb-server libmariadb-dev python3-dev

Red Hat Enterprise Linux 8.2

Código: Bash
  1. sudo yum install python3-devel gcc mariadb mariadb-server mariadb-devel

General:

Código: Bash
  1. sudo systemctl start mariadb.server
  2. python3 -m pip install -r requirements.txt
  3. ./UTesla

Es recomendable configurar primero antes de iniciar UTesla (como el nombre de usuario y la contraseña en MySQL)

Contribuyendo:

Al igual que cada proyecto nuevo creado, soy imperfecto y puedo equivocarme, pero con todo el gusto del mundo aceptaré tu contribución, ya sea por código o no, porque hay que recordar que se trata de abarcar muchos idiomas de distintas regiones del mundo y en éso puede haber múltiples defectos.

Notas:

  • No se ha probado en Windows u otro sistema operativo
  • El proyecto usa un protocolo propio y no uno estándar
  • El proyecto no está definido, de eso se encarga el mismo usuario
  • Todo el proyecto fue probado en la versión 3.8.2 y 3.7.3 de python

~ DtxdF
« Última modificación: Julio 05, 2020, 08:55:12 am por DtxdF »
Los seres humanos son robots, cuyo combustible es el afanado dinero.

Conectado Gabriela

  • *
  • Co Admin
  • Mensajes: 991
  • Actividad:
    33.33%
  • Country: 00
  • Reputación 22
  • A las personas se las conoce por sus heridas...
  • Twitter: @hira_io
    • Ver Perfil
    • Red Hira! La red mágica de IRC
    • Email

      @You are not allowed to view links. Register or Login

Muy bueno tu trabajo, claro y limpio.
Una guía útil y documentada para los que deseen adherir a Ultra Tesla.
 Gracias por compartirlo a la Comunidad!

Saludos

Gabriela


Tú te enamoraste de mi valentía, yo me enamoré de tu oscuridad; tú aprendiste a vencer tus miedos, yo aprendí a no perderme en tu abismo.

Conectado DtxdF

  • *
  • Moderador Global
  • Mensajes: 801
  • Actividad:
    80%
  • Reputación 16
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email
Hola @You are not allowed to view links. Register or Login  ;D, muchas gracias a ti por leerlo, y como siempre es un placer compartir estos aportes  ;)

~ DtxdF
Los seres humanos son robots, cuyo combustible es el afanado dinero.

Desconectado Kirari

  • *
  • Moderator
  • Mensajes: 218
  • Actividad:
    70%
  • Country: ru
  • Reputación 11
  • No dejes que el mundo te corrompa
    • Ver Perfil
    • Baúl para el público
Excelente trabajo compañero, se agradece estos grandes aportes y proyectos que haces para la comunidad  ;) ;).

-Kirari
Jamás te contarán la verdadera versión, siempre te dirán la suya... Por eso... Si quieres saber la verdad, debes buscarla tú mismo...

Conectado DtxdF

  • *
  • Moderador Global
  • Mensajes: 801
  • Actividad:
    80%
  • Reputación 16
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email
Gracias @You are not allowed to view links. Register or Login lo que sea para aprender y enseñar  ;D

~ DtxdF
Los seres humanos son robots, cuyo combustible es el afanado dinero.

Desconectado Nomad

  • *
  • Underc0der
  • Mensajes: 7
  • Actividad:
    53.33%
  • Country: 00
  • Reputación 0
  • Nuestro foro, nuestro conocimiento camarada!!
    • Ver Perfil
    • Email
Excelente artículo, muy claro y sobre todo informativo.

Conectado DtxdF

  • *
  • Moderador Global
  • Mensajes: 801
  • Actividad:
    80%
  • Reputación 16
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email
Gracias @You are not allowed to view links. Register or Login, ya vendrán más al respecto :D

~ DtxdF
Los seres humanos son robots, cuyo combustible es el afanado dinero.

 

[VIDEOTUTORIAL] Aprende a crear programas en Python paso a paso

Iniciado por akame_night_raid

Respuestas: 12
Vistas: 10051
Último mensaje Noviembre 24, 2016, 07:37:14 pm
por zaphiel
Como crear un ejecutable [.exe] de Python para poderlo ejecutar en Windows

Iniciado por [Z]tuX

Respuestas: 2
Vistas: 7963
Último mensaje Mayo 28, 2011, 12:18:29 pm
por Gh0st.C
Selenium - aprende a crear tus propios bots con Python

Iniciado por Mortal_Poison

Respuestas: 12
Vistas: 17433
Último mensaje Mayo 27, 2018, 06:26:32 pm
por Bartz
[Python] Publicar en redes sociales desde Telegram.

Iniciado por R3v0lve

Respuestas: 0
Vistas: 2411
Último mensaje Septiembre 14, 2015, 02:25:37 am
por R3v0lve
Pytorch – Redes Neuronales en Python

Iniciado por ANTRAX

Respuestas: 3
Vistas: 2508
Último mensaje Agosto 12, 2019, 09:25:26 pm
por DtxdF