• Publicidad

Consulta de bloque de un hash y ejecutar rutina

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Consulta de bloque de un hash y ejecutar rutina

Notapor tomGarcia » 2021-11-12 12:59 @583

Hola a todos, requiero de su ayuda. Necesito poder leer un archivo perl (.pl) el cual contiene un hash; requiero que lea el primer bloque y después valide si es v2c o v3, y poder almacenar algunos atributos de ese mismo bloque para efectuar una rutina.

Mis datos del archivo Datos.pl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. %hash = (
  2.   'Espana' => {
  3.     'active' => 'true',
  4.     'authpassword' => 'E$pan@#2021_2022',
  5.     'authprotocol' => 'sha',
  6.     'community' => '',
  7.     'name' => 'Esp_Madrid',
  8.     'privpassword' => 'S3cRt_EsP4n4',
  9.     'privprotocol' => 'aes',
  10.     'username' => 'n3tw0rk_EsP4na',
  11.     'version' => 'v3',
  12.     'wmipassword' => '',
  13.     'wmiusername' => ''
  14.   },
  15.   'Peru' => {
  16.     'active' => 'true',
  17.     'name' => 'Peru_LATAM',
  18.     'authpassword' => '',
  19.     'authprotocol' => 'md5',
  20.     'community' => 'test_P3Ru_001%',
  21.     'privpassword' => '',
  22.     'privprotocol' => 'aes',
  23.     'username' => '',
  24.     'version' => 'v2',
  25.     'wmipassword' => '',
  26.     'wmiusername' => ''
  27.   },
  28.     'MEXICO_CENTER_01' => {
  29.     'active' => 'true',
  30.     'name' => 'MEXICO_CENTER_01',
  31.     'authpassword' => '',
  32.     'authprotocol' => 'md5',
  33.     'community' => 'M3xiC0_#2021%',
  34.     'privpassword' => '',
  35.     'privprotocol' => 'aes',
  36.     'username' => '',
  37.     'version' => 'v2',
  38.     'wmipassword' => '',
  39.     'wmiusername' => ''
  40.   }
  41. );
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Digamos leer el archivo .pl y entrar al bloque de España y ver si es v2c o v3. Si es v3 guardar el valor de name, privpassword, username, etc. para ocuparlas en una rutina (Consulta SNMP) y mostrar la salida.

Sintáxis: [ Descargar ] [ Ocultar ]
  1. snmpwalk -v3 -l <noAuthNoPriv|authNoPriv|authPriv> -u <username> [-a <MD5|SHA>] [-A <authphrase>] [-x DES] [-X <privaphrase>] <name>[:<dest_port>] [oid] 


Ahora si es v2 tal el caso de Perú sólo guardar el valor de community y name, para aplicar la consulta
Sintáxis: [ Descargar ] [ Ocultar ]
  1. snmpwalk -v 2c <name> -c <community> system 

y mostrar la salida.

