Página 3 de 4

Re: Análisis del archivo /etc/login.defs

NotaPublicado: 2011-02-14 12:07 @546
por explorer
Mi fichero /etc/sysctl.conf no sigue tu patrón, así que esa puede ser una explicación. Y el fichero sshd_config no puedo leerlo como usuario.

Por otra parte, las tres funciones son casi iguales... podrías reducir las tres funciones (y las futuras) a una sola. Solo tendrías que pasar, como argumentos,

* el nombre del fichero a analizar
* la expresión regular a aplicar
* la referencia al hash que almacena los valores correctos.

El resto de la función se deja tal cual.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5. use autodie;
  6.  
  7. use Term::ANSIColor qw(:constants);
  8.  
  9. # Valores correctos esperados
  10. my %valores_correctos_de = (
  11.  
  12.     login_defs  => {
  13.                     fichero    => '/etc/login.defs',
  14.                     patron     => qr/^ (\S+) \s+ (\S+) $/xi,
  15.                     parametros => {
  16.                                     PASS_MAX_DAYS => 99999,
  17.                                     PASS_MIN_DAYS =>     0,
  18.                                     PASS_WARN_AGE =>     7,
  19.                                   },
  20.                    },
  21.  
  22.     sysctl_conf => {
  23.                     fichero    => '/etc/sysctl.conf',
  24.                     patron     => qr/^ (\S+) \s* = \s* (\S+) $/xi,
  25.                     parametros => {
  26.                                     'net.ipv4.conf.all.rp_filter'               => 1,
  27.                                     'net.ipv4.conf.default.promote_secondaries' => 0,
  28.                                     'net.ipv4.conf.all.promote_secondaries'     => 1,
  29.                                   },
  30.                    },
  31.     sshd_config => {
  32.                     fichero    => '/etc/ssh/sshd_config',
  33.                     patron     => qr/^ (\S+) \s* (\S+) $/xi,
  34.                     parametros => {
  35.                                     X11Forwarding               => 'yes',
  36.                                     Port                        =>  2222,
  37.                                     PasswordAuthentication      =>  'no',
  38.                                   },
  39.                    },
  40. );
  41.  
  42. # Arrancamos los análisis
  43. analiza($valores_correctos_de{login_defs});
  44. analiza($valores_correctos_de{sysctl_conf});
  45. analiza($valores_correctos_de{sshd_config});
  46.  
  47. # Subrutina que analiza
  48. sub analiza {
  49.     my $hash_ref = shift;
  50.     my($fichero, $regex, $valores_correctos_ref) = @{$hash_ref}{'fichero','patron','parametros'};
  51.  
  52.     # Leemos el fichero a un hash según cómo lo indique la expresión regular
  53.     my %valor_actual_de;
  54.     open my $fh, q[<], $fichero;
  55.     while (<$fh>) {
  56.         if (/$regex/) {
  57.             $valor_actual_de{ $1 } = $2;
  58.         }
  59.     }
  60.  
  61.     close $fh;
  62.  
  63.     # Comprobamos los valores correctos
  64.     for my $parametro (sort keys %$valores_correctos_ref) {
  65.         if (exists $valor_actual_de{$parametro}) {
  66.             if ($valor_actual_de{$parametro} eq $valores_correctos_ref->{$parametro}) {
  67.                 print BOLD, GREEN, 'Positivo: ', RESET, "El valor del parametro $parametro es correcto\n";
  68.             }
  69.             else {
  70.                 print
  71.                     BOLD, RED  , 'Negativo: ', RESET,
  72.                     "El valor del parametro $parametro es incorrecto: ",
  73.                     "[$valor_actual_de{$parametro}] != [$valores_correctos_ref->{$parametro}]\n",
  74.                     ;
  75.             }
  76.         }
  77.         else {
  78.             print BOLD . 'No existe ' . RESET, "el parametro $parametro en $fichero\n";
  79.         }
  80.     }
  81. }
  82.  
  83. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Re: Análisis del archivo /etc/login.defs

NotaPublicado: 2011-02-14 13:19 @596
por situ
Como siempre un lujo participar en el foro =)

Están separadas porque cada una es una llamada del menú.

