Ayuda con un script [PERL]

Iniciado por 0uts1de, 16 Enero 2017, 16:53 PM

0 Miembros y 2 Visitantes están viendo este tema.

0uts1de

Hola a todos, programando en perl como suelo hacer casi siempre ultimamente (ya soy un poco mejor que la ultima vez que pregunte por aqui) me ha salido un problema del que no se salir.
Mi idea era crear un script que leyera el espacio del sistema de archivos que se quiera (solo funciona en linux por teams de modulos y tal), que diga el tipo de fs, elespacio restante, el usado, y avisara en caso de que hubiera menos espacio libre que un tanto porciento (en el script es un 10).
Todo suena muy bien y me pongo a programar:
Código:
Código (perl) [Seleccionar]
   
#!usr/bin/perl
#solo funciona para unix/linux/solaris(solaris ni idea)
#si da el error "Undefined subroutine &main::SYS_statfs called at Filesys/DiskSpace.pm at line XXX", editar syscall.ph
# (en el perl lib tree) y copiar la linea "SYS_statfs {196;}" fuera del "if (defined &__hp9000s800)" (alrededor de la linea 356)
use strict ;
use warnings ;
use Filesys::DiskSpace ;
use POSIX ;
#sistema de archivos/particion a comprobar espacio
#sacar fecha ;
my $TIME = strftime("%d/%m/%Y %H:%M:%S", localtime(time) ) ;
print "+----------+---+----------+\n" ;
print "+Script made up by 0uts1de+\n" ;
print "+----------+---+----------+\n" ;
print "Today is $TIME \n" ;
print "Write the filesystem/partiton you want to monitor, for example /home or /usr \n" ;
my $monit = <STDIN> ;
chomp $monit ;
print "##warning level is by default about a 20 % of free space, if u want to change this##\n" ;
print "##change the variable warn in the script with a editor like vim or gedit ##\n" ;
########## warn string ############
my $warn = 10 ;
###################################
#consegir caracteristicas de la particion/filesystem (raw)
my ($fs_type, $fs_desc, $used, $avail, $fused, $favail) = df $monit ;
my $monit_percentual = (  $avail  /  $avail+$used  ) * 100 ;
my $final_used = $used / 1000 ;
my $final_avail = $avail / 1000 ;
print "$monit is a $fs_type filesystem who has $final_used space used (in MB) and $final_avail of avalible space (in MB too) \n" ;
#comparacion con el porcentaje de $monit_percentual
if ($monit_percentual < $warn) {
        print "Less of the $warn % of the space of the filesystem $monit is avalible for use, consider uninstall unused software \n" ;
}
elsif ($monit_percentual eq $warn) {
        print "Be carefull, exactly the $warn % of the space of $monit is usable, consider uninstall unused software \n" ;
}
else {
        print "There is a $monit_percentual % of avarible space of the disk \n" ;
}

Pero ahora viene mi duda, y es que de imput recibo este error y despues de varias horas rascandome la cabeza sigo desconociendo proqué se produce:
Codigo:
Código (perl) [Seleccionar]

+----------+---+----------+
+Script made up by 0uts1de+
+----------+---+----------+
Today is 16/01/2017 16:31:04
Write the filesystem/partiton you want to monitor, for example /home or /usr
/
##warning level is by default about a 20 % of free space, if u want to change this##
##change the variable warn in the script with a editor like vim or gedit ##
Illegal division by zero at analizador de filesystem (16-1-17).pl line 35, <STDIN> line 1.


(el / que se ve en la linea 6 de la salida es mi input, ya que queria probar con el sistema de archivos /)
Como ya dije en mi anterior post, gracias por adelantado :D
if (you eq coment){
   print "gracias" ;
}
else {
print ":("  ;
}

explorer

Lo más probable es que Filesys::DiskSpace::df() no haya sido capaz de sacar la información que se le solicita. Tiene algunos problemas.

Después de la línea 26 deberías comprobar que los valores que te devuelve df() son consistentes, o si contienen valores erróneos.

La división por cero creo que se produce en la línea 27, en la que además hay un error: falta poner paréntesis alrededor de $avail+$used. Sin los paréntesis, la operación

my $monit_percentual = (  $avail  /  $avail+$used  ) * 100;

en realidad es

my $monit_percentual = ( ($avail / $avail) +$used) * 100;

Es por la precedencia de los operadores: la división tiene más precedencia que la suma.

Pero antes de hacer la división debes comprobar que $avail+$used es mayor que 0, porque si no salta el error.

0uts1de

#2
Cita de: explorer en 16 Enero 2017, 23:36 PM
Lo más probable es que Filesys::DiskSpace::df() no haya sido capaz de sacar la información que se le solicita. Tiene algunos problemas.

Después de la línea 26 deberías comprobar que los valores que te devuelve df() son consistentes, o si contienen valores erróneos.

La división por cero creo que se produce en la línea 27, en la que además hay un error: falta poner paréntesis alrededor de $avail+$used. Sin los paréntesis, la operación

my $monit_percentual = (  $avail  /  $avail+$used  ) * 100;

en realidad es

my $monit_percentual = ( ($avail / $avail) +$used) * 100;

Es por la precedencia de los operadores: la división tiene más precedencia que la suma.

Pero antes de hacer la división debes comprobar que $avail+$used es mayor que 0, porque si no salta el error.

Efectivamente, despues de varios test y de mirar el link que me has enviado el comando df no podía obtener los valores.
Hoy en dia estoy usando en ved de Filesys:.DiskSpace el modulo Sys::Filesystem junto al submodulo Sys::Filesystem:Linux para hacer esta tarea.
Ahora lo unico que necesito es saber como poner una cantidad de tiempo antes de que prosiga con el resto del script, pero no creo que me lleve mucho tiempo descubrir como si se puede.
Gracias por la ayuda!
if (you eq coment){
   print "gracias" ;
}
else {
print ":("  ;
}

explorer

Puedes hacer un bucle sin fin, con un sleep en el interior, para que haga una espera entre comprobaciones...

0uts1de

Pues no habia pensado en ello, ahora si que si muchas gracias  y doy el tema como resuelto ;D
if (you eq coment){
   print "gracias" ;
}
else {
print ":("  ;
}