Estaba probando con un solo bloque, pasando los datos directamente a una variable, anexo lo que tengo.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. /usr/bin/perl
  2. use POSIX qw/ strftime /;                       # fecha
  3. my $IPNODO = 'NODO_TEST_SNMP';
  4. my $cmd = "snmpwalk -v 2c -c public $IPNODO";   # Comando consulta snmpwalk
  5. print "Ejecutando el comando: [$cmd]\n";        # Print del comando a ejecutar
  6. eval {
  7.     local $SIG{ALRM} = sub { die "timeout\n" }; # Nota: \n es requerido
  8.     alarm 90;                                   # ajustamos una alarma a los 90 segundos
  9.     $salidaComando = qx($cmd);                  
  10.     alarm 0;                                    # todo bien, desactivamos alarma
  11. };
  12. if ($@) {                                                               # si hubo errores...
  13.     die unless $@ eq "timeout\n";                                       # Propagar los errores inesperados
  14.     die "ERROR: Se produjo un error al ejecutar [$cmd]: [$@]\n";        # paramos el programa informando del error
  15. }
  16. print "Salida: [$salidaComando]\n";             # Imprime el debug de la consulta SNMPWALK
  17.  
  18. if ($salidaComando =~ /No more variables left in this MIB View \(It is past the end of the MIB tree\)/i) {  # Valida si existe el String
  19. my $fecha = strftime( "%d-%m-%Y %H:%M:%S", localtime(time) );
  20.    $epoc = time();
  21. my $detalle = "$epoc,$IPNODO,SNMP Down,Warning,,No more variables left in this MIB View (It is past the end of the MIB tree)\n";   # Imprime el Warning y manda al log
  22.  
  23. my $filename = '/usr/local/nmis8/logs/CheckSNMP.log';
  24. open(FH, '>>', $filename) or die $!;
  25. print FH $detalle;
  26. close(FH);
  27.  
  28.    }
  29. else {                                       # Si no encuentra nada manda mensaje de falso.
  30.     print "No se encuentra el patrón";
  31. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



PD: Les agradecería mucho su ayuda :D :D :D
tomGarcia
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2020-08-12 12:35 @566

Publicidad

Re: Consulta de bloque de un hash y ejecutar rutina

Notapor explorer » 2021-11-12 13:36 @608

Bienvenido a los foros de Perl en Español, tomGarcía.

Hay algunos detalles que no están claros. ¿Debemos fijarnos en el nombre del país o en el número de versión, a la hora de elegir qué comando usar?

Ver si una entrada de un hash contiene un cierto valor es sencillo. Con un simple if lo puedes sacar. Otra cosa es saber qué tipo de estructura de datos requieres para procesarlo más tarde.

Se podría guardar en una lista con los parámetros que necesitamos.

Este es un ejemplo para crear esa estructura. Lista de listas, siendo el primer elemento de cada lista un indicador de la versión.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.28;
  3. use experimental 'switch';
  4. #use strict;
  5. #use warnings;
  6.  
  7. my %hash = (
  8.     'Espana' => {
  9.     'active' => 'true',
  10.     'authpassword' => 'E$pan@#2021_2022',
  11.     'authprotocol' => 'sha',
  12.     'community' => '',
  13.     'name' => 'Esp_Madrid',
  14.     'privpassword' => 'S3cRt_EsP4n4',
  15.     'privprotocol' => 'aes',
  16.     'username' => 'n3tw0rk_EsP4na',
  17.     'version' => 'v3',
  18.     'wmipassword' => '',
  19.     'wmiusername' => ''
  20.     },
  21.     'Peru' => {
  22.     'active' => 'true',
  23.     'name' => 'Peru_LATAM',
  24.     'authpassword' => '',
  25.     'authprotocol' => 'md5',
  26.     'community' => 'test_P3Ru_001%',
  27.     'privpassword' => '',
  28.     'privprotocol' => 'aes',
  29.     'username' => '',
  30.     'version' => 'v2',
  31.     'wmipassword' => '',
  32.     'wmiusername' => ''
  33.     },
  34.     'MEXICO_CENTER_01' => {
  35.     'active' => 'true',
  36.     'name' => 'MEXICO_CENTER_01',
  37.     'authpassword' => '',
  38.     'authprotocol' => 'md5',
  39.     'community' => 'M3xiC0_#2021%',
  40.     'privpassword' => '',
  41.     'privprotocol' => 'aes',
  42.     'username' => '',
  43.     'version' => 'v2',
  44.     'wmipassword' => '',
  45.     'wmiusername' => ''
  46.     }
  47. );
  48.  
  49. # Recorremos el hash
  50. my @pruebas;
  51.  
  52. foreach my $zona (keys %hash) {
  53.     my $version = $hash{$zona}{version};
  54.  
  55.     given ($version) {
  56.         when ('v3') {
  57.             # snmpwalk -v3 -l <noAuthNoPriv|authNoPriv|authPriv> -u <username> [-a <MD5|SHA>] [-A <authphrase>] [-x DES] [-X <privaphrase>] <name>[:<dest_port>] [oid]
  58.             push @pruebas, [ 'v3', $zona, $hash{$zona}{name}, $hash{$zona}{privpassword}, $hash{$zona}{username}, ];
  59.         }
  60.         when ('v2') {
  61.             # snmpwalk -v 2c <name> -c <community> system
  62.             push @pruebas, [ 'v2', $zona, $hash{$zona}{name}, $hash{$zona}{community}, ];
  63.         }
  64.     }
  65. }
  66.  
  67. use Data::Printer;
  68. p @pruebas;
  69.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
> perl  tomGarcia.pl
[
    [0] [
            [0] "v2",
            [1] "Peru",
            [2] "Peru_LATAM",
            [3] "test_P3Ru_001%"
        ],
    [1] [
            [0] "v2",
            [1] "MEXICO_CENTER_01",
            [2] "MEXICO_CENTER_01",
            [3] "M3xiC0_#2021%"
        ],
    [2] [
            [0] "v3",
            [1] "Espana",
            [2] "Esp_Madrid",
            [3] "S3cRt_EsP4n4",
            [4] "n3tw0rk_EsP4na"
        ]
]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14485
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Consulta de bloque de un hash y ejecutar rutina

Notapor tomGarcia » 2021-11-12 14:01 @626

¿Debemos fijarnos en el nombre del país o en el número de versión, a la hora de elegir qué comando usar?

El archivo Externo (Datos.pl) contienen varios Bloques, la intención es entrar y leer cada nombre/bloque (españa, Peru...) y analizar si es v3 o V2, en caso de ser V3 hacer la rutina de v3 y en caso de ser v2 hacer la rutina de v2, esto para todos los bloques hasta terminar el archivo .pl que contiene el hash.

Estoy revisando lo que me enviaste :D :D
tomGarcia
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2020-08-12 12:35 @566


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado