Oct 17 2021

Todos los Iconos Disponibles del Diagram as Code

Published by under Python

El Diagram as Code de Mingrammer le permite crear hermosos diagramas ofreciendo muchos iconos. Es frustrante tener que ir a cada subdirectorio para encontrar todos los íconos disponibles. Así que decidí escribir un fragmento de código que importe las clases de los submódulos del paquete Diagram as Code.
Luego reuní los submódulos de cada grupo en un cluster – que se muestran en la parte azul – y las clases en verde. Una clase corresponde a un icono específico.

En esta imagen encontrarás todos los iconos disponibles para sus diagramas as code. Haga clic para ampliar la imagen en una mejor resolución. Puede guardarlo con un simple clic derecho.

Diagram as code todos los iconos

Aquí está el código fuente que genera la imagen de arriba, la cual puede adaptar a sus necesidades para obtener todos los íconos más recientes. Tal vez desee mostrar iconos para un grupo en particular o generar imágenes separadas para cada uno de ellos.

Tuve que vincular los íconos juntos para que se mostraran horizontalmente en lugar de en una sola columna infinita. Esto es lo que hace la función recursiva display_icons. Por alguna razón que se me escapa, la recursividad funciona eliminando el último elemento, pero no el primero.

#!/usr/bin/env python3
 
import importlib
import pkgutil
import sys, inspect
 
import diagrams
from diagrams import Cluster, Diagram, Edge
 
def get_modules(module):
   path_list = []
   spec_list = []
   for importer, modname, ispkg in pkgutil.walk_packages(module.__path__):
      import_path = f"{module.__name__}.{modname}"
      if ispkg:
         spec = pkgutil._get_spec(importer, modname)
         importlib._bootstrap._load(spec)
         spec_list.append(spec)
      else:
         path_list.append(import_path)
   return path_list
 
def get_classes(module):
   class_list = []
   for name, obj in inspect.getmembers(module,inspect.isclass):
      if not name.startswith('_'):
         class_list.append([name,obj]) 
   return class_list
 
def add_module_to_provider_list(providers, module):
   # eg diagrams.azure.database
   # add "database" to array linked to key "azure"
   (diagram,provider,pclass) = module.split('.')
   if provider not in providers:
      providers[provider] = [pclass]
   else:
      providers[provider].append(pclass)
 
def get_provider_list(providers):
   return providers.keys()
 
def get_provider_classes(providers, provider):
   return providers[provider]
 
def display_icons(class_list):
   if len(class_list) < 1: return
   if len(class_list) == 1: return class_list[0][1](class_list[0][0])
   length = len(class_list)
   return display_icons(class_list[:-1]) - class_list[length-1][1](class_list[length-1][0])
 
if __name__ == "__main__":
   providers = {}
   modules = get_modules(diagrams)
 
   for module in modules:
      # Module exception
      # /usr/local/lib/python3.8/site-packages/diagrams/oci/database.py
      # NameError: name 'AutonomousDatabase' is not defined
      if module not in ['diagrams.oci.database']:
         add_module_to_provider_list(providers, module)
 
   with Diagram("all_Icons", show="False", outformat="png"):
      for provider in get_provider_list(providers):
         with Cluster(provider):
            for pclassname in get_provider_classes(providers, provider):
               with Cluster(pclassname):
                  classes = get_classes(importlib.import_module('diagrams.'+provider+'.'+pclassname))
                  display_classes(classes)
 

No responses yet

Oct 17 2021

Crea Hermosos Diagramas con Diagram as Code

Published by under Python

El Diagram as Code es un tema muy presente en este momento que trae muchas ventajas. Entre los cuales:
– Mantener un registro de los cambios, quién y qué
– Almacenar en un repositorio de código como texto simple
– No es necesario realinear flechas o mover iconos al agregar elementos
– Más rápido una vez que domines
– Es código, y sabe cuánto a los desarrolladores les encanta hacer diagramas manuales
– El renderizado de los diagramas, todo está alineado correctamente
Muchos iconos disponibles


La biblioteca de Diagram as Code está disponible en diagrams.mingrammer.com en Python y Go. No describiré los pasos de instalación, está muy bien explicado en su documentación. También proporcionan diagramas de ejemplo muy buenos.
Intentaré convertir un diagrama antiguo creado en Microsoft Visio hace mucho tiempo en un diagram as code. Esta imagen es de un artículo de replicación Mysql.

Microsoft Visio Diagram


Ejemplo de Diagram as Code


Aquí está el código que escribí para generar la imagen a continuación:

from diagrams import Cluster, Diagram, Edge
from diagrams.azure.compute import *
from diagrams.azure.database import *
 
