• Publicidad

Manejador de módulos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Manejador de módulos

Notapor BigBear » 2016-02-17 10:47 @491

Hola. Estaba viendo este proyecto en Python donde el script principal puede cargar módulos, leer y mostrar las funciones del módulo y usarlas en el script principal. ¿Cómo se llamaría este tema? ¿Alguien conoce algún manual o proyecto para estudiar sobre este tema?

Los enlaces:

https://github.com/joselimas/wsploit/bl ... wsploit.py
https://github.com/joselimas/wsploit/bl ... ypasser.py
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Manejador de módulos

Notapor explorer » 2016-02-17 17:15 @760

Pues sería algo así como introspección o inspección, usando ref(), isa() y can(), pero en CPAN hay módulos que dan mucha más información, como por ejemplo:
  • Class::Can Saca la jerarquía interna del módulo, mediante un hash, en que las claves son los métodos que se pueden usar, y los valores son el paquete asociado a cada método
  • Devel::Symdump Hace un volcado de toda la tabla de símbolos del programa
pero seguro que hay muchos más.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Manejador de módulos

Notapor BigBear » 2016-02-17 19:06 @837

Gracias por responder, explorer. Hummm... parece que Python la tiene muy fácil en esto. Estoy buscando ejemplos como los del enlace, en Perl, pero no encuentro y no sé con qué nombre buscar. Si supieras algún proyecto en Github, avísame. Mientras tanto sigo programando mi primer módulo en Perl.

Saludos.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Manejador de módulos

Notapor explorer » 2016-02-18 14:22 @640

He entrado en Google y he puesto «Perl introspection», y me sale, el primer enlace a stackoverflow: How can I perform introspection in Perl?, que lleva a dos buenos enlaces: Help, Help (un artículo que muestra el código de un módulo Perl que hace introspección de otros módulos y te muestra los métodos que puedes llamar, cuando te equivocas y pones el nombre de un método que no existe); y la respuesta principal, en How do I list available methods on a given object or package in Perl?, en el que se dice que en Perl hay hasta demasiados métodos para hacer esto (el más sencillo está en la primera respuesta de esa página), y comenta uno clásico: usar el módulo Class::Inspector (ejemplo de uso en la primera página enlazada de StackOverflow). También se muestra el uso con Data::Printer.

No se me ocurre más fácil que esto (solo un par de líneas). Así que no cometas el error de decir que en Python lo tienen más fácil que en Perl. Lo que de verdad quisiste decir es que encontraste antes la solución de Python que la de Perl.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Manejador de módulos

Notapor BigBear » 2016-10-23 19:42 @862

explorer, estoy tratando de sacar las funciones principales de este módulo que hice: http://pastebin.com/PpGLJjMD

El tema es que cuando uso este código me devuelve hasta las funciones de los módulos que usé, como "sockaddr_family" y otros. Intenté usando el argumento "public" o "private" como dice en su documentación: http://search.cpan.org/~adamk/Class-Ins ... spector.pm pero me devuelve siempre el mismo resultado.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $methods = Class::Inspector->methods("DH_Tools");
  2.  
  3. print "Methods:\n";
  4. for my $met(@$methods) {
  5.         if ($tools->can($met)) {
  6.                 print "$met\n";
  7.         }
  8. }
  9.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿ Cómo lo podría hacer ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Manejador de módulos

Notapor explorer » 2016-10-24 09:39 @444

El comportamiento que indicas sí que está descrito en la página de manual.

¿Has probado a cambiar methods() por functions()?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Manejador de módulos

Notapor BigBear » 2016-10-24 09:42 @446

Sí, probé todas las opciones, explorer, y lo peor es que cuando chequeo que la función existe me devuelve todo esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
AF_APPLETALK
AF_CCITT
AF_CHAOS
AF_DATAKIT
AF_DECnet
AF_DLI
AF_ECMA
AF_HYLINK
AF_IMPLINK
AF_INET
AF_INET6
AF_ISO
AF_LAT
AF_MAX
AF_NS
AF_OSI
AF_PUP
AF_SNA
AF_UNIX
AF_UNSPEC
INADDR_ANY
INADDR_BROADCAST
INADDR_LOOPBACK
INADDR_NONE
IP_HDRINCL
IP_OPTIONS
IP_TOS
IP_TTL
MSG_DONTROUTE
MSG_MAXIOVLEN
MSG_OOB
MSG_PEEK
MSG_WAITALL
PF_APPLETALK
PF_CCITT
PF_CHAOS
PF_DATAKIT
PF_DECnet
PF_DLI
PF_ECMA
PF_HYLINK
PF_IMPLINK
PF_INET
PF_INET6
PF_ISO
PF_LAT
PF_MAX
PF_NS
PF_OSI
PF_PUP
PF_SNA
PF_UNIX
PF_UNSPEC
SHUT_RD
SHUT_RDWR
SHUT_WR
SOCK_DGRAM
SOCK_RAW
SOCK_RDM
SOCK_SEQPACKET
SOCK_STREAM
SOL_SOCKET
SOMAXCONN
SO_ACCEPTCONN
SO_BROADCAST
SO_DEBUG
SO_DONTLINGER
SO_DONTROUTE
SO_ERROR
SO_KEEPALIVE
SO_LINGER
SO_OOBINLINE
SO_RCVBUF
SO_RCVLOWAT
SO_RCVTIMEO
SO_REUSEADDR
SO_SNDBUF
SO_SNDLOWAT
SO_SNDTIMEO
SO_TYPE
SO_USELOOPBACK
basename
catch
console
cortar
destroy
dirname
download
fileparse
fileparse_set_fstype
finally
get_filename_by_url
get_ip
get_response_code
http_fingerprinting
inet_aton
inet_ntoa
md5_encode
md5_file_encode
new
pack_sockaddr_in
pack_sockaddr_in6
pack_sockaddr_un
regex
repes
savefile
sockaddr_family
sockaddr_in
sockaddr_in6
sockaddr_un
toma
tomar
try
unpack_sockaddr_in
unpack_sockaddr_in6
unpack_sockaddr_un
uri_join
uri_split
url_split
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Manejador de módulos

Notapor explorer » 2016-10-24 10:32 @480

Bueno, una manera sería llamar a methods(), pero con la opción 'full', que lo que hace es devolver el nombre completo de los métodos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # listar los métodos públicos de DH_Tools
  2. my $methods = Class::Inspector->methods( 'DH_Tools', 'public', 'full' );
  3.  
  4. # y luego hacer un filtrado: nos quedamos solo con los del paquete
  5. my @mis_metodos = grep { /^DH_Tools/ } @$methods;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Si luego quieres quitarle el prefijo 'DH_Tools::', pues con una exp. reg. sencilla se puede hacer.

Otra opción, sacada de How do I list available methods on a given object or package in Perl?:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. no strict 'refs';
  2. for(keys %DH_Tools::) {                         # Todos los símbolos de la tabla de símbolos de DH_Tools
  3.   print "$_\n" if exists &{"DH_Tools::$_"};     # comprobar que el símbolo es un método
  4. }
  5. use strict 'refs';
Coloreado en 0.001 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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Manejador de módulos

Notapor BigBear » 2016-10-24 18:40 @819

Sí, el código de Stackoverflow ya lo probé y los dos (el tuyo también) me devuelve todo el mismo resultado del mensaje anterior. Como plan b voy a ponerles un nombre especial a las funciones que quiero recuperar y desde ese patrón encontrarlas. ¿Se te ocurre una idea mejor?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Manejador de módulos

Notapor explorer » 2016-10-25 16:45 @739

Cuando importas funciones o métodos de otras bibliotecas, pasan a formar parte de tu "espacio de nombres", para poder usarlas, naturalmente, y no tener que referirse a ellas usando nombres largos, como paquete::funcion(). Quieres usar funcion(), y nada más. Pero eso lo que hace es "contaminar" tu propio espacio de nombres, haciéndose cada vez más grande.

