• Publicidad

Buscar coincidencia dentro de archivo y agregar nueva info.

¿Eres administrador de sistemas? Este foro es para todos aquellos temas relacionados con el uso de Perl para administración de sistemas.

Buscar coincidencia dentro de archivo y agregar nueva info.

Notapor juanjosemuriel » 2015-10-15 16:35 @732

Hola, soy nuevo en el foro y en Perl. Estuve investigando y éste es uno de los mejores lenguajes para manejar cadenas de texto.

Tengo la siguiente necesidad: Para la configuración de unos puntos de acceso inalámbrico (AP) debo agregar una lista de direcciones MAC (en algunos casos más de 2000), para restringir los accesos de clientes no autorizados.

El problema es que la interfaz de configuración del AP no permite ingresarlos todos al tiempo, sino que debo hacerlo uno por uno. Adicionalmente las direcciones MAC del archivo de texto aparecen de la forma AA-BB-... y no de la forma AA:BB:... que requiere el archivo de configuración XML.

Se me ocurrió la idea de exportar el archivo de configuración del AP (genera un XML) y agregarle las direcciones MAC desde el archivo de texto y volver a cargar la configuración con todas estas direcciones.

He intentado múltiples scripts en Perl, sin éxito, y debido a la premura para configurar estos equipos, ya no tengo tiempo de seguir probando. Por eso recurro a su valiosa ayuda.

Dentro del archivo XML se encuentra una sección como la que sigue (que puede estar ubicada en posiciones diferentes al inicio o final del archivo XML):

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <bss name="wlan1bssvap14">
  2. <description>Virtual Access Point 14 - Radio 2</description>
  3. <radio>wlan1</radio>
  4. <beacon-interface>wlan1vap14</beacon-interface>
  5. <ignore-broadcast-ssid>off</ignore-broadcast-ssid>
  6. <mac-acl-auth-type>disable</mac-acl-auth-type>
  7. <mac-acl-name>default</mac-acl-name>
  8. <global-radius>off</global-radius>
  9. <radius-ip>192.168.1.1</radius-ip>
  10. <radius-ip-network>ipv4</radius-ip-network>
  11. <radius-ipv6>::</radius-ipv6>
  12. <encrypted-radius-key>1111111</encrypted-radius-key>
  13. <radius-own-ip-interface>brtrunk</radius-own-ip-interface>
  14. <radius-accounting>off</radius-accounting>
  15. <required-vlan-id>off</required-vlan-id>
  16. <radius-port>1812</radius-port>
  17. <radius-accounting-port>1813</radius-accounting-port>
  18. <vlan-tagged-interface>brtrunk</vlan-tagged-interface>
  19. <open-system-authentication>on</open-system-authentication>
  20. <shared-key-authentication>off</shared-key-authentication>
  21. <wpa-cipher-tkip>off</wpa-cipher-tkip>
  22. <wpa-allowed>off</wpa-allowed>
  23. <wpa2-allowed>on</wpa2-allowed>
  24. <rsn-preauthentication>on</rsn-preauthentication>
  25. <broadcast-key-refresh-rate>0</broadcast-key-refresh-rate>
  26. <session-key-refresh-rate>0</session-key-refresh-rate>
  27. <syslog>8</syslog>
  28. <wpa-cipher-ccmp>on</wpa-cipher-ccmp>
  29. <status>down</status>
  30. <mac-acl-mode>deny-list</mac-acl-mode>
  31. </bss>
  32.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y necesito encontrar la línea que contiene "<mac-acl-mode>deny-list</mac-acl-mode>" para agregarle un retorno de carro y después las líneas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <mac-acl name="default">
  2. <mac>AA:AA:AA:09:09:09</mac>
  3. </mac-acl>
  4. <mac-acl name="default">
  5. <mac>BB:BB:BB:10:10:10</mac>
  6. </mac-acl>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