with Diagram("Replication", show="False", direction='TB'):
 
  slaves = []
  clients= []
 
  master = SQLServers("Master")
  with Cluster("slaves"):
    for s in range(3):
      slave = SQLDatabases("slave"+str(s+1))
      slaves.append(slave)
 
  for c in range(3):
    client = VM("client"+str(c+1))
    clients.append(client)
    clients[c] >> Edge(color="darkgreen",label="Reads") >> slaves[c]
    
  clients >> Edge(color="red",label="Writes") >> master
  master >> Edge(color="blue",label="Replication") >> slaves[1]

Menos de 20 líneas de código, no más. Los íconos son del directorio de Azure, pero podría haber tomado otros. La segunda imagen es prácticamente la misma, pero eliminé la dirección que se convierte de izquierda a derecha de forma predeterminada. Como puede ver, las etiquetas se manejan mejor en esta dirección, aunque todavía no es perfecto con varias flechas.
También eliminé la etiqueta «Read» en el medio para una mejor alineación al vincular objetos simples en lugar de matrices. También reemplacé

clients[c] >> Edge(color="darkgreen",label="Reads") >> slaves[c]


por (fuera del bucle for):

for i in [0,2]: clients[i] >> Edge(color="darkgreen",label="Reads") >> slaves[i]


Dificultades encontradas

Puede resultar un poco complicado obtener exactamente lo que desea, especialmente con varios niveles conectados entre sí. Puede experimentar y cambiar el comportamiento jugando con agrupaciones por Cluster. Puede ser útil cuando desea agrupar los niveles 2 y 4, por ejemplo, pero también puede complicarse como en este clúster de Mysql:

Mysql Replication Diagram as Code


En resumen, esta implementación de Diagram as Code es poderosa y eficiente incluso si pierde el control sobre la ubicación de los elementos. Un pequeño inconveniente para una librería muy buena. Una vez que esté familiarizado con todos estos pequeños consejos, puede crear hermosos diagramas. A continuación, se muestra un ejemplo de una arquitectura básica de Kubernetes:

Kubernetes Diagram as Code
 

No responses yet

Oct 05 2021

Un Enrutador Virtual de Cisco en su Red

Published by under Cisco

Dynamips y dynagen le permiten crear un enrutador Cisco virtual en un entorno Linux. ¿No sería aún mejor si este enrutador estuviera conectado a la LAN local? Yendo más allá, este mismo enrutador podría conectarse a otros enrutadores virtuales formando un laboratorio completo.


Descarga e instalación

Descarga dynamips y dynagen en sourceforge.net. Tenga en cuenta que la última versión de Dynagen requiere Dynamips 0.2.8-RC2.
Ambos programas se entregan como paquetes RPM para Redhat / Fedora.

En otras distribuciones de Linux como Debian o Ubuntu, Dynagen solo está disponible como un archivo del que puede extraer archivos binarios. Luego, solo apunte un enlace simbólico a dynagen desde /usr/local/bin, por ejemplo. En cuanto a Dynamips, debe extraerse de las rpm. También se puede descargar de netexpertise.eu.
Tenga en cuenta que dynamips puede devolver un error como este:

[root@cisco_host]$ dynamips -h
dynamips: error while loading shared libraries: libpcap.so.0.9:
cannot open shared object file: No such file or directory

[root@cisco_host]$ ln -s /usr/lib/libpcap.so.0.9.8 /usr/lib/libpcap.so.0.9


Un enlace simbólico es suficiente para apuntar a la biblioteca correcta.


Instalación de Herramientas de Red

Serán necesarias las siguientes 2 herramientas:
– brctl del paquete bridge-utils (en la mayoría de las distribuciones de Linux) – para crear un puente
rpmfind tunctl para Redhat / Fedora y uml-utilities para Debian / Ubuntu – para crear una interfaz tap. Esto no es absolutamente necesario ya que Dynagen puede crear su propia interfaz por sí mismo, pero es muy útil.


Creación del puente y conexión a la red

El puente br0 constará de la interfaz eth1 conectada a la LAN y tap0 vinculada al enrutador Cisco. 192.168.0.100 es la dirección del host de Linux.

[root @ cisco_host] $ brctl addbr br0
[root @ cisco_host] $ ifconfig br0 up
[root @ cisco_host] $ ifconfig eth1 0.0.0.0
[root @ cisco_host] $ brctl addif br0 eth1
[root @ cisco_host] $ ifconfig br0 192.168.0.100 máscara de red 255.255.255.0 hasta


Archivo de Configuración del Enrutador Virtual de Cisco

Cree el siguiente archivo de configuración de Dynagen. Tendrá que copiar su propia imagen de Cisco en el servidor, ya que, por supuesto, es propietario. Aquí es donde hacemos el enlace entre la interfaz de Cisco f0/0 y tap0.

[localhost]
workingdir = /tmp

    [[ 7200 ]]
    image = /root/c7200-js-mz.124-3.bin
    ram = 128
    idlepc = 0x6082c30c

    [[ router R1 ]]
    console = 2001
    f0/0 = NIO_tap:tap0


Sugiero echar un vistazo al tutorial Dynagen para establecer el mejor valor para idlepc para no consumir todos los recursos de CPU de la máquina. Luego podemos lanzar el hipervisor Dynamips así como Dynagen para ejecutar el enrutador virtual.

[root@cisco_host]$ dynamips -H 7200&
[1] 2347
[root@cisco_host]$ Cisco Router Simulation Platform (version 0.2.8-RC2-x86)
Copyright (c) 2005-2007 Christophe Fillot.
Build date: Apr 20 2008 12:25:53
Hypervisor TCP control server started (port 7200).

[root@cisco_host]$ dynagen router.net
Reading configuration file...

Shutdown in progress...
Shutdown completed.
Network successfully loaded

Dynagen management console for Dynamips and Pemuwrapper 0.11.0
Copyright (c) 2005-2007 Greg Anuzelli, contributions Pavel Skovajsa

=>


Agregar el Enrutador Cisco al Puente

tap0 fue creado por Dynagen y ahora se puede activar y agregar al puente.

[root@cisco_host]$ brctl addif br0 tap0
[root@cisco_host]$ ifconfig tap0 up


Conexión al Enrutador

Conéctese al enrutador por telnet en el puerto 2001 – como se definió anteriormente en el archivo de configuración – y juegue con la consola como si estuviera en un enrutador Cisco real y su IOS.

[root@cisco_host]$ telnet localhost 2001
router>enable
router#show interface summary

 *: interface is up
 IHQ: pkts in input hold queue     IQD: pkts dropped from input queue
 OHQ: pkts in output hold queue    OQD: pkts dropped from output queue
 RXBS: rx rate (bits/sec)          RXPS: rx rate (pkts/sec)
 TXBS: tx rate (bits/sec)          TXPS: tx rate (pkts/sec)
 TRTL: throttle count

  Interface              IHQ   IQD  OHQ   OQD  RXBS RXPS  TXBS TXPS TRTL
------------------------------------------------------------------------
* FastEthernet0/0          0     0    0     0     0    0     0    0    0
  FastEthernet0/1          0     0    0     0     0    0     0    0    0
NOTE:No separate counters are maintained for subinterfaces
     Hence Details of subinterface are not shown

router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
router(config)#int fa0/0
router(config-if)#ip address 192.168.0.101 255.255.255.0
router(config-if)#no shutdown
router(config-if)#end
router#

router#ping 192.168.0.1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.0.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 8/11/16 ms
router#ping 192.168.0.100

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.0.100, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 4/20/36 ms


192.168.0.1 es la puerta de enlace o cualquier hardware en la LAN.
Ahora puede virtualizar tantos enrutadores Cisco como desee, dentro de los límites de los recursos de su máquina.

 

No responses yet

Sep 19 2021

Autodesk Inventor Licencia de Red no Disponible

Published by under Diverso

Logs Autodesk Inventor en LMTools
Inventor Licencia de Red no Disponible
Autodesk no parece proporcionar una herramienta para averiguar
quién utiliza las licencias de red de Inventor. Los usuarios finales
se preguntan por qué reciben el mensaje de error Inventor
«Licencia de Red no Disponible», y a quién se han asignado estas licencias.


Escribí esta herramienta para evitar llamadas innecesarias al departamento de TI y también para dar a todos la posibilidad de saber quién está conectado en todo momento. Por lo tanto, los usuarios pueden organizar entre ellos la liberación de una licencia.

Inventor genera un archivo de registro en el que se registra cada (des) conexión junto con otra información. El script analiza el archivo y muestra los usuarios registrados.

Solo son necesarios 2 pasos para la instalación:
– Establezca la ruta del archivo de registro flex.log en un directorio compartido de solo lectura y otorgue derechos de acceso a los usuarios finales.
– Cree el siguiente script inventor.vbs en la misma carpeta.

El script fue escrito en VB para ser ejecutado desde cualquier PC con Windows. Lo puse a disposición de los usuarios en un recurso compartido de Windows.
Finalmente, configure la variable «Users» con su propio número de licencias. Tenemos 4 licencias concurrentes aquí.

Ahora, los usuarios saben dónde buscar cuando reciben un mensaje de error de Inventor «Licencia de red no disponible».

Option Explicit

