98 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			98 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
|  | #!/usr/bin/perl | ||
|  | use strict; | ||
|  | use warnings; | ||
|  | use Carp; | ||
|  | 
 | ||
|  | use Sys::Filesystem (); | ||
|  | use Filesys::Df qw(df); | ||
|  | use IO::Socket; | ||
|  | 
 | ||
|  | my @ignoreformats = qw(tmpfs sysfs devtmpfs devpts proc binfmt_misc | ||
|  |                        fusectl fuse.gvfsd-fuse fuse.vmware-vmblock | ||
|  |                        debugfs securityfs swap); | ||
|  | 
 | ||
|  | my $color_ok   = "#78af78"; | ||
|  | my $color_warn = "#ffff00"; | ||
|  | my $color_crit = "#ff0000"; | ||
|  | 
 | ||
|  | 
 | ||
|  | # check_mk based magic df kungfu | ||
|  | sub magic_level { | ||
|  |   my ($level, $size) = @_; | ||
|  | 
 | ||
|  |   my $normsize = 20.0; # GB | ||
|  |   my $exp = 0.6; | ||
|  | 
 | ||
|  |   my $hgb_size = $size / $normsize; | ||
|  |   my $felt_size = $hgb_size ** $exp; | ||
|  |   my $scale = $felt_size / $hgb_size; | ||
|  |   my $new_level = 1 - ((1 - $level) * $scale); | ||
|  |   if ($new_level < 0.6) { | ||
|  |     $new_level = 0.6; | ||
|  |   } | ||
|  | 
 | ||
|  |   return $new_level; | ||
|  | } | ||
|  | 
 | ||
|  | my $fs = Sys::Filesystem->new(); | ||
|  | my @filesystems = $fs->filesystems(); | ||
|  | 
 | ||
|  | # determine longest mount point path | ||
|  | my $mlength = 5; | ||
|  | for my $f (@filesystems) { | ||
|  |   my $mount_point = $fs->mount_point($f); | ||
|  | 
 | ||
|  |   if (length($mount_point) > $mlength) { | ||
|  |     $mlength = length($mount_point); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | for my $f (@filesystems) { | ||
|  |   my $mount_point = $fs->mount_point($f); | ||
|  |   my $format= $fs->format($f); | ||
|  | 
 | ||
|  |   next if grep { /^$format$/xsm } @ignoreformats; | ||
|  | 
 | ||
|  |   my $df   = df($mount_point, 1024); # 1k blocks | ||
|  |   my $size = $df->{blocks}/(1024*1024); | ||
|  | 
 | ||
|  |   my $level_warn = magic_level(0.80, $size) * 100; | ||
|  |   my $level_crit = magic_level(0.90, $size) * 100; | ||
|  | 
 | ||
|  |   # color depends on used percent | ||
|  |   my $color = $color_ok; | ||
|  |   if ($df->{per} >= $level_warn) { | ||
|  |     $color = $color_warn; | ||
|  |   } | ||
|  |   if ($df->{per} >= $level_crit) { | ||
|  |     $color = $color_crit; | ||
|  |   } | ||
|  | 
 | ||
|  |   printf("  \${color #98c2c7}%-${mlength}s\$color %2.f%% (%2.f/%2.f) %6.2fGB \${color $color}\${fs_bar 6 %s}\$color\n", | ||
|  |     $mount_point, | ||
|  |     100 - $df->{per}, | ||
|  |     100 - $level_warn, 100 - $level_crit, | ||
|  |     $df->{bfree}/(1024*1024), | ||
|  |     $mount_point | ||
|  |   ); | ||
|  | } | ||
|  | 
 | ||
|  | # hddtemp | ||
|  | my $socket=IO::Socket::INET->new( | ||
|  |   PeerAddr => 'localhost', PeerPort=> 7634, | ||
|  |   Proto => 'tcp', Type => $IO::Socket::SOCK_STREAM) | ||
|  |   or croak "Can't talk to hddtemp"; | ||
|  | my $hddtemp_output = <$socket>; | ||
|  | close $socket; | ||
|  | 
 | ||
|  | my @hddtemp_output = split /[|]/x, $hddtemp_output; | ||
|  | my $diskcount = $#hddtemp_output/5; | ||
|  | for (my $i = 0; $i < $diskcount; $i++) { | ||
|  |   my $dev   = $hddtemp_output[$i*5+1]; | ||
|  |   my $temp  = $hddtemp_output[$i*5+3]; | ||
|  |   my $unit  = $hddtemp_output[$i*5+4]; | ||
|  |   printf "  %s %02.f°%s\n", $dev, $temp, $unit; | ||
|  | } | ||
|  | 
 | ||
|  | # vim:textwidth=120: |