para obtener algo como:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <bss name="wlan1bssvap14">
  2. <description>Virtual Access Point 14 - Radio 2</description>
  3. <radio>wlan1</radio>
  4. <beacon-interface>wlan1vap14</beacon-interface>
  5. <ignore-broadcast-ssid>off</ignore-broadcast-ssid>
  6. <mac-acl-auth-type>disable</mac-acl-auth-type>
  7. <mac-acl-name>default</mac-acl-name>
  8. <global-radius>off</global-radius>
  9. <radius-ip>192.168.1.1</radius-ip>
  10. <radius-ip-network>ipv4</radius-ip-network>
  11. <radius-ipv6>::</radius-ipv6>
  12. <encrypted-radius-key>11111111</encrypted-radius-key>
  13. <radius-own-ip-interface>brtrunk</radius-own-ip-interface>
  14. <radius-accounting>off</radius-accounting>
  15. <required-vlan-id>off</required-vlan-id>
  16. <radius-port>1812</radius-port>
  17. <radius-accounting-port>1813</radius-accounting-port>
  18. <vlan-tagged-interface>brtrunk</vlan-tagged-interface>
  19. <open-system-authentication>on</open-system-authentication>
  20. <shared-key-authentication>off</shared-key-authentication>
  21. <wpa-cipher-tkip>off</wpa-cipher-tkip>
  22. <wpa-allowed>off</wpa-allowed>
  23. <wpa2-allowed>on</wpa2-allowed>
  24. <rsn-preauthentication>on</rsn-preauthentication>
  25. <broadcast-key-refresh-rate>0</broadcast-key-refresh-rate>
  26. <session-key-refresh-rate>0</session-key-refresh-rate>
  27. <syslog>8</syslog>
  28. <wpa-cipher-ccmp>on</wpa-cipher-ccmp>
  29. <status>down</status>
  30. <mac-acl-mode>deny-list</mac-acl-mode>
  31. <mac-acl name="default">
  32. <mac>AA:AA:AA:09:09:09</mac>
  33. </mac-acl>
  34. <mac-acl name="default">
  35. <mac>BB:BB:BB:10:10:10</mac>
  36. </mac-acl>
  37. </bss>
  38.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Como ya les dije, tengo a parte un archivo de texto que contiene las MAC AA:AA:AA:09:09:09 y BB:BB:BB:10:10:10 y muchas otras más, que está con el siguiente formato:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
AA-AA-AA-09-09-09
BB-BB-BB-10-10-10
...
XX-XX-XX-YY-YY-YY
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


En resumen, necesito encontrar la línea que contiene "<mac-acl-mode>deny-list</mac-acl-mode>" y después de esta agregarle el texto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <mac-acl name="default">
  2. <mac>AA:AA:AA:09:09:09</mac>
  3. </mac-acl>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

donde "AA:AA:AA:09:09:09" es el parámetro que voy a tomar desde el archivo de texto que no tiene como separadores dos puntos (:), sino guiones (-) y debo hacerlo por cada una de las direcciones MAC que contiene el archivo de texto.

De antemano, agradezco su colaboración.
juanjosemuriel
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2015-10-15 15:49 @700

Publicidad

Re: Buscar coincidencia dentro de archivo y agregar nueva in

Notapor explorer » 2015-10-16 09:56 @455

Esta es una posible solución.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.18;
  3. use File::Slurp;
  4.  
  5. ## Leer las MAC
  6. my @macs = read_file('code_38995_3.txt', chomp => 1);
  7.  
  8. ## Leer archivo original
  9. my $conf_plantilla = read_file('code_38995.txt');
  10.  
  11. ## Procesar por cada MAC
  12. my $configuracion;
  13. foreach (@macs) {
  14.     tr/-/:/;                    # cambiamos guiones por puntos
  15.  
  16.     # le añadimos el marcado
  17.     $configuracion .= qq(\n<mac-acl name="default">\n<mac>$_</mac>\n</mac-acl>);
  18. }
  19.  
  20. ## Magia
  21. my $salida =
  22.         $conf_plantilla =~ s{<mac-acl-mode>deny-list</mac-acl-mode>\K}{$configuracion}rxg;
  23.  
  24. ## Resultado
  25. #say $salida;
  26. write_file('code_38995_4.txt', $salida);