Dim objFSO, objFile, strTextFile
Dim line, allSessions(), offline, currentSessions, firstIndex
Dim i, l
CONST ForReading = 1
CONST Users = 4

'Nombre del archivo de registro
strTextFile = "flex.log"

'Crear un objeto de sistema de archivos
Set objFSO = CreateObject("Scripting.FileSystemObject")
if not (objFSO.FileExists(strTextFile)) then
   MsgBox strTextFile&" no existe!", vbExclamation, "Error"
   wscript.quit
end if
Set objFile = objFSO.OpenTextFile(strTextFile, ForReading)

i = 0

' Encuentra conexiones en orden inverso
Do Until objFile.AtEndOfStream
    Line = objFile.ReadLine
    If (not InStr(line, "(adskflex) OUT:") = 0) or (not InStr(line, "(adskflex) IN:") = 0) Then
        Redim Preserve allSessions(i)
        allSessions(i) = line
        i = i + 1
    End If
Loop

' Index en allSessions
On Error Resume Next
l = UBound(allSessions)
' Compte les licences
i = 0

if (l = "") then
   currentSessions = "Nadie ha iniciado sesión"
end if

' Devuelve las últimas x conexiones
' sin tener en cuenta los duplicados
Do While (i < Users) and (l >= 0)
   line = split(allSessions(l))
   ' Cas heure < 10h
   if line(0) = "" then
      ' Compruebe si el usuario no se ha desconectado
      if StrComp(line(3), "In:", vbTextCompare) = 0 and InStr(currentSessions, line(5)) = 0 then
         offline = offline & line(5) & " "
      end if
      if InStr(currentSessions, line(5)) = 0 and InStr(offline, line(5)) = 0 then
         currentSessions = currentSessions & line(1) & " " & line(5) & VbCrLf
         i = i + 1
      end if
   else
      if StrComp(line(2), "In:", vbTextCompare) = 0 and InStr(currentSessions, line(4)) = 0 then
         offline = offline & line(4) & " "
      end if
      if InStr(currentSessions, line(4)) = 0 and InStr(offline, line(4)) = 0 then
         currentSessions = currentSessions & line(0) & " " & line(4) & VbCrLf
         i = i + 1
      end if
   end if
   l = l - 1
Loop

MsgBox currentSessions, vbInformation, "Licencias Inventor"
'wscript.echo currentSessions

objFile.Close

'Cleanup
Set objFSO = Nothing
 

No responses yet

Sep 15 2021

Error de Versión de Idioma durante la Actualización de Client Access

Published by under AS400

IBM i Client Access, también llamado Client Access iSeries, es el cliente pesado tradicional en Windows para conectarse a plataformas AS400. Al actualizar el acceso de cliente, ya encontré un error de versión de idioma principal:

Error de Versión de Idioma IBM

La versión de idioma principal Mri2931 instalada no coincide con la versión de idioma MRI2931 a la que está intentando actualizar. La actualización no puede continuar. Para cambiar el idioma a MRI2931, retirar el producto y vuelva a ejecutar la instalación.


IBM recomienda en su sitio eliminar el software y reinstalarlo. Pero el caso de la versión debe cambiarse primero. Como se describe en el mensaje de error de la versión de idioma, debe estar en mayúsculas. La modificación se realiza en el registro para corresponder al nuevo nombre.
Esto se puede hacer manualmente o mediante las siguientes líneas de comando (MRI2931 es para español, se adapta a su idioma) en el indicador de DOS. La ruta es diferente según la versión de 32 y 64 bits del cliente.

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

REM Instalación Client Access 32/64 bits
set v=0

for /f "usebackq tokens=* delims= " %%I in 
(`reg query "HKLM\SOFTWARE\IBM\Client Access\CurrentVersion" 
/v version ^| findstr "REG_SZ"`)
do (for /f "tokens=3" %%i in ("%%I") do set v="%%i")

if %v% == "5" reg add "HKLM\SOFTWARE\IBM\Client Access\CurrentVersion" 
/v SourceInstallMRI /t REG_SZ /d MRI2928 /f

REM Instalación 32 bits en OS Windows 64 bits
set v=0

for /f "usebackq tokens=* delims= " %%I in 
(`reg query "HKLM\SOFTWARE\Wow6432Node\IBM\Client Access\CurrentVersion" 
/v version ^| findstr "REG_SZ"`)
do (for /f "tokens=3" %%i in ("%%I") do set v="%%i")

if %v% == "5" reg add "HKLM\SOFTWARE\Wow6432Node\IBM\Client Access\CurrentVersion" 
/v SourceInstallMRI /t REG_SZ /d MRI2928 /f
 

No responses yet

« Prev - Next »