Proyecto UWS-2 (1)

Desde hace unos meses he tenido abandonada la publicación porque durante los ratos libres he retomado el proyecto UWS. Se trata de un entorno de desarrollo SCADA programado en Python con interfaz web. Cuando publiqué la última actualización de la primera versión, comentaba que me quedaban varios temas pendientes. El que más me preocupaba era la seguridad, aunque tampoco estaba del todo satisfecho con la estructura. Por eso, he decidido hacer borrón y cuenta nueva y desarrollar una nueva versión. Está aún incompleta: necesita unas horas para rehacer la gestión de alarmas y sobre todo, introducir capturas de excepciones y documentar. Pero el grueso es lo bastante completo para que pueda comenzar a describirla.
Los principios que han orientado UWS-2 han sido la organización, la abstracción, la versatilidad y la seguridad. Uno de los defectos de los que adolecía la antigua versión era que las variables se compartían entre todos los controladores (antes llamados PLC). Incluida la interfaz web, que por otro lado tampoco tenía una gestión de usuarios, ni utilizaba comunicaciones cifradas. Era difícil corregir estos defectos con las estructuras existentes:

UWS-1
UWS-1

Gran parte del trabajo en esta segunda versión ha consistido en migrar lo existente a algo similar a una arquitectura cliente-servidor. El Ensemble crea ahora las variables por un lado y los controladores por otro, y éstos sólo tienen acceso a sus métodos después de identificarse y contar con una serie de derechos. Para ello es necesario introducir usuarios, roles, grupos de variables y reglas. Si lo quisiésemos llevar a un gráfico como el anterior, quedaría algo así:

UWS-2
UWS-2

De un primer vistazo, parecen haber desaparecido muchos elementos. No se ven los objetos de salida, el webserver, ni tampoco existen otros implícitos en el primer gráfico, como las expresiones. No se han esfumado: todos se han convertido en controladores. En UWS-2, todo lo que maneje variables (datos en definitiva) es un objeto derivado de la clase Controller. Y como tal, debe someterse a unas reglas. En primer lugar debe identificarse contra el Ensemble utilizando un usuario y una contraseña. Éste analiza roles y permisos y le otorga el tipo adecuado de acceso a las variables, según los grupos a los que pertenecen. Como se da el caso de que un controlador puede gestionar varios usuarios (el servidor web, por ejemplo), es preciso establecer un marco independiente para cada uno, lo que he denominado Frame. En realidad la identificación no la hace el controlador directamente, sino un Frame perteneciente a él. Los permisos posibles son:

  • r: lectura de valores o atributos de una variable.
  • w: escritura de valores o atributos.
  • x: acceso a un método especial.
  • s: añadir un método especial a la variable.

Ya explicaré más adelante qué son los métodos especiales. Mi preocupación original era cómo otorgar a un objeto controlador acceso limitado a las variables sin merma de eficiencia ni mediante un proceso farragoso. Una solución elegante es pasarle sus métodos. Y para hacerlo aún más elegante y cómodo, lo adecuado es que cada objeto variable tenga un objeto espejo en el controlador, llamado Subscriptor. Durante la instanciación, dicho objeto recibe de forma automática y según permisos los métodos que le corresponden, y se le asocian las llamadas pertinentes, como update(), para que ejecute el código adecuado al actualizarse el valor de la variable.

Tag y Subscriptor
Tag y Subscriptor

Cada controlador trabaja con sus subscriptores con la misma comodidad que tendría caso de hacerlo con las variables, pero su alcance está acotado. Esto nos hace despreocuparnos de la seguridad del código de los módulos de controlador, que podría ser desarrollado por programadores independientes. Bueno, o quizás no. Vamos a dejarlo en casi. Python es un lenguaje abierto hasta extremos insólitos, y por ejemplo una llamada a globals() nos permite inspeccionar y alterar todo el entorno. Digamos que la nueva arquitectura previene del error, pero no del sabotaje desde dentro.
En sucesivas entregas iré desgranando más detalles de UWS-2, hasta que esté listo para publicarlo. Espero que resulte de interés.

Facebooktwitterlinkedin