Un ejemplo. Supongamos que tenemos este módulo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package query;
  2.  
  3. sub new {
  4.     my $struct = {};                    # almacén de información para todos los usuarios
  5.     bless $struct;                      # la bendecimos
  6.     return $struct;                     # y devolvemos
  7. }
  8.  
  9. sub struct_user {                       # estructura para un único usuario
  10.     my $self = shift;                   # objeto con todo el almacén
  11.                                         # datos del usuario a guardar
  12.     my($id,$nick,$ip,$modos,$realname,$identd,$timestamp) = @_;
  13.  
  14.     $self->{users}-> {$nick} = {
  15.                             id          => $id,
  16.                             nickname    => $nick,
  17.                             ip          => $ip,
  18.                             modos       => $modos,
  19.                             realname    => $realname,
  20.                             identd      => $identd,
  21.                             timestamp   => $timestamp
  22.     };
  23.     $self->{oldusers}->{$id} = {
  24.                             nickname    => $nick,
  25.     };
  26. }
  27.  
  28. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Bueno, apenas tiene dos métodos. Si lo pasamos por el bucle, solo salen esos dos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. > perl -E 'use query; for(keys %query::) { print "$_\n" if exists &{"query::$_"} }'
  2. struct_user
  3. new
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Ahora le agregamos un módulo, List::Util, e importamos un montón de métodos, puede que los usemos o no, en el módulo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package query;
  2. use List::Util qw(first max maxstr min minstr reduce shuffle sum);
  3.  
  4. sub new {
  5.     my $struct = {};                    # almacén de información para todos los usuarios
  6.     bless $struct;                      # la bendecimos
  7.     return $struct;                     # y devolvemos
  8. }
  9.  
  10. sub struct_user {                       # estructura para un único usuario
  11.     my $self = shift;                   # objeto con todo el almacén
  12.                                         # datos del usuario a guardar
  13.     my($id,$nick,$ip,$modos,$realname,$identd,$timestamp) = @_;
  14.  
  15.     $self->{users}-> {$nick} = {
  16.                             id          => $id,
  17.                             nickname    => $nick,
  18.                             ip          => $ip,
  19.                             modos       => $modos,
  20.                             realname    => $realname,
  21.                             identd      => $identd,
  22.                             timestamp   => $timestamp
  23.     };
  24.     $self->{oldusers}->{$id} = {
  25.                             nickname    => $nick,
  26.     };
  27.  
  28.     my $x = first { defined $_ } (undef, undef, undef, 1, undef);
  29.     print $x;
  30. }
  31.  
  32. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Usamos solo una vez la función 'first', pero hemos importado unas cuantas más:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. > perl -E 'use query; for(keys %query::) { print "$_\n" if exists &{"query::$_"} }'
  2. sum
  3. minstr
  4. max
  5. struct_user
  6. reduce
  7. maxstr
  8. min
  9. first
  10. shuffle
  11. new
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Bueno, podemos hacer una cosa: cuando Perl haya terminado de compilar nuestro módulo, podemos decirle que "olvide" todas esas funciones importadas, y que se quede solo con las que hemos definido nosotros. Las funciones externas seguirán funcionando, pero ya no formarán parte del espacio de nombres de nuestro módulo.

Eso se consigue con los módulos namespace::autoclean y namespace::clean. Veámoslo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package query;
  2. use List::Util qw(first max maxstr min minstr reduce shuffle sum);
  3. use namespace::autoclean;
  4.  
  5. sub new {
  6.     my $struct = {};                    # almacén de información para todos los usuarios
  7.     bless $struct;                      # la bendecimos
  8.     return $struct;                     # y devolvemos
  9. }
  10.  
  11. sub struct_user {                       # estructura para un único usuario
  12.     my $self = shift;                   # objeto con todo el almacén
  13.                                         # datos del usuario a guardar
  14.     my($id,$nick,$ip,$modos,$realname,$identd,$timestamp) = @_;
  15.  
  16.     $self->{users}-> {$nick} = {
  17.                             id          => $id,
  18.                             nickname    => $nick,
  19.                             ip          => $ip,
  20.                             modos       => $modos,
  21.                             realname    => $realname,
  22.                             identd      => $identd,
  23.                             timestamp   => $timestamp
  24.     };
  25.     $self->{oldusers}->{$id} = {
  26.                             nickname    => $nick,
  27.     };
  28.  
  29.     my $x = first { defined $_ } (undef, undef, undef, 1, undef);
  30.     print $x;
  31. }
  32.  
  33. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Y ahora, la salida de los métodos definidos dentro será:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. > perl -E 'use query; for(keys %query::) { print "$_\n" if exists &{"query::$_"} }'
  2. new
  3. struct_user
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Incluso funciona Class::Inspector:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. > perl -E 'use query; use Class::Inspector; $ref = Class::Inspector->methods("query", "public", "full"); for (@$ref) { say }'
  2. query::new
  3. query::struct_user
  4. > perl -E 'use query; use Class::Inspector; $ref = Class::Inspector->functions("query"); for (@$ref) { say $_ }'
  5. new
  6. struct_user
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Naturalmente, esto funciona para los módulos que escribamos nosotros. Si queremos hacer introspección de otros distintos, pues nos podemos encontrar con que los autores no hicieron esa limpieza.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

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