Coloreado en 0.004 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Buscar coincidencia dentro de archivo y agregar nueva in

Notapor juanjosemuriel » 2015-10-16 15:13 @675

¡¡¡Funciona perfecto!!! Justo lo que necesitaba. Nuevamente, gracias.
juanjosemuriel
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2015-10-15 15:49 @700

Re: Buscar coincidencia dentro de archivo y agregar nueva in

Notapor juanjosemuriel » 2015-10-19 18:39 @819

Buenas noches.

Como le había dicho, el script funcionó de maravilla, pero ahora se me ha presentado un caso nuevo, donde los AP están configurados en un modo especial, llamado cluster, donde se agrupan para configurar parámetros comunes como el SSID o la codificación de la red inalámbrica, pero otros parámetros como las listas de direcciones MAC para crear una ACL, debe hacerse en el campo que corresponde a cada AP. La ventaja es que se sigue generando un solo archivo XML de configuración.

Entonces, tengo dentro del archivo XML el segmento:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. </bss>
  2. <bss name="wlan0bssvap1">
  3. <description>Virtual Access Point 1</description>
  4. <radio>wlan0</radio>
  5. <beacon-interface>wlan0vap1</beacon-interface>
  6. <ignore-broadcast-ssid>off</ignore-broadcast-ssid>
  7. <mac-acl-auth-type>disable</mac-acl-auth-type>
  8. <mac-acl-name>default</mac-acl-name>
  9. <global-radius>off</global-radius>
  10. <radius-ip>192.168.1.1</radius-ip>
  11. <radius-ip-network>ipv4</radius-ip-network>
  12. <radius-ipv6>::</radius-ipv6>
  13. <encrypted-radius-key>000</encrypted-radius-key>
  14. <radius-own-ip-interface>brtrunk</radius-own-ip-interface>
  15. <radius-accounting>off</radius-accounting>
  16. <required-vlan-id>off</required-vlan-id>
  17. <radius-port>1812</radius-port>
  18. <radius-accounting-port>1813</radius-accounting-port>
  19. <vlan-tagged-interface>brtrunk</vlan-tagged-interface>
  20. <open-system-authentication>on</open-system-authentication>
  21. <shared-key-authentication>off</shared-key-authentication>
  22. <wpa-cipher-tkip>off</wpa-cipher-tkip>
  23. <wpa-allowed>off</wpa-allowed>
  24. <wpa2-allowed>on</wpa2-allowed>
  25. <rsn-preauthentication>on</rsn-preauthentication>
  26. <broadcast-key-refresh-rate>0</broadcast-key-refresh-rate>
  27. <session-key-refresh-rate>0</session-key-refresh-rate>
  28. <syslog>8</syslog>
  29. <wpa-cipher-ccmp>on</wpa-cipher-ccmp>
  30. <status>down</status>
  31. <mac-acl-mode>deny-list</mac-acl-mode>
  32. </bss>
  33. <bss name="wlan0bssvap2">
  34. <description>Virtual Access Point 2</description>
  35. <radio>wlan0</radio>
  36. <beacon-interface>wlan0vap2</beacon-interface>
  37. <ignore-broadcast-ssid>off</ignore-broadcast-ssid>
  38. <mac-acl-auth-type>disable</mac-acl-auth-type>
  39. <mac-acl-name>default</mac-acl-name>
  40. <global-radius>off</global-radius>
  41. <radius-ip>192.168.1.1</radius-ip>
  42. <radius-ip-network>ipv4</radius-ip-network>
  43. <radius-ipv6>::</radius-ipv6>
  44. <encrypted-radius-key>1111</encrypted-radius-key>
  45. <radius-own-ip-interface>brtrunk</radius-own-ip-interface>
  46. <radius-accounting>off</radius-accounting>
  47. <required-vlan-id>off</required-vlan-id>
  48. <radius-port>1812</radius-port>
  49. <radius-accounting-port>1813</radius-accounting-port>
  50. <vlan-tagged-interface>brtrunk</vlan-tagged-interface>
  51. <open-system-authentication>on</open-system-authentication>
  52. <shared-key-authentication>off</shared-key-authentication>
  53. <wpa-cipher-tkip>off</wpa-cipher-tkip>
  54. <wpa-allowed>off</wpa-allowed>
  55. <wpa2-allowed>on</wpa2-allowed>
  56. <rsn-preauthentication>on</rsn-preauthentication>
  57. <broadcast-key-refresh-rate>0</broadcast-key-refresh-rate>
  58. <session-key-refresh-rate>0</session-key-refresh-rate>
  59. <syslog>8</syslog>
  60. <wpa-cipher-ccmp>on</wpa-cipher-ccmp>
  61. <status>down</status>
  62. <mac-acl-mode>deny-list</mac-acl-mode>
  63. </bss>
  64.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Ahora requiero que para cada coincidencia dentro del archivo con la cadena "<mac-acl-mode>deny-list</mac-acl-mode>" insertar las direcciones MAC con el formato que ya se les había dado dentro de su script.

