Disk space monitoring by percentage free
authorJamie Cameron <jcameron@webmin.com>
Fri, 11 Dec 2009 22:45:47 +0000 (14:45 -0800)
committerJamie Cameron <jcameron@webmin.com>
Fri, 11 Dec 2009 22:45:47 +0000 (14:45 -0800)
status/CHANGELOG
status/lang/en
status/space-monitor.pl

index 2bd3c94..6cce3d3 100644 (file)
@@ -67,3 +67,5 @@ Added an option to the SSH monitor type for a port number.
 ---- Changes since 1.490 ----
 Added a new monitor type for detecting large directories.
 Added a button to the main page for refreshing only selected monitors, thanks to Michael Mansour.
+---- Changes since 1.500 ----
+Added an option to the Disk Space monitor to alert based on percentage free, as an alternative to a threshold in bytes.
index 33cbc8c..7da1717 100644 (file)
@@ -237,13 +237,18 @@ traffic_ebytes=Missing or invalid number of bytes/second
 
 space_fs=Filesystem to check
 space_min2=Minimum free space
+space_mode0=Absolute size
+space_mode1=Percentage of total
 space_desc=$1 free
 space_nofs=Filesystem not mounted
 space_other=Other..
 space_emin=Missing or invalid free space
+space_epc=Missing or invalid free space percentage
 space_eother=Missing or invalid filesystem
 space_inode=Minimum free Inodes
 space_ierr=Only $1 inodes free
+space_merr=Only $1 space free
+space_perr=Only $1% free
 
 load_time=Load average to check
 load_1=1 minute
index 5c39d07..acff604 100755 (executable)
@@ -11,8 +11,21 @@ foreach $f (&mount::list_mounted()) {
        }
 if ($m) {
        local @sp = &mount::disk_space($m->[2], $m->[0]);
-       if ($sp[1] < $_[0]->{'min'}) {
-               return { 'up' => 0 };
+       if ($_[0]->{'min'} =~ /^(\S+)%/) {
+               # Compare percentage
+               local $pc = $sp[1] * 100.0 / $sp[0];
+               if ($pc < $1) {
+                       return { 'up' => 0,
+                                'desc' => &text('space_perr', int($pc)) };
+                       }
+               }
+       else {
+               # Compare absolute size
+               if ($sp[1] < $_[0]->{'min'}) {
+                       return { 'up' => 0,
+                                'desc' => &text('space_merr',
+                                                &nice_size($sp[1]*1024)) };
+                       }
                }
 
        if ($_[0]->{'inode'} && defined(&mount::inode_space)) {
@@ -54,9 +67,17 @@ else {
                &ui_textbox("other", $_[0]->{'fs'}, 30));
        }
 
+# Minumum free space
+local $min = $_[0]->{'min'};
+local $pc = ($min =~ s/\%$// ? 1 : 0);
 print &ui_table_row($text{'space_min2'},
-       &ui_bytesbox("min", $_[0]->{'min'}*1024));
+       &ui_radio_table("min_mode", $pc,
+               [ [ 0, $text{'space_mode0'},
+                   &ui_bytesbox("min", $pc ? undef : $min*1024) ],
+                 [ 1, $text{'space_mode1'},
+                   &ui_textbox("pc", $pc ? $min : undef, 4)."%" ] ]), 3);
 
+# Minimum free inodes
 if (defined(&mount::inode_space)) {
        print &ui_table_row($text{'space_inode'},
                &ui_textbox("inode", $_[0]->{'inode'}, 10));
@@ -66,8 +87,15 @@ if (defined(&mount::inode_space)) {
 sub parse_space_dialog
 {
 &depends_check($_[0], "mount");
-$in{'min'} =~ /^[0-9\.]+$/ || &error($text{'space_emin'});
-$_[0]->{'min'} = $in{'min'}*$in{'min_units'}/1024;
+if ($in{'min_mode'} == 0) {
+       $in{'min'} =~ /^[0-9\.]+$/ || &error($text{'space_emin'});
+       $_[0]->{'min'} = $in{'min'}*$in{'min_units'}/1024;
+       }
+else {
+       $in{'pc'} =~ /^[0-9\.]+$/ && $in{'pc'} >= 0 && $in{'pc'} <= 100 ||
+               &error($text{'space_epc'});
+       $_[0]->{'min'} = $in{'pc'}."%";
+       }
 if ($in{'fs'}) {
        $_[0]->{'fs'} = $in{'fs'};
        }