diff --git a/src/snmp_standard/mode/diskusage.pm b/src/snmp_standard/mode/diskusage.pm index 23f42981a8..f2dfad0118 100644 --- a/src/snmp_standard/mode/diskusage.pm +++ b/src/snmp_standard/mode/diskusage.pm @@ -153,10 +153,14 @@ sub check_options { $self->SUPER::check_options(%options); - if (defined($self->{option_results}->{space_reservation}) && - ($self->{option_results}->{space_reservation} < 0 || $self->{option_results}->{space_reservation} > 100)) { - $self->{output}->add_option_msg(short_msg => "Space reservation argument must be between 0 and 100 percent."); - $self->{output}->option_exit(); + if (defined($self->{option_results}->{space_reservation}) && $self->{option_results}->{space_reservation} ne '') { + if ($self->{option_results}->{space_reservation} eq 'auto') { + $self->{auto_space_reservation} = 1; + } elsif ($self->{option_results}->{space_reservation} !~ /^\d+(?:\.\d+)?$/ || + $self->{option_results}->{space_reservation} < 0 || $self->{option_results}->{space_reservation} > 100) { + $self->{output}->add_option_msg(short_msg => "Space reservation argument must be 'auto' or between 0 and 100 percent."); + $self->{output}->option_exit(); + } } $self->{statefile_cache}->check_options(%options); @@ -164,11 +168,14 @@ sub check_options { my $mapping = { dskTotal32 => { oid => '.1.3.6.1.4.1.2021.9.1.6' }, # kB + dskAvail32 => { oid => '.1.3.6.1.4.1.2021.9.1.7' }, # kB dskUsed32 => { oid => '.1.3.6.1.4.1.2021.9.1.8' }, # kB dskPercent => { oid => '.1.3.6.1.4.1.2021.9.1.9' }, dskPercentNode => { oid => '.1.3.6.1.4.1.2021.9.1.10' }, dskTotalLow => { oid => '.1.3.6.1.4.1.2021.9.1.11' }, # kB dskTotalHigh => { oid => '.1.3.6.1.4.1.2021.9.1.12' }, # kB + dskAvailLow => { oid => '.1.3.6.1.4.1.2021.9.1.13' }, # kB + dskAvailHigh => { oid => '.1.3.6.1.4.1.2021.9.1.14' }, # kB dskUsedLow => { oid => '.1.3.6.1.4.1.2021.9.1.15' }, # kB dskUsedHigh => { oid => '.1.3.6.1.4.1.2021.9.1.16' } # kB }; @@ -179,12 +186,20 @@ sub manage_selection { my $disks = $self->get_selection(snmp => $options{snmp}); delete($mapping->{dskPercent}) if (!defined($self->{option_results}->{force_use_mib_percent})); + if (!defined($self->{auto_space_reservation})) { + delete($mapping->{dskAvail32}); + delete($mapping->{dskAvailLow}); + delete($mapping->{dskAvailHigh}); + } if (!defined($self->{option_results}->{force_counters32})) { delete($mapping->{dskTotal32}); + delete($mapping->{dskAvail32}); delete($mapping->{dskUsed32}); } else { delete($mapping->{dskTotalLow}); delete($mapping->{dskTotalHigh}); + delete($mapping->{dskAvailLow}); + delete($mapping->{dskAvailHigh}); delete($mapping->{dskUsedLow}); delete($mapping->{dskUsedHigh}); } @@ -220,11 +235,25 @@ sub manage_selection { my $total_used = defined($result->{dskUsedHigh}) ? ((($result->{dskUsedHigh} << 32) + $result->{dskUsedLow}) * 1024) : $result->{dskUsed32} * 1024; my $reserved_value = 0; - if (defined($self->{option_results}->{space_reservation})) { + if (defined($self->{auto_space_reservation})) { + my $total_avail = defined($result->{dskAvailHigh}) ? + ((($result->{dskAvailHigh} << 32) + $result->{dskAvailLow}) * 1024) : + (defined($result->{dskAvail32}) ? $result->{dskAvail32} * 1024 : undef); + if (defined($total_avail)) { + # dskTotal - dskUsed - dskAvail is the space reserved for privileged users (f_bfree - f_bavail) + $reserved_value = $total_size - $total_used - $total_avail; + $reserved_value = 0 if ($reserved_value < 0); + } else { + $self->{output}->output_add( + long_msg => sprintf("partition '%s': cannot get available space, space reservation ignored", $name_diskpath), + debug => 1 + ); + } + } elsif (defined($self->{option_results}->{space_reservation})) { $reserved_value = $self->{option_results}->{space_reservation} * $total_size / 100; } - my $prct_used = $total_used * 100 / ($total_size - $reserved_value); + my $prct_used = ($total_size - $reserved_value) > 0 ? $total_used * 100 / ($total_size - $reserved_value) : 100; my $prct_free = 100 - $prct_used; my $free = $total_size - $total_used - $reserved_value; # limit to 100. Better output. @@ -406,6 +435,9 @@ Display cache disk path data. Some filesystem has space reserved (like ext4 for root). The value is in percent of total (default: none) (results like 'df' command). +Use 'auto' to compute the real reservation of each partition from the values +returned by the agent (dskTotal - dskUsed - dskAvail), instead of applying the +same fixed percentage to every partition. =item B<--force-use-mib-percent> diff --git a/tests/os/linux/snmp/disk-usage.robot b/tests/os/linux/snmp/disk-usage.robot index 7d52622611..ca114960d8 100644 --- a/tests/os/linux/snmp/disk-usage.robot +++ b/tests/os/linux/snmp/disk-usage.robot @@ -54,3 +54,6 @@ disk-usage ${tc} ... 24 --filter-disk-path='/run/lock' OK: Partition '/run/lock' usage total: 5.00 MB used: 0.00 B (0.00%) free: 5.00 MB (100.00%), Inodes used: 0 % | 'count'=1;;;0; 'used'=0B;;;0;5242880 'free'=5242880B;;;0;5242880 'used_prct'=0.00%;;;0;100 'inodes'=0%;;;0;100 ... 25 --filter-disk-path='/' OK: All partitions are ok | 'count'=5;;;0; 'used_/'=7394013184B;;;0;105088212992 'free_/'=97694199808B;;;0;105088212992 'used_prct_/'=7.04%;;;0;100 'inodes_/'=6%;;;0;100 'used_/dev/shm'=0B;;;0;1031299072 'free_/dev/shm'=1031299072B;;;0;1031299072 'used_prct_/dev/shm'=0.00%;;;0;100 'inodes_/dev/shm'=0%;;;0;100 'used_/run'=532480B;;;0;206262272 'free_/run'=205729792B;;;0;206262272 'used_prct_/run'=0.26%;;;0;100 'inodes_/run'=0%;;;0;100 'used_/run/lock'=0B;;;0;5242880 'free_/run/lock'=5242880B;;;0;5242880 'used_prct_/run/lock'=0.00%;;;0;100 'inodes_/run/lock'=0%;;;0;100 'used_/run/user/0'=0B;;;0;206258176 'free_/run/user/0'=206258176B;;;0;206258176 'used_prct_/run/user/0'=0.00%;;;0;100 'inodes_/run/user/0'=0%;;;0;100 ... 26 --filter-disk-path='/run/user/0' OK: Partition '/run/user/0' usage total: 196.70 MB used: 0.00 B (0.00%) free: 196.70 MB (100.00%), Inodes used: 0 % | 'count'=1;;;0; 'used'=0B;;;0;206258176 'free'=206258176B;;;0;206258176 'used_prct'=0.00%;;;0;100 'inodes'=0%;;;0;100 + ... 27 --space-reservation='auto' OK: All partitions are ok | 'count'=5;;;0; 'used_/'=7394013184B;;;0;105088212992 'free_/'=92308766720B;;;0;105088212992 'used_prct_/'=7.42%;;;0;100 'inodes_/'=6%;;;0;100 'used_/dev/shm'=0B;;;0;1031299072 'free_/dev/shm'=1031299072B;;;0;1031299072 'used_prct_/dev/shm'=0.00%;;;0;100 'inodes_/dev/shm'=0%;;;0;100 'used_/run'=532480B;;;0;206262272 'free_/run'=205729792B;;;0;206262272 'used_prct_/run'=0.26%;;;0;100 'inodes_/run'=0%;;;0;100 'used_/run/lock'=0B;;;0;5242880 'free_/run/lock'=5242880B;;;0;5242880 'used_prct_/run/lock'=0.00%;;;0;100 'inodes_/run/lock'=0%;;;0;100 'used_/run/user/0'=0B;;;0;206258176 'free_/run/user/0'=206258176B;;;0;206258176 'used_prct_/run/user/0'=0.00%;;;0;100 'inodes_/run/user/0'=0%;;;0;100 + ... 28 --space-reservation='auto' --filter-disk-path='^/$' OK: Partition '/' usage total: 97.87 GB used: 6.89 GB (7.42%) free: 85.97 GB (92.58%), Inodes used: 6 % | 'count'=1;;;0; 'used'=7394013184B;;;0;105088212992 'free'=92308766720B;;;0;105088212992 'used_prct'=7.42%;;;0;100 'inodes'=6%;;;0;100 + ... 29 --space-reservation='invalid' UNKNOWN: Space reservation argument must be 'auto' or between 0 and 100 percent. diff --git a/tests/resources/spellcheck/stopwords.txt b/tests/resources/spellcheck/stopwords.txt index 0088604757..d29ed2927d 100644 --- a/tests/resources/spellcheck/stopwords.txt +++ b/tests/resources/spellcheck/stopwords.txt @@ -87,6 +87,9 @@ dfsrevent --display-transform-dst --display-transform-src dns-resolve-time +dskAvail +dskTotal +dskUsed --dyn-mode Ekara -EncodedCommand @@ -145,6 +148,7 @@ in-bcast in-crc in-fcserror in-mcast +includeAllDisks -InputFormat interface-dsl-name InterrupibleSleep