Por pantalla me da los valores, el tema es que no me hace el print() al archivo externo, solamente me funciona la función "expiracionUsuarios".

Muchas gracias.

Re: Análisis del archivo /etc/login.defs

NotaPublicado: 2011-02-14 15:55 @705
por explorer
Es posible que el fichero ARCH no esté abierto en el momento del print()...

Re: Análisis del archivo /etc/login.defs

NotaPublicado: 2011-02-14 17:16 @761
por situ
Es raro porque recién lo cierro al terminar de ejecutar todo el script.

Acá está el script completo.

http://code.google.com/p/checklistlinux/downloads/list

¿Me podéis ayudar? Gracias.

Re: Análisis del archivo /etc/login.defs

NotaPublicado: 2011-02-15 10:58 @498
por explorer
He probado la versión 2.5 y me funciona, salvo que falta cerrar el final del fichero recomendación (el R).

Otro problema es que si se vuelve a ejecutar el programa, no sobreescribe los ficheros html, sino que añade nuevo contenido, lo cual no es coherente con el hecho de que siempre genera una cabecera HTML. Deberían ser abiertos en modo escritura, no en modo añadir. Y agregar la hora de la ejecución en el nombre del fichero.

Y el código HTML tiene cantidad de errores... los atributos no están entrecomillados, hay caracteres ';' que sobran... el DTD no corresponde con la forma de escritura de las marcas HTML... casi mejor, quitarlo...

Por otra parte, sabiendo que en las distribuciones Perl viene incluido de base el módulo CGI, podrías aprovecharlo para generar el código HTML, y reducir tu programa a la mitad.

Y si ejecutamos el programa con los avisos activados (no desactivados, como lo tienes puesto), Perl te da más pistas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@aprosi21:~/Documents/tmp> perl -c checklist-2.0.4.pl
Switch will be removed from the Perl core distribution in the next major release. Please install it from CPAN. It is being used at checklist-2.0.4.pl, line 29.
Variable "%uid" will not stay shared at checklist-2.0.4.pl line 273.
Variable "%gid" will not stay shared at checklist-2.0.4.pl line 275.
Name "main::defaultuser" used only once: possible typo at checklist-2.0.4.pl line 151.
Name "main::archivos" used only once: possible typo at checklist-2.0.4.pl line 177.
checklist-2.0.4.pl syntax OK
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

O sea:
* Switch es un módulo maldito, así que no hay que usarlo. Hay que usar given/when
* Las variables defaultuser y archivos no se usan nunca
* Las variables %uid y %gid están en contextos diferentes, por lo que los cambios externos en ellas no se verán en sucesivas llamadas en la función que luego las usa. En tu caso, te avisa que la función wanted3() está definida dentro de la función sinownergroup(), por lo que, de las variables %uid y %gui que referencia, y que están declaradas y definidas fuera de ella, solo usará el primer valor que tuvieran, y no los posteriores. En tu caso, no te afecta, porque la función sinownergroup() solo se llama una vez.

Re: Análisis del archivo /etc/login.defs

NotaPublicado: 2011-02-15 12:29 @562
por situ
Yo tengo la:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
This is perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¡Qué raro! Por el output por terminal me lo da. El tema es el archivo =(.

Seguiré probando.

Re: Análisis del archivo /etc/login.defs

NotaPublicado: 2011-03-19 00:34 @065
por situ
Consulta: ¿cómo puedo adaptarle File::stat; para comprobar si existe el archivo, si puedo leerlo antes de parsearlo?

Saludos.

Re: Análisis del archivo /etc/login.defs

NotaPublicado: 2011-03-19 07:14 @343
por explorer
Para eso no es necesario usar ningún módulo.

Perl tiene una serie de operadores, los -X, que te permitan recibir información básica de ficheros y directorios. Por ejemplo:

say 'Es legible' if -r $fichero;

Re: Análisis del archivo /etc/login.defs

NotaPublicado: 2011-03-19 10:48 @491
por situ
Muchas Gracias.

Re: Análisis del archivo /etc/login.defs

NotaPublicado: 2014-07-11 08:54 @413
por situ
¿Existe la posibilidad de poder listar el contenido de una variable pero que no sea analizada? Solamente quiero ver su valor o en el caso que no esté que me lo informe.