Como puede notar en el código XML adjunto, las líneas 2 y 33 hacen referencia a un nuevo AP (dentro del archivo de configuración existen un total de 15 referencias hacía AP) y el texto que debe coincidir está en las líneas 31 y 62. En este punto debo insertar las cadenas de texto modificadas con las direcciones MAC.

Intenté modificarlo, pero sin éxito, utilizando el siguiente código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.18;
  3. use File::Slurp;
  4.  
  5. ## Leer las MAC
  6. my @macs = read_file( 'MACs.txt', chomp => 1 );
  7.  
  8. ## Leer archivo original
  9. my $conf_plantilla = read_file('CONF.xml');
  10.  
  11. ## Procesar por cada MAC
  12. my $configuracion;
  13. foreach (@macs) {
  14.     tr/-/:/;                                   # cambiamos guiones por puntos
  15.  
  16.     # le añadimos el marcado
  17.     $configuracion .= qq(\n<mac-acl name="default">\n<mac>$_</mac>\n</mac-acl>);
  18. }
  19.  
  20. ## Magia
  21. my $salida;
  22. my $filename = "saliente.xml";
  23. open( $salida, '>', $filename )
  24.     or die "Unable to open file $filename : $!";
  25.  
  26. while (<$conf_plantilla>) {
  27.  
  28.     if ( /^$_$/ =~ qq(mac-acl-mode>deny-list</mac-acl-mode>\K) ) {
  29.         my $salida =
  30.             $conf_plantilla =~ s{<mac-acl-mode>deny-list</mac-acl-mode>\K}{$configuracion}rx;
  31.     }
  32. }
  33. write_file( 'saliente.xml', $salida );
  34. close($salida);
  35. close($conf_plantilla);
  36. ## Resultado
  37. #say $salida;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Podría, por favor, ayudarme a detectar mi error y darme alguna luz para conseguir esta tarea?

De antemano, gracias por su ayuda.
juanjosemuriel
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2015-10-15 15:49 @700

Re: Buscar coincidencia dentro de archivo y agregar nueva in

Notapor explorer » 2015-10-19 19:52 @870

El único cambio que hay que hacer, entonces, es añadir una /g a la línea 23 de mi código. Quedaría así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         {$configuracion}rxg;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esa opción tiene el efecto de repetir la búsqueda y sustitución a lo largo de todo el archivo ('g' de global).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Buscar coincidencia dentro de archivo y agregar nueva in

Notapor juanjosemuriel » 2015-10-20 08:48 @408

Muchas gracias por su valiosa ayuda. Funciona de maravilla.
juanjosemuriel
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2015-10-15 15:49 @700


Volver a